Skip to content

Commit ae623ba

Browse files
authored
Merge pull request #875 from aritorto/logCartSizeParallel
Add cases with distributed grids in logicalCartesianSize_and_refinement_test.cpp
2 parents 1affdfa + ce7ed56 commit ae623ba

File tree

3 files changed

+80
-27
lines changed

3 files changed

+80
-27
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ if(MPI_FOUND)
125125
add_test(distribution_test_parallel ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 bin/distribution_test)
126126
add_test(grid_global_id_set_test_parallel ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 bin/grid_global_id_set_test)
127127
add_test(lgr_cell_id_sync_test_parallel ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 bin/lgr_cell_id_sync_test)
128+
add_test(logicalCartesianSize_and_refinement_test_parallel ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 bin/logicalCartesianSize_and_refinement_test)
128129
if(Boost_VERSION_STRING VERSION_GREATER 1.53)
129130
add_test(lgr_with_inactive_parent_cells_test_parallel ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 4 bin/lgr_with_inactive_parent_cells_test)
130131
add_test(test_graphofgrid_parallel3 ${MPIEXEC_EXECUTABLE} ${MPIEXEC_NUMPROC_FLAG} 3 bin/test_graphofgrid_parallel)

opm/grid/cpgrid/CpGrid.cpp

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2009,25 +2009,15 @@ bool CpGrid::adapt()
20092009
}
20102010
}
20112011

2012-
// Check if its a global refinement
2013-
bool is_global_refine = false;
20142012
std::vector<std::string> lgr_name_vec = { "LGR" + std::to_string(preAdaptMaxLevel +1) };
2015-
// Rewrite if global refinement
2016-
#if HAVE_MPI
2013+
20172014
auto global_marked_elem_count = comm().sum(local_marked_elem_count);
20182015
auto global_cell_count_before_adapt = comm().sum(current_view_data_-> size(0)); // Recall overlap cells are also marked
2019-
if (global_marked_elem_count == global_cell_count_before_adapt) {
2020-
// GR stands for GLOBAL REFINEMET
2021-
lgr_name_vec = { "GR" + std::to_string(preAdaptMaxLevel +1) };
2022-
is_global_refine = true; // parallel
2023-
}
2024-
#endif
2025-
if ( (comm().size() == 0) && (local_marked_elem_count == current_view_data_-> size(0)) ) {
2026-
// GR stands for GLOBAL REFINEMET
2027-
lgr_name_vec = { "GR" + std::to_string(preAdaptMaxLevel +1) };
2028-
is_global_refine = true; // sequential
2029-
}
2016+
// Check if its a global refinement
2017+
bool is_global_refine = (global_marked_elem_count == global_cell_count_before_adapt);
20302018
if (is_global_refine) { // parallel or sequential
2019+
// Rewrite the lgr name (GR stands for GLOBAL REFINEMET)
2020+
lgr_name_vec = { "GR" + std::to_string(preAdaptMaxLevel +1) };
20312021
const std::array<int,3>& endIJK = currentData().back()->logicalCartesianSize();
20322022
return this->adapt(cells_per_dim_vec, assignRefinedLevel, lgr_name_vec, {{0,0,0}}, {endIJK});
20332023
}

tests/cpgrid/logicalCartesianSize_and_refinement_test.cpp

Lines changed: 74 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939

4040
#include <array>
41+
#include <unordered_set>
4142
#include <vector>
4243

4344
struct Fixture {
@@ -61,11 +62,19 @@ void areEqual(const std::array<int,3>& expected_logicalCartesianSize,
6162
BOOST_CHECK_EQUAL(expected_logicalCartesianSize[2], actual_logicalCartesianSize[2]);
6263
}
6364

64-
BOOST_AUTO_TEST_CASE(lgrLogicalCartesianSize_afterAddLgrsUpdateLeafView_makesSense)
65+
// This test reuses in each case the same grid and LGRs, to check
66+
// serial and parallel bahavior. The difference is how refinement
67+
// gets trigered, namemly, by calling addLgrsUpdateLeafView(...),
68+
// adapt(), or globalRefine(..).
69+
BOOST_AUTO_TEST_CASE(lgrLogCartSize_afterAddLgrsUpdateLeafView_makesSense)
6570
{
6671
Dune::CpGrid grid;
6772
grid.createCartesian(/* grid_dim = */ {4,3,3}, /* cell_sizes = */ {1.0, 1.0, 1.0});
6873

74+
bool isParallel = grid.comm().size() > 1;
75+
if (isParallel) {
76+
grid.loadBalance();
77+
}
6978
grid.addLgrsUpdateLeafView( /* cells_per_dim = */ {{3,3,3}, {3,3,3}},
7079
/* startIJK_vec = */ {{0,0,1}, {2,2,2}},
7180
/* endIJK_vec = */ {{3,2,2}, {4,3,3}},
@@ -78,15 +87,17 @@ BOOST_AUTO_TEST_CASE(lgrLogicalCartesianSize_afterAddLgrsUpdateLeafView_makesSen
7887
// Block shaped parent cells of LGR2 dimensions (4-2)x(3-2)x(3-2). Number of subdivisions per cell, per direction {3,3,3}.
7988
areEqual( /* expected_logicalCartisianSize = */ {6,3,3}, // LGR2 dimensions {(4-2)*3, (3-2)*3, (3-2)*3}.
8089
/* LGR2 logicalCartesianSize = */ grid.currentData()[2]->logicalCartesianSize());
81-
8290
}
8391

84-
85-
BOOST_AUTO_TEST_CASE(gridLogicalCartesianSize_afterStrictLocalRefinementWith_addLgrsUpdateLeafView_isACopyOfLevelZeroLogicalCartesianSize)
92+
BOOST_AUTO_TEST_CASE(gridLogCartSize_afterStrictLocalRefinementWith_addLgrsUpdateLeafView_isACopyOfLevelZeroLogCartSize)
8693
{
8794
Dune::CpGrid grid;
8895
grid.createCartesian(/* grid_dim = */ {4,3,3}, /* cell_sizes = */ {1.0, 1.0, 1.0});
8996

97+
bool isParallel = grid.comm().size() > 1;
98+
if (isParallel) {
99+
grid.loadBalance();
100+
}
90101
grid.addLgrsUpdateLeafView(/* cells_per_dim = */ {{3,3,3}, {3,3,3}},
91102
/* startIJK_vec = */ {{0,0,1}, {2,2,2}},
92103
/* endIJK_vec = */ {{3,2,2}, {4,3,3}},
@@ -99,11 +110,15 @@ BOOST_AUTO_TEST_CASE(gridLogicalCartesianSize_afterStrictLocalRefinementWith_add
99110
grid.logicalCartesianSize());
100111
}
101112

102-
BOOST_AUTO_TEST_CASE(gridLogicalCartesianSize_afterHiddenGlobalRefinementWith_addLgrsUpdateLeafView_makesSense)
113+
BOOST_AUTO_TEST_CASE(gridLogCartSize_afterHiddenGlobalRefinementWith_addLgrsUpdateLeafView_makesSense)
103114
{
104115
Dune::CpGrid grid;
105116
grid.createCartesian(/* grid_dim = */ {4,3,3}, /* cell_sizes = */ {1.0, 1.0, 1.0});
106117

118+
bool isParallel = grid.comm().size() > 1;
119+
if (isParallel) {
120+
grid.loadBalance();
121+
}
107122
grid.addLgrsUpdateLeafView(/* cells_per_dim = */ {{3,3,3}},
108123
/* startIJK_vec = */ {{0,0,0}},
109124
/* endIJK_vec = */ {{4,3,3}},
@@ -121,14 +136,28 @@ BOOST_AUTO_TEST_CASE(gridLogicalCartesianSize_afterHiddenGlobalRefinementWith_ad
121136
grid.logicalCartesianSize());
122137
}
123138

124-
125-
BOOST_AUTO_TEST_CASE(lgrAndGridLogicalCartesianSize_afterStrictLocalRefinementWith_adapt_areACopyOfLevelZeroLogicalCartesianSize)
139+
BOOST_AUTO_TEST_CASE(lgrAndGridLogCartSize_afterStrictLocalRefinementWith_adapt_areACopyOfLevelZeroLogCartSize)
126140
{
127141
Dune::CpGrid grid;
128142
grid.createCartesian(/* grid_dim = */ {4,3,3}, /* cell_sizes = */ {1.0, 1.0, 1.0});
129143

130-
std::vector<int> markedCells = {17,18,21,22};
131-
Opm::adaptGrid(grid, markedCells); // Default subdivisions per cell 2x2x2 in x-,y-, and z-direction.
144+
bool isParallel = grid.comm().size() > 1;
145+
if (isParallel){
146+
grid.loadBalance();
147+
}
148+
149+
std::unordered_set<int> markedCells = {17,18,21,22}; // parent cell global ids
150+
// Mark selected elements for refinement
151+
for (const auto& element : elements(grid.leafGridView())) {
152+
const auto& id = grid.globalIdSet().id(element);
153+
if (markedCells.count(id) > 0) {
154+
grid.mark(1, element);
155+
}
156+
}
157+
158+
grid.preAdapt();
159+
grid.adapt(); // Default subdivisions per cell 2x2x2 in x-,y-, and z-direction.
160+
grid.postAdapt();
132161

133162
areEqual(/* grid dimensions before refinement = */ {4,3,3},
134163
/* level 0 logicalCartesianSize = */ grid.currentData().front()->logicalCartesianSize());
@@ -141,15 +170,48 @@ BOOST_AUTO_TEST_CASE(lgrAndGridLogicalCartesianSize_afterStrictLocalRefinementWi
141170
grid.logicalCartesianSize());
142171
}
143172

144-
BOOST_AUTO_TEST_CASE(lgrAndGridLogicalCartesianSize_after_globalRefine_makeSense)
173+
BOOST_AUTO_TEST_CASE(lgrAndGridLogCartSize_afterHiddenGlobalRefinementWith_adapt_makeSense)
145174
{
146175
Dune::CpGrid grid;
147176
grid.createCartesian(/* grid_dim = */ {4,3,3}, /* cell_sizes = */ {1.0, 1.0, 1.0});
148177

178+
areEqual(/* grid dimensions before refinement = */ {4,3,3},
179+
/* level 0 logicalCartesianSize = */ grid.currentData().front()->logicalCartesianSize());
180+
181+
bool isParallel = grid.comm().size() > 1;
182+
if (isParallel) {
183+
grid.loadBalance();
184+
}
185+
// Mark all elements -> 'indirect' globalRefine
186+
for (const auto& element : elements(grid.leafGridView())) {
187+
grid.mark(1, element);
188+
}
189+
grid.preAdapt();
190+
grid.adapt(); // Default subdivisions per cell 2x2x2 in x-,y-, and z-direction.
191+
grid.postAdapt();
192+
193+
areEqual(/* expected logicalCartesianSize = */ {4*2, 3*2, 3*2},
194+
/* LGR1 logicalCartesianSize = */ grid.currentData()[1]->logicalCartesianSize());
195+
196+
areEqual(/* expected logicalCartesianSize = */ {4*2, 3*2, 3*2},
197+
grid.logicalCartesianSize());
198+
}
199+
200+
BOOST_AUTO_TEST_CASE(lgrAndGridLogCartSize_after_globalRefine_makeSense)
201+
{
202+
Dune::CpGrid grid;
203+
grid.createCartesian(/* grid_dim = */ {4,3,3}, /* cell_sizes = */ {1.0, 1.0, 1.0});
204+
205+
bool isParallel = grid.comm().size() > 1;
206+
if (isParallel) {
207+
grid.loadBalance();
208+
}
149209
grid.globalRefine(1); // Default subdivisions per cell 2x2x2 in x-,y-, and z-direction.
150210

151-
areEqual(/* expected logicalCartesianSize = */ {4*2, 3*2, 3*2}, grid.logicalCartesianSize());
211+
areEqual(/* expected logicalCartesianSize = */ {4*2, 3*2, 3*2},
212+
grid.logicalCartesianSize());
152213
// The refined level grid is a "copy" of the leaf grid view, if globalRefine has been invoked.
153214
// TODO: remove the refined level grid in this case.
154-
areEqual(/* expected logicalCartesianSize = */ {4*2, 3*2, 3*2}, grid.currentData()[1]->logicalCartesianSize());
215+
areEqual(/* expected logicalCartesianSize = */ {4*2, 3*2, 3*2},
216+
grid.currentData()[1]->logicalCartesianSize());
155217
}

0 commit comments

Comments
 (0)