PROGRAM Two_Groups IMPLICIT NONE INCLUDE "mpif.h" INTEGER :: GlobalComm, LocComm, InterComm INTEGER, DIMENSION(MPI_STATUS_SIZE) :: stat INTEGER :: rc, colour, numproc, id, lid, root, idinter, np INTEGER :: val, lsum, gsum LOGICAL :: flag CALL MPI_Init(rc) CALL MPI_Comm_dup(MPI_COMM_WORLD,GlobalComm,rc) CALL MPI_Comm_size(GlobalComm, numproc, rc) CALL MPI_Comm_rank(GlobalComm, id, rc) ! Divide processes in 2 groups colour = MOD(id,2) CALL MPI_Comm_split(GlobalComm, colour, id, LocComm, rc) CALL MPI_Comm_rank(LocComm, lid, rc) print*,"Process ",id," in global comm is process ",lid," in local comm" ! Generate inter communicator between 2 leaders IF ( colour == 0 ) THEN CALL MPI_Intercomm_create(LocComm, 0, GlobalComm, 1, 01, InterComm, rc) else CALL MPI_Intercomm_create(LocComm, 0, GlobalComm, 0, 01, InterComm, rc) END IF IF ( lid == 0 ) then WRITE(*,"(a)",ADVANCE="NO") "Check if InterComm is an inter-communicator: " CALL MPI_COMM_TEST_INTER (InterComm, flag, rc) WRITE(*,*) "flag=",flag WRITE(*,"(a)",ADVANCE="NO") "Check if LocComm is an inter-communicator" CALL MPI_COMM_TEST_INTER (LocComm, flag, rc) WRITE(*,*) "flag=",flag WRITE(*,"(a)",ADVANCE="NO") "Check size of InterComm: " CALL MPI_COMM_REMOTE_SIZE(InterComm, np, rc) WRITE(*,*) "size=",np ENDIF ! Sum of values: each group computes a partial sum val = 1; lsum = 0; CALL MPI_Reduce(val,lsum,1,MPI_INTEGER,MPI_SUM,0,LocComm,rc) IF ( lid == 0 ) print*,"Local sum = ",lsum ! Compute global sum CALL MPI_Comm_size(InterComm, numproc, rc) CALL MPI_Comm_rank(InterComm, idinter, rc) ! Remote leader sends local sum to root process IF ( idinter == 0 ) THEN IF ( colour == 1) THEN CALL MPI_Send(lsum,1,MPI_INTEGER,0,101,InterComm,rc) else gsum = lsum CALL MPI_Recv(val,1,MPI_INTEGER,0,101,InterComm,stat,rc) ! Global sum gsum = gsum + val END IF END IF CALL MPI_Barrier(GlobalComm,rc) CALL MPI_Comm_free(InterComm,rc) CALL MPI_Comm_free(LocComm,rc) CALL MPI_Comm_free(GlobalComm,rc) IF ( id == 0 ) THEN print*,"Sum equals ", gsum END IF CALL MPI_Finalize(rc) STOP END PROGRAM Two_Groups