program switch use mpi implicit none integer :: rank, nb_mpi_processes, ierror, tag, statu(MPI_STATUS_SIZE), n, val, val0 integer :: niter = 4 ! Switch program tag = 7777 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 /= 2) stop 'This program is design to be run with 2 processes only' if(rank==0) val = 74 if(rank==1) val = 32 ! check print*, 'process',rank,'I have the value',val,'at 2' ! First switch if(rank==0) then call MPI_SENDRECV ( val , 1 , MPI_INTEGER , 1 , tag , val0 , 1 , MPI_INTEGER , 1 , tag , MPI_COMM_WORLD , statu , ierror ) val = val0 end if if(rank==1) then call MPI_SENDRECV ( val , 1 , MPI_INTEGER , 0 , tag , val0 , 1 , MPI_INTEGER , 0 , tag , MPI_COMM_WORLD , statu , ierror ) val = val0 end if ! check print*, 'process',rank,'I have the value',val,'at 1' ! Second switch if(rank==0) then call MPI_SENDRECV ( val , 1 , MPI_INTEGER , 1 , tag , val0 , 1 , MPI_INTEGER , 1 , tag , MPI_COMM_WORLD , statu , ierror ) val = val0 end if if(rank==1) then call MPI_SENDRECV ( val , 1 , MPI_INTEGER , 0 , tag , val0 , 1 , MPI_INTEGER , 0 , tag , MPI_COMM_WORLD , statu , ierror ) val = val0 end if ! check print*, 'process',rank,'I have the value',val,'at 2' call MPI_FINALIZE ( ierror ) ! Close MPI end program switch #include #include // Switch program int main(int argc, char** argv) { MPI_Init(NULL, NULL); int nb_mpi_processes; MPI_Comm_size(MPI_COMM_WORLD, &nb_mpi_processes); int rank; MPI_Comm_rank(MPI_COMM_WORLD, &rank); if(nb_mpi_processes != 2) { printf("This program is design to be run with 2 processes only"); return 0;} int tag = 7777; int val; int val0; if(rank==0) {val = 74;} if(rank==1) {val = 32;} // check printf("Process %d I have the value %d at 2\n",rank,val); // First switch if(rank==0) { MPI_Sendrecv ( &val , 1 , MPI_INTEGER , 1 , tag , &val0 , 1 , MPI_INTEGER , 1 , tag , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); val = val0; } if(rank==1) { MPI_Sendrecv ( &val , 1 , MPI_INTEGER , 0 , tag , &val0 , 1 , MPI_INTEGER , 0 , tag , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); val = val0; } // check printf("Process %d I have the value %d at 1\n",rank,val); // Second switch if(rank==0) { MPI_Sendrecv ( &val , 1 , MPI_INTEGER , 1 , tag , &val0 , 1 , MPI_INTEGER , 1 , tag , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); val = val0; } if(rank==1) { MPI_Sendrecv ( &val , 1 , MPI_INTEGER , 0 , tag , &val0 , 1 , MPI_INTEGER , 0 , tag , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); val = val0; } // check printf("Process %d I have the value %d at 2\n",rank,val); MPI_Finalize(); // Close MPI return 0; }