9 #include <stk_util/unit_test_support/stk_utest_macros.hpp>
10 #include <Shards_BasicTopologies.hpp>
12 #include <stk_util/parallel/Parallel.hpp>
14 #include <stk_mesh/base/MetaData.hpp>
15 #include <stk_mesh/base/BulkData.hpp>
16 #include <stk_mesh/base/Entity.hpp>
17 #include <stk_mesh/base/GetEntities.hpp>
18 #include <stk_mesh/base/Selector.hpp>
19 #include <stk_mesh/base/GetBuckets.hpp>
21 #include <stk_mesh/fem/BoundaryAnalysis.hpp>
22 #include <stk_mesh/fem/FEMHelpers.hpp>
24 #include <stk_mesh/fixtures/GridFixture.hpp>
29 static const size_t NODE_RANK = stk_classic::mesh::fem::FEMMetaData::NODE_RANK;
31 class UnitTestStkMeshBoundaryAnalysis {
39 void test_boundary_analysis();
40 void test_boundary_analysis_null_topology();
49 STKUNIT_UNIT_TEST( UnitTestStkMeshBoundaryAnalysis , testUnit )
51 UnitTestStkMeshBoundaryAnalysis unit(MPI_COMM_WORLD);
52 unit.test_boundary_analysis();
55 STKUNIT_UNIT_TEST( UnitTestStkMeshBoundaryAnalysis , testNullTopology )
57 UnitTestStkMeshBoundaryAnalysis unit(MPI_COMM_WORLD);
58 unit.test_boundary_analysis_null_topology();
63 void UnitTestStkMeshBoundaryAnalysis::test_boundary_analysis()
86 if (m_num_procs > 1) {
91 stk_classic::mesh::fixtures::GridFixture grid_mesh(MPI_COMM_WORLD);
96 const stk_classic::mesh::EntityRank element_rank = fem_meta.
element_rank();
99 stk_classic::mesh::fem::CellTopology line_top(shards::getCellTopologyData<shards::ShellLine<2> >());
105 grid_mesh.generate_grid();
108 const unsigned num_shells = 4;
111 std::vector<unsigned>
count;
114 const unsigned num_entities =
count[NODE_RANK] +
count[element_rank];
117 std::vector<stk_classic::mesh::Entity*> shells;
119 shell_parts.push_back(&shell_part);
120 for (
unsigned i = 1; i <= num_shells; ++i) {
124 shells.push_back(&new_shell);
128 unsigned node_list[5] = {20, 25, 30, 35, 40};
129 for (
unsigned i = 0; i < num_shells; ++i) {
140 std::vector<stk_classic::mesh::Entity*> closure;
141 unsigned num_elems_in_closure = 6;
142 stk_classic::mesh::EntityId ids_of_entities_in_closure[] =
143 {6, 7, 10, 11, 14, 15, 23, 24, 25, 28, 29, 30, 33, 34, 35, 38, 39, 40};
145 i <
sizeof(ids_of_entities_in_closure)/
sizeof(stk_classic::mesh::EntityId);
147 stk_classic::mesh::EntityRank rank_of_entity;
148 if (i < num_elems_in_closure) {
149 rank_of_entity = element_rank;
152 rank_of_entity = NODE_RANK;
155 bulk_data.
get_entity(rank_of_entity, ids_of_entities_in_closure[i]);
156 closure.push_back(closure_entity);
162 stk_classic::mesh::EntitySideVector boundary;
163 stk_classic::mesh::boundary_analysis(bulk_data, closure, element_rank, boundary);
164 STKUNIT_EXPECT_TRUE(!boundary.empty());
172 typedef std::pair<stk_classic::mesh::EntityId, stk_classic::mesh::Ordinal> BoundaryItem;
173 typedef std::pair<BoundaryItem, BoundaryItem> BoundaryPair;
178 BoundaryPair results[] = {
179 BoundaryPair(BoundaryItem(6, 0), BoundaryItem(5, 2)),
181 BoundaryPair(BoundaryItem(6, 3), BoundaryItem(2, 1)),
183 BoundaryPair(BoundaryItem(7, 2), BoundaryItem(8, 0)),
184 BoundaryPair(BoundaryItem(7, 2), BoundaryItem(43, 0)),
186 BoundaryPair(BoundaryItem(7, 3), BoundaryItem(3, 1)),
188 BoundaryPair(BoundaryItem(10, 0), BoundaryItem(9, 2)),
190 BoundaryPair(BoundaryItem(11, 2), BoundaryItem(12, 0)),
191 BoundaryPair(BoundaryItem(11, 2), BoundaryItem(44, 0)),
193 BoundaryPair(BoundaryItem(14, 0), BoundaryItem(13, 2)),
195 BoundaryPair(BoundaryItem(14, 1), BoundaryItem(0, 0)),
197 BoundaryPair(BoundaryItem(15, 1), BoundaryItem(0, 0)),
199 BoundaryPair(BoundaryItem(15, 2), BoundaryItem(16, 0)),
200 BoundaryPair(BoundaryItem(15, 2), BoundaryItem(45, 0))
206 BoundaryPair expected_results[
sizeof(results)/
sizeof(BoundaryPair)];
209 stk_classic::mesh::EntitySideVector::iterator itr = boundary.begin();
211 for (; itr != boundary.end(); ++itr, ++i)
213 stk_classic::mesh::EntitySide& side = *itr;
214 stk_classic::mesh::EntitySideComponent& inside_closure = side.inside;
215 stk_classic::mesh::EntityId inside_id = inside_closure.entity != NULL ? inside_closure.entity->identifier() : 0;
216 stk_classic::mesh::EntityId inside_side = inside_closure.entity != NULL ? inside_closure.side_ordinal : 0;
217 stk_classic::mesh::EntitySideComponent& outside_closure = side.outside;
218 stk_classic::mesh::EntityId outside_id = outside_closure.entity != NULL ? outside_closure.entity->identifier() : 0;
219 stk_classic::mesh::EntityId outside_side = outside_closure.entity != NULL ? outside_closure.side_ordinal : 0;
221 expected_results[i] = BoundaryPair(BoundaryItem(inside_id, inside_side),
222 BoundaryItem(outside_id, outside_side));
227 STKUNIT_EXPECT_EQ(
sizeof(results),
sizeof(expected_results));
229 for (i = 0; i <
sizeof(results)/
sizeof(BoundaryPair); ++i) {
230 STKUNIT_EXPECT_TRUE(results[i] == expected_results[i]);
234 void UnitTestStkMeshBoundaryAnalysis::test_boundary_analysis_null_topology()
239 const int spatial_dimension = 3;
241 fem_meta.
FEM_initialize(spatial_dimension, stk_classic::mesh::fem::entity_rank_names(spatial_dimension));
243 const stk_classic::mesh::EntityRank side_rank = fem_meta.
side_rank();
253 stk_classic::mesh::EntitySideVector boundary;
254 std::vector<stk_classic::mesh::Entity*> newclosure;
257 face_parts.push_back(&quad_part);
259 bulk.modification_begin();
262 newclosure.push_back(&new_face);
265 stk_classic::mesh::boundary_analysis(bulk, newclosure, side_rank, boundary);
270 bulk.modification_end();