-----------------------------------------------------------------------------
| 1357 | } |
| 1358 | //----------------------------------------------------------------------------- |
| 1359 | std::array<std::vector<int>, 2> IndexMap::rank_type(int split_type) const |
| 1360 | { |
| 1361 | int ierr; |
| 1362 | |
| 1363 | MPI_Comm comm_s; |
| 1364 | ierr = MPI_Comm_split_type(_comm.comm(), split_type, 0, MPI_INFO_NULL, |
| 1365 | &comm_s); |
| 1366 | dolfinx::MPI::check_error(_comm.comm(), ierr); |
| 1367 | |
| 1368 | int size_s = dolfinx::MPI::size(comm_s); |
| 1369 | int rank = dolfinx::MPI::rank(_comm.comm()); |
| 1370 | |
| 1371 | // Note: in most cases, size_s will be much smaller than the size of |
| 1372 | // _comm |
| 1373 | std::vector<int> ranks_s(size_s); |
| 1374 | ierr = MPI_Allgather(&rank, 1, MPI_INT, ranks_s.data(), 1, MPI_INT, comm_s); |
| 1375 | dolfinx::MPI::check_error(comm_s, ierr); |
| 1376 | |
| 1377 | std::vector<int> split_dest, split_src; |
| 1378 | std::ranges::set_intersection(_dest, ranks_s, std::back_inserter(split_dest)); |
| 1379 | assert(std::ranges::is_sorted(split_dest)); |
| 1380 | std::ranges::set_intersection(_src, ranks_s, std::back_inserter(split_src)); |
| 1381 | assert(std::ranges::is_sorted(split_src)); |
| 1382 | |
| 1383 | ierr = MPI_Comm_free(&comm_s); |
| 1384 | dolfinx::MPI::check_error(comm_s, ierr); |
| 1385 | |
| 1386 | return {std::move(split_dest), std::move(split_src)}; |
| 1387 | } |
| 1388 | //----------------------------------------------------------------------------- |