program Cart use mpi implicit none integer :: rank, nb_mpi_processes, ierror, tag, statu(MPI_STATUS_SIZE), n,i,niter character(len=4) :: charbuff integer :: ndim = 1 ! number of dimmensions of cartesian topology integer, dimension(1) :: nb_process_axe ! number of processes per axe of cartesian topology logical, dimension(1) :: cart_boundaries ! Type of boundaries : .true. -> periodic, .false. -> non periodic integer :: MPI_COMM_CART ! our new communicator integer, dimension(1) :: cart_position, pos ! position of process on the cartesian topology ( and pos a buffer ) integer, dimension(-1:1) :: cart_neigh ! neigbours rank on the cartesian topology ! CART program ! This program show the organisation and use of the Cartesian topology call MPI_INIT( ierror ) call MPI_COMM_SIZE( MPI_COMM_WORLD , nb_mpi_processes , ierror ) call MPI_COMM_RANK( MPI_COMM_WORLD , rank , ierror ) if(nb_mpi_processes /= 4) stop 'This program is design to be run with 4 processes only' nb_process_axe(1) = 4 cart_boundaries(1) = .false. call MPI_CART_CREATE( MPI_COMM_WORLD , ndim , nb_process_axe(1:ndim) , & & cart_boundaries(1:ndim) , .true. , MPI_COMM_CART , ierror ) call MPI_CART_COORDS( MPI_COMM_CART , rank , ndim , cart_position(1:ndim) , ierror ) call MPI_CART_SHIFT (MPI_COMM_CART, 0, 1, cart_neigh(-1), cart_neigh(+1), ierror) print *,'Good way to get neigh, Rank :',rank,'Position :',cart_position(1),'Neighbours :',cart_neigh(-1),cart_neigh(1) do i=-1,1 if((cart_boundaries(1) .eqv. .false.) .AND. & & ((cart_position(1) == 0 .AND. i==-1) .OR. (cart_position(1) == nb_process_axe(1)-1) .AND. i==1)) then cart_neigh(i) = MPI_PROC_NULL else pos(1) = cart_position(1) + i call MPI_CART_RANK( MPI_COMM_CART , pos(1:ndim) , cart_neigh(i) , ierror ) end if end do print *,'2nd way to get neigh, Rank :',rank,'Position :',cart_position(1),'Neighbours :',cart_neigh(-1),cart_neigh(1) call MPI_FINALIZE ( ierror ) ! Close MPI end program Cart #include #include #include #include // This program show the organisation and use of the Cartesian topology int main(int argc, char** argv) { int rank, nb_mpi_processes, ierror, tag, n,i,niter; char charbuff[4]; int ndim = 1; // number of dimmensions of cartesian topology int nb_process_axe[1]; // number of processes per axe of cartesian topology int cart_boundaries[1]; // cart_boundaries, type of boundaries : 1 -> periodic, 0 -> non periodic int cart_position[1], pos[1]; // position of process on the cartesian topology ( and pos a buffer ) int cart_neigh[3]; // neigbours rank on the cartesian topology // CART program // This program show the organisation and use of the Cartesian topology MPI_Init(NULL, NULL); MPI_Comm_size( MPI_COMM_WORLD , &nb_mpi_processes ); MPI_Comm_rank( MPI_COMM_WORLD , &rank ); if(nb_mpi_processes != 4) { printf("This program is design to be run with 4 processes only"); return 0;} nb_process_axe[0] = 4; cart_boundaries[0] = 0; MPI_Comm MPI_COMM_CART; // our new communicator MPI_Cart_create( MPI_COMM_WORLD , ndim , &nb_process_axe[0] , &cart_boundaries[0] , 1 , &MPI_COMM_CART ); MPI_Cart_coords( MPI_COMM_CART , rank , ndim , &cart_position[0] ); MPI_Cart_shift (MPI_COMM_CART, 0, 1, &cart_neigh[0], &cart_neigh[2] ); printf("Good way to get neigh, Rank : %d Position : %d Neighbours : %d %d\n",rank,cart_position[0],cart_neigh[0],cart_neigh[2]); for(i=0;i<=2;i++) { if((cart_boundaries[0] == 0) && ((cart_position[0] == 0 && i==0) || (cart_position[0] == nb_process_axe[0]-1) && i==2)) { cart_neigh[i] = MPI_PROC_NULL; } else { pos[0] = cart_position[0] + i - 1; MPI_Cart_rank( MPI_COMM_CART , &pos[0] , &cart_neigh[i] ); } } printf("2nd way to get neigh, Rank : %d Position : %d Neighbours : %d %d\n",rank,cart_position[0],cart_neigh[0],cart_neigh[2]); MPI_Finalize ( ); // Close MPI return 0; }