From a3a11641aff0e101653fd133646bc791dc3a8aa2 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 2 Nov 2020 13:08:52 -0600 Subject: [PATCH 01/50] Adding creation of interior graveyard surface triangles. --- src/dagmc/DagMC.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++ src/dagmc/DagMC.hpp | 19 +++++++- 2 files changed, 128 insertions(+), 1 deletion(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 27c51eb9d7..cb94f921c1 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -212,6 +212,116 @@ ErrorCode DagMC::setup_indices() { return MB_SUCCESS; } +ErrorCode DagMC::create_graveyard() { + + // internal structure used to track geometry bounds + struct BBOX { + double lower[3] = { INFTY, INFTY, INFTY}; + double upper[3] = {-INFTY, -INFTY, -INFTY}; + + bool valid() { + return ( lower[0] <= upper[0] && + lower[1] <= upper[1] && + lower[2] <= upper[2] ); + } + + void update(double x, double y, double z) { + lower[0] = x < lower[0] ? x : lower[0]; + lower[1] = y < lower[1] ? y : lower[1]; + lower[2] = z < lower[2] ? z : lower[2]; + + upper[0] = x > upper[0] ? x : upper[0]; + upper[1] = y > upper[1] ? y : upper[1]; + upper[2] = z > upper[2] ? z : upper[2]; + } + + void update(double xyz[3]) { + update(xyz[0], xyz[1], xyz[2]); + } + }; + BBOX box; + + ErrorCode rval; + + int num_vols = num_entities(3); + double vmin[3], vmax[3]; + for(int i = 0; i < num_vols; i++) { + moab::EntityHandle vol = this->entity_by_index(3, i+1); + rval = this->getobb(vol, vmin, vmax); + MB_CHK_SET_ERR(rval, "Failed to get volume OBB"); + + box.update(vmin); + box.update(vmax); + } + + // start modifying the MOAB mesh + moab::Interface* MBI = this->moab_instance(); + + //start with vertices + std::vector> vertex_coords; + // vertex coordinates for the lower z face + vertex_coords.push_back({box.lower[0], box.lower[1], box.lower[2]}); + vertex_coords.push_back({box.upper[0], box.lower[1], box.lower[2]}); + vertex_coords.push_back({box.upper[0], box.upper[1], box.lower[2]}); + vertex_coords.push_back({box.lower[0], box.upper[1], box.lower[2]}); + // vertex coordinate for the upper z face + vertex_coords.push_back({box.lower[0], box.lower[1], box.upper[2]}); + vertex_coords.push_back({box.upper[0], box.lower[1], box.upper[2]}); + vertex_coords.push_back({box.upper[0], box.upper[1], box.upper[2]}); + vertex_coords.push_back({box.lower[0], box.upper[1], box.upper[2]}); + + std::vector box_verts; + for(const auto& coords : vertex_coords) { + EntityHandle new_vertex; + rval = MBI->create_vertex(coords.data(), new_vertex); + MB_CHK_SET_ERR(rval, "Failed to create graveyard vertex"); + box_verts.push_back(new_vertex); + } + + // now we have 8 vertices to create triangles with + std::vector> connectivity_indices; + // lower z + connectivity_indices.push_back({1, 0, 2}); + connectivity_indices.push_back({3, 2, 0}); + // upper z + connectivity_indices.push_back({5, 6, 4}); + connectivity_indices.push_back({7, 4, 6}); + // lower x + connectivity_indices.push_back({0, 1, 4}); + connectivity_indices.push_back({3, 4, 1}); + // upper x + connectivity_indices.push_back({2, 3, 6}); + connectivity_indices.push_back({7, 6, 3}); + // lower y + connectivity_indices.push_back({0, 4, 3}); + connectivity_indices.push_back({7, 3, 4}); + // upper y + connectivity_indices.push_back({1, 2, 3}); + connectivity_indices.push_back({6, 3, 2}); + + moab::Range new_tris; + for(const auto& ind : connectivity_indices) { + EntityHandle new_triangle; + std::array tri_conn = {box_verts[ind[0]], box_verts[ind[1]], box_verts[ind[2]]}; + rval = MBI->create_element(moab::MBTRI, tri_conn.data(), 3, new_triangle); + MB_CHK_SET_ERR(rval, "Failed to create new graveyard triangle"); + new_tris.insert(new_triangle); + } + + //create a new surface meshset + rval = create_geometric_entity(new_tris, "surface"); + + return rval; +} + +ErrorCode DagMC::create_geometric_entity(const Range& entities, const std::string& type) { + if (type == "surface" && !entities.all_of_type(moab::MBTRI)) { + MB_CHK_SET_ERR(moab::MB_FAILURE, "Cannot create surface with non-triangle types present"); + } + + return moab::MB_SUCCESS; +} + // initialise the obb tree ErrorCode DagMC::init_OBBTree() { ErrorCode rval; diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index c3288cedee..cc4191bb8d 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -2,7 +2,7 @@ #define MOABMC_HPP #include - +#include #include #include #include @@ -22,6 +22,8 @@ class RefEntity; +constexpr double INFTY {std::numeric_limits::max()}; + struct DagmcVolData { int mat_id; double density, importance; @@ -160,10 +162,25 @@ class DagMC { */ ErrorCode setup_indices(); + /**\brief Create a graveyard volume. + * + * Create a cuboid volume marked with metadata indicating it is the boundary + * of the DAGMC model. This method will create an additional graveyard + * if one already exists. Use the has_graveyard method to check + * if the DAGMC instance already has a graveyard. + */ + ErrorCode create_graveyard(); + private: /** loading code shared by load_file and load_existing_contents */ ErrorCode finish_loading(); + /** create geometric meshset from a set of elements + * + * Valid types are "curve", "surface", or "volume" + */ + ErrorCode create_geometric_entity(const Range& entities, const std::string& type); + /* SECTION II: Fundamental Geometry Operations/Queries */ public: /** The methods in this section are thin wrappers around methods in the From ee099340092fe5db056436b4ab0dfd4de16640c7 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 2 Nov 2020 18:48:14 -0600 Subject: [PATCH 02/50] Moving INFTY symbol into the MOAB namespace. --- src/dagmc/DagMC.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index cc4191bb8d..efe2a477ef 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -22,8 +22,6 @@ class RefEntity; -constexpr double INFTY {std::numeric_limits::max()}; - struct DagmcVolData { int mat_id; double density, importance; @@ -34,6 +32,8 @@ class RayTracingInterface; namespace moab { +constexpr double INFTY {std::numeric_limits::max()}; + static const int vertex_handle_idx = 0; static const int curve_handle_idx = 1; static const int surfs_handle_idx = 2; @@ -179,7 +179,8 @@ class DagMC { * * Valid types are "curve", "surface", or "volume" */ - ErrorCode create_geometric_entity(const Range& entities, const std::string& type); + ErrorCode create_geometric_entity(const Range& entities, + const std::string& type); /* SECTION II: Fundamental Geometry Operations/Queries */ public: From cba9b1ae457103ad0263a4fb64b31a6e2390c30b Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 2 Nov 2020 18:48:38 -0600 Subject: [PATCH 03/50] Adding a check for consistency when creating volumes. --- src/dagmc/DagMC.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index cb94f921c1..8e8ef54bf5 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -315,10 +315,15 @@ ErrorCode DagMC::create_graveyard() { } ErrorCode DagMC::create_geometric_entity(const Range& entities, const std::string& type) { + if (type == "surface" && !entities.all_of_type(moab::MBTRI)) { MB_CHK_SET_ERR(moab::MB_FAILURE, "Cannot create surface with non-triangle types present"); } + if (type == "volume" && !entities.all_of_type(moab::MBENTITYSET)) { + MB_CHK_SET_ERR(moab::MB_FAILURE, "Cannot create a volume with non-entityset types present"); + } + return moab::MB_SUCCESS; } From 18ef758678e8e07fd9dd016847ff83fea5ae68cc Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 2 Nov 2020 23:47:48 -0600 Subject: [PATCH 04/50] A whole bunch of reorganization. --- src/dagmc/DagMC.cpp | 143 ++++++++++++++++++++++++++++++++++++-------- src/dagmc/DagMC.hpp | 21 ++++--- 2 files changed, 127 insertions(+), 37 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 8e8ef54bf5..8fb1ad592c 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -212,7 +212,7 @@ ErrorCode DagMC::setup_indices() { return MB_SUCCESS; } -ErrorCode DagMC::create_graveyard() { +ErrorCode DagMC::create_graveyard(bool overwrite) { // internal structure used to track geometry bounds struct BBOX { @@ -243,6 +243,29 @@ ErrorCode DagMC::create_graveyard() { ErrorCode rval; + // create a new volume meshset + EntityHandle volume_set; + rval = MBI->create_meshset(0, volume_set); + MB_CHK_SET_ERR(rval, "Failed to create a graveyard volume set"); + + // tag the volume set with the appropriate info + int volume_dim = 3; + rval = MBI->tag_set_data(geom_tag(), &volume_set, 1, &volume_dim); + MB_CHK_SET_ERR(rval, "Failed to set the graveyard volume's geometric dimension"); + + // determine what ID to give the volume + int vol_id = get_max_id(3); + vol_id++; + + // set the volume ID + rval = MBI->tag_set_data(id_tag(), &volume_set, 1, &vol_id); + MB_CHK_SET_ERR(rval, "Failed to get graveyard volume's id"); + + // set the category tag + std::string volume_str = "Volume"; + rval = MBI->tag_set_data(category_tag(), &volume_set, 1, volume_str.c_str()); + MB_CHK_SET_ERR(rval, "Failed to set graveyard volume category"); + int num_vols = num_entities(3); double vmin[3], vmax[3]; for(int i = 0; i < num_vols; i++) { @@ -254,21 +277,62 @@ ErrorCode DagMC::create_graveyard() { box.update(vmax); } - // start modifying the MOAB mesh - moab::Interface* MBI = this->moab_instance(); + // expand the box a bit + for (int i = 0; i < 3; i++) { + box.upper[i] += 10.0 * numerical_precision(); + box.lower[i] -= 10.0 * numerical_precision(); + } + + EntityHandle inner_surface; + rval = box_to_surf(box.lower, box.upper, inner_surface); + + // establish the volume-surface parent-child relationship with the inner surface + rval = MBI->add_parent_child(volume_set, inner_surface); + MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + + // set the surface senses (all triangles have outward normals so this should + // be REVERSE wrt the graveyard volume) + EntityHandle inner_senses[2] = {0, volume_set}; + rval = MBI->tag_set_data(sense_tag(), &inner_surface, 1, inner_senses); + MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); + + // expand the box a bit again for the outer surface + for (int i = 0; i < 3; i++) { + box.upper[i] += 10.0 * numerical_precision(); + box.lower[i] -= 10.0 * numerical_precision(); + } + + EntityHandle outer_surface; + rval = box_to_surf(box.lower, box.upper, outer_surface); + + // establish the volume-surface parent-child relationship with tie outer surface + rval = MBI->add_parent_child(volume_set, outer_surface); + MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + + // set the surface senses (all triangles have outward normals so this should + // be FORWARD wrt the graveyard volume) + EntityHandle outer_senses[2] = {volume_set, 0}; + rval = MBI->tag_set_data(sense_tag(), &outer_surface, 1, outer_senses); + MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); + + return rval; +} + +ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set) { + ErrorCode rval; //start with vertices std::vector> vertex_coords; // vertex coordinates for the lower z face - vertex_coords.push_back({box.lower[0], box.lower[1], box.lower[2]}); - vertex_coords.push_back({box.upper[0], box.lower[1], box.lower[2]}); - vertex_coords.push_back({box.upper[0], box.upper[1], box.lower[2]}); - vertex_coords.push_back({box.lower[0], box.upper[1], box.lower[2]}); + vertex_coords.push_back({llc[0], llc[1], llc[2]}); + vertex_coords.push_back({urc[0], llc[1], llc[2]}); + vertex_coords.push_back({urc[0], urc[1], llc[2]}); + vertex_coords.push_back({llc[0], urc[1], llc[2]}); // vertex coordinate for the upper z face - vertex_coords.push_back({box.lower[0], box.lower[1], box.upper[2]}); - vertex_coords.push_back({box.upper[0], box.lower[1], box.upper[2]}); - vertex_coords.push_back({box.upper[0], box.upper[1], box.upper[2]}); - vertex_coords.push_back({box.lower[0], box.upper[1], box.upper[2]}); + vertex_coords.push_back({llc[0], llc[1], urc[2]}); + vertex_coords.push_back({urc[0], llc[1], urc[2]}); + vertex_coords.push_back({urc[0], urc[1], urc[2]}); + vertex_coords.push_back({llc[0], urc[1], urc[2]}); std::vector box_verts; for(const auto& coords : vertex_coords) { @@ -308,23 +372,36 @@ ErrorCode DagMC::create_graveyard() { new_tris.insert(new_triangle); } - //create a new surface meshset - rval = create_geometric_entity(new_tris, "surface"); + // create a surface set + rval = MBI->create_meshset(0, surface_set); + MB_CHK_SET_ERR(rval, "Failed to create a graveyard surface set"); - return rval; -} + // add the triangles and vertices to the surface + rval = MBI->add_entities(surface_set, new_tris); + MB_CHK_SET_ERR(rval, "Failed to add triangles to the graveyard surface set"); -ErrorCode DagMC::create_geometric_entity(const Range& entities, const std::string& type) { + rval = MBI->add_entities(surface_set, box_verts.data(), box_verts.size()); + MB_CHK_SET_ERR(rval, "Failed to add vertices to the graveyard surface set"); - if (type == "surface" && !entities.all_of_type(moab::MBTRI)) { - MB_CHK_SET_ERR(moab::MB_FAILURE, "Cannot create surface with non-triangle types present"); - } + // tag the surface set with the appropriate info + int surface_dim = 2; + rval = MBI->tag_set_data(geom_tag(), &surface_set, 1, &surface_dim); + MB_CHK_SET_ERR(rval, "Failed to set the graveyard surface's geometric dimension"); - if (type == "volume" && !entities.all_of_type(moab::MBENTITYSET)) { - MB_CHK_SET_ERR(moab::MB_FAILURE, "Cannot create a volume with non-entityset types present"); - } + // determine what ID to give the volume + int surf_id = get_max_id(2); + surf_id++; + + // set the volume ID + rval = MBI->tag_set_data(id_tag(), &surface_set, 1, &surf_id); + MB_CHK_SET_ERR(rval, "Failed to get graveyard surface's id"); - return moab::MB_SUCCESS; + // set the category tag + std::string surface_str = "Surface"; + rval = MBI->tag_set_data(category_tag(), &surface_set, 1, surface_str.c_str()); + MB_CHK_SET_ERR(rval, "Failed to set graveyard volume category"); + + return rval; } // initialise the obb tree @@ -503,6 +580,16 @@ int DagMC::get_entity_id(EntityHandle this_ent) { return GTT->global_id(this_ent); } +int DagMC::get_max_id(int dimension) { + // determine what ID to give the volume + int max_id = 0; + for (int i = 0; i < num_entities(dimension); i++) { + int id = id_by_index(dimension, i); + max_id = std::max(id, max_id); + } + return max_id; +} + ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { ErrorCode rval = MB_SUCCESS; @@ -543,14 +630,13 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { entIndices[*rit - setOffset] = idx++; // get group handles - Tag category_tag = get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, - MB_TAG_SPARSE, MB_TYPE_OPAQUE); + Tag cat_tag = category_tag(); char group_category[CATEGORY_TAG_SIZE]; std::fill(group_category, group_category + CATEGORY_TAG_SIZE, '\0'); sprintf(group_category, "%s", "Group"); const void* const group_val[] = {&group_category}; Range groups; - rval = MBI->get_entities_by_type_and_tag(0, MBENTITYSET, &category_tag, + rval = MBI->get_entities_by_type_and_tag(0, MBENTITYSET, &cat_tag, group_val, 1, groups); if (MB_SUCCESS != rval) return rval; group_handles().resize(groups.size() + 1); @@ -560,6 +646,11 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { return MB_SUCCESS; } +Tag DagMC::category_tag() { + return get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, + MB_TAG_SPARSE, MB_TYPE_OPAQUE); +} + /* SECTION IV: Handling DagMC settings */ double DagMC::overlap_thickness() { diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index efe2a477ef..be21163a32 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -169,19 +169,15 @@ class DagMC { * if one already exists. Use the has_graveyard method to check * if the DAGMC instance already has a graveyard. */ - ErrorCode create_graveyard(); + ErrorCode create_graveyard(bool overwrite = false); + +private: + /** convenience function for creating a box of triangles from a bounding box */ + ErrorCode box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set); - private: /** loading code shared by load_file and load_existing_contents */ ErrorCode finish_loading(); - /** create geometric meshset from a set of elements - * - * Valid types are "curve", "surface", or "volume" - */ - ErrorCode create_geometric_entity(const Range& entities, - const std::string& type); - /* SECTION II: Fundamental Geometry Operations/Queries */ public: /** The methods in this section are thin wrappers around methods in the @@ -247,8 +243,10 @@ class DagMC { /** map from EntityHandle to global ID */ int get_entity_id(EntityHandle this_ent); - /**\brief get number of geometric sets corresponding to geometry of specified - *dimension + /** get the largest ID value for entities of a specified dimension */ + int get_max_id(int dimension); + + /**\brief get number of geometric sets corresponding to geometry of specified dimension * * For a given dimension (e.g. dimension=3 for volumes, dimension=2 for *surfaces) return the number of entities of that dimension \param dimension @@ -379,6 +377,7 @@ class DagMC { * EntitySets - PCS */ Tag obb_tag() { return NULL; } + Tag category_tag(); Tag geom_tag() { return GTT->get_geom_tag(); } Tag id_tag() { return GTT->get_gid_tag(); } Tag sense_tag() { return GTT->get_sense_tag(); } From 20f2eb007db8a2b24ac1898e582dd68c5acd909c Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 11:48:45 -0600 Subject: [PATCH 05/50] Adding new file for testing graveyard creation/removal. --- src/dagmc/tests/CMakeLists.txt | 1 + src/dagmc/tests/dagmc_graveyard_test.cpp | 35 ++++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 src/dagmc/tests/dagmc_graveyard_test.cpp diff --git a/src/dagmc/tests/CMakeLists.txt b/src/dagmc/tests/CMakeLists.txt index d8e7e2ceab..c999e8f5f4 100644 --- a/src/dagmc/tests/CMakeLists.txt +++ b/src/dagmc/tests/CMakeLists.txt @@ -11,6 +11,7 @@ dagmc_install_test(dagmc_unit_tests cpp) dagmc_install_test(dagmc_pointinvol_test cpp) dagmc_install_test(dagmc_rayfire_test cpp) dagmc_install_test(dagmc_simple_test cpp) +dagmc_install_test(dagmc_graveyard_test cpp) dagmc_install_test_file(test_dagmc.h5m) dagmc_install_test_file(test_dagmc_impl.h5m) diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp new file mode 100644 index 0000000000..8e1e9a87a9 --- /dev/null +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -0,0 +1,35 @@ +#include + +#include "moab/Interface.hpp" +#include "moab/Core.hpp" +#include "DagMC.hpp" + +#include + +using namespace moab; + +using moab::DagMC; + +moab::DagMC* DAG; + +static const char input_file[] = "test_geom.h5m"; + +class DagmcSimpleTest : public ::testing::Test { + protected: + virtual void SetUp() {} + virtual void TearDown() {} +}; + + +class GraveyardTest : public::testing::Test { + protected: + + virtual void SetUp() override {} + virtual void TearDown() {} +}; + +TEST_F(DagmcSimpleTest, dagmc_load_file) { + DAG = new DagMC(); + ErrorCode rval = DAG->load_file(input_file); // open the Dag file + EXPECT_EQ(rval, MB_SUCCESS); +} From 3f8bd24113ad026105736e48945f1080c7b91817 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 13:30:07 -0600 Subject: [PATCH 06/50] Factoring out a function for retrieving the group sets from the MOAB instance. --- src/dagmc/DagMC.cpp | 25 +++++++++++++++++-------- src/dagmc/DagMC.hpp | 3 +++ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 8fb1ad592c..4d3a5f2a61 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -630,15 +630,11 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { entIndices[*rit - setOffset] = idx++; // get group handles - Tag cat_tag = category_tag(); - char group_category[CATEGORY_TAG_SIZE]; - std::fill(group_category, group_category + CATEGORY_TAG_SIZE, '\0'); - sprintf(group_category, "%s", "Group"); - const void* const group_val[] = {&group_category}; Range groups; - rval = MBI->get_entities_by_type_and_tag(0, MBENTITYSET, &cat_tag, - group_val, 1, groups); - if (MB_SUCCESS != rval) return rval; + rval = get_groups(groups); + if (MB_SUCCESS != rval) + return rval; + group_handles().resize(groups.size() + 1); group_handles()[0] = 0; std::copy(groups.begin(), groups.end(), &group_handles()[1]); @@ -646,6 +642,19 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { return MB_SUCCESS; } +ErrorCode DagMC::get_groups(Range& groups) { + // get group handles + Tag cat_tag = category_tag(); + char group_category[CATEGORY_TAG_SIZE]; + std::fill(group_category, group_category + CATEGORY_TAG_SIZE, '\0'); + sprintf(group_category, "%s", "Group"); + const void* const group_val[] = {&group_category}; + ErrorCode rval = MBI->get_entities_by_type_and_tag(0, MBENTITYSET, &cat_tag, + group_val, 1, groups); + MB_CHK_SET_ERR(rval, "Failed to retrieve groups from the MOAB instance"); + return rval; +} + Tag DagMC::category_tag() { return get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, MB_TAG_SPARSE, MB_TYPE_OPAQUE); diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index be21163a32..a91d13b6c8 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -256,6 +256,9 @@ class DagMC { unsigned int num_entities(int dimension); private: + /** get group sets */ + ErrorCode get_groups(Range& groups); + /** build internal index vectors that speed up handle-by-id, etc. */ ErrorCode build_indices(Range& surfs, Range& vols); From 882d57e445c0b7d51932cb012597824ceae8c34b Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 15:04:17 -0600 Subject: [PATCH 07/50] Adding a utility header and function for transforming a string to lowercase characters in place. --- src/dagmc/dagmcmetadata.cpp | 6 +++--- src/dagmc/util.hpp | 14 ++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) create mode 100644 src/dagmc/util.hpp diff --git a/src/dagmc/dagmcmetadata.cpp b/src/dagmc/dagmcmetadata.cpp index d834560fd6..9d9aee3743 100644 --- a/src/dagmc/dagmcmetadata.cpp +++ b/src/dagmc/dagmcmetadata.cpp @@ -4,6 +4,8 @@ #include #include +#include "util.hpp" + // constructor for metadata class dagmcMetaData::dagmcMetaData(moab::DagMC* dag_ptr, bool verbosity, bool require_density_present) @@ -339,9 +341,7 @@ void dagmcMetaData::parse_tally_volume_data() { } std::string dagmcMetaData::to_lower(std::string input) { - for (int i = 0; i < input.size(); i++) { - input[i] = std::tolower(input[i]); - } + lowercase_str(input); return input; } diff --git a/src/dagmc/util.hpp b/src/dagmc/util.hpp new file mode 100644 index 0000000000..5f6857060e --- /dev/null +++ b/src/dagmc/util.hpp @@ -0,0 +1,14 @@ + + +// include guard +#ifndef _DAGMC_UTIL +#define _DAGMC_UTIL + +#include + +inline void lowercase_str(std::string& input) { + std::transform(input.begin(), input.end(), input.begin(), + [](unsigned char c){ return std::tolower(c); }); +} + +#endif \ No newline at end of file From 73a34eeb7f4476129ca145a474cd07fbe797858e Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 18:18:49 -0600 Subject: [PATCH 08/50] Adding test for graveyard on the demo model. --- src/dagmc/DagMC.cpp | 24 ++++++++++++++++++++++++ src/dagmc/DagMC.hpp | 4 ++++ src/dagmc/tests/dagmc_graveyard_test.cpp | 8 +++++--- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 4d3a5f2a61..dd452d804b 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -1,4 +1,5 @@ #include "DagMC.hpp" +#include "util.hpp" #include #include @@ -212,6 +213,29 @@ ErrorCode DagMC::setup_indices() { return MB_SUCCESS; } +bool DagMC::has_graveyard() { + Range groups; + ErrorCode rval = get_groups(groups); + MB_CHK_SET_ERR_CONT(rval, "Failed to retrieve groups"); + + // get the name of each group and check for the 'mat:graveyard' string + for (auto group : groups) { + std::string group_name; + group_name.resize(NAME_TAG_SIZE); + + rval = moab_instance()->tag_get_data(name_tag(), &group, 1, const_cast(group_name.c_str())); + MB_CHK_SET_ERR_CONT(rval, "Failed to get group name"); + + // convert name to lower case + lowercase_str(group_name); + + // check for the graveyard string + if (group_name == graveyard_name) { return true; } + } + + return false; +} + ErrorCode DagMC::create_graveyard(bool overwrite) { // internal structure used to track geometry bounds diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index a91d13b6c8..c1d39d118a 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -39,6 +39,7 @@ static const int curve_handle_idx = 1; static const int surfs_handle_idx = 2; static const int vols_handle_idx = 3; static const int groups_handle_idx = 4; +static const std::string graveyard_name = "mat:graveyard\0"; class CartVect; class GeomQueryTool; @@ -171,6 +172,9 @@ class DagMC { */ ErrorCode create_graveyard(bool overwrite = false); + /** The model contains a graveyard volume */ + bool has_graveyard(); + private: /** convenience function for creating a box of triangles from a bounding box */ ErrorCode box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set); diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 8e1e9a87a9..c6a91fcb20 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -12,9 +12,9 @@ using moab::DagMC; moab::DagMC* DAG; -static const char input_file[] = "test_geom.h5m"; +static const char input_file[] = "test_dagmc.h5m"; -class DagmcSimpleTest : public ::testing::Test { +class DagmcGraveyardTest : public ::testing::Test { protected: virtual void SetUp() {} virtual void TearDown() {} @@ -28,8 +28,10 @@ class GraveyardTest : public::testing::Test { virtual void TearDown() {} }; -TEST_F(DagmcSimpleTest, dagmc_load_file) { +TEST_F(DagmcGraveyardTest, dagmc_load_file) { DAG = new DagMC(); ErrorCode rval = DAG->load_file(input_file); // open the Dag file EXPECT_EQ(rval, MB_SUCCESS); + + EXPECT_FALSE(DAG->has_graveyard()); } From 8c131a5bffb6574499dc9fadfa8faa380d9df6a2 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 20:01:16 -0600 Subject: [PATCH 09/50] Sizing category strings to they are recognizable by the MOAB tagging system. --- src/dagmc/DagMC.cpp | 48 ++++++++++++++++++++++-- src/dagmc/DagMC.hpp | 2 +- src/dagmc/tests/dagmc_graveyard_test.cpp | 8 ++++ 3 files changed, 53 insertions(+), 5 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index dd452d804b..9e7a8e6723 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -229,6 +229,9 @@ bool DagMC::has_graveyard() { // convert name to lower case lowercase_str(group_name); + // resize to match lengths + group_name.resize(graveyard_name.size()); + // check for the graveyard string if (group_name == graveyard_name) { return true; } } @@ -286,7 +289,9 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { MB_CHK_SET_ERR(rval, "Failed to get graveyard volume's id"); // set the category tag - std::string volume_str = "Volume"; + std::string volume_str; + volume_str.resize(CATEGORY_TAG_SIZE); + volume_str = "Volume"; rval = MBI->tag_set_data(category_tag(), &volume_set, 1, volume_str.c_str()); MB_CHK_SET_ERR(rval, "Failed to set graveyard volume category"); @@ -339,6 +344,39 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->tag_set_data(sense_tag(), &outer_surface, 1, outer_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); + // create group set for the graveyard volume + EntityHandle group_set; + rval = MBI->create_meshset(0, group_set); + MB_CHK_SET_ERR(rval, "Failed to create a new graveyard group set"); + + // set the group dimension + int group_dim = 4; + rval = MBI->tag_set_data(geom_tag(), &group_set, 1, &group_dim); + MB_CHK_SET_ERR(rval, "Failed to set the graveyard group dimension"); + + // set the group category + std::string group_str = "Group\0"; + group_str.resize(CATEGORY_TAG_SIZE); + std::cout << group_str << std::endl; + rval = MBI->tag_set_data(category_tag(), &group_set, 1, group_str.c_str()); + MB_CHK_SET_ERR(rval, "Failed to set the group category"); + + // set the volume name tag data (material metadata) + rval = MBI->tag_set_data(name_tag(), &group_set, 1, graveyard_name.c_str()); + MB_CHK_SET_ERR(rval, "Failed to set the graveyard name"); + + // add the graveyard volume to this group + rval = MBI->add_entities(group_set, &volume_set, 1); + MB_CHK_SET_ERR(rval, "Failed to add the graveyard volume to the graveyard group"); + + // // reset BVH data structures + // rval = geom_tool()->delete_all_obb_trees(); + // MB_CHK_SET_ERR(rval, "Failed to remove BVH after creating a graveyard volume"); + + rval = init_OBBTree(); + MB_CHK_SET_ERR(rval, "Failed to re-build the BVH after creating a graveyard volume"); + + return rval; } @@ -400,7 +438,7 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface rval = MBI->create_meshset(0, surface_set); MB_CHK_SET_ERR(rval, "Failed to create a graveyard surface set"); - // add the triangles and vertices to the surface + // add the triangles and vertices to the surface rval = MBI->add_entities(surface_set, new_tris); MB_CHK_SET_ERR(rval, "Failed to add triangles to the graveyard surface set"); @@ -416,12 +454,14 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface int surf_id = get_max_id(2); surf_id++; - // set the volume ID + // set the surface ID rval = MBI->tag_set_data(id_tag(), &surface_set, 1, &surf_id); MB_CHK_SET_ERR(rval, "Failed to get graveyard surface's id"); // set the category tag - std::string surface_str = "Surface"; + std::string surface_str; + surface_str.resize(CATEGORY_TAG_SIZE); + surface_str = "Surface"; rval = MBI->tag_set_data(category_tag(), &surface_set, 1, surface_str.c_str()); MB_CHK_SET_ERR(rval, "Failed to set graveyard volume category"); diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index c1d39d118a..72bab69b4c 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -39,7 +39,7 @@ static const int curve_handle_idx = 1; static const int surfs_handle_idx = 2; static const int vols_handle_idx = 3; static const int groups_handle_idx = 4; -static const std::string graveyard_name = "mat:graveyard\0"; +static const std::string graveyard_name = "mat:graveyard"; class CartVect; class GeomQueryTool; diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index c6a91fcb20..0906b112fb 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -33,5 +33,13 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { ErrorCode rval = DAG->load_file(input_file); // open the Dag file EXPECT_EQ(rval, MB_SUCCESS); + rval = DAG->init_OBBTree(); + EXPECT_EQ(rval, MB_SUCCESS); + EXPECT_FALSE(DAG->has_graveyard()); + + rval = DAG->create_graveyard(); + EXPECT_EQ(rval, MB_SUCCESS); + + EXPECT_TRUE(DAG->has_graveyard()); } From 4416421322df03e82b8fb093a4004226c231ea2e Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 20:05:25 -0600 Subject: [PATCH 10/50] Updating how the group value is constructed in get_groups. --- src/dagmc/DagMC.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 9e7a8e6723..79a25f8f40 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -221,7 +221,8 @@ bool DagMC::has_graveyard() { // get the name of each group and check for the 'mat:graveyard' string for (auto group : groups) { std::string group_name; - group_name.resize(NAME_TAG_SIZE); + rval = get_group_name(group, group_name); + MB_CHK_SET_ERR_CONT(rval, "Failed to get a group name"); rval = moab_instance()->tag_get_data(name_tag(), &group, 1, const_cast(group_name.c_str())); MB_CHK_SET_ERR_CONT(rval, "Failed to get group name"); @@ -709,10 +710,10 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { ErrorCode DagMC::get_groups(Range& groups) { // get group handles Tag cat_tag = category_tag(); - char group_category[CATEGORY_TAG_SIZE]; - std::fill(group_category, group_category + CATEGORY_TAG_SIZE, '\0'); - sprintf(group_category, "%s", "Group"); - const void* const group_val[] = {&group_category}; + std::string group_category; + group_category.resize(CATEGORY_TAG_SIZE); + group_category = "Group"; + const void* const group_val[] = {group_category.c_str()}; ErrorCode rval = MBI->get_entities_by_type_and_tag(0, MBENTITYSET, &cat_tag, group_val, 1, groups); MB_CHK_SET_ERR(rval, "Failed to retrieve groups from the MOAB instance"); From 2f8d21c79397535537c88c2de192fa40cb19bd05 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 20:51:20 -0600 Subject: [PATCH 11/50] Removing a duplicate tag_get_value call. --- src/dagmc/DagMC.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 79a25f8f40..9e9067babd 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -224,9 +224,6 @@ bool DagMC::has_graveyard() { rval = get_group_name(group, group_name); MB_CHK_SET_ERR_CONT(rval, "Failed to get a group name"); - rval = moab_instance()->tag_get_data(name_tag(), &group, 1, const_cast(group_name.c_str())); - MB_CHK_SET_ERR_CONT(rval, "Failed to get group name"); - // convert name to lower case lowercase_str(group_name); From 599a42f7dd467fcc824846f41de3b3347e7e0a69 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 23:35:43 -0600 Subject: [PATCH 12/50] Managing the BVH structure of the implicit complement. --- src/dagmc/DagMC.cpp | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 9e9067babd..674e865325 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -230,6 +230,8 @@ bool DagMC::has_graveyard() { // resize to match lengths group_name.resize(graveyard_name.size()); + std::cout << group_name << std::endl; + // check for the graveyard string if (group_name == graveyard_name) { return true; } } @@ -239,6 +241,10 @@ bool DagMC::has_graveyard() { ErrorCode DagMC::create_graveyard(bool overwrite) { + if (!geom_tool()->have_obb_tree()) { + MB_CHK_SET_ERR(MB_FAILURE, "Graveyard creation attempted without BVH"); + } + // internal structure used to track geometry bounds struct BBOX { double lower[3] = { INFTY, INFTY, INFTY}; @@ -310,6 +316,15 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { box.lower[i] -= 10.0 * numerical_precision(); } + // tear down the implicit complement tree + EntityHandle ic; + rval = geom_tool()->get_implicit_complement(ic); + MB_CHK_SET_ERR(rval, "Failed to get the implicit complement"); + + // delete the implicit complement tree (but not the surface trees) + rval = geom_tool()->delete_obb_tree(ic, true); + MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement tree"); + EntityHandle inner_surface; rval = box_to_surf(box.lower, box.upper, inner_surface); @@ -317,9 +332,13 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->add_parent_child(volume_set, inner_surface); MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + // establish the volume-surface parent-child relationship with the inner surface + rval = MBI->add_parent_child(ic, inner_surface); + MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + // set the surface senses (all triangles have outward normals so this should // be REVERSE wrt the graveyard volume) - EntityHandle inner_senses[2] = {0, volume_set}; + EntityHandle inner_senses[2] = {ic, volume_set}; rval = MBI->tag_set_data(sense_tag(), &inner_surface, 1, inner_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); @@ -336,9 +355,13 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->add_parent_child(volume_set, outer_surface); MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + // establish the volume-surface parent-child relationship with tie outer surface + rval = MBI->add_parent_child(ic, outer_surface); + MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + // set the surface senses (all triangles have outward normals so this should // be FORWARD wrt the graveyard volume) - EntityHandle outer_senses[2] = {volume_set, 0}; + EntityHandle outer_senses[2] = {volume_set, ic}; rval = MBI->tag_set_data(sense_tag(), &outer_surface, 1, outer_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); @@ -367,13 +390,13 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->add_entities(group_set, &volume_set, 1); MB_CHK_SET_ERR(rval, "Failed to add the graveyard volume to the graveyard group"); - // // reset BVH data structures - // rval = geom_tool()->delete_all_obb_trees(); - // MB_CHK_SET_ERR(rval, "Failed to remove BVH after creating a graveyard volume"); - - rval = init_OBBTree(); - MB_CHK_SET_ERR(rval, "Failed to re-build the BVH after creating a graveyard volume"); + // create BVH for both the new implicit complement and the new graveyard + // volume + rval = geom_tool()->construct_obb_tree(volume_set); + MB_CHK_SET_ERR(rval, "Failed to build accel. data structure for the new graveyard volume"); + rval = geom_tool()->construct_obb_tree(ic); + MB_CHK_SET_ERR(rval, "Failed to build accel. data structure for the new implicit complement"); return rval; } From 7b21c203153e796dbe70aba30c03435dc328f318 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 10 Nov 2020 23:44:22 -0600 Subject: [PATCH 13/50] Using some of the GTT methods to simplify creating new geometry sets. --- src/dagmc/DagMC.cpp | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 674e865325..930d919cc1 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -279,18 +279,9 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->create_meshset(0, volume_set); MB_CHK_SET_ERR(rval, "Failed to create a graveyard volume set"); - // tag the volume set with the appropriate info - int volume_dim = 3; - rval = MBI->tag_set_data(geom_tag(), &volume_set, 1, &volume_dim); - MB_CHK_SET_ERR(rval, "Failed to set the graveyard volume's geometric dimension"); - - // determine what ID to give the volume - int vol_id = get_max_id(3); - vol_id++; - - // set the volume ID - rval = MBI->tag_set_data(id_tag(), &volume_set, 1, &vol_id); - MB_CHK_SET_ERR(rval, "Failed to get graveyard volume's id"); + // add volume set to the model + rval = geom_tool()->add_geo_set(volume_set, 3); + MB_CHK_SET_ERR(rval, "Failed to add the volume to the GeomTopoTool"); // set the category tag std::string volume_str; @@ -467,17 +458,8 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface MB_CHK_SET_ERR(rval, "Failed to add vertices to the graveyard surface set"); // tag the surface set with the appropriate info - int surface_dim = 2; - rval = MBI->tag_set_data(geom_tag(), &surface_set, 1, &surface_dim); - MB_CHK_SET_ERR(rval, "Failed to set the graveyard surface's geometric dimension"); - - // determine what ID to give the volume - int surf_id = get_max_id(2); - surf_id++; - - // set the surface ID - rval = MBI->tag_set_data(id_tag(), &surface_set, 1, &surf_id); - MB_CHK_SET_ERR(rval, "Failed to get graveyard surface's id"); + rval = geom_tool()->add_geo_set(surface_set, 2); + MB_CHK_SET_ERR(rval, "Failed to add the surface to the GeomTopoTool"); // set the category tag std::string surface_str; From 2a3969d30e607cfa59b78a85aaeb0f41b4689812 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Wed, 11 Nov 2020 00:01:22 -0600 Subject: [PATCH 14/50] Adding description of the graveyard creation algorithm. Also using GTT methods for adding the graveyard group set. --- src/dagmc/DagMC.cpp | 121 ++++++++++++++++++++++---------------------- src/dagmc/DagMC.hpp | 31 +++++++++++- 2 files changed, 91 insertions(+), 61 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 930d919cc1..99e17e2cd5 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -240,37 +240,47 @@ bool DagMC::has_graveyard() { } ErrorCode DagMC::create_graveyard(bool overwrite) { + /* Methodology + 1) Determine the axis-aligned bounding box of the current model + 2) Create a new volume set for the graveyard + 3) Create a new group labeled as the graveyard and add volume to that group + 4) Create an inner surface from the bounding box + 5) Create an outer surface by extending the inner surface + 6) Add surfaces as children of the new graveyard volume and the implicit + complement + 7) Set the surface senses w.r.t. the new graveyard volume and implicit + complement + 8) Delete the implicit complement volume's out-of-date OBBTree/BVH + 9) Construct the new volume's OBBTree/BVH + 10) Construct the updated implicit complement OBBTree/BVH + */ + + // if a graveyard already exists and we aren't overwriting it, + // report an error + if (has_graveyard() && !overwrite) { + MB_CHK_SET_ERR(rval, "Graveyard already exists"); + } + // currently relying on the BVH as looping over all vertices may + // be prohibitive if (!geom_tool()->have_obb_tree()) { MB_CHK_SET_ERR(MB_FAILURE, "Graveyard creation attempted without BVH"); } - // internal structure used to track geometry bounds - struct BBOX { - double lower[3] = { INFTY, INFTY, INFTY}; - double upper[3] = {-INFTY, -INFTY, -INFTY}; - - bool valid() { - return ( lower[0] <= upper[0] && - lower[1] <= upper[1] && - lower[2] <= upper[2] ); - } - - void update(double x, double y, double z) { - lower[0] = x < lower[0] ? x : lower[0]; - lower[1] = y < lower[1] ? y : lower[1]; - lower[2] = z < lower[2] ? z : lower[2]; + BBOX box; + for(int i = 0; i < num_entities(3); i++) { + moab::EntityHandle vol = this->entity_by_index(3, i+1); + double vmin[3], vmax[3]; + rval = this->getobb(vol, vmin, vmax); + MB_CHK_SET_ERR(rval, "Failed to get volume OBB"); - upper[0] = x > upper[0] ? x : upper[0]; - upper[1] = y > upper[1] ? y : upper[1]; - upper[2] = z > upper[2] ? z : upper[2]; - } + box.update(vmin); + box.update(vmax); + } - void update(double xyz[3]) { - update(xyz[0], xyz[1], xyz[2]); - } - }; - BBOX box; + if (!box.valid()) { + MB_CHK_SET_ERR(rval, "Invalid model bounding box generated for graveyard volume"); + } ErrorCode rval; @@ -290,16 +300,30 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->tag_set_data(category_tag(), &volume_set, 1, volume_str.c_str()); MB_CHK_SET_ERR(rval, "Failed to set graveyard volume category"); - int num_vols = num_entities(3); - double vmin[3], vmax[3]; - for(int i = 0; i < num_vols; i++) { - moab::EntityHandle vol = this->entity_by_index(3, i+1); - rval = this->getobb(vol, vmin, vmax); - MB_CHK_SET_ERR(rval, "Failed to get volume OBB"); + // create group set for the graveyard volume + EntityHandle group_set; + rval = MBI->create_meshset(0, group_set); + MB_CHK_SET_ERR(rval, "Failed to create a new graveyard group set"); - box.update(vmin); - box.update(vmax); - } + rval = geom_tool()->add_geo_set(group_set, 4); + MB_CHK_SET_ERR(rval, "Failed to add the graveyard group to the GeomTopoTool"); + + // set the group category + std::string group_str = "Group\0"; + group_str.resize(CATEGORY_TAG_SIZE); + std::cout << group_str << std::endl; + rval = MBI->tag_set_data(category_tag(), &group_set, 1, group_str.c_str()); + MB_CHK_SET_ERR(rval, "Failed to set the group category"); + + // set the volume name tag data (material metadata) + rval = MBI->tag_set_data(name_tag(), &group_set, 1, graveyard_name.c_str()); + MB_CHK_SET_ERR(rval, "Failed to set the graveyard name"); + + // add the graveyard volume to this group + rval = MBI->add_entities(group_set, &volume_set, 1); + MB_CHK_SET_ERR(rval, "Failed to add the graveyard volume to the graveyard group"); + + /// SURFACE CREATION /// // expand the box a bit for (int i = 0; i < 3; i++) { @@ -312,10 +336,6 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = geom_tool()->get_implicit_complement(ic); MB_CHK_SET_ERR(rval, "Failed to get the implicit complement"); - // delete the implicit complement tree (but not the surface trees) - rval = geom_tool()->delete_obb_tree(ic, true); - MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement tree"); - EntityHandle inner_surface; rval = box_to_surf(box.lower, box.upper, inner_surface); @@ -356,30 +376,11 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->tag_set_data(sense_tag(), &outer_surface, 1, outer_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); - // create group set for the graveyard volume - EntityHandle group_set; - rval = MBI->create_meshset(0, group_set); - MB_CHK_SET_ERR(rval, "Failed to create a new graveyard group set"); - - // set the group dimension - int group_dim = 4; - rval = MBI->tag_set_data(geom_tag(), &group_set, 1, &group_dim); - MB_CHK_SET_ERR(rval, "Failed to set the graveyard group dimension"); + // OBBTree/BVH update - // set the group category - std::string group_str = "Group\0"; - group_str.resize(CATEGORY_TAG_SIZE); - std::cout << group_str << std::endl; - rval = MBI->tag_set_data(category_tag(), &group_set, 1, group_str.c_str()); - MB_CHK_SET_ERR(rval, "Failed to set the group category"); - - // set the volume name tag data (material metadata) - rval = MBI->tag_set_data(name_tag(), &group_set, 1, graveyard_name.c_str()); - MB_CHK_SET_ERR(rval, "Failed to set the graveyard name"); - - // add the graveyard volume to this group - rval = MBI->add_entities(group_set, &volume_set, 1); - MB_CHK_SET_ERR(rval, "Failed to add the graveyard volume to the graveyard group"); + // delete the implicit complement tree (but not the surface trees) + rval = geom_tool()->delete_obb_tree(ic, true); + MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement tree"); // create BVH for both the new implicit complement and the new graveyard // volume diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 72bab69b4c..36a821763d 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -496,7 +496,36 @@ class DagMC { std::vector disList; std::vector dirList; std::vector surList, facList; -}; + + // axis-aligned box used to track geometry bounds + // (internal use only) + struct BBOX { + double lower[3] = { INFTY, INFTY, INFTY}; + double upper[3] = {-INFTY, -INFTY, -INFTY}; + + bool valid() { + return ( lower[0] <= upper[0] && + lower[1] <= upper[1] && + lower[2] <= upper[2] ); + } + + void update(double x, double y, double z) { + lower[0] = x < lower[0] ? x : lower[0]; + lower[1] = y < lower[1] ? y : lower[1]; + lower[2] = z < lower[2] ? z : lower[2]; + + upper[0] = x > upper[0] ? x : upper[0]; + upper[1] = y > upper[1] ? y : upper[1]; + upper[2] = z > upper[2] ? z : upper[2]; + } + + void update(double xyz[3]) { + update(xyz[0], xyz[1], xyz[2]); + } + }; + +}; // end DagMC + inline EntityHandle DagMC::entity_by_index(int dimension, int index) { assert(2 <= dimension && 3 >= dimension && From d356874cc0954d9944116ed99d5755feda506fd6 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Wed, 11 Nov 2020 00:02:46 -0600 Subject: [PATCH 15/50] Removing some comments. --- src/dagmc/DagMC.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 99e17e2cd5..936e71d84a 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -254,6 +254,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { 9) Construct the new volume's OBBTree/BVH 10) Construct the updated implicit complement OBBTree/BVH */ + ErrorCode rval; // if a graveyard already exists and we aren't overwriting it, // report an error @@ -282,8 +283,6 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { MB_CHK_SET_ERR(rval, "Invalid model bounding box generated for graveyard volume"); } - ErrorCode rval; - // create a new volume meshset EntityHandle volume_set; rval = MBI->create_meshset(0, volume_set); @@ -309,9 +308,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { MB_CHK_SET_ERR(rval, "Failed to add the graveyard group to the GeomTopoTool"); // set the group category - std::string group_str = "Group\0"; + std::string group_str = "Group"; group_str.resize(CATEGORY_TAG_SIZE); - std::cout << group_str << std::endl; rval = MBI->tag_set_data(category_tag(), &group_set, 1, group_str.c_str()); MB_CHK_SET_ERR(rval, "Failed to set the group category"); From 0ec092fdc9e601e0616d049c6b4443b2b0855db5 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Wed, 11 Nov 2020 00:49:05 -0600 Subject: [PATCH 16/50] Added bulk of the remove graveyard method. Something is wrong with tree deletion though. --- src/dagmc/DagMC.cpp | 83 ++++++++++++++++++++++-- src/dagmc/DagMC.hpp | 6 ++ src/dagmc/tests/dagmc_graveyard_test.cpp | 4 ++ 3 files changed, 89 insertions(+), 4 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 936e71d84a..8c44159fcf 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -214,10 +214,16 @@ ErrorCode DagMC::setup_indices() { } bool DagMC::has_graveyard() { + return get_graveyard_group() != 0; +} + +EntityHandle DagMC::get_graveyard_group() { Range groups; ErrorCode rval = get_groups(groups); MB_CHK_SET_ERR_CONT(rval, "Failed to retrieve groups"); + EntityHandle graveyard_group = 0; + // get the name of each group and check for the 'mat:graveyard' string for (auto group : groups) { std::string group_name; @@ -230,13 +236,82 @@ bool DagMC::has_graveyard() { // resize to match lengths group_name.resize(graveyard_name.size()); - std::cout << group_name << std::endl; - // check for the graveyard string - if (group_name == graveyard_name) { return true; } + if (group_name == graveyard_name) { + graveyard_group = group; + break; + } + } + + return graveyard_group; +} + +ErrorCode DagMC::remove_graveyard() { + ErrorCode rval; + + EntityHandle graveyard_group = get_graveyard_group(); + + if (graveyard_group == 0) { return MB_SUCCESS; } + + bool trees_exist = geom_tool()->have_obb_tree(); + + // get the graveyard volume(s) + Range graveyard_vols; + rval = moab_instance()->get_entities_by_handle(graveyard_group, graveyard_vols); + MB_CHK_SET_ERR(rval, "Failed to get the graveyard volume(s)"); + + // get the implicit complement + EntityHandle ic = 0; + rval = geom_tool()->get_implicit_complement(ic); + if (rval != MB_ENTITY_NOT_FOUND || rval != MB_SUCCESS) { + MB_CHK_SET_ERR(rval, "Could not get the implicit complement"); } - return false; + Range to_delete; + + for (auto vol : graveyard_vols) { + if (trees_exist) { + // will recursively delete the volume's surface trees as well + rval = geom_tool()->delete_obb_tree(vol); + MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); + } + + Range surfs; + rval = moab_instance()->get_child_meshsets(vol, surfs); + MB_CHK_SET_ERR(rval, "Failed to get the surfaces of the graveyard volume"); + + to_delete.merge(surfs); + + for (auto surf : surfs) { + // add triangles, vertices to the list of entities to remove + Range primitives; + rval = moab_instance()->get_entities_by_handle(surf, primitives); + MB_CHK_SET_ERR(rval, "Failed to get mesh entities of graveyard surface"); + //to_delete.merge(primitives); + + if (ic) { + rval = moab_instance()->remove_child_meshset(ic, surf); + MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); + } + } + } + + // update the implicit complement tree if needed + if (trees_exist && ic) { + rval = geom_tool()->delete_obb_tree(ic, true); + MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); + } + + // delete accumulated entities + rval = moab_instance()->delete_entities(to_delete); + MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); + + if(trees_exist && ic) { + rval = geom_tool()->construct_obb_tree(ic); + MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); + } + + return rval; } ErrorCode DagMC::create_graveyard(bool overwrite) { diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 36a821763d..49c8bcf3bb 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -163,6 +163,9 @@ class DagMC { */ ErrorCode setup_indices(); + /**\brief Removes the graveyard volume. */ + ErrorCode remove_graveyard(); + /**\brief Create a graveyard volume. * * Create a cuboid volume marked with metadata indicating it is the boundary @@ -175,6 +178,9 @@ class DagMC { /** The model contains a graveyard volume */ bool has_graveyard(); + /** Retrieve the graveyard group */ + EntityHandle get_graveyard_group(); + private: /** convenience function for creating a box of triangles from a bounding box */ ErrorCode box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set); diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 0906b112fb..1f6a893d8c 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -42,4 +42,8 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { EXPECT_EQ(rval, MB_SUCCESS); EXPECT_TRUE(DAG->has_graveyard()); + + rval = DAG->remove_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + } From b113b1b699032e937be859d834cfe67de4f122b8 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Wed, 11 Nov 2020 23:07:44 -0600 Subject: [PATCH 17/50] Updates to methods to ensure multiple graveyard removals/additions work successfully. --- src/dagmc/DagMC.cpp | 20 +++++++++++++------- src/dagmc/tests/dagmc_graveyard_test.cpp | 15 +++++++++++++-- 2 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 8c44159fcf..a9d3e61928 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -253,6 +253,10 @@ ErrorCode DagMC::remove_graveyard() { if (graveyard_group == 0) { return MB_SUCCESS; } + Range to_delete; + + to_delete.insert(graveyard_group); + bool trees_exist = geom_tool()->have_obb_tree(); // get the graveyard volume(s) @@ -267,7 +271,12 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Could not get the implicit complement"); } - Range to_delete; + // update the implicit complement tree if needed + if (trees_exist && ic) { + rval = geom_tool()->delete_obb_tree(ic, true); + MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); + } + for (auto vol : graveyard_vols) { if (trees_exist) { @@ -296,12 +305,6 @@ ErrorCode DagMC::remove_graveyard() { } } - // update the implicit complement tree if needed - if (trees_exist && ic) { - rval = geom_tool()->delete_obb_tree(ic, true); - MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); - } - // delete accumulated entities rval = moab_instance()->delete_entities(to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); @@ -311,6 +314,9 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); } + rval = geom_tool()->find_geomsets(); + MB_CHK_SET_ERR(rval, "Failed to find geometry sets after removing the graveyard"); + return rval; } diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 1f6a893d8c..4a9975fa25 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -34,16 +34,27 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { EXPECT_EQ(rval, MB_SUCCESS); rval = DAG->init_OBBTree(); - EXPECT_EQ(rval, MB_SUCCESS); + EXPECT_EQ(MB_SUCCESS, rval); EXPECT_FALSE(DAG->has_graveyard()); rval = DAG->create_graveyard(); - EXPECT_EQ(rval, MB_SUCCESS); + EXPECT_EQ(MB_SUCCESS, rval); EXPECT_TRUE(DAG->has_graveyard()); rval = DAG->remove_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); + EXPECT_FALSE(DAG->has_graveyard()); + + rval = DAG->create_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_TRUE(DAG->has_graveyard()); + + rval = DAG->remove_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_FALSE(DAG->has_graveyard()); } From 3fc839618bdd93a24185202dd4a93d8bed07e924 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 18:19:05 -0600 Subject: [PATCH 18/50] Updating signature of get_graveyard_group. --- src/dagmc/DagMC.cpp | 35 +++-- src/dagmc/DagMC.hpp | 6 +- src/dagmc/tests/test_dagmc.vtk | 225 +++++++++++++++++++++++++++++++++ 3 files changed, 251 insertions(+), 15 deletions(-) create mode 100644 src/dagmc/tests/test_dagmc.vtk diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index a9d3e61928..4b83025678 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -214,16 +214,17 @@ ErrorCode DagMC::setup_indices() { } bool DagMC::has_graveyard() { - return get_graveyard_group() != 0; + EntityHandle eh; + return get_graveyard_group(eh) == MB_SUCCESS && eh != 0; } -EntityHandle DagMC::get_graveyard_group() { +ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { Range groups; ErrorCode rval = get_groups(groups); MB_CHK_SET_ERR_CONT(rval, "Failed to retrieve groups"); - EntityHandle graveyard_group = 0; - + graveyard_group = 0; + int graveyard_count = 0; // get the name of each group and check for the 'mat:graveyard' string for (auto group : groups) { std::string group_name; @@ -234,25 +235,35 @@ EntityHandle DagMC::get_graveyard_group() { lowercase_str(group_name); // resize to match lengths - group_name.resize(graveyard_name.size()); + group_name.resize(GRAVEYARD_NAME.size()); // check for the graveyard string - if (group_name == graveyard_name) { + if (group_name == GRAVEYARD_NAME) { graveyard_group = group; - break; + graveyard_count++; } } - return graveyard_group; + // there should not be more than one graveyard + if (graveyard_count > 1) { + MB_CHK_SET_ERR(MB_FAILURE, "More than one graveyard is present in the model"); + } + + // if the graveyard was not found, return an error + if (graveyard_group == 0) return MB_ENTITY_NOT_FOUND; + + return MB_SUCCESS; } ErrorCode DagMC::remove_graveyard() { ErrorCode rval; - EntityHandle graveyard_group = get_graveyard_group(); - - if (graveyard_group == 0) { return MB_SUCCESS; } + EntityHandle graveyard_group; + rval = get_graveyard_group(graveyard_group); + if (rval == MB_ENTITY_NOT_FOUND) { return MB_SUCCESS; } + MB_CHK_SET_ERR(rval, "Failed to check for existing graveyard volume"); + // set of entities to delete from the MOAB instance Range to_delete; to_delete.insert(graveyard_group); @@ -395,7 +406,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { MB_CHK_SET_ERR(rval, "Failed to set the group category"); // set the volume name tag data (material metadata) - rval = MBI->tag_set_data(name_tag(), &group_set, 1, graveyard_name.c_str()); + rval = MBI->tag_set_data(name_tag(), &group_set, 1, GRAVEYARD_NAME.c_str()); MB_CHK_SET_ERR(rval, "Failed to set the graveyard name"); // add the graveyard volume to this group diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 49c8bcf3bb..5a3a156d9c 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -39,7 +39,7 @@ static const int curve_handle_idx = 1; static const int surfs_handle_idx = 2; static const int vols_handle_idx = 3; static const int groups_handle_idx = 4; -static const std::string graveyard_name = "mat:graveyard"; +static const std::string GRAVEYARD_NAME = "mat:graveyard"; class CartVect; class GeomQueryTool; @@ -179,7 +179,7 @@ class DagMC { bool has_graveyard(); /** Retrieve the graveyard group */ - EntityHandle get_graveyard_group(); + ErrorCode get_graveyard_group(EntityHandle& graveyard_group); private: /** convenience function for creating a box of triangles from a bounding box */ @@ -266,7 +266,7 @@ class DagMC { unsigned int num_entities(int dimension); private: - /** get group sets */ + /** get all group sets on the model */ ErrorCode get_groups(Range& groups); /** build internal index vectors that speed up handle-by-id, etc. */ diff --git a/src/dagmc/tests/test_dagmc.vtk b/src/dagmc/tests/test_dagmc.vtk new file mode 100644 index 0000000000..67fcb50590 --- /dev/null +++ b/src/dagmc/tests/test_dagmc.vtk @@ -0,0 +1,225 @@ +# vtk DataFile Version 3.0 +MOAB 5.1.1 +ASCII +DATASET UNSTRUCTURED_GRID +POINTS 16 double +25 -5 5 +25 5 5 +15 5 5 +15 -5 5 +25 5 -5 +25 -5 -5 +15 -5 -5 +15 5 -5 +5 -5 5 +5 -5 -5 +5 5 -5 +5 5 5 +-5 5 5 +-5 -5 5 +-5 -5 -5 +-5 5 -5 +CELLS 60 212 +2 0 1 +2 1 2 +2 2 3 +2 3 0 +2 4 5 +2 5 6 +2 6 7 +2 7 4 +2 3 6 +2 0 5 +2 2 7 +2 1 4 +2 8 3 +2 9 10 +2 10 7 +2 8 9 +2 11 10 +2 2 11 +2 11 8 +2 6 9 +2 11 12 +2 12 13 +2 13 8 +2 9 14 +2 14 15 +2 15 10 +2 13 14 +2 12 15 +3 1 2 0 +3 0 2 3 +3 5 6 4 +3 4 6 7 +3 3 6 0 +3 0 6 5 +3 2 7 3 +3 3 7 6 +3 1 4 2 +3 2 4 7 +3 0 5 1 +3 1 5 4 +3 8 9 3 +3 3 9 6 +3 11 10 8 +3 8 10 9 +3 2 7 11 +3 11 7 10 +3 2 11 3 +3 3 11 8 +3 6 9 7 +3 7 9 10 +3 11 12 8 +3 8 12 13 +3 9 14 10 +3 10 14 15 +3 13 14 8 +3 8 14 9 +3 12 15 13 +3 13 15 14 +3 11 10 12 +3 12 10 15 +CELL_TYPES 60 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +3 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +5 +POINT_DATA 16 +SCALARS GLOBAL_ID int 1 +LOOKUP_TABLE default +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +CELL_DATA 60 +SCALARS GLOBAL_ID int 1 +LOOKUP_TABLE default +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 From 2aff072ffc7f339548e976e6e2430428ba2c1a54 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 20:38:34 -0600 Subject: [PATCH 19/50] Making sure all entities get removed when removing the graveyard. --- src/dagmc/DagMC.cpp | 75 +++++++++++++++++++++++++++++---------------- 1 file changed, 48 insertions(+), 27 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 4b83025678..71be65f647 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -264,9 +264,11 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to check for existing graveyard volume"); // set of entities to delete from the MOAB instance - Range to_delete; + Range ents_to_delete; + // vertices need to be tracked separately and deleted after everything else + Range verts_to_delete; - to_delete.insert(graveyard_group); + ents_to_delete.insert(graveyard_group); bool trees_exist = geom_tool()->have_obb_tree(); @@ -288,8 +290,8 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); } - for (auto vol : graveyard_vols) { + ents_to_delete.insert(vol); if (trees_exist) { // will recursively delete the volume's surface trees as well rval = geom_tool()->delete_obb_tree(vol); @@ -299,15 +301,19 @@ ErrorCode DagMC::remove_graveyard() { Range surfs; rval = moab_instance()->get_child_meshsets(vol, surfs); MB_CHK_SET_ERR(rval, "Failed to get the surfaces of the graveyard volume"); - - to_delete.merge(surfs); + ents_to_delete.merge(surfs); for (auto surf : surfs) { // add triangles, vertices to the list of entities to remove - Range primitives; - rval = moab_instance()->get_entities_by_handle(surf, primitives); - MB_CHK_SET_ERR(rval, "Failed to get mesh entities of graveyard surface"); - //to_delete.merge(primitives); + Range triangles; + rval = moab_instance()->get_entities_by_type(surf, MBTRI, triangles); + MB_CHK_SET_ERR(rval, "Failed to get triangles of the graveyard surface"); + ents_to_delete.merge(triangles); + + Range vertices; + rval = moab_instance()->get_entities_by_type(surf, MBVERTEX, vertices); + MB_CHK_SET_ERR(rval, "Failed to get vertices of the graveyard surface"); + verts_to_delete.merge(vertices); if (ic) { rval = moab_instance()->remove_child_meshset(ic, surf); @@ -317,9 +323,12 @@ ErrorCode DagMC::remove_graveyard() { } // delete accumulated entities - rval = moab_instance()->delete_entities(to_delete); + rval = moab_instance()->delete_entities(ents_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); + rval = moab_instance()->delete_entities(verts_to_delete); + MB_CHK_SET_ERR(rval, "Failed to delete graveyard vertices"); + if(trees_exist && ic) { rval = geom_tool()->construct_obb_tree(ic); MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); @@ -328,30 +337,39 @@ ErrorCode DagMC::remove_graveyard() { rval = geom_tool()->find_geomsets(); MB_CHK_SET_ERR(rval, "Failed to find geometry sets after removing the graveyard"); - return rval; + // re-initialize indices + rval = setup_indices(); + MB_CHK_SET_ERR(rval, "Failed to setup DAGMC indices"); + + return MB_SUCCESS; } ErrorCode DagMC::create_graveyard(bool overwrite) { /* Methodology - 1) Determine the axis-aligned bounding box of the current model - 2) Create a new volume set for the graveyard - 3) Create a new group labeled as the graveyard and add volume to that group - 4) Create an inner surface from the bounding box - 5) Create an outer surface by extending the inner surface - 6) Add surfaces as children of the new graveyard volume and the implicit + - Determine the axis-aligned bounding box of the current model + - Create a new volume set for the graveyard + - Create a new group labeled as the graveyard and add volume to that group + - Create an inner surface from the bounding box + - Create an outer surface by extending the inner surface + - Add surfaces as children of the new graveyard volume and the implicit complement - 7) Set the surface senses w.r.t. the new graveyard volume and implicit + - Set the surface senses w.r.t. the new graveyard volume and implicit complement - 8) Delete the implicit complement volume's out-of-date OBBTree/BVH - 9) Construct the new volume's OBBTree/BVH - 10) Construct the updated implicit complement OBBTree/BVH + - Delete the implicit complement volume's out-of-date OBBTree/BVH + - Construct the new volume's OBBTree/BVH + - Construct the updated implicit complement OBBTree/BVH */ ErrorCode rval; + // remove existing graveyard + if(overwrite) { + remove_graveyard(); + } + // if a graveyard already exists and we aren't overwriting it, // report an error if (has_graveyard() && !overwrite) { - MB_CHK_SET_ERR(rval, "Graveyard already exists"); + MB_CHK_SET_ERR(MB_FAILURE, "Graveyard already exists"); } // currently relying on the BVH as looping over all vertices may @@ -400,8 +418,9 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { MB_CHK_SET_ERR(rval, "Failed to add the graveyard group to the GeomTopoTool"); // set the group category - std::string group_str = "Group"; + std::string group_str; group_str.resize(CATEGORY_TAG_SIZE); + group_str = "Group"; rval = MBI->tag_set_data(category_tag(), &group_set, 1, group_str.c_str()); MB_CHK_SET_ERR(rval, "Failed to set the group category"); @@ -480,6 +499,10 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = geom_tool()->construct_obb_tree(ic); MB_CHK_SET_ERR(rval, "Failed to build accel. data structure for the new implicit complement"); + // re-initialize indices + rval = setup_indices(); + MB_CHK_SET_ERR(rval, "Failed to setup indices after graveyard creation"); + return rval; } @@ -803,9 +826,8 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { ErrorCode DagMC::get_groups(Range& groups) { // get group handles Tag cat_tag = category_tag(); - std::string group_category; + std::string group_category = "Group"; group_category.resize(CATEGORY_TAG_SIZE); - group_category = "Group"; const void* const group_val[] = {group_category.c_str()}; ErrorCode rval = MBI->get_entities_by_type_and_tag(0, MBENTITYSET, &cat_tag, group_val, 1, groups); @@ -814,8 +836,7 @@ ErrorCode DagMC::get_groups(Range& groups) { } Tag DagMC::category_tag() { - return get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, - MB_TAG_SPARSE, MB_TYPE_OPAQUE); + return get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, MB_TAG_SPARSE, MB_TYPE_OPAQUE); } /* SECTION IV: Handling DagMC settings */ From 99fc6fbc29a6e977d276ec30a5233ca8cf019fcc Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 20:39:13 -0600 Subject: [PATCH 20/50] Adding checks that the number/type of entities and entity sets remain the same before and after graveyard removal. --- src/dagmc/tests/dagmc_graveyard_test.cpp | 41 +++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 4a9975fa25..5d864aa9ed 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -31,16 +31,32 @@ class GraveyardTest : public::testing::Test { TEST_F(DagmcGraveyardTest, dagmc_load_file) { DAG = new DagMC(); ErrorCode rval = DAG->load_file(input_file); // open the Dag file - EXPECT_EQ(rval, MB_SUCCESS); + EXPECT_EQ(MB_SUCCESS, rval); rval = DAG->init_OBBTree(); EXPECT_EQ(MB_SUCCESS, rval); + Range starting_vertices; + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); + EXPECT_EQ(MB_SUCCESS, rval); + + Range starting_triangles; + rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); + EXPECT_EQ(MB_SUCCESS, rval); + + Range starting_sets; + rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); + EXPECT_EQ(MB_SUCCESS, rval); + EXPECT_FALSE(DAG->has_graveyard()); + int n_vols = DAG->num_entities(3); + rval = DAG->create_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); + EXPECT_EQ(n_vols + 1, DAG->num_entities(3)); + EXPECT_TRUE(DAG->has_graveyard()); rval = DAG->remove_graveyard(); @@ -57,4 +73,27 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { EXPECT_EQ(MB_SUCCESS, rval); EXPECT_FALSE(DAG->has_graveyard()); + + // checks to make sure we didn't accumulate any new data on the mesh + Range ending_vertices; + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, ending_vertices); + EXPECT_EQ(MB_SUCCESS, rval); + + Range ending_triangles; + rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, ending_triangles); + EXPECT_EQ(MB_SUCCESS, rval); + + Range ending_sets; + rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(starting_vertices.size(), ending_vertices.size()); + EXPECT_EQ(0, subtract(starting_vertices, ending_vertices).size()); + + EXPECT_EQ(starting_triangles.size(), ending_triangles.size()); + EXPECT_EQ(0, subtract(starting_triangles, ending_triangles).size()); + + EXPECT_EQ(starting_sets.size(), ending_sets.size()); + EXPECT_EQ(0, subtract(starting_sets, ending_sets).size()); + } From 77e0d348435f0b52c098e39443d123b0ba3f8c68 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 20:52:22 -0600 Subject: [PATCH 21/50] Adding futher tests. --- src/dagmc/tests/dagmc_graveyard_test.cpp | 33 +++++++++++++++++++----- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 5d864aa9ed..1dc1c3db5d 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -5,14 +5,15 @@ #include "DagMC.hpp" #include +#include using namespace moab; using moab::DagMC; -moab::DagMC* DAG; +std::unique_ptr DAG; -static const char input_file[] = "test_dagmc.h5m"; +static std::string input_file = "test_dagmc.h5m"; class DagmcGraveyardTest : public ::testing::Test { protected: @@ -23,19 +24,19 @@ class DagmcGraveyardTest : public ::testing::Test { class GraveyardTest : public::testing::Test { protected: - virtual void SetUp() override {} virtual void TearDown() {} }; -TEST_F(DagmcGraveyardTest, dagmc_load_file) { - DAG = new DagMC(); - ErrorCode rval = DAG->load_file(input_file); // open the Dag file +TEST_F(DagmcGraveyardTest, dagmc_graveyard_tests) { + DAG = std::unique_ptr(new DagMC()); + ErrorCode rval = DAG->load_file(input_file.c_str()); // open the Dag file EXPECT_EQ(MB_SUCCESS, rval); rval = DAG->init_OBBTree(); EXPECT_EQ(MB_SUCCESS, rval); + // collect starting sets to make sure we end up with the same thing at the end Range starting_vertices; rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); EXPECT_EQ(MB_SUCCESS, rval); @@ -48,20 +49,26 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); EXPECT_EQ(MB_SUCCESS, rval); + // there is no graveyard present in this model EXPECT_FALSE(DAG->has_graveyard()); int n_vols = DAG->num_entities(3); + int n_surfs = DAG->num_entities(2); rval = DAG->create_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); EXPECT_EQ(n_vols + 1, DAG->num_entities(3)); + EXPECT_EQ(n_surfs + 2, DAG->num_entities(2)); EXPECT_TRUE(DAG->has_graveyard()); rval = DAG->remove_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); + EXPECT_EQ(n_vols, DAG->num_entities(3)); + EXPECT_EQ(n_surfs, DAG->num_entities(2)); + EXPECT_FALSE(DAG->has_graveyard()); rval = DAG->create_graveyard(); @@ -69,6 +76,19 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { EXPECT_TRUE(DAG->has_graveyard()); + // test overwrite capability + bool overwrite_graveyard = true; + rval = DAG->create_graveyard(true); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(n_vols + 1, DAG->num_entities(3)); + EXPECT_EQ(n_surfs + 2, DAG->num_entities(2)); + + // this should fail, graveyard already exists + // and overwrite isn't specified + rval = DAG->create_graveyard(); + EXPECT_EQ(MB_FAILURE, rval); + rval = DAG->remove_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); @@ -95,5 +115,4 @@ TEST_F(DagmcGraveyardTest, dagmc_load_file) { EXPECT_EQ(starting_sets.size(), ending_sets.size()); EXPECT_EQ(0, subtract(starting_sets, ending_sets).size()); - } From 14c23f293b9ece9f41b4547590566c7006dc4851 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 21:19:29 -0600 Subject: [PATCH 22/50] Some cleanup from self-review. --- src/dagmc/DagMC.cpp | 35 +++-- src/dagmc/DagMC.hpp | 22 ++-- src/dagmc/tests/test_dagmc.vtk | 225 --------------------------------- src/dagmc/util.hpp | 3 - 4 files changed, 27 insertions(+), 258 deletions(-) delete mode 100644 src/dagmc/tests/test_dagmc.vtk diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 71be65f647..4845dd92c2 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -225,16 +225,16 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { graveyard_group = 0; int graveyard_count = 0; - // get the name of each group and check for the 'mat:graveyard' string + // get the name of each group and check for the GRAVEYARD_NAME string for (auto group : groups) { std::string group_name; rval = get_group_name(group, group_name); MB_CHK_SET_ERR_CONT(rval, "Failed to get a group name"); - // convert name to lower case + // convert name to lower case for comparison lowercase_str(group_name); - // resize to match lengths + // resize to match the length (trims trailing empty values) group_name.resize(GRAVEYARD_NAME.size()); // check for the graveyard string @@ -244,9 +244,9 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { } } - // there should not be more than one graveyard + // there should not be more than one graveyard group if (graveyard_count > 1) { - MB_CHK_SET_ERR(MB_FAILURE, "More than one graveyard is present in the model"); + MB_CHK_SET_ERR(MB_FAILURE, "More than one graveyard group is present in the model"); } // if the graveyard was not found, return an error @@ -272,12 +272,12 @@ ErrorCode DagMC::remove_graveyard() { bool trees_exist = geom_tool()->have_obb_tree(); - // get the graveyard volume(s) + // get the graveyard volume Range graveyard_vols; rval = moab_instance()->get_entities_by_handle(graveyard_group, graveyard_vols); MB_CHK_SET_ERR(rval, "Failed to get the graveyard volume(s)"); - // get the implicit complement + // get the implicit complement, it's children will need updating EntityHandle ic = 0; rval = geom_tool()->get_implicit_complement(ic); if (rval != MB_ENTITY_NOT_FOUND || rval != MB_SUCCESS) { @@ -290,14 +290,17 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); } + // collect graveyard volume entities for deletion for (auto vol : graveyard_vols) { ents_to_delete.insert(vol); + if (trees_exist) { // will recursively delete the volume's surface trees as well rval = geom_tool()->delete_obb_tree(vol); MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); } + // collect entities from the graveyard surfaces Range surfs; rval = moab_instance()->get_child_meshsets(vol, surfs); MB_CHK_SET_ERR(rval, "Failed to get the surfaces of the graveyard volume"); @@ -315,6 +318,7 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to get vertices of the graveyard surface"); verts_to_delete.merge(vertices); + // update implicit complement relationships if (ic) { rval = moab_instance()->remove_child_meshset(ic, surf); MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); @@ -326,18 +330,21 @@ ErrorCode DagMC::remove_graveyard() { rval = moab_instance()->delete_entities(ents_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); + // delete accumulated vertices rval = moab_instance()->delete_entities(verts_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard vertices"); + // re-construct the implicit complement's tree if needed if(trees_exist && ic) { rval = geom_tool()->construct_obb_tree(ic); MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); } + // update geometry sets in the GTT rval = geom_tool()->find_geomsets(); MB_CHK_SET_ERR(rval, "Failed to find geometry sets after removing the graveyard"); - // re-initialize indices + // re-initialize DAGMC indices rval = setup_indices(); MB_CHK_SET_ERR(rval, "Failed to setup DAGMC indices"); @@ -345,7 +352,7 @@ ErrorCode DagMC::remove_graveyard() { } ErrorCode DagMC::create_graveyard(bool overwrite) { - /* Methodology + /* Method summary - Determine the axis-aligned bounding box of the current model - Create a new volume set for the graveyard - Create a new group labeled as the graveyard and add volume to that group @@ -761,16 +768,6 @@ int DagMC::get_entity_id(EntityHandle this_ent) { return GTT->global_id(this_ent); } -int DagMC::get_max_id(int dimension) { - // determine what ID to give the volume - int max_id = 0; - for (int i = 0; i < num_entities(dimension); i++) { - int id = id_by_index(dimension, i); - max_id = std::max(id, max_id); - } - return max_id; -} - ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { ErrorCode rval = MB_SUCCESS; diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 5a3a156d9c..d897d46df7 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -32,8 +32,6 @@ class RayTracingInterface; namespace moab { -constexpr double INFTY {std::numeric_limits::max()}; - static const int vertex_handle_idx = 0; static const int curve_handle_idx = 1; static const int surfs_handle_idx = 2; @@ -169,20 +167,23 @@ class DagMC { /**\brief Create a graveyard volume. * * Create a cuboid volume marked with metadata indicating it is the boundary - * of the DAGMC model. This method will create an additional graveyard - * if one already exists. Use the has_graveyard method to check - * if the DAGMC instance already has a graveyard. + * of the DAGMC model. This method will fail if a graveyard volume already + * exists and `overwrite` is not true. + * */ ErrorCode create_graveyard(bool overwrite = false); - /** The model contains a graveyard volume */ + /** True if the model has a graveyard volume, false if not */ bool has_graveyard(); - /** Retrieve the graveyard group */ + /** Retrieve the graveyard group on the model if it exists */ ErrorCode get_graveyard_group(EntityHandle& graveyard_group); private: - /** convenience function for creating a box of triangles from a bounding box */ + /** convenience function for converting a bounding box into a box of triangles + * with outward facing normals + * + */ ErrorCode box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set); /** loading code shared by load_file and load_existing_contents */ @@ -253,9 +254,6 @@ class DagMC { /** map from EntityHandle to global ID */ int get_entity_id(EntityHandle this_ent); - /** get the largest ID value for entities of a specified dimension */ - int get_max_id(int dimension); - /**\brief get number of geometric sets corresponding to geometry of specified dimension * * For a given dimension (e.g. dimension=3 for volumes, dimension=2 for @@ -506,6 +504,8 @@ class DagMC { // axis-aligned box used to track geometry bounds // (internal use only) struct BBOX { + constexpr static double INFTY {std::numeric_limits::max()}; + double lower[3] = { INFTY, INFTY, INFTY}; double upper[3] = {-INFTY, -INFTY, -INFTY}; diff --git a/src/dagmc/tests/test_dagmc.vtk b/src/dagmc/tests/test_dagmc.vtk deleted file mode 100644 index 67fcb50590..0000000000 --- a/src/dagmc/tests/test_dagmc.vtk +++ /dev/null @@ -1,225 +0,0 @@ -# vtk DataFile Version 3.0 -MOAB 5.1.1 -ASCII -DATASET UNSTRUCTURED_GRID -POINTS 16 double -25 -5 5 -25 5 5 -15 5 5 -15 -5 5 -25 5 -5 -25 -5 -5 -15 -5 -5 -15 5 -5 -5 -5 5 -5 -5 -5 -5 5 -5 -5 5 5 --5 5 5 --5 -5 5 --5 -5 -5 --5 5 -5 -CELLS 60 212 -2 0 1 -2 1 2 -2 2 3 -2 3 0 -2 4 5 -2 5 6 -2 6 7 -2 7 4 -2 3 6 -2 0 5 -2 2 7 -2 1 4 -2 8 3 -2 9 10 -2 10 7 -2 8 9 -2 11 10 -2 2 11 -2 11 8 -2 6 9 -2 11 12 -2 12 13 -2 13 8 -2 9 14 -2 14 15 -2 15 10 -2 13 14 -2 12 15 -3 1 2 0 -3 0 2 3 -3 5 6 4 -3 4 6 7 -3 3 6 0 -3 0 6 5 -3 2 7 3 -3 3 7 6 -3 1 4 2 -3 2 4 7 -3 0 5 1 -3 1 5 4 -3 8 9 3 -3 3 9 6 -3 11 10 8 -3 8 10 9 -3 2 7 11 -3 11 7 10 -3 2 11 3 -3 3 11 8 -3 6 9 7 -3 7 9 10 -3 11 12 8 -3 8 12 13 -3 9 14 10 -3 10 14 15 -3 13 14 8 -3 8 14 9 -3 12 15 13 -3 13 15 14 -3 11 10 12 -3 12 10 15 -CELL_TYPES 60 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -5 -POINT_DATA 16 -SCALARS GLOBAL_ID int 1 -LOOKUP_TABLE default -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -CELL_DATA 60 -SCALARS GLOBAL_ID int 1 -LOOKUP_TABLE default -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 -0 diff --git a/src/dagmc/util.hpp b/src/dagmc/util.hpp index 5f6857060e..a91fbfc0e6 100644 --- a/src/dagmc/util.hpp +++ b/src/dagmc/util.hpp @@ -1,6 +1,3 @@ - - -// include guard #ifndef _DAGMC_UTIL #define _DAGMC_UTIL From 401c54b07b038e876e032397a91ff4ed9cf7f979 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 22:41:22 -0600 Subject: [PATCH 23/50] Removing curves as well. Making box bump larger for now. --- src/dagmc/DagMC.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 4845dd92c2..fb4b7f8da6 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -318,6 +318,18 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to get vertices of the graveyard surface"); verts_to_delete.merge(vertices); + Range curves; + rval = moab_instance()->get_child_meshsets(surf, curves); + MB_CHK_SET_ERR(rval, "Failed to get the graveyard surface curves"); + ents_to_delete.merge(curves); + + for (auto curve : curves) { + Range edges; + rval = moab_instance()->get_entities_by_type(curve, MBEDGE, edges); + MB_CHK_SET_ERR(rval, "Failed to get graveyard curve edges"); + ents_to_delete.merge(edges); + } + // update implicit complement relationships if (ic) { rval = moab_instance()->remove_child_meshset(ic, surf); @@ -443,8 +455,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // expand the box a bit for (int i = 0; i < 3; i++) { - box.upper[i] += 10.0 * numerical_precision(); - box.lower[i] -= 10.0 * numerical_precision(); + box.upper[i] += 5.0; + box.lower[i] -= 5.0; } // tear down the implicit complement tree @@ -471,8 +483,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // expand the box a bit again for the outer surface for (int i = 0; i < 3; i++) { - box.upper[i] += 10.0 * numerical_precision(); - box.lower[i] -= 10.0 * numerical_precision(); + box.upper[i] += 2.0; + box.lower[i] -= 2.0; } EntityHandle outer_surface; From 9037469557bcb11e7455147fd994b5a7bcddbfcb Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 27 Nov 2020 22:53:19 -0600 Subject: [PATCH 24/50] Adding removal of geometric vertex sets. --- src/dagmc/DagMC.cpp | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index fb4b7f8da6..ca72c9ec99 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -321,13 +321,32 @@ ErrorCode DagMC::remove_graveyard() { Range curves; rval = moab_instance()->get_child_meshsets(surf, curves); MB_CHK_SET_ERR(rval, "Failed to get the graveyard surface curves"); - ents_to_delete.merge(curves); for (auto curve : curves) { + ents_to_delete.insert(curve); Range edges; rval = moab_instance()->get_entities_by_type(curve, MBEDGE, edges); MB_CHK_SET_ERR(rval, "Failed to get graveyard curve edges"); ents_to_delete.merge(edges); + + Range curve_vertices; + rval = moab_instance()->get_entities_by_type(curve, MBVERTEX, curve_vertices); + MB_CHK_SET_ERR(rval, "Failed to get graveyard curve vertices"); + verts_to_delete.merge(curve_vertices); + + // now remove the geometric vertex sets (vertices represented in the CAD + // representing the end of an analytic curve) + Range geom_vertices; + rval = moab_instance()->get_child_meshsets(curve, geom_vertices); + MB_CHK_SET_ERR(rval, "Failed to get the graveyard curve's geometric vertices"); + for (auto geom_vert : geom_vertices) { + ents_to_delete.insert(geom_vert); + // the only entities in here should be vertices + Range geom_vertices; + rval = moab_instance()->get_entities_by_type(geom_vert, MBVERTEX, geom_vertices); + MB_CHK_SET_ERR(rval, "Failed to get graveyard curve vertices"); + verts_to_delete.merge(geom_vertices); + } } // update implicit complement relationships From f93f7b30c11ffd3c404c152f97b78b3d99dca568 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 28 Nov 2020 10:35:36 -0600 Subject: [PATCH 25/50] Updating connectivity scheme when creating box triangles. --- src/dagmc/DagMC.cpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index ca72c9ec99..f190332f0d 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -400,7 +400,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { ErrorCode rval; // remove existing graveyard - if(overwrite) { + if (overwrite) { remove_graveyard(); } @@ -550,15 +550,15 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface //start with vertices std::vector> vertex_coords; // vertex coordinates for the lower z face - vertex_coords.push_back({llc[0], llc[1], llc[2]}); - vertex_coords.push_back({urc[0], llc[1], llc[2]}); - vertex_coords.push_back({urc[0], urc[1], llc[2]}); - vertex_coords.push_back({llc[0], urc[1], llc[2]}); - // vertex coordinate for the upper z face - vertex_coords.push_back({llc[0], llc[1], urc[2]}); vertex_coords.push_back({urc[0], llc[1], urc[2]}); vertex_coords.push_back({urc[0], urc[1], urc[2]}); vertex_coords.push_back({llc[0], urc[1], urc[2]}); + vertex_coords.push_back({llc[0], llc[1], urc[2]}); + // vertex coordinate for the upper z face + vertex_coords.push_back({urc[0], llc[1], llc[2]}); + vertex_coords.push_back({urc[0], urc[1], llc[2]}); + vertex_coords.push_back({llc[0], urc[1], llc[2]}); + vertex_coords.push_back({llc[0], llc[1], llc[2]}); std::vector box_verts; for(const auto& coords : vertex_coords) { @@ -571,23 +571,23 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface // now we have 8 vertices to create triangles with std::vector> connectivity_indices; // lower z - connectivity_indices.push_back({1, 0, 2}); - connectivity_indices.push_back({3, 2, 0}); + connectivity_indices.push_back({0, 1, 3}); + connectivity_indices.push_back({3, 1, 2}); // upper z - connectivity_indices.push_back({5, 6, 4}); - connectivity_indices.push_back({7, 4, 6}); + connectivity_indices.push_back({4, 7, 5}); + connectivity_indices.push_back({7, 6, 5}); // lower x - connectivity_indices.push_back({0, 1, 4}); - connectivity_indices.push_back({3, 4, 1}); + connectivity_indices.push_back({6, 3, 2}); + connectivity_indices.push_back({7, 3, 6}); // upper x - connectivity_indices.push_back({2, 3, 6}); - connectivity_indices.push_back({7, 6, 3}); + connectivity_indices.push_back({0, 4, 1}); + connectivity_indices.push_back({5, 1, 4}); // lower y - connectivity_indices.push_back({0, 4, 3}); - connectivity_indices.push_back({7, 3, 4}); + connectivity_indices.push_back({0, 3, 4}); + connectivity_indices.push_back({7, 4, 3}); // upper y - connectivity_indices.push_back({1, 2, 3}); - connectivity_indices.push_back({6, 3, 2}); + connectivity_indices.push_back({1, 6, 2}); + connectivity_indices.push_back({6, 1, 5}); moab::Range new_tris; for(const auto& ind : connectivity_indices) { From 4e9d102fcd11736351e7ee2ec07e3887d7f25f58 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 28 Nov 2020 10:56:23 -0600 Subject: [PATCH 26/50] Adding graveyard tests using a file exported from Trelis. --- src/dagmc/tests/CMakeLists.txt | 2 + src/dagmc/tests/dagmc_graveyard_test.cpp | 111 +++++++++++++++++++++-- src/dagmc/tests/pincell.h5m | Bin 0 -> 1233364 bytes 3 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 src/dagmc/tests/pincell.h5m diff --git a/src/dagmc/tests/CMakeLists.txt b/src/dagmc/tests/CMakeLists.txt index c999e8f5f4..d294ab3a35 100644 --- a/src/dagmc/tests/CMakeLists.txt +++ b/src/dagmc/tests/CMakeLists.txt @@ -16,3 +16,5 @@ dagmc_install_test(dagmc_graveyard_test cpp) dagmc_install_test_file(test_dagmc.h5m) dagmc_install_test_file(test_dagmc_impl.h5m) dagmc_install_test_file(test_geom.h5m) +dagmc_install_test_file(pincell.h5m) + diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 1dc1c3db5d..3f1b3a55fc 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -11,9 +11,8 @@ using namespace moab; using moab::DagMC; -std::unique_ptr DAG; - -static std::string input_file = "test_dagmc.h5m"; +static std::string simple_file = "test_dagmc.h5m"; +static std::string trelis_file = "pincell.h5m"; class DagmcGraveyardTest : public ::testing::Test { protected: @@ -28,9 +27,9 @@ class GraveyardTest : public::testing::Test { virtual void TearDown() {} }; -TEST_F(DagmcGraveyardTest, dagmc_graveyard_tests) { - DAG = std::unique_ptr(new DagMC()); - ErrorCode rval = DAG->load_file(input_file.c_str()); // open the Dag file +TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { + std::unique_ptr DAG(new DagMC()); + ErrorCode rval = DAG->load_file(simple_file.c_str()); // open the Dag file EXPECT_EQ(MB_SUCCESS, rval); rval = DAG->init_OBBTree(); @@ -116,3 +115,103 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_tests) { EXPECT_EQ(starting_sets.size(), ending_sets.size()); EXPECT_EQ(0, subtract(starting_sets, ending_sets).size()); } + +TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { + std::unique_ptr DAG(new DagMC()); + ErrorCode rval = DAG->load_file(trelis_file.c_str()); // open the Dag file + EXPECT_EQ(MB_SUCCESS, rval); + + rval = DAG->init_OBBTree(); + EXPECT_EQ(MB_SUCCESS, rval); + + // there should already be a graveyard present in this model + EXPECT_TRUE(DAG->has_graveyard()); + + int n_vols = DAG->num_entities(3); + int n_surfs = DAG->num_entities(2); + + rval = DAG->remove_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(n_vols - 1, DAG->num_entities(3)); + // each cube face is a surface here, there should be 12 fewer + EXPECT_EQ(n_surfs - 12, DAG->num_entities(2)); + + // update number of surfaces and volumes before creating the graveyard + n_vols = DAG->num_entities(3); + n_surfs = DAG->num_entities(2); + + // collect starting sets to make sure we end up with the same thing at the end + Range starting_vertices; + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); + EXPECT_EQ(MB_SUCCESS, rval); + + Range starting_triangles; + rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); + EXPECT_EQ(MB_SUCCESS, rval); + + Range starting_sets; + rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); + EXPECT_EQ(MB_SUCCESS, rval); + + rval = DAG->create_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(n_vols + 1, DAG->num_entities(3)); + EXPECT_EQ(n_surfs + 2, DAG->num_entities(2)); + + EXPECT_TRUE(DAG->has_graveyard()); + + rval = DAG->remove_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(n_vols, DAG->num_entities(3)); + EXPECT_EQ(n_surfs, DAG->num_entities(2)); + + EXPECT_FALSE(DAG->has_graveyard()); + + rval = DAG->create_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_TRUE(DAG->has_graveyard()); + + // test overwrite capability + bool overwrite_graveyard = true; + rval = DAG->create_graveyard(true); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(n_vols + 1, DAG->num_entities(3)); + EXPECT_EQ(n_surfs + 2, DAG->num_entities(2)); + + // this should fail, graveyard already exists + // and overwrite isn't specified + rval = DAG->create_graveyard(); + EXPECT_EQ(MB_FAILURE, rval); + + rval = DAG->remove_graveyard(); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_FALSE(DAG->has_graveyard()); + + // checks to make sure we didn't accumulate any new data on the mesh + Range ending_vertices; + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, ending_vertices); + EXPECT_EQ(MB_SUCCESS, rval); + + Range ending_triangles; + rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, ending_triangles); + EXPECT_EQ(MB_SUCCESS, rval); + + Range ending_sets; + rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); + EXPECT_EQ(MB_SUCCESS, rval); + + EXPECT_EQ(starting_vertices.size(), ending_vertices.size()); + EXPECT_EQ(0, subtract(starting_vertices, ending_vertices).size()); + + EXPECT_EQ(starting_triangles.size(), ending_triangles.size()); + EXPECT_EQ(0, subtract(starting_triangles, ending_triangles).size()); + + EXPECT_EQ(starting_sets.size(), ending_sets.size()); + EXPECT_EQ(0, subtract(starting_sets, ending_sets).size()); +} diff --git a/src/dagmc/tests/pincell.h5m b/src/dagmc/tests/pincell.h5m new file mode 100644 index 0000000000000000000000000000000000000000..bd50a9691464941dec3526cb67f992138ba0a3f3 GIT binary patch literal 1233364 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

ZT3*$Jo~GOk*Q38F=ifZ!{F|fiDd*oDJy1FS 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 literal 0 HcmV?d00001 From 0b8c4cc32abf5d0900dcce017128f376f7bab204 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 28 Nov 2020 11:52:59 -0600 Subject: [PATCH 27/50] A much more simple version of graveyard entity collection. --- src/dagmc/DagMC.cpp | 94 +++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 59 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index f190332f0d..3683ce733e 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -290,73 +290,49 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); } - // collect graveyard volume entities for deletion for (auto vol : graveyard_vols) { - ents_to_delete.insert(vol); - - if (trees_exist) { - // will recursively delete the volume's surface trees as well - rval = geom_tool()->delete_obb_tree(vol); - MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); - } - - // collect entities from the graveyard surfaces Range surfs; rval = moab_instance()->get_child_meshsets(vol, surfs); - MB_CHK_SET_ERR(rval, "Failed to get the surfaces of the graveyard volume"); - ents_to_delete.merge(surfs); - - for (auto surf : surfs) { - // add triangles, vertices to the list of entities to remove - Range triangles; - rval = moab_instance()->get_entities_by_type(surf, MBTRI, triangles); - MB_CHK_SET_ERR(rval, "Failed to get triangles of the graveyard surface"); - ents_to_delete.merge(triangles); - - Range vertices; - rval = moab_instance()->get_entities_by_type(surf, MBVERTEX, vertices); - MB_CHK_SET_ERR(rval, "Failed to get vertices of the graveyard surface"); - verts_to_delete.merge(vertices); - - Range curves; - rval = moab_instance()->get_child_meshsets(surf, curves); - MB_CHK_SET_ERR(rval, "Failed to get the graveyard surface curves"); - - for (auto curve : curves) { - ents_to_delete.insert(curve); - Range edges; - rval = moab_instance()->get_entities_by_type(curve, MBEDGE, edges); - MB_CHK_SET_ERR(rval, "Failed to get graveyard curve edges"); - ents_to_delete.merge(edges); - - Range curve_vertices; - rval = moab_instance()->get_entities_by_type(curve, MBVERTEX, curve_vertices); - MB_CHK_SET_ERR(rval, "Failed to get graveyard curve vertices"); - verts_to_delete.merge(curve_vertices); - - // now remove the geometric vertex sets (vertices represented in the CAD - // representing the end of an analytic curve) - Range geom_vertices; - rval = moab_instance()->get_child_meshsets(curve, geom_vertices); - MB_CHK_SET_ERR(rval, "Failed to get the graveyard curve's geometric vertices"); - for (auto geom_vert : geom_vertices) { - ents_to_delete.insert(geom_vert); - // the only entities in here should be vertices - Range geom_vertices; - rval = moab_instance()->get_entities_by_type(geom_vert, MBVERTEX, geom_vertices); - MB_CHK_SET_ERR(rval, "Failed to get graveyard curve vertices"); - verts_to_delete.merge(geom_vertices); - } - } + MB_CHK_SET_ERR(rval, "Failed to get graveyard volume surfaces"); + for (auto surf: surfs) { // update implicit complement relationships - if (ic) { - rval = moab_instance()->remove_child_meshset(ic, surf); - MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); - } + // if (ic) { + // rval = moab_instance()->remove_child_meshset(ic, surf); + // MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); + // } } } + // get all sets underneath these volumes + for (auto vol : graveyard_vols) { + Range children; + // recursively collect all child sets + rval = moab_instance()->get_child_meshsets(vol, children, -1); + MB_CHK_SET_ERR(rval, "Failed to get the child geometry of the graveyard volume"); + ents_to_delete.merge(children); + } + + // collect the vertices of each set + for (auto ent_set : ents_to_delete) { + Range vertices; + rval = moab_instance()->get_entities_by_type(ent_set, MBVERTEX, vertices); + MB_CHK_SET_ERR(rval, "Failed to get vertices of a graveyard set"); + verts_to_delete.merge(vertices); + } + + // get the union of the adjacencies of the graveyard vertices. + // this should retrieve all elements connected to these vertices + // (edges, triangles, etc. ) + Range adj; + rval = moab_instance()->get_adjacencies(verts_to_delete, 1, true, adj, Interface::UNION); + MB_CHK_SET_ERR(rval, "Failed to get dimension 1 adjacencies of graveyard vertices"); + ents_to_delete.merge(adj); + adj.clear(); + rval = moab_instance()->get_adjacencies(verts_to_delete, 2, true, adj, Interface::UNION); + MB_CHK_SET_ERR(rval, "Failed to get dimension 2 adjacencies of graveyard vertices"); + ents_to_delete.merge(adj); + // delete accumulated entities rval = moab_instance()->delete_entities(ents_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); From a8ca3d5459bf30d88550744cbd01d43bad201f5a Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 28 Nov 2020 13:59:36 -0600 Subject: [PATCH 28/50] Re-adding removal of volume trees. --- src/dagmc/DagMC.cpp | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 3683ce733e..d29ea6300d 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -276,6 +276,7 @@ ErrorCode DagMC::remove_graveyard() { Range graveyard_vols; rval = moab_instance()->get_entities_by_handle(graveyard_group, graveyard_vols); MB_CHK_SET_ERR(rval, "Failed to get the graveyard volume(s)"); + ents_to_delete.merge(graveyard_vols); // get the implicit complement, it's children will need updating EntityHandle ic = 0; @@ -285,22 +286,29 @@ ErrorCode DagMC::remove_graveyard() { } // update the implicit complement tree if needed - if (trees_exist && ic) { - rval = geom_tool()->delete_obb_tree(ic, true); - MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); + if (trees_exist) { + if (ic) { + rval = geom_tool()->delete_obb_tree(ic, true); + MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); + } + for (auto vol : graveyard_vols) { + // will recursively delete the volume's surface trees as well + rval = geom_tool()->delete_obb_tree(vol); + MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); + } } - for (auto vol : graveyard_vols) { - Range surfs; - rval = moab_instance()->get_child_meshsets(vol, surfs); - MB_CHK_SET_ERR(rval, "Failed to get graveyard volume surfaces"); - - for (auto surf: surfs) { - // update implicit complement relationships - // if (ic) { - // rval = moab_instance()->remove_child_meshset(ic, surf); - // MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); - // } + + if (ic) { + for (auto vol : graveyard_vols) { + Range surfs; + rval = moab_instance()->get_child_meshsets(vol, surfs); + MB_CHK_SET_ERR(rval, "Failed to get graveyard volume surfaces"); + for (auto surf: surfs) { + // update implicit complement relationships + rval = moab_instance()->remove_child_meshset(ic, surf); + MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); + } } } From 516a08558c68f954d78834ca308c4134d299f0a3 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 28 Nov 2020 23:58:06 -0600 Subject: [PATCH 29/50] Accumlating and deleting sets separately from entities. --- src/dagmc/DagMC.cpp | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index d29ea6300d..e917deb4fb 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -263,12 +263,10 @@ ErrorCode DagMC::remove_graveyard() { if (rval == MB_ENTITY_NOT_FOUND) { return MB_SUCCESS; } MB_CHK_SET_ERR(rval, "Failed to check for existing graveyard volume"); - // set of entities to delete from the MOAB instance - Range ents_to_delete; - // vertices need to be tracked separately and deleted after everything else - Range verts_to_delete; + // ranges of sets, entities, and vertices to delete + Range sets_to_delete, ents_to_delete, verts_to_delete; - ents_to_delete.insert(graveyard_group); + sets_to_delete.insert(graveyard_group); bool trees_exist = geom_tool()->have_obb_tree(); @@ -276,7 +274,7 @@ ErrorCode DagMC::remove_graveyard() { Range graveyard_vols; rval = moab_instance()->get_entities_by_handle(graveyard_group, graveyard_vols); MB_CHK_SET_ERR(rval, "Failed to get the graveyard volume(s)"); - ents_to_delete.merge(graveyard_vols); + sets_to_delete.merge(graveyard_vols); // get the implicit complement, it's children will need updating EntityHandle ic = 0; @@ -298,7 +296,6 @@ ErrorCode DagMC::remove_graveyard() { } } - if (ic) { for (auto vol : graveyard_vols) { Range surfs; @@ -318,13 +315,13 @@ ErrorCode DagMC::remove_graveyard() { // recursively collect all child sets rval = moab_instance()->get_child_meshsets(vol, children, -1); MB_CHK_SET_ERR(rval, "Failed to get the child geometry of the graveyard volume"); - ents_to_delete.merge(children); + sets_to_delete.merge(children); } // collect the vertices of each set - for (auto ent_set : ents_to_delete) { + for (auto entity_set : sets_to_delete) { Range vertices; - rval = moab_instance()->get_entities_by_type(ent_set, MBVERTEX, vertices); + rval = moab_instance()->get_entities_by_type(entity_set, MBVERTEX, vertices); MB_CHK_SET_ERR(rval, "Failed to get vertices of a graveyard set"); verts_to_delete.merge(vertices); } @@ -341,6 +338,10 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to get dimension 2 adjacencies of graveyard vertices"); ents_to_delete.merge(adj); + // delete accumulated entity sets + rval = moab_instance()->delete_entities(sets_to_delete); + MB_CHK_SET_ERR(rval, "Failed to delete graveyard entity sets"); + // delete accumulated entities rval = moab_instance()->delete_entities(ents_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); From 917742296fbe9d889214a631db5f7b3185d1bc1c Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sat, 28 Nov 2020 23:59:04 -0600 Subject: [PATCH 30/50] Adding a bunch of test conditions for the Trelis file. --- src/dagmc/tests/dagmc_graveyard_test.cpp | 71 +++++++++++++++++------- 1 file changed, 50 insertions(+), 21 deletions(-) diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 3f1b3a55fc..dd24bb275f 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -124,36 +124,65 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { rval = DAG->init_OBBTree(); EXPECT_EQ(MB_SUCCESS, rval); - // there should already be a graveyard present in this model + // collect starting sets to make sure we end up with the same thing at the end + Range starting_vertices; + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); + EXPECT_EQ(MB_SUCCESS, rval); + + Range starting_triangles; + rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); + EXPECT_EQ(MB_SUCCESS, rval); + + Range starting_sets; + rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); + EXPECT_EQ(MB_SUCCESS, rval); + + // there should already be a graveyard present in this model EXPECT_TRUE(DAG->has_graveyard()); + int n_groups = DAG->num_entities(4); int n_vols = DAG->num_entities(3); int n_surfs = DAG->num_entities(2); + // the DagMC class only tracks relevant geometry sets (surfaces and volumes) + int n_curves = DAG->geom_tool()->num_ents_of_dim(1); + int n_geom_verts = DAG->geom_tool()->num_ents_of_dim(0); + // remove original graveyard rval = DAG->remove_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); - EXPECT_EQ(n_vols - 1, DAG->num_entities(3)); - // each cube face is a surface here, there should be 12 fewer - EXPECT_EQ(n_surfs - 12, DAG->num_entities(2)); + // geometric sets removed: + // (geometric vertices - 16, curves - 24, surfaces - 12, volumes - 1, groups - 1) + EXPECT_EQ(16, n_geom_verts - DAG->geom_tool()->num_ents_of_dim(0)); + EXPECT_EQ(24, n_curves - DAG->geom_tool()->num_ents_of_dim(1)); + EXPECT_EQ(12, n_surfs - DAG->num_entities(2)); + EXPECT_EQ(1, n_vols - DAG->num_entities(3)); + EXPECT_EQ(1, n_groups - DAG->num_entities(4)); - // update number of surfaces and volumes before creating the graveyard - n_vols = DAG->num_entities(3); - n_surfs = DAG->num_entities(2); - - // collect starting sets to make sure we end up with the same thing at the end - Range starting_vertices; - rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); + DAG->moab_instance()->write_file("test.h5m"); + // set of vertices, triangles, and sets without the original graveyard volume + Range model_vertices; + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, model_vertices); EXPECT_EQ(MB_SUCCESS, rval); - Range starting_triangles; - rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); + Range model_triangles; + rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, model_triangles); EXPECT_EQ(MB_SUCCESS, rval); - Range starting_sets; - rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); + Range model_sets; + rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, model_sets); EXPECT_EQ(MB_SUCCESS, rval); + // make sure the right number of mesh elements were removed + // sixteen vertices removed (corners of two cuboid volumes) + EXPECT_EQ(starting_vertices.size() - 16, model_vertices.size()); + // twenty-four triangles removed (two per face for two cuboid volumes) + EXPECT_EQ(starting_triangles.size() - 24, model_triangles.size()); + + // update number of surfaces and volumes before creating the graveyard + n_vols = DAG->num_entities(3); + n_surfs = DAG->num_entities(2); + rval = DAG->create_graveyard(); EXPECT_EQ(MB_SUCCESS, rval); @@ -206,12 +235,12 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); EXPECT_EQ(MB_SUCCESS, rval); - EXPECT_EQ(starting_vertices.size(), ending_vertices.size()); - EXPECT_EQ(0, subtract(starting_vertices, ending_vertices).size()); + EXPECT_EQ(model_vertices.size(), ending_vertices.size()); + EXPECT_EQ(0, subtract(model_vertices, ending_vertices).size()); - EXPECT_EQ(starting_triangles.size(), ending_triangles.size()); - EXPECT_EQ(0, subtract(starting_triangles, ending_triangles).size()); + EXPECT_EQ(model_triangles.size(), ending_triangles.size()); + EXPECT_EQ(0, subtract(model_triangles, ending_triangles).size()); - EXPECT_EQ(starting_sets.size(), ending_sets.size()); - EXPECT_EQ(0, subtract(starting_sets, ending_sets).size()); + EXPECT_EQ(model_sets.size(), ending_sets.size()); + EXPECT_EQ(0, subtract(model_sets, ending_sets).size()); } From b08b39b2873cfddc918fba86c9029bcefff49470 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 00:03:26 -0600 Subject: [PATCH 31/50] No need to remove parent/child relationships. Those are cleaned up in the instance when entities are deleted. --- src/dagmc/DagMC.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index e917deb4fb..8066c55fb0 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -296,19 +296,6 @@ ErrorCode DagMC::remove_graveyard() { } } - if (ic) { - for (auto vol : graveyard_vols) { - Range surfs; - rval = moab_instance()->get_child_meshsets(vol, surfs); - MB_CHK_SET_ERR(rval, "Failed to get graveyard volume surfaces"); - for (auto surf: surfs) { - // update implicit complement relationships - rval = moab_instance()->remove_child_meshset(ic, surf); - MB_CHK_SET_ERR(rval, "Failed to remove graveyard surface relationship to implicit complement"); - } - } - } - // get all sets underneath these volumes for (auto vol : graveyard_vols) { Range children; From 7eb68e1fad410e14c559a346fcc34877c41e893f Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 14:01:36 -0600 Subject: [PATCH 32/50] Applying style guide. --- src/dagmc/DagMC.cpp | 19 +++++++++++-------- src/dagmc/DagMC.hpp | 8 ++++---- src/dagmc/tests/dagmc_graveyard_test.cpp | 2 +- src/dagmc/util.hpp | 4 ++-- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 8066c55fb0..35a3e05ea1 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -250,7 +250,8 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { } // if the graveyard was not found, return an error - if (graveyard_group == 0) return MB_ENTITY_NOT_FOUND; + if (graveyard_group == 0) + return MB_ENTITY_NOT_FOUND; return MB_SUCCESS; } @@ -260,7 +261,9 @@ ErrorCode DagMC::remove_graveyard() { EntityHandle graveyard_group; rval = get_graveyard_group(graveyard_group); - if (rval == MB_ENTITY_NOT_FOUND) { return MB_SUCCESS; } + if (rval == MB_ENTITY_NOT_FOUND) { + return MB_SUCCESS; + } MB_CHK_SET_ERR(rval, "Failed to check for existing graveyard volume"); // ranges of sets, entities, and vertices to delete @@ -338,7 +341,7 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to delete graveyard vertices"); // re-construct the implicit complement's tree if needed - if(trees_exist && ic) { + if (trees_exist && ic) { rval = geom_tool()->construct_obb_tree(ic); MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); } @@ -389,8 +392,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { } BBOX box; - for(int i = 0; i < num_entities(3); i++) { - moab::EntityHandle vol = this->entity_by_index(3, i+1); + for (int i = 0; i < num_entities(3); i++) { + moab::EntityHandle vol = this->entity_by_index(3, i + 1); double vmin[3], vmax[3]; rval = this->getobb(vol, vmin, vmax); MB_CHK_SET_ERR(rval, "Failed to get volume OBB"); @@ -520,7 +523,7 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface ErrorCode rval; //start with vertices - std::vector> vertex_coords; + std::vector> vertex_coords; // vertex coordinates for the lower z face vertex_coords.push_back({urc[0], llc[1], urc[2]}); vertex_coords.push_back({urc[0], urc[1], urc[2]}); @@ -533,7 +536,7 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface vertex_coords.push_back({llc[0], llc[1], llc[2]}); std::vector box_verts; - for(const auto& coords : vertex_coords) { + for (const auto& coords : vertex_coords) { EntityHandle new_vertex; rval = MBI->create_vertex(coords.data(), new_vertex); MB_CHK_SET_ERR(rval, "Failed to create graveyard vertex"); @@ -562,7 +565,7 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface connectivity_indices.push_back({6, 1, 5}); moab::Range new_tris; - for(const auto& ind : connectivity_indices) { + for (const auto& ind : connectivity_indices) { EntityHandle new_triangle; std::array tri_conn = {box_verts[ind[0]], box_verts[ind[1]], box_verts[ind[2]]}; rval = MBI->create_element(moab::MBTRI, tri_conn.data(), 3, new_triangle); diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index d897d46df7..53f23421c8 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -179,7 +179,7 @@ class DagMC { /** Retrieve the graveyard group on the model if it exists */ ErrorCode get_graveyard_group(EntityHandle& graveyard_group); -private: + private: /** convenience function for converting a bounding box into a box of triangles * with outward facing normals * @@ -510,9 +510,9 @@ class DagMC { double upper[3] = {-INFTY, -INFTY, -INFTY}; bool valid() { - return ( lower[0] <= upper[0] && - lower[1] <= upper[1] && - lower[2] <= upper[2] ); + return (lower[0] <= upper[0] && + lower[1] <= upper[1] && + lower[2] <= upper[2]); } void update(double x, double y, double z) { diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index dd24bb275f..23388ce9eb 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -22,7 +22,7 @@ class DagmcGraveyardTest : public ::testing::Test { class GraveyardTest : public::testing::Test { - protected: + protected: virtual void SetUp() override {} virtual void TearDown() {} }; diff --git a/src/dagmc/util.hpp b/src/dagmc/util.hpp index a91fbfc0e6..b63309fa36 100644 --- a/src/dagmc/util.hpp +++ b/src/dagmc/util.hpp @@ -4,8 +4,8 @@ #include inline void lowercase_str(std::string& input) { - std::transform(input.begin(), input.end(), input.begin(), - [](unsigned char c){ return std::tolower(c); }); + std::transform(input.begin(), input.end(), input.begin(), + [](unsigned char c) { return std::tolower(c); }); } #endif \ No newline at end of file From 0e340de020972b6cc610358075795be69f59365f Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 22:50:52 -0600 Subject: [PATCH 33/50] Updating some comments for clarity in the graveyard test file. --- src/dagmc/tests/dagmc_graveyard_test.cpp | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index 23388ce9eb..e2a0463e84 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -20,15 +20,10 @@ class DagmcGraveyardTest : public ::testing::Test { virtual void TearDown() {} }; - -class GraveyardTest : public::testing::Test { - protected: - virtual void SetUp() override {} - virtual void TearDown() {} -}; - TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { + // create a DAGMC instance std::unique_ptr DAG(new DagMC()); + // load the test geometry file ErrorCode rval = DAG->load_file(simple_file.c_str()); // open the Dag file EXPECT_EQ(MB_SUCCESS, rval); @@ -48,7 +43,7 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); EXPECT_EQ(MB_SUCCESS, rval); - // there is no graveyard present in this model + // there is no graveyard present to start in this model EXPECT_FALSE(DAG->has_graveyard()); int n_vols = DAG->num_entities(3); @@ -117,8 +112,10 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { } TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { + // create DAGMC instance std::unique_ptr DAG(new DagMC()); - ErrorCode rval = DAG->load_file(trelis_file.c_str()); // open the Dag file + // load the trelis test file + ErrorCode rval = DAG->load_file(trelis_file.c_str()); EXPECT_EQ(MB_SUCCESS, rval); rval = DAG->init_OBBTree(); @@ -137,7 +134,7 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); EXPECT_EQ(MB_SUCCESS, rval); - // there should already be a graveyard present in this model + // a graveyard is already present in this model EXPECT_TRUE(DAG->has_graveyard()); int n_groups = DAG->num_entities(4); From 06add3e478e305e628d18cc8cd1bdcb415b81baf Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 22:53:57 -0600 Subject: [PATCH 34/50] Removing unecessary empty line. --- src/dagmc/tests/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/src/dagmc/tests/CMakeLists.txt b/src/dagmc/tests/CMakeLists.txt index d294ab3a35..b5417eb6bb 100644 --- a/src/dagmc/tests/CMakeLists.txt +++ b/src/dagmc/tests/CMakeLists.txt @@ -17,4 +17,3 @@ dagmc_install_test_file(test_dagmc.h5m) dagmc_install_test_file(test_dagmc_impl.h5m) dagmc_install_test_file(test_geom.h5m) dagmc_install_test_file(pincell.h5m) - From ddd3af38e967aac2207da1fb1c3062ff159d86ff Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 23:04:30 -0600 Subject: [PATCH 35/50] Some comment updates for clarity. Reducing the size of the bump beyond the model limits. --- src/dagmc/DagMC.cpp | 40 ++++++++++++++++++++++------------------ src/dagmc/DagMC.hpp | 12 ++++++------ 2 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 35a3e05ea1..a978e99649 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -250,8 +250,9 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { } // if the graveyard was not found, return an error - if (graveyard_group == 0) + if (graveyard_group == 0) { return MB_ENTITY_NOT_FOUND; + } return MB_SUCCESS; } @@ -268,9 +269,9 @@ ErrorCode DagMC::remove_graveyard() { // ranges of sets, entities, and vertices to delete Range sets_to_delete, ents_to_delete, verts_to_delete; - sets_to_delete.insert(graveyard_group); + // check for bounding box trees on the model bool trees_exist = geom_tool()->have_obb_tree(); // get the graveyard volume @@ -293,7 +294,7 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); } for (auto vol : graveyard_vols) { - // will recursively delete the volume's surface trees as well + // will recursively delete the graveyard volume's surface trees as well rval = geom_tool()->delete_obb_tree(vol); MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); } @@ -316,9 +317,9 @@ ErrorCode DagMC::remove_graveyard() { verts_to_delete.merge(vertices); } - // get the union of the adjacencies of the graveyard vertices. + // get the union of the graveyard vertices' adjacencies. // this should retrieve all elements connected to these vertices - // (edges, triangles, etc. ) + // (edges, triangles, tets, etc. ) Range adj; rval = moab_instance()->get_adjacencies(verts_to_delete, 1, true, adj, Interface::UNION); MB_CHK_SET_ERR(rval, "Failed to get dimension 1 adjacencies of graveyard vertices"); @@ -336,7 +337,7 @@ ErrorCode DagMC::remove_graveyard() { rval = moab_instance()->delete_entities(ents_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard entities"); - // delete accumulated vertices + // delete accumulated vertices (this must come last) rval = moab_instance()->delete_entities(verts_to_delete); MB_CHK_SET_ERR(rval, "Failed to delete graveyard vertices"); @@ -359,7 +360,7 @@ ErrorCode DagMC::remove_graveyard() { ErrorCode DagMC::create_graveyard(bool overwrite) { /* Method summary - - Determine the axis-aligned bounding box of the current model + - Determine the global axis-aligned bounding box of the current model - Create a new volume set for the graveyard - Create a new group labeled as the graveyard and add volume to that group - Create an inner surface from the bounding box @@ -393,11 +394,12 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { BBOX box; for (int i = 0; i < num_entities(3); i++) { + // get the bounding box of the volume moab::EntityHandle vol = this->entity_by_index(3, i + 1); double vmin[3], vmax[3]; - rval = this->getobb(vol, vmin, vmax); - MB_CHK_SET_ERR(rval, "Failed to get volume OBB"); - + rval = this->getobb(vol, vmin, vmax); // this method name is a misnomer + MB_CHK_SET_ERR(rval, "Failed to get volume bounding box"); + // update the global bounding box box.update(vmin); box.update(vmax); } @@ -449,8 +451,9 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // expand the box a bit for (int i = 0; i < 3; i++) { - box.upper[i] += 5.0; - box.lower[i] -= 5.0; + double bump = 10 * numerical_precision(); + box.upper[i] += bump; + box.lower[i] -= bump; } // tear down the implicit complement tree @@ -477,18 +480,19 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // expand the box a bit again for the outer surface for (int i = 0; i < 3; i++) { - box.upper[i] += 2.0; - box.lower[i] -= 2.0; + double bump = 10.0 * numerical_precision(); + box.upper[i] += bump; + box.lower[i] -= bump; } EntityHandle outer_surface; rval = box_to_surf(box.lower, box.upper, outer_surface); - // establish the volume-surface parent-child relationship with tie outer surface + // establish the volume-surface parent-child relationship with the outer surface rval = MBI->add_parent_child(volume_set, outer_surface); MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); - // establish the volume-surface parent-child relationship with tie outer surface + // establish the volume-surface parent-child relationship with the outer surface rval = MBI->add_parent_child(ic, outer_surface); MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); @@ -498,7 +502,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval = MBI->tag_set_data(sense_tag(), &outer_surface, 1, outer_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); - // OBBTree/BVH update + // OBBTree/BVH updates // delete the implicit complement tree (but not the surface trees) rval = geom_tool()->delete_obb_tree(ic, true); @@ -522,7 +526,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set) { ErrorCode rval; - //start with vertices + // start with vertices std::vector> vertex_coords; // vertex coordinates for the lower z face vertex_coords.push_back({urc[0], llc[1], urc[2]}); diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 53f23421c8..229994ad34 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -161,19 +161,19 @@ class DagMC { */ ErrorCode setup_indices(); - /**\brief Removes the graveyard volume. */ + /**\brief Removes the graveyard if one is present. */ ErrorCode remove_graveyard(); - /**\brief Create a graveyard volume. + /**\brief Create a graveyard (a volume representing the volume boundary). * * Create a cuboid volume marked with metadata indicating it is the boundary * of the DAGMC model. This method will fail if a graveyard volume already - * exists and `overwrite` is not true. + * exists and `overwrite` is not true. Requires BVH tree's existence. * */ ErrorCode create_graveyard(bool overwrite = false); - /** True if the model has a graveyard volume, false if not */ + /** Returns true if the model has a graveyard volume, false if not */ bool has_graveyard(); /** Retrieve the graveyard group on the model if it exists */ @@ -181,8 +181,8 @@ class DagMC { private: /** convenience function for converting a bounding box into a box of triangles - * with outward facing normals - * + * with outward facing normals and setting up set structure necessary for + * representation as a geometric entity */ ErrorCode box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set); From e60b35d2e14d86a0006f56a394e1b580c970c90a Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 23:32:44 -0600 Subject: [PATCH 36/50] Adding some brief documentation to the BBOX class. --- src/dagmc/DagMC.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 229994ad34..ef759caf0c 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -509,12 +509,14 @@ class DagMC { double lower[3] = { INFTY, INFTY, INFTY}; double upper[3] = {-INFTY, -INFTY, -INFTY}; + /** ensure box corners are valid */ bool valid() { return (lower[0] <= upper[0] && lower[1] <= upper[1] && lower[2] <= upper[2]); } + /** update box to ensure the provided point is contained */ void update(double x, double y, double z) { lower[0] = x < lower[0] ? x : lower[0]; lower[1] = y < lower[1] ? y : lower[1]; @@ -525,6 +527,7 @@ class DagMC { upper[2] = z > upper[2] ? z : upper[2]; } + /** update box to ensure the provided point is contained */ void update(double xyz[3]) { update(xyz[0], xyz[1], xyz[2]); } From e6b88330b6de3260d7b9deda146de757936e2adc Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 29 Nov 2020 23:33:16 -0600 Subject: [PATCH 37/50] Placing the method in the moab namespace. --- src/dagmc/dagmcmetadata.cpp | 2 +- src/dagmc/util.hpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/dagmc/dagmcmetadata.cpp b/src/dagmc/dagmcmetadata.cpp index 9d9aee3743..88145f170a 100644 --- a/src/dagmc/dagmcmetadata.cpp +++ b/src/dagmc/dagmcmetadata.cpp @@ -341,7 +341,7 @@ void dagmcMetaData::parse_tally_volume_data() { } std::string dagmcMetaData::to_lower(std::string input) { - lowercase_str(input); + moab::lowercase_str(input); return input; } diff --git a/src/dagmc/util.hpp b/src/dagmc/util.hpp index b63309fa36..d5855750dd 100644 --- a/src/dagmc/util.hpp +++ b/src/dagmc/util.hpp @@ -3,9 +3,12 @@ #include +namespace moab { // TODO: separate into a new namespace + inline void lowercase_str(std::string& input) { std::transform(input.begin(), input.end(), input.begin(), [](unsigned char c) { return std::tolower(c); }); } +} #endif \ No newline at end of file From b5c2296deb99a92d25037e9f27f887bdade79ca8 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Mon, 30 Nov 2020 00:03:44 -0600 Subject: [PATCH 38/50] Adding news file. --- news/PR-0714.rst | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 news/PR-0714.rst diff --git a/news/PR-0714.rst b/news/PR-0714.rst new file mode 100644 index 0000000000..a4cee4fc8a --- /dev/null +++ b/news/PR-0714.rst @@ -0,0 +1,20 @@ +**Added:** + + - The following public methods for creation and removal of graveyard volumes: + - DagMC::remove_graveyard + - DagMC::create_graveyard + - DagMC::has_graveyard + - DagMC::get_graveyard_group + - DagMC::category_tag + - Other, private methods: + - DagMC::box_to_surf + +**Changed:** None + +**Deprecated:** None + +**Removed:** None + +**Fixed:** None + +**Security:** None From aacbafc8c1e2a2e67a8090659b8304c258d1312a Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Thu, 21 Jan 2021 10:49:21 -0600 Subject: [PATCH 39/50] Applying style guide. --- src/dagmc/DagMC.cpp | 91 ++++++++++++++++-------- src/dagmc/DagMC.hpp | 21 +++--- src/dagmc/tests/dagmc_graveyard_test.cpp | 46 +++++++----- src/dagmc/util.hpp | 6 +- 4 files changed, 102 insertions(+), 62 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index a978e99649..696c11e639 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -1,5 +1,4 @@ #include "DagMC.hpp" -#include "util.hpp" #include #include @@ -15,6 +14,8 @@ #include #include #include + +#include "util.hpp" #ifndef M_PI /* windows */ #define M_PI 3.14159265358979323846 #endif @@ -246,7 +247,8 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { // there should not be more than one graveyard group if (graveyard_count > 1) { - MB_CHK_SET_ERR(MB_FAILURE, "More than one graveyard group is present in the model"); + MB_CHK_SET_ERR(MB_FAILURE, + "More than one graveyard group is present in the model"); } // if the graveyard was not found, return an error @@ -276,7 +278,8 @@ ErrorCode DagMC::remove_graveyard() { // get the graveyard volume Range graveyard_vols; - rval = moab_instance()->get_entities_by_handle(graveyard_group, graveyard_vols); + rval = + moab_instance()->get_entities_by_handle(graveyard_group, graveyard_vols); MB_CHK_SET_ERR(rval, "Failed to get the graveyard volume(s)"); sets_to_delete.merge(graveyard_vols); @@ -291,7 +294,8 @@ ErrorCode DagMC::remove_graveyard() { if (trees_exist) { if (ic) { rval = geom_tool()->delete_obb_tree(ic, true); - MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); + MB_CHK_SET_ERR(rval, + "Failed to delete the implicit complement OBBTree/BVH"); } for (auto vol : graveyard_vols) { // will recursively delete the graveyard volume's surface trees as well @@ -305,14 +309,16 @@ ErrorCode DagMC::remove_graveyard() { Range children; // recursively collect all child sets rval = moab_instance()->get_child_meshsets(vol, children, -1); - MB_CHK_SET_ERR(rval, "Failed to get the child geometry of the graveyard volume"); + MB_CHK_SET_ERR(rval, + "Failed to get the child geometry of the graveyard volume"); sets_to_delete.merge(children); } // collect the vertices of each set for (auto entity_set : sets_to_delete) { Range vertices; - rval = moab_instance()->get_entities_by_type(entity_set, MBVERTEX, vertices); + rval = + moab_instance()->get_entities_by_type(entity_set, MBVERTEX, vertices); MB_CHK_SET_ERR(rval, "Failed to get vertices of a graveyard set"); verts_to_delete.merge(vertices); } @@ -321,12 +327,16 @@ ErrorCode DagMC::remove_graveyard() { // this should retrieve all elements connected to these vertices // (edges, triangles, tets, etc. ) Range adj; - rval = moab_instance()->get_adjacencies(verts_to_delete, 1, true, adj, Interface::UNION); - MB_CHK_SET_ERR(rval, "Failed to get dimension 1 adjacencies of graveyard vertices"); + rval = moab_instance()->get_adjacencies(verts_to_delete, 1, true, adj, + Interface::UNION); + MB_CHK_SET_ERR(rval, + "Failed to get dimension 1 adjacencies of graveyard vertices"); ents_to_delete.merge(adj); adj.clear(); - rval = moab_instance()->get_adjacencies(verts_to_delete, 2, true, adj, Interface::UNION); - MB_CHK_SET_ERR(rval, "Failed to get dimension 2 adjacencies of graveyard vertices"); + rval = moab_instance()->get_adjacencies(verts_to_delete, 2, true, adj, + Interface::UNION); + MB_CHK_SET_ERR(rval, + "Failed to get dimension 2 adjacencies of graveyard vertices"); ents_to_delete.merge(adj); // delete accumulated entity sets @@ -344,12 +354,14 @@ ErrorCode DagMC::remove_graveyard() { // re-construct the implicit complement's tree if needed if (trees_exist && ic) { rval = geom_tool()->construct_obb_tree(ic); - MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); + MB_CHK_SET_ERR(rval, + "Failed to re-create the implicit complement OBBTree/BVH"); } // update geometry sets in the GTT rval = geom_tool()->find_geomsets(); - MB_CHK_SET_ERR(rval, "Failed to find geometry sets after removing the graveyard"); + MB_CHK_SET_ERR(rval, + "Failed to find geometry sets after removing the graveyard"); // re-initialize DAGMC indices rval = setup_indices(); @@ -397,7 +409,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // get the bounding box of the volume moab::EntityHandle vol = this->entity_by_index(3, i + 1); double vmin[3], vmax[3]; - rval = this->getobb(vol, vmin, vmax); // this method name is a misnomer + rval = this->getobb(vol, vmin, vmax); // this method name is a misnomer MB_CHK_SET_ERR(rval, "Failed to get volume bounding box"); // update the global bounding box box.update(vmin); @@ -405,7 +417,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { } if (!box.valid()) { - MB_CHK_SET_ERR(rval, "Invalid model bounding box generated for graveyard volume"); + MB_CHK_SET_ERR(rval, + "Invalid model bounding box generated for graveyard volume"); } // create a new volume meshset @@ -445,7 +458,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // add the graveyard volume to this group rval = MBI->add_entities(group_set, &volume_set, 1); - MB_CHK_SET_ERR(rval, "Failed to add the graveyard volume to the graveyard group"); + MB_CHK_SET_ERR(rval, + "Failed to add the graveyard volume to the graveyard group"); /// SURFACE CREATION /// @@ -464,13 +478,17 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { EntityHandle inner_surface; rval = box_to_surf(box.lower, box.upper, inner_surface); - // establish the volume-surface parent-child relationship with the inner surface + // establish the volume-surface parent-child relationship with the inner + // surface rval = MBI->add_parent_child(volume_set, inner_surface); - MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + MB_CHK_SET_ERR(rval, + "Failed to create the graveyard parent-child relationship"); - // establish the volume-surface parent-child relationship with the inner surface + // establish the volume-surface parent-child relationship with the inner + // surface rval = MBI->add_parent_child(ic, inner_surface); - MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + MB_CHK_SET_ERR(rval, + "Failed to create the graveyard parent-child relationship"); // set the surface senses (all triangles have outward normals so this should // be REVERSE wrt the graveyard volume) @@ -488,13 +506,17 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { EntityHandle outer_surface; rval = box_to_surf(box.lower, box.upper, outer_surface); - // establish the volume-surface parent-child relationship with the outer surface + // establish the volume-surface parent-child relationship with the outer + // surface rval = MBI->add_parent_child(volume_set, outer_surface); - MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + MB_CHK_SET_ERR(rval, + "Failed to create the graveyard parent-child relationship"); - // establish the volume-surface parent-child relationship with the outer surface + // establish the volume-surface parent-child relationship with the outer + // surface rval = MBI->add_parent_child(ic, outer_surface); - MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); + MB_CHK_SET_ERR(rval, + "Failed to create the graveyard parent-child relationship"); // set the surface senses (all triangles have outward normals so this should // be FORWARD wrt the graveyard volume) @@ -511,10 +533,14 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // create BVH for both the new implicit complement and the new graveyard // volume rval = geom_tool()->construct_obb_tree(volume_set); - MB_CHK_SET_ERR(rval, "Failed to build accel. data structure for the new graveyard volume"); + MB_CHK_SET_ERR( + rval, + "Failed to build accel. data structure for the new graveyard volume"); rval = geom_tool()->construct_obb_tree(ic); - MB_CHK_SET_ERR(rval, "Failed to build accel. data structure for the new implicit complement"); + MB_CHK_SET_ERR( + rval, + "Failed to build accel. data structure for the new implicit complement"); // re-initialize indices rval = setup_indices(); @@ -523,7 +549,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { return rval; } -ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set) { +ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], + EntityHandle& surface_set) { ErrorCode rval; // start with vertices @@ -571,7 +598,8 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface moab::Range new_tris; for (const auto& ind : connectivity_indices) { EntityHandle new_triangle; - std::array tri_conn = {box_verts[ind[0]], box_verts[ind[1]], box_verts[ind[2]]}; + std::array tri_conn = { + box_verts[ind[0]], box_verts[ind[1]], box_verts[ind[2]]}; rval = MBI->create_element(moab::MBTRI, tri_conn.data(), 3, new_triangle); MB_CHK_SET_ERR(rval, "Failed to create new graveyard triangle"); new_tris.insert(new_triangle); @@ -596,7 +624,8 @@ ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], EntityHandle& surface std::string surface_str; surface_str.resize(CATEGORY_TAG_SIZE); surface_str = "Surface"; - rval = MBI->tag_set_data(category_tag(), &surface_set, 1, surface_str.c_str()); + rval = + MBI->tag_set_data(category_tag(), &surface_set, 1, surface_str.c_str()); MB_CHK_SET_ERR(rval, "Failed to set graveyard volume category"); return rval; @@ -820,8 +849,7 @@ ErrorCode DagMC::build_indices(Range& surfs, Range& vols) { // get group handles Range groups; rval = get_groups(groups); - if (MB_SUCCESS != rval) - return rval; + if (MB_SUCCESS != rval) return rval; group_handles().resize(groups.size() + 1); group_handles()[0] = 0; @@ -843,7 +871,8 @@ ErrorCode DagMC::get_groups(Range& groups) { } Tag DagMC::category_tag() { - return get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, MB_TAG_SPARSE, MB_TYPE_OPAQUE); + return get_tag(CATEGORY_TAG_NAME, CATEGORY_TAG_SIZE, MB_TAG_SPARSE, + MB_TYPE_OPAQUE); } /* SECTION IV: Handling DagMC settings */ diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index ef759caf0c..fa240ce339 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -2,6 +2,7 @@ #define MOABMC_HPP #include + #include #include #include @@ -184,7 +185,8 @@ class DagMC { * with outward facing normals and setting up set structure necessary for * representation as a geometric entity */ - ErrorCode box_to_surf(double llc[3], double urc[3], EntityHandle& surface_set); + ErrorCode box_to_surf(double llc[3], double urc[3], + EntityHandle& surface_set); /** loading code shared by load_file and load_existing_contents */ ErrorCode finish_loading(); @@ -254,7 +256,8 @@ class DagMC { /** map from EntityHandle to global ID */ int get_entity_id(EntityHandle this_ent); - /**\brief get number of geometric sets corresponding to geometry of specified dimension + /**\brief get number of geometric sets corresponding to geometry of specified + *dimension * * For a given dimension (e.g. dimension=3 for volumes, dimension=2 for *surfaces) return the number of entities of that dimension \param dimension @@ -504,15 +507,14 @@ class DagMC { // axis-aligned box used to track geometry bounds // (internal use only) struct BBOX { - constexpr static double INFTY {std::numeric_limits::max()}; + constexpr static double INFTY{std::numeric_limits::max()}; - double lower[3] = { INFTY, INFTY, INFTY}; + double lower[3] = {INFTY, INFTY, INFTY}; double upper[3] = {-INFTY, -INFTY, -INFTY}; /** ensure box corners are valid */ bool valid() { - return (lower[0] <= upper[0] && - lower[1] <= upper[1] && + return (lower[0] <= upper[0] && lower[1] <= upper[1] && lower[2] <= upper[2]); } @@ -528,13 +530,10 @@ class DagMC { } /** update box to ensure the provided point is contained */ - void update(double xyz[3]) { - update(xyz[0], xyz[1], xyz[2]); - } + void update(double xyz[3]) { update(xyz[0], xyz[1], xyz[2]); } }; -}; // end DagMC - +}; // end DagMC inline EntityHandle DagMC::entity_by_index(int dimension, int index) { assert(2 <= dimension && 3 >= dimension && diff --git a/src/dagmc/tests/dagmc_graveyard_test.cpp b/src/dagmc/tests/dagmc_graveyard_test.cpp index e2a0463e84..7c2e8d5b0c 100644 --- a/src/dagmc/tests/dagmc_graveyard_test.cpp +++ b/src/dagmc/tests/dagmc_graveyard_test.cpp @@ -1,12 +1,12 @@ #include -#include "moab/Interface.hpp" -#include "moab/Core.hpp" -#include "DagMC.hpp" - #include #include +#include "DagMC.hpp" +#include "moab/Core.hpp" +#include "moab/Interface.hpp" + using namespace moab; using moab::DagMC; @@ -24,7 +24,7 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { // create a DAGMC instance std::unique_ptr DAG(new DagMC()); // load the test geometry file - ErrorCode rval = DAG->load_file(simple_file.c_str()); // open the Dag file + ErrorCode rval = DAG->load_file(simple_file.c_str()); // open the Dag file EXPECT_EQ(MB_SUCCESS, rval); rval = DAG->init_OBBTree(); @@ -32,15 +32,18 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { // collect starting sets to make sure we end up with the same thing at the end Range starting_vertices; - rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, + starting_vertices); EXPECT_EQ(MB_SUCCESS, rval); Range starting_triangles; - rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); EXPECT_EQ(MB_SUCCESS, rval); Range starting_sets; - rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); EXPECT_EQ(MB_SUCCESS, rval); // there is no graveyard present to start in this model @@ -90,7 +93,8 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { // checks to make sure we didn't accumulate any new data on the mesh Range ending_vertices; - rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, ending_vertices); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, ending_vertices); EXPECT_EQ(MB_SUCCESS, rval); Range ending_triangles; @@ -98,7 +102,8 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_simple_test) { EXPECT_EQ(MB_SUCCESS, rval); Range ending_sets; - rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); EXPECT_EQ(MB_SUCCESS, rval); EXPECT_EQ(starting_vertices.size(), ending_vertices.size()); @@ -123,15 +128,18 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { // collect starting sets to make sure we end up with the same thing at the end Range starting_vertices; - rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, starting_vertices); + rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, + starting_vertices); EXPECT_EQ(MB_SUCCESS, rval); Range starting_triangles; - rval = DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBTRI, starting_triangles); EXPECT_EQ(MB_SUCCESS, rval); Range starting_sets; - rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, starting_sets); EXPECT_EQ(MB_SUCCESS, rval); // a graveyard is already present in this model @@ -149,7 +157,8 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { EXPECT_EQ(MB_SUCCESS, rval); // geometric sets removed: - // (geometric vertices - 16, curves - 24, surfaces - 12, volumes - 1, groups - 1) + // (geometric vertices - 16, curves - 24, surfaces - 12, volumes - 1, groups - + // 1) EXPECT_EQ(16, n_geom_verts - DAG->geom_tool()->num_ents_of_dim(0)); EXPECT_EQ(24, n_curves - DAG->geom_tool()->num_ents_of_dim(1)); EXPECT_EQ(12, n_surfs - DAG->num_entities(2)); @@ -159,7 +168,8 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { DAG->moab_instance()->write_file("test.h5m"); // set of vertices, triangles, and sets without the original graveyard volume Range model_vertices; - rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, model_vertices); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, model_vertices); EXPECT_EQ(MB_SUCCESS, rval); Range model_triangles; @@ -221,7 +231,8 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { // checks to make sure we didn't accumulate any new data on the mesh Range ending_vertices; - rval = DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, ending_vertices); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBVERTEX, ending_vertices); EXPECT_EQ(MB_SUCCESS, rval); Range ending_triangles; @@ -229,7 +240,8 @@ TEST_F(DagmcGraveyardTest, dagmc_graveyard_test_trelis_file) { EXPECT_EQ(MB_SUCCESS, rval); Range ending_sets; - rval = DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); + rval = + DAG->moab_instance()->get_entities_by_type(0, MBENTITYSET, ending_sets); EXPECT_EQ(MB_SUCCESS, rval); EXPECT_EQ(model_vertices.size(), ending_vertices.size()); diff --git a/src/dagmc/util.hpp b/src/dagmc/util.hpp index d5855750dd..dac384dc0c 100644 --- a/src/dagmc/util.hpp +++ b/src/dagmc/util.hpp @@ -3,12 +3,12 @@ #include -namespace moab { // TODO: separate into a new namespace +namespace moab { // TODO: separate into a new namespace inline void lowercase_str(std::string& input) { std::transform(input.begin(), input.end(), input.begin(), - [](unsigned char c) { return std::tolower(c); }); + [](unsigned char c) { return std::tolower(c); }); } -} +} // namespace moab #endif \ No newline at end of file From 2267b72d8d4ff1cd47f121a944890e7e9dd9253c Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 24 Jan 2021 09:28:05 -0600 Subject: [PATCH 40/50] ic to implicit_complement --- src/dagmc/DagMC.cpp | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 696c11e639..1f0325f10a 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -284,16 +284,16 @@ ErrorCode DagMC::remove_graveyard() { sets_to_delete.merge(graveyard_vols); // get the implicit complement, it's children will need updating - EntityHandle ic = 0; - rval = geom_tool()->get_implicit_complement(ic); + EntityHandle implicit_complement = 0; + rval = geom_tool()->get_implicit_complement(implicit_complement); if (rval != MB_ENTITY_NOT_FOUND || rval != MB_SUCCESS) { MB_CHK_SET_ERR(rval, "Could not get the implicit complement"); } // update the implicit complement tree if needed if (trees_exist) { - if (ic) { - rval = geom_tool()->delete_obb_tree(ic, true); + if (implicit_complement) { + rval = geom_tool()->delete_obb_tree(implicit_complement, true); MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); } @@ -352,8 +352,8 @@ ErrorCode DagMC::remove_graveyard() { MB_CHK_SET_ERR(rval, "Failed to delete graveyard vertices"); // re-construct the implicit complement's tree if needed - if (trees_exist && ic) { - rval = geom_tool()->construct_obb_tree(ic); + if (trees_exist && implicit_complement) { + rval = geom_tool()->construct_obb_tree(implicit_complement); MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); } @@ -399,7 +399,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { } // currently relying on the BVH as looping over all vertices may - // be prohibitive + // be too expensive if (!geom_tool()->have_obb_tree()) { MB_CHK_SET_ERR(MB_FAILURE, "Graveyard creation attempted without BVH"); } @@ -471,8 +471,8 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { } // tear down the implicit complement tree - EntityHandle ic; - rval = geom_tool()->get_implicit_complement(ic); + EntityHandle implicit_complement; + rval = geom_tool()->get_implicit_complement(implicit_complement); MB_CHK_SET_ERR(rval, "Failed to get the implicit complement"); EntityHandle inner_surface; @@ -486,13 +486,13 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // establish the volume-surface parent-child relationship with the inner // surface - rval = MBI->add_parent_child(ic, inner_surface); + rval = MBI->add_parent_child(implicit_complement, inner_surface); MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); // set the surface senses (all triangles have outward normals so this should // be REVERSE wrt the graveyard volume) - EntityHandle inner_senses[2] = {ic, volume_set}; + EntityHandle inner_senses[2] = {implicit_complement, volume_set}; rval = MBI->tag_set_data(sense_tag(), &inner_surface, 1, inner_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); @@ -514,20 +514,20 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // establish the volume-surface parent-child relationship with the outer // surface - rval = MBI->add_parent_child(ic, outer_surface); + rval = MBI->add_parent_child(implicit_complement, outer_surface); MB_CHK_SET_ERR(rval, "Failed to create the graveyard parent-child relationship"); // set the surface senses (all triangles have outward normals so this should // be FORWARD wrt the graveyard volume) - EntityHandle outer_senses[2] = {volume_set, ic}; + EntityHandle outer_senses[2] = {volume_set, implicit_complement}; rval = MBI->tag_set_data(sense_tag(), &outer_surface, 1, outer_senses); MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); // OBBTree/BVH updates // delete the implicit complement tree (but not the surface trees) - rval = geom_tool()->delete_obb_tree(ic, true); + rval = geom_tool()->delete_obb_tree(implicit_complement, true); MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement tree"); // create BVH for both the new implicit complement and the new graveyard @@ -537,7 +537,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { rval, "Failed to build accel. data structure for the new graveyard volume"); - rval = geom_tool()->construct_obb_tree(ic); + rval = geom_tool()->construct_obb_tree(implicit_complement); MB_CHK_SET_ERR( rval, "Failed to build accel. data structure for the new implicit complement"); From ef6946d3b4f98f00e53a33fb4bcb242f2b49ebbd Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 24 Jan 2021 09:32:44 -0600 Subject: [PATCH 41/50] Simplifying graveyard presence check. --- src/dagmc/DagMC.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 1f0325f10a..9c3f50a5c6 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -392,9 +392,9 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { remove_graveyard(); } - // if a graveyard already exists and we aren't overwriting it, + // if a graveyard already exists at this point, // report an error - if (has_graveyard() && !overwrite) { + if (has_graveyard()) { MB_CHK_SET_ERR(MB_FAILURE, "Graveyard already exists"); } From 0ea45ed5f3e60c09c131385e86da6c56353c02fc Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 24 Jan 2021 09:39:38 -0600 Subject: [PATCH 42/50] Adding an expand method to the box struct for convenience. --- src/dagmc/DagMC.cpp | 12 ++---------- src/dagmc/DagMC.hpp | 8 ++++++++ 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 9c3f50a5c6..07ccebc735 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -464,11 +464,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { /// SURFACE CREATION /// // expand the box a bit - for (int i = 0; i < 3; i++) { - double bump = 10 * numerical_precision(); - box.upper[i] += bump; - box.lower[i] -= bump; - } + box.expand(10.0 * numerical_precision()); // tear down the implicit complement tree EntityHandle implicit_complement; @@ -497,11 +493,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { MB_CHK_SET_ERR(rval, "Failed to set graveyard surface senses"); // expand the box a bit again for the outer surface - for (int i = 0; i < 3; i++) { - double bump = 10.0 * numerical_precision(); - box.upper[i] += bump; - box.lower[i] -= bump; - } + box.expand(10.0 * numerical_precision()); EntityHandle outer_surface; rval = box_to_surf(box.lower, box.upper, outer_surface); diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index fa240ce339..c87553088a 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -529,6 +529,14 @@ class DagMC { upper[2] = z > upper[2] ? z : upper[2]; } + /** expand the box by some absolute value*/ + void expand(double bump) { + for (int i = 0; i < 3; i++) { + upper[i] += bump; + lower[i] -= bump; + } + } + /** update box to ensure the provided point is contained */ void update(double xyz[3]) { update(xyz[0], xyz[1], xyz[2]); } }; From 95f1f8d7f81348188936ed2011c9e5508217f94a Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 24 Jan 2021 09:50:03 -0600 Subject: [PATCH 43/50] Making array args to box_to_surf const. --- src/dagmc/DagMC.cpp | 2 +- src/dagmc/DagMC.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 07ccebc735..294dfec08c 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -541,7 +541,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { return rval; } -ErrorCode DagMC::box_to_surf(double llc[3], double urc[3], +ErrorCode DagMC::box_to_surf(const double llc[3], const double urc[3], EntityHandle& surface_set) { ErrorCode rval; diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index c87553088a..6b00329a1f 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -185,7 +185,7 @@ class DagMC { * with outward facing normals and setting up set structure necessary for * representation as a geometric entity */ - ErrorCode box_to_surf(double llc[3], double urc[3], + ErrorCode box_to_surf(const double llc[3], const double urc[3], EntityHandle& surface_set); /** loading code shared by load_file and load_existing_contents */ From 364c24d24f5b79797e5718e1c9137b0a597b9465 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 24 Jan 2021 09:52:25 -0600 Subject: [PATCH 44/50] Moving lowercase_str into a new dagmc_util namespace. --- src/dagmc/DagMC.cpp | 2 +- src/dagmc/dagmcmetadata.cpp | 2 +- src/dagmc/util.hpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 294dfec08c..a8b9fbbbca 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -233,7 +233,7 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { MB_CHK_SET_ERR_CONT(rval, "Failed to get a group name"); // convert name to lower case for comparison - lowercase_str(group_name); + dagmc_util::lowercase_str(group_name); // resize to match the length (trims trailing empty values) group_name.resize(GRAVEYARD_NAME.size()); diff --git a/src/dagmc/dagmcmetadata.cpp b/src/dagmc/dagmcmetadata.cpp index 88145f170a..2e8383f782 100644 --- a/src/dagmc/dagmcmetadata.cpp +++ b/src/dagmc/dagmcmetadata.cpp @@ -341,7 +341,7 @@ void dagmcMetaData::parse_tally_volume_data() { } std::string dagmcMetaData::to_lower(std::string input) { - moab::lowercase_str(input); + dagmc_util::lowercase_str(input); return input; } diff --git a/src/dagmc/util.hpp b/src/dagmc/util.hpp index dac384dc0c..9a8b64c0e1 100644 --- a/src/dagmc/util.hpp +++ b/src/dagmc/util.hpp @@ -3,12 +3,12 @@ #include -namespace moab { // TODO: separate into a new namespace +namespace dagmc_util { inline void lowercase_str(std::string& input) { std::transform(input.begin(), input.end(), input.begin(), [](unsigned char c) { return std::tolower(c); }); } -} // namespace moab +} // namespace dagmc_util #endif \ No newline at end of file From 1134648aaefd2afa69d6c59adaccff313e440ba4 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Sun, 24 Jan 2021 09:57:15 -0600 Subject: [PATCH 45/50] Report number of graveyard groups to user in error message. --- src/dagmc/DagMC.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index a8b9fbbbca..1cf28fde55 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -248,7 +248,8 @@ ErrorCode DagMC::get_graveyard_group(EntityHandle& graveyard_group) { // there should not be more than one graveyard group if (graveyard_count > 1) { MB_CHK_SET_ERR(MB_FAILURE, - "More than one graveyard group is present in the model"); + "More than one graveyard group is present in the model. " + << graveyard_count << " graveyard groups were found."); } // if the graveyard was not found, return an error From 67a4765e58d8f25f5f6ff920b08aefc98ffefd1c Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Thu, 25 Mar 2021 14:56:32 -0500 Subject: [PATCH 46/50] Adding some wrapper functions to avoid propagation of ifdefs. --- src/dagmc/DagMC.cpp | 75 ++++++++++++++++++++++++++++++----- src/dagmc/DagMC.hpp | 10 +++++ src/overlap_check/overlap.cpp | 2 +- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 1cf28fde55..1bc228a741 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -75,7 +75,8 @@ DagMC::DagMC(std::shared_ptr mb_impl, double overlap_tolerance, this->set_numerical_precision(p_numerical_precision); } -DagMC::DagMC(Interface* mb_impl, double overlap_tolerance, +DagMC::DagMC(Interface* mb_impl, + double overlap_tolerance, double p_numerical_precision) { moab_instance_created = false; // set the internal moab pointer @@ -275,8 +276,11 @@ ErrorCode DagMC::remove_graveyard() { sets_to_delete.insert(graveyard_group); // check for bounding box trees on the model +#ifdef DOUBLE_DOWN + bool trees_exist = ray_tracer->has_bvh(); +#else bool trees_exist = geom_tool()->have_obb_tree(); - +#endif // get the graveyard volume Range graveyard_vols; rval = @@ -294,14 +298,15 @@ ErrorCode DagMC::remove_graveyard() { // update the implicit complement tree if needed if (trees_exist) { if (implicit_complement) { - rval = geom_tool()->delete_obb_tree(implicit_complement, true); + rval = remove_bvh(implicit_complement, true); MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement OBBTree/BVH"); } for (auto vol : graveyard_vols) { // will recursively delete the graveyard volume's surface trees as well - rval = geom_tool()->delete_obb_tree(vol); - MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); + rval = remove_bvh(vol); + MB_CHK_SET_ERR(rval, + "Failed to delete the graveyard volume's tree"); } } @@ -354,7 +359,7 @@ ErrorCode DagMC::remove_graveyard() { // re-construct the implicit complement's tree if needed if (trees_exist && implicit_complement) { - rval = geom_tool()->construct_obb_tree(implicit_complement); + rval = build_bvh(implicit_complement); MB_CHK_SET_ERR(rval, "Failed to re-create the implicit complement OBBTree/BVH"); } @@ -401,7 +406,7 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // currently relying on the BVH as looping over all vertices may // be too expensive - if (!geom_tool()->have_obb_tree()) { + if (!has_acceleration_datastructures()) { MB_CHK_SET_ERR(MB_FAILURE, "Graveyard creation attempted without BVH"); } @@ -519,18 +524,22 @@ ErrorCode DagMC::create_graveyard(bool overwrite) { // OBBTree/BVH updates + // update the geometry sets + rval = geom_tool()->find_geomsets(); + MB_CHK_SET_ERR(rval, "Failed to update the geometry sets"); + // delete the implicit complement tree (but not the surface trees) - rval = geom_tool()->delete_obb_tree(implicit_complement, true); + rval = remove_bvh(implicit_complement, true); MB_CHK_SET_ERR(rval, "Failed to delete the implicit complement tree"); // create BVH for both the new implicit complement and the new graveyard // volume - rval = geom_tool()->construct_obb_tree(volume_set); + rval = build_bvh(volume_set); MB_CHK_SET_ERR( rval, "Failed to build accel. data structure for the new graveyard volume"); - rval = geom_tool()->construct_obb_tree(implicit_complement); + rval = build_bvh(implicit_complement); MB_CHK_SET_ERR( rval, "Failed to build accel. data structure for the new implicit complement"); @@ -647,6 +656,39 @@ ErrorCode DagMC::init_OBBTree() { return MB_SUCCESS; } +ErrorCode DagMC::remove_bvh(EntityHandle volume, bool unjoin_vol) { + ErrorCode rval = MB_SUCCESS; + #ifdef DOUBLE_DOWN + // we don't use unjoin_volume here because + // double-down creates a BVH for each volume + ray_tracer->deleteBVH(volume); + #else + rval = geom_tool()->delete_obb_tree(volume, unjoin_vol); + MB_CHK_SET_ERR(rval, + "Failed to delete the volume's OBBTree/BVH"); + #endif + return rval; +} + +ErrorCode DagMC::build_bvh(EntityHandle volume) { + ErrorCode rval = MB_SUCCESS; + #ifdef DOUBLE_DOWN + ray_tracer->createBVH(volume); + #else + rval = geom_tool()->construct_obb_tree(volume); + MB_CHK_SET_ERR(rval, "Failed to create the bvh for a volume."); + #endif + return rval; +} + +bool DagMC::has_acceleration_datastructures() { + #ifdef DOUBLE_DOWN + return ray_tracer->has_bvh(); + #else + return geom_tool()->have_obb_tree(); + #endif +} + // helper function to finish setting up required tags. ErrorCode DagMC::finish_loading() { ErrorCode rval; @@ -901,6 +943,19 @@ ErrorCode DagMC::write_mesh(const char* ffile, const int flen) { return MB_SUCCESS; } +ErrorCode DagMC::getobb(EntityHandle volume, double minPt[3], + double maxPt[3]) { + ErrorCode rval = MB_SUCCESS; + #ifdef DOUBLE_DOWN + rval = ray_tracer->get_bbox(volume, minPt, maxPt); + #else + rval = GTT->get_bounding_coords(volume, minPt, maxPt); + #endif + MB_CHK_SET_ERR(rval, "Failed to get obb for volume"); + return MB_SUCCESS; +} + + /* SECTION V: Metadata handling */ ErrorCode DagMC::get_group_name(EntityHandle group_set, std::string& name) { diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 6b00329a1f..41a8a68f03 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -165,6 +165,7 @@ class DagMC { /**\brief Removes the graveyard if one is present. */ ErrorCode remove_graveyard(); + /**\brief Create a graveyard (a volume representing the volume boundary). * * Create a cuboid volume marked with metadata indicating it is the boundary @@ -177,6 +178,9 @@ class DagMC { /** Returns true if the model has a graveyard volume, false if not */ bool has_graveyard(); + /** Returns true if the model has any trees, false if not */ + bool has_acceleration_datastructures(); + /** Retrieve the graveyard group on the model if it exists */ ErrorCode get_graveyard_group(EntityHandle& graveyard_group); @@ -188,6 +192,12 @@ class DagMC { ErrorCode box_to_surf(const double llc[3], const double urc[3], EntityHandle& surface_set); + /**\brief Removes the BVH for the specified volume */ + ErrorCode remove_bvh(EntityHandle volume, bool unjoin_vol = false); + + /**\brief Builds the BVH for a specified volume */ + ErrorCode build_bvh(EntityHandle volume); + /** loading code shared by load_file and load_existing_contents */ ErrorCode finish_loading(); diff --git a/src/overlap_check/overlap.cpp b/src/overlap_check/overlap.cpp index 1b64c8b3b5..637987bc25 100644 --- a/src/overlap_check/overlap.cpp +++ b/src/overlap_check/overlap.cpp @@ -149,7 +149,7 @@ ErrorCode check_instance_for_overlaps(std::shared_ptr MBI, for (auto& loc : locations) { rval = check_location_for_overlap(GQT, all_vols, loc, dir, overlap_map); MB_CHK_SET_ERR_CONT(rval, "Failed to check point for overlap"); -#pragma omp critical + #pragma omp critical prog_bar.set_value(100.0 * (double)num_checked++ / (double)num_locations); } From a940fb5a6b751dd8bc598c5361031258b4a701ca Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Fri, 23 Jul 2021 15:13:37 -0500 Subject: [PATCH 47/50] Removing old news file. Updating changelog. --- doc/CHANGELOG.rst | 7 +++++++ news/PR-0714.rst | 20 -------------------- 2 files changed, 7 insertions(+), 20 deletions(-) delete mode 100644 news/PR-0714.rst diff --git a/doc/CHANGELOG.rst b/doc/CHANGELOG.rst index fefc72b832..1112dc1c64 100644 --- a/doc/CHANGELOG.rst +++ b/doc/CHANGELOG.rst @@ -15,6 +15,13 @@ Next version * GitHub Action to build and upload Docker images. (#746, #748, #754, #757, #758, #759, #765, #767) * Enforcing usage of Python3 for PyNE amalgamation. (#773) * Adding workflow_dispatch option to docker_publish workflow (#776) + * DagMC methods for creation and removal of the graveyard volume (#714) + * DagMC::remove_graveyard + * DagMC::create_graveyard + * DagMC::has_graveyard + * DagMC::get_graveyard_group + * DagMC::category_tag + * DagMC::box_to_surf (private method) **Changed:** diff --git a/news/PR-0714.rst b/news/PR-0714.rst deleted file mode 100644 index a4cee4fc8a..0000000000 --- a/news/PR-0714.rst +++ /dev/null @@ -1,20 +0,0 @@ -**Added:** - - - The following public methods for creation and removal of graveyard volumes: - - DagMC::remove_graveyard - - DagMC::create_graveyard - - DagMC::has_graveyard - - DagMC::get_graveyard_group - - DagMC::category_tag - - Other, private methods: - - DagMC::box_to_surf - -**Changed:** None - -**Deprecated:** None - -**Removed:** None - -**Fixed:** None - -**Security:** None From f8db99ad20ecb081a27add65f7f70e6122454209 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 17 Aug 2021 11:05:03 -0500 Subject: [PATCH 48/50] Removing duplicate getobb definition after rebase. --- src/dagmc/DagMC.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 1bc228a741..548d0c0d63 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -943,19 +943,6 @@ ErrorCode DagMC::write_mesh(const char* ffile, const int flen) { return MB_SUCCESS; } -ErrorCode DagMC::getobb(EntityHandle volume, double minPt[3], - double maxPt[3]) { - ErrorCode rval = MB_SUCCESS; - #ifdef DOUBLE_DOWN - rval = ray_tracer->get_bbox(volume, minPt, maxPt); - #else - rval = GTT->get_bounding_coords(volume, minPt, maxPt); - #endif - MB_CHK_SET_ERR(rval, "Failed to get obb for volume"); - return MB_SUCCESS; -} - - /* SECTION V: Metadata handling */ ErrorCode DagMC::get_group_name(EntityHandle group_set, std::string& name) { From 5b418ecbfb6013a432ce595085fe3e629e5a3f9c Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 17 Aug 2021 11:10:46 -0500 Subject: [PATCH 49/50] Applying style guide. --- src/dagmc/DagMC.cpp | 41 ++++++++++++++++------------------- src/dagmc/DagMC.hpp | 1 - src/overlap_check/overlap.cpp | 2 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/src/dagmc/DagMC.cpp b/src/dagmc/DagMC.cpp index 548d0c0d63..c72eb7e859 100644 --- a/src/dagmc/DagMC.cpp +++ b/src/dagmc/DagMC.cpp @@ -75,8 +75,7 @@ DagMC::DagMC(std::shared_ptr mb_impl, double overlap_tolerance, this->set_numerical_precision(p_numerical_precision); } -DagMC::DagMC(Interface* mb_impl, - double overlap_tolerance, +DagMC::DagMC(Interface* mb_impl, double overlap_tolerance, double p_numerical_precision) { moab_instance_created = false; // set the internal moab pointer @@ -305,8 +304,7 @@ ErrorCode DagMC::remove_graveyard() { for (auto vol : graveyard_vols) { // will recursively delete the graveyard volume's surface trees as well rval = remove_bvh(vol); - MB_CHK_SET_ERR(rval, - "Failed to delete the graveyard volume's tree"); + MB_CHK_SET_ERR(rval, "Failed to delete the graveyard volume's tree"); } } @@ -658,35 +656,34 @@ ErrorCode DagMC::init_OBBTree() { ErrorCode DagMC::remove_bvh(EntityHandle volume, bool unjoin_vol) { ErrorCode rval = MB_SUCCESS; - #ifdef DOUBLE_DOWN - // we don't use unjoin_volume here because - // double-down creates a BVH for each volume - ray_tracer->deleteBVH(volume); - #else - rval = geom_tool()->delete_obb_tree(volume, unjoin_vol); - MB_CHK_SET_ERR(rval, - "Failed to delete the volume's OBBTree/BVH"); - #endif +#ifdef DOUBLE_DOWN + // we don't use unjoin_volume here because + // double-down creates a BVH for each volume + ray_tracer->deleteBVH(volume); +#else + rval = geom_tool()->delete_obb_tree(volume, unjoin_vol); + MB_CHK_SET_ERR(rval, "Failed to delete the volume's OBBTree/BVH"); +#endif return rval; } ErrorCode DagMC::build_bvh(EntityHandle volume) { ErrorCode rval = MB_SUCCESS; - #ifdef DOUBLE_DOWN - ray_tracer->createBVH(volume); - #else - rval = geom_tool()->construct_obb_tree(volume); - MB_CHK_SET_ERR(rval, "Failed to create the bvh for a volume."); - #endif +#ifdef DOUBLE_DOWN + ray_tracer->createBVH(volume); +#else + rval = geom_tool()->construct_obb_tree(volume); + MB_CHK_SET_ERR(rval, "Failed to create the bvh for a volume."); +#endif return rval; } bool DagMC::has_acceleration_datastructures() { - #ifdef DOUBLE_DOWN +#ifdef DOUBLE_DOWN return ray_tracer->has_bvh(); - #else +#else return geom_tool()->have_obb_tree(); - #endif +#endif } // helper function to finish setting up required tags. diff --git a/src/dagmc/DagMC.hpp b/src/dagmc/DagMC.hpp index 41a8a68f03..46b1489c75 100644 --- a/src/dagmc/DagMC.hpp +++ b/src/dagmc/DagMC.hpp @@ -165,7 +165,6 @@ class DagMC { /**\brief Removes the graveyard if one is present. */ ErrorCode remove_graveyard(); - /**\brief Create a graveyard (a volume representing the volume boundary). * * Create a cuboid volume marked with metadata indicating it is the boundary diff --git a/src/overlap_check/overlap.cpp b/src/overlap_check/overlap.cpp index 637987bc25..1b64c8b3b5 100644 --- a/src/overlap_check/overlap.cpp +++ b/src/overlap_check/overlap.cpp @@ -149,7 +149,7 @@ ErrorCode check_instance_for_overlaps(std::shared_ptr MBI, for (auto& loc : locations) { rval = check_location_for_overlap(GQT, all_vols, loc, dir, overlap_map); MB_CHK_SET_ERR_CONT(rval, "Failed to check point for overlap"); - #pragma omp critical +#pragma omp critical prog_bar.set_value(100.0 * (double)num_checked++ / (double)num_locations); } From c31cf5d0525af1658ac3ed6e1136a7b0ec4035c3 Mon Sep 17 00:00:00 2001 From: Patrick Shriwise Date: Tue, 17 Aug 2021 12:30:07 -0500 Subject: [PATCH 50/50] Removing unecessary detail in changelog. --- doc/CHANGELOG.rst | 7 ------- 1 file changed, 7 deletions(-) diff --git a/doc/CHANGELOG.rst b/doc/CHANGELOG.rst index 1112dc1c64..8cd17fca97 100644 --- a/doc/CHANGELOG.rst +++ b/doc/CHANGELOG.rst @@ -16,13 +16,6 @@ Next version * Enforcing usage of Python3 for PyNE amalgamation. (#773) * Adding workflow_dispatch option to docker_publish workflow (#776) * DagMC methods for creation and removal of the graveyard volume (#714) - * DagMC::remove_graveyard - * DagMC::create_graveyard - * DagMC::has_graveyard - * DagMC::get_graveyard_group - * DagMC::category_tag - * DagMC::box_to_surf (private method) - **Changed:**