diff --git a/src/mesh/gmsh_io.C b/src/mesh/gmsh_io.C index 7772202aa9..b9d34a8fb5 100644 --- a/src/mesh/gmsh_io.C +++ b/src/mesh/gmsh_io.C @@ -175,14 +175,13 @@ void GmshIO::read_mesh(std::istream & in) // actually blocks of lower-dimensional elements. std::set lower_dimensional_blocks; - // Mapping from physical id -> (physical dim, physical name) pairs. + // Mapping from (physical id, physical dim) -> physical name. // These can refer to either "sidesets" or "subdomains"; we need to // wait until the Mesh has been read to know which is which. Note - // that we are using 'int' as the key here rather than + // that we are using ptrdiff_t as the key here rather than // subdomain_id_type or boundary_id_type, since at this point, it // could be either. - typedef std::pair GmshPhysical; - std::map gmsh_physicals; + std::map, std::string> gmsh_physicals; // map to hold the node numbers for translation // note the the nodes can be non-consecutive @@ -267,7 +266,7 @@ void GmshIO::read_mesh(std::istream & in) phys_name.erase(std::remove(phys_name.begin(), phys_name.end(), '"'), phys_name.end()); // Record this ID for later assignment of subdomain/sideset names. - gmsh_physicals[phys_id] = std::make_pair(phys_dim, phys_name); + gmsh_physicals[std::make_pair(phys_id, phys_dim)] = phys_name; // If 's' also contains the libmesh-specific string // "lower_dimensional_block", add this block ID to @@ -790,9 +789,8 @@ void GmshIO::read_mesh(std::istream & in) for (const auto & pr : gmsh_physicals) { // Extract data - int phys_id = pr.first; - unsigned phys_dim = pr.second.first; - const std::string & phys_name = pr.second.second; + auto [phys_id, phys_dim] = pr.first; + const std::string & phys_name = pr.second; // If the physical's dimension matches the largest // dimension we've seen, it's a subdomain name. diff --git a/tests/mesh/mesh_input.C b/tests/mesh/mesh_input.C index 5f683e0335..7f305bf032 100644 --- a/tests/mesh/mesh_input.C +++ b/tests/mesh/mesh_input.C @@ -203,6 +203,8 @@ public: CPPUNIT_TEST( testGoodSTL ); CPPUNIT_TEST( testGoodSTLBinary ); + CPPUNIT_TEST( testGmshBCIDOverlap ); + #ifdef LIBMESH_HAVE_TETGEN CPPUNIT_TEST( testTetgenIO ); #endif @@ -1562,6 +1564,32 @@ public: CPPUNIT_ASSERT_EQUAL(mesh.n_elem(), dof_id_type(14)); } + void testGmshBCIDOverlap () + { + LOG_UNIT_TEST; + + Mesh mesh(*TestCommWorld); + + GmshIO gmsh_io(mesh); + + if (mesh.processor_id() == 0) + gmsh_io.read("meshes/bcid_overlap.msh"); + MeshCommunication().broadcast(mesh); + + CPPUNIT_ASSERT_EQUAL(mesh.get_boundary_info().get_sideset_name_map().size(), + std::size_t(2)); + CPPUNIT_ASSERT_EQUAL(mesh.get_boundary_info().sideset_name(1), + std::string("srfBC4A")); + CPPUNIT_ASSERT_EQUAL(mesh.get_boundary_info().sideset_name(2), + std::string("srfBC4B")); + CPPUNIT_ASSERT_EQUAL(mesh.get_subdomain_name_map().size(), + std::size_t(2)); + CPPUNIT_ASSERT_EQUAL(mesh.subdomain_name(1), + std::string("volBC3A")); + CPPUNIT_ASSERT_EQUAL(mesh.subdomain_name(2), + std::string("volBC3B")); + } + void testGoodSTL () { LOG_UNIT_TEST; diff --git a/tests/meshes/bcid_overlap.msh b/tests/meshes/bcid_overlap.msh new file mode 100644 index 0000000000..eeebb4e9fd --- /dev/null +++ b/tests/meshes/bcid_overlap.msh @@ -0,0 +1,184 @@ +$MeshFormat +4.1 0 8 +$EndMeshFormat +$PhysicalNames +6 +1 1 "linD4A" +1 2 "linD4B" +2 1 "srfBC4A" +2 2 "srfBC4B" +3 1 "volBC3A" +3 2 "volBC3B" +$EndPhysicalNames +$Entities +9 21 15 2 +1 1 0 1 0 +2 2 0 1 0 +3 1 0 0 0 +4 2 0 0 0 +5 2 1 0 0 +6 0 0 1 0 +7 0 0 0 0 +8 0 1 0 0 +9 1 1 0 0 +1 1.0 0.0 1.0 2.0 0.0 1.0 1 1 2 1 -2 +2 1.0 0.0 0.0 1.0 0.0 1.0 0 2 3 -1 +3 1.0 0.0 0.0 2.0 0.0 1.0 0 2 3 -2 +4 2.0 0.0 0.0 2.0 0.0 1.0 0 2 4 -2 +5 1.0 0.0 0.0 2.0 1.0 1.0 0 2 9 -2 +6 2.0 0.0 0.0 2.0 1.0 1.0 0 2 5 -2 +7 0.0 0.0 1.0 1.0 0.0 1.0 1 2 2 6 -1 +8 0.0 0.0 0.0 1.0 0.0 1.0 0 2 3 -6 +9 0.0 0.0 0.0 0.0 0.0 1.0 0 2 6 -7 +10 0.0 0.0 0.0 1.0 0.0 0.0 0 2 7 -3 +11 1.0 0.0 0.0 1.0 1.0 1.0 0 2 9 -1 +12 0.0 0.0 0.0 1.0 1.0 1.0 0 2 1 -8 +13 0.0 0.0 0.0 0.0 1.0 1.0 0 2 6 -8 +14 0.0 1.0 0.0 1.0 1.0 0.0 0 2 8 -9 +15 1.0 0.0 0.0 1.0 1.0 0.0 0 2 9 -3 +16 0.0 0.0 0.0 1.0 1.0 0.0 0 2 3 -8 +17 0.0 0.0 0.0 0.0 1.0 0.0 0 2 7 -8 +18 1.0 0.0 0.0 2.0 0.0 0.0 0 2 3 -4 +19 1.0 1.0 0.0 2.0 1.0 0.0 0 2 9 -5 +20 2.0 0.0 0.0 2.0 1.0 0.0 0 2 5 -4 +21 1.0 0.0 0.0 2.0 1.0 0.0 0 2 4 -9 +1 0.0 0.0 0.0 1.0 0.0 1.0 1 1 3 8 9 10 +2 0.0 0.0 0.0 1.0 0.0 1.0 1 1 3 2 -7 -8 +3 1.0 0.0 0.0 2.0 0.0 1.0 1 2 3 3 -1 -2 +4 1.0 0.0 0.0 2.0 0.0 1.0 1 2 3 18 4 -3 +5 0.0 0.0 0.0 1.0 1.0 0.0 0 3 14 15 16 +6 0.0 0.0 0.0 1.0 1.0 0.0 0 3 17 -16 -10 +7 0.0 0.0 0.0 1.0 1.0 1.0 0 3 14 11 12 +8 0.0 0.0 0.0 1.0 1.0 1.0 0 3 13 -12 -7 +9 0.0 0.0 0.0 0.0 1.0 1.0 0 3 -17 -9 13 +10 1.0 0.0 0.0 1.0 1.0 1.0 0 3 -2 -15 11 +11 1.0 0.0 0.0 2.0 1.0 0.0 0 3 19 20 21 +12 1.0 0.0 0.0 2.0 1.0 0.0 0 3 -15 -21 -18 +13 1.0 0.0 0.0 2.0 1.0 1.0 0 3 5 -1 -11 +14 1.0 0.0 0.0 2.0 1.0 1.0 0 3 6 -5 19 +15 2.0 0.0 0.0 2.0 1.0 1.0 0 3 4 -6 20 +1 0.0 0.0 0.0 1.0 1.0 1.0 1 1 8 1 2 9 6 10 8 5 7 +2 1.0 0.0 0.0 2.0 1.0 1.0 1 2 8 3 4 13 10 12 15 11 14 +$EndEntities +$Nodes +36 30 1 31 +0 1 0 1 +1 +1 0 1 +0 2 0 1 +2 +2 0 1 +0 3 0 1 +3 +1 0 0 +0 4 0 1 +4 +2 0 0 +0 5 0 1 +5 +2 1 0 +0 6 0 1 +6 +0 0 1 +0 7 0 1 +7 +0 0 0 +0 8 0 1 +8 +0 1 0 +0 9 0 1 +9 +1 1 0 +1 1 0 1 +11 +1.5 0 1 +1 2 0 1 +12 +1 0 0.5 +1 3 0 1 +13 +1.5 0 0.5 +1 4 0 1 +14 +2 0 0.5 +1 5 0 1 +15 +1.5 0.5 0.5 +1 6 0 1 +16 +2 0.5 0.5 +1 7 0 1 +17 +0.5 0 1 +1 8 0 1 +18 +0.5 0 0.5 +1 9 0 1 +19 +0 0 0.5 +1 10 0 1 +20 +0.5 0 0 +1 11 0 1 +21 +1 0.5 0.5 +1 12 0 1 +22 +0.5 0.5 0.5 +1 13 0 1 +23 +0 0.5 0.5 +1 14 0 1 +24 +0.5 1 0 +1 15 0 1 +25 +1 0.5 0 +1 16 0 1 +26 +0.5 0.5 0 +1 17 0 1 +27 +0 0.5 0 +1 18 0 1 +28 +1.5 0 0 +1 19 0 1 +29 +1.5 1 0 +1 20 0 1 +30 +2 0.5 0 +1 21 0 1 +31 +1.5 0.5 0 +2 1 0 0 +2 2 0 0 +2 3 0 0 +2 4 0 0 +3 1 0 0 +3 2 0 0 +$EndNodes +$Elements +8 12 94 135 +1 1 8 1 +94 1 2 11 +1 7 8 1 +100 6 1 17 +2 1 9 1 +115 3 6 7 18 19 20 +2 2 9 1 +116 1 6 3 17 18 12 +2 3 9 1 +117 1 3 2 12 13 11 +2 4 9 1 +118 2 3 4 13 28 14 +3 1 11 3 +130 6 3 7 8 18 20 19 23 27 26 +131 9 8 3 1 24 26 25 21 12 22 +132 6 3 8 1 18 26 23 17 22 12 +3 2 11 3 +133 3 2 9 1 13 15 25 12 21 11 +134 2 4 9 5 14 31 15 16 29 30 +135 2 3 9 4 13 25 15 14 31 28 +$EndElements