@@ -101,6 +101,7 @@ class DynamicPartitioner : public BlockPartitioner<NumSpaceDim>
101101 // compute the ranks_per_dim from MPI communicator
102102 allocate ( global_cells_per_dim );
103103 ranksPerDimension ( comm );
104+ initializePartitionByAverage ( comm, global_cells_per_dim );
104105 }
105106
106107 /* !
@@ -126,6 +127,7 @@ class DynamicPartitioner : public BlockPartitioner<NumSpaceDim>
126127 int comm_size;
127128 MPI_Comm_size ( comm, &comm_size );
128129 MPI_Dims_create ( comm_size, num_space_dim, _ranks_per_dim.data () );
130+ initializePartitionByAverage ( comm, global_cells_per_dim );
129131 }
130132
131133 /* !
@@ -267,18 +269,49 @@ class DynamicPartitioner : public BlockPartitioner<NumSpaceDim>
267269 }
268270
269271 /* !
270- \brief Initialize the tile partition; partition in each dimension
272+ \brief Initialize the tile partition by average size
273+ \param comm The communicator to use for initializing partitioning
274+ \param global_cells_per_dim 3D array, global cells in each dimension
275+ */
276+ void initializePartitionByAverage (
277+ MPI_Comm comm,
278+ const std::array<int , num_space_dim>& global_cells_per_dim )
279+ {
280+ std::array<int , 3 > global_num_tile = {
281+ global_cells_per_dim[0 ] / (int )cell_num_per_tile_dim,
282+ global_cells_per_dim[1 ] / (int )cell_num_per_tile_dim,
283+ global_cells_per_dim[2 ] / (int )cell_num_per_tile_dim };
284+
285+ auto ranks_per_dim = ranksPerDimension ( comm, global_cells_per_dim );
286+ std::array<std::vector<int >, 3 > rec_partitions;
287+ for ( int d = 0 ; d < 3 ; ++d )
288+ {
289+ int ele = global_num_tile[d] / ranks_per_dim[d];
290+ int part = 0 ;
291+ for ( int i = 0 ; i < ranks_per_dim[d]; ++i )
292+ {
293+ rec_partitions[d].push_back ( part );
294+ part += ele;
295+ }
296+ rec_partitions[d].push_back ( global_num_tile[d] );
297+ }
298+
299+ setRecPartition ( rec_partitions[0 ], rec_partitions[1 ],
300+ rec_partitions[2 ] );
301+ }
302+
303+ /* !
304+ \brief Set the tile partition; partition in each dimension
271305 has the form [0, p_1, ..., p_n, total_tile_num], so the partition
272306 would be [0, p_1), [p_1, p_2) ... [p_n, total_tile_num]
273307 \param rec_partition_i partition array in dimension i
274308 \param rec_partition_j partition array in dimension j
275309 \param rec_partition_k partition array in dimension k
276310 */
277- void initializeRecPartition ( std::vector<int >& rec_partition_i,
278- std::vector<int >& rec_partition_j,
279- std::vector<int >& rec_partition_k )
311+ void setRecPartition ( std::vector<int >& rec_partition_i,
312+ std::vector<int >& rec_partition_j,
313+ std::vector<int >& rec_partition_k )
280314 {
281-
282315 int max_size = 0 ;
283316 for ( std::size_t d = 0 ; d < num_space_dim; ++d )
284317 max_size =
0 commit comments