@@ -215,34 +215,31 @@ TEST(ProcessTopology, DefaultConstructorIsSingleProcess)
215215
216216TEST (ProcessTopology, ConstructAndAccessors)
217217{
218- // Procs 10 world ranks 0..9.
219- // KPAR=3 -> pool sizes {4,3,3} i.e. pools cover ranks:
220- // pool0: 0..3, pool1:4..6, pool2:7..9
221- // BNDPAR=2 splits each pool into 2 stripe-contiguous band groups.
222- // Each band group is required globally to contain NPROC_IN_BAND_GROUP=5
223- // (bndpar * nproc_in_band_group = 10 = world), so per-pool slice
224- // sizes into band groups are:
225- // pool0 (4) -> 2 each into bg0/bg1 -> bg0: 0,1 bg1: 2,3
226- // pool1 (3) -> 1 (bg1 gets +1 due pool1 divide even=false via kpar)
227- // Actually ABACUS bndpar_group.divide_group_comm(NG, even=true);
228- // but the constructor only asserts the size invariants
229- // provided by callers; we keep this synthetic vector
230- // consistent with a valid layout and pick ranks such
231- // that the band_group_root_rank helper produces 0/5:
232- // bg0 global set -> {0,1 of pool0; first of pool1; first 2 of pool2} = 5 ranks -> root rank 0
233- // bg1 global set -> {2,3 of pool0; last 2 of pool1; last 1 of pool2} = 5 ranks -> root rank 5
234- const std::vector<int > pool_sizes = {4 , 3 , 3 };
218+ // Real ABACUS layout with 12 world ranks 0..11, KPAR=3, BNDPAR=2.
219+ // divide_pools constraint (BNDPAR>1): NPROC % (BNDPAR*KPAR) == 0,
220+ // i.e. 12 % 6 == 0, so pools are even: {4,4,4} covering ranks
221+ // pool0: 0..3, pool1: 4..7, pool2: 8..11
222+ // Each pool is split by BNDPAR=2 (even) into 2 slices of
223+ // pool_size/bndpar = 2 ranks:
224+ // bg0: {0,1} {4,5} {8,9} -> 6 ranks, root = world rank 0
225+ // bg1: {2,3} {6,7} {10,11} -> 6 ranks, root = world rank 2
226+ // Global band-group size nproc_in_band_group = kpar * 2 = 6 and
227+ // bndpar * nproc_in_band_group = 12 = world.
228+ // my_rank = 6 sits in pool1 (start 4) at rank_in_pool 2, which
229+ // belongs to bg1 (pool1 slice [2,4)) at global band-group rank
230+ // RANK_IN_BPGROUP = my_pool * 2 + 0 = 2.
231+ const std::vector<int > pool_sizes = {4 , 4 , 4 };
235232#ifdef __MPI
236- const ProcessTopology t (/* world=*/ 10 ,
233+ const ProcessTopology t (/* world=*/ 12 ,
237234 /* my_rank=*/ 6 ,
238235 /* kpar=*/ 3 ,
239- /* my_pool=*/ 2 ,
240- /* rank_in_pool=*/ 2 , // world rank 7+2 = 9
236+ /* my_pool=*/ 1 ,
237+ /* rank_in_pool=*/ 2 ,
241238 pool_sizes,
242239 /* bndpar=*/ 2 ,
243240 /* my_band_group=*/ 1 ,
244- /* rank_in_band_group=*/ 1 ,
245- /* nproc_in_band_group=*/ 5 ,
241+ /* rank_in_band_group=*/ 2 ,
242+ /* nproc_in_band_group=*/ 6 ,
246243 /* pw_world=*/ MPI_COMM_SELF ,
247244 /* kmesh_world=*/ MPI_COMM_NULL ,
248245 /* bsame_kdiff=*/ MPI_COMM_SELF ,
@@ -252,35 +249,35 @@ TEST(ProcessTopology, ConstructAndAccessors)
252249 /* matrix_world=*/ MPI_COMM_SELF ,
253250 /* atom_world=*/ MPI_COMM_WORLD );
254251#else
255- const ProcessTopology t (10 , 6 , 3 , 2 , 2 , pool_sizes, 2 , 1 , 1 , 5 );
252+ const ProcessTopology t (12 , 6 , 3 , 1 , 2 , pool_sizes, 2 , 1 , 2 , 6 );
256253#endif
257254
258- EXPECT_EQ (t.world_size (), 10 );
255+ EXPECT_EQ (t.world_size (), 12 );
259256 EXPECT_EQ (t.world_rank (), 6 );
260257
261258 EXPECT_EQ (t.kpar (), 3 );
262- EXPECT_EQ (t.my_pool (), 2 );
259+ EXPECT_EQ (t.my_pool (), 1 );
263260 EXPECT_EQ (t.rank_in_pool (), 2 );
264261 EXPECT_EQ (t.nproc_in_pool (0 ), 4 );
265- EXPECT_EQ (t.nproc_in_pool (1 ), 3 );
266- EXPECT_EQ (t.nproc_in_pool (2 ), 3 );
262+ EXPECT_EQ (t.nproc_in_pool (1 ), 4 );
263+ EXPECT_EQ (t.nproc_in_pool (2 ), 4 );
267264
268265 EXPECT_EQ (t.bndpar (), 2 );
269266 EXPECT_EQ (t.my_band_group (), 1 );
270- EXPECT_EQ (t.rank_in_band_group (), 1 );
271- EXPECT_EQ (t.nproc_in_band_group (), 5 );
267+ EXPECT_EQ (t.rank_in_band_group (), 2 );
268+ EXPECT_EQ (t.nproc_in_band_group (), 6 );
272269
273270 // pool_root_rank prefix offsets -> pool start world rank.
274271 EXPECT_EQ (t.pool_root_rank (0 ), 0 );
275272 EXPECT_EQ (t.pool_root_rank (1 ), 4 );
276- EXPECT_EQ (t.pool_root_rank (2 ), 7 );
273+ EXPECT_EQ (t.pool_root_rank (2 ), 8 );
277274 EXPECT_EQ (t.pool_root_rank (3 ), -1 );
278275
279- // band_group_root_rank over the 2 band groups:
280- // bg0 root = 0 * 5 = 0 (first rank of bg0 set across all pools)
281- // bg1 root = 1 * 5 = 5
276+ // band_group_root_rank: first member of each band-group union.
277+ // bg0 root = 0 * (4/2) = 0
278+ // bg1 root = 1 * (4/2) = 2 (world rank 2, first member of bg1)
282279 EXPECT_EQ (t.band_group_root_rank (0 ), 0 );
283- EXPECT_EQ (t.band_group_root_rank (1 ), 5 );
280+ EXPECT_EQ (t.band_group_root_rank (1 ), 2 );
284281 EXPECT_EQ (t.band_group_root_rank (2 ), -1 );
285282
286283#ifdef __MPI
@@ -348,8 +345,9 @@ TEST(ParallelGlobalCreateTopology, FourRanksKpar2Bndpar2DiagNp2)
348345 // BNDPAR=2 (even=true) in each pool of 2 procs -> each bg gets 1 proc
349346 // Global union bg size = kpar*1 = 2 = nproc_in_band_group
350347 EXPECT_EQ (t.nproc_in_band_group (), 2 );
348+ // bg0 = {0, 2} -> root 0; bg1 = {1, 3} -> root = 1 * (2/2) = 1
351349 EXPECT_EQ (t.band_group_root_rank (0 ), 0 );
352- EXPECT_EQ (t.band_group_root_rank (1 ), 2 ); // band_group * nproc_in_band_group = 1 * 2
350+ EXPECT_EQ (t.band_group_root_rank (1 ), 1 );
353351
354352 // ---- per-rank local values -------------------------------------
355353 // World ranks 0..3, KPAR=2 (even=false) -> pools {0: {0,1}, 1: {2,3}}.
0 commit comments