diff --git a/src/fiat/mpl/internal/mpl_groups.F90 b/src/fiat/mpl/internal/mpl_groups.F90 index 2b992311..e7868f78 100644 --- a/src/fiat/mpl/internal/mpl_groups.F90 +++ b/src/fiat/mpl/internal/mpl_groups.F90 @@ -31,11 +31,13 @@ MODULE MPL_GROUPS USE MPL_MPIF USE MPL_DATA_MODULE USE MPL_MESSAGE_MOD +USE MPL_ABORT_MOD IMPLICIT NONE PRIVATE PUBLIC MPL_COMM_GRID, MPL_ALL_LEVS_COMM, MPL_ALL_MS_COMM, & - & MPL_GROUPS_CREATE, MPL_CART_RANK, MPL_CART_COORDS + & MPL_GROUPS_CREATE, MPL_CART_RANK, MPL_CART_COORDS, MPL_CREATE_UNION_COMMUNICATOR, & + & MPL_CREATE_GROUP_COMMUNICATOR INTEGER(KIND=JPIM) :: MPL_COMM_GRID, MPL_ALL_LEVS_COMM, MPL_ALL_MS_COMM, & & MPL_GP_GRID @@ -143,6 +145,36 @@ SUBROUTINE MPL_CART_COORDS(KPROC, KPROCW, KPROCV) END SUBROUTINE MPL_CART_COORDS +SUBROUTINE MPL_CREATE_GROUP_COMMUNICATOR(NPROC, OFFSET, NEW_GROUP, NEW_COMM) + INTEGER, INTENT(IN) :: NPROC, OFFSET + INTEGER, INTENT(OUT) :: NEW_GROUP, NEW_COMM + INTEGER, ALLOCATABLE :: RANKS(:) + INTEGER :: I, SIZE, IERR, WORLD_GROUP + + CALL MPI_COMM_SIZE(MPI_COMM_WORLD, SIZE, IERR) + + IF (OFFSET+NPROC > SIZE) THEN + CALL MPL_ABORT("MPL_CREATE_GROUP_COMMUNICATOR: OFFSET+NPROC exceeds MPI_COMM_SIZE") + END IF + + ALLOCATE(RANKS(NPROC)) + RANKS = [(I, I=OFFSET, OFFSET+NPROC-1)] + + CALL MPI_COMM_GROUP(MPI_COMM_WORLD, WORLD_GROUP, IERR) + CALL MPI_GROUP_INCL(WORLD_GROUP, NPROC, RANKS, NEW_GROUP, IERR) + CALL MPI_COMM_CREATE(MPI_COMM_WORLD, NEW_GROUP, NEW_COMM, IERR) + +END SUBROUTINE MPL_CREATE_GROUP_COMMUNICATOR + +SUBROUTINE MPL_CREATE_UNION_COMMUNICATOR(GROUP1, GROUP2, UNION_COMM) + INTEGER, INTENT(IN) :: GROUP1, GROUP2 + INTEGER, INTENT(OUT) :: UNION_COMM + INTEGER :: IERR, UNION_GROUP + + CALL MPI_GROUP_UNION(GROUP1, GROUP2, UNION_GROUP, IERR) + CALL MPI_COMM_CREATE(MPI_COMM_WORLD, UNION_GROUP, UNION_COMM, IERR) + +END SUBROUTINE MPL_CREATE_UNION_COMMUNICATOR ! ------------------------------------------------------------------ END MODULE MPL_GROUPS