3838
3939
4040#include < array>
41+ #include < unordered_set>
4142#include < vector>
4243
4344struct 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