title: How does the MPI_SENDRECV work?
body: <p>I have a question about MPI_SENDRECV.
  here is an example:</p>
  
  <pre><code> PROGRAM sendrecv
    IMPLICIT NONE
    INCLUDE "mpif.h"
    INTEGER a,b,myrank,nprocs,ierr
    integer istat(MPI_STATUS_SIZE)
    CALL MPI_INIT(ierr)
    CALL MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
    CALL MPI_COMM_RANK(MPI_COMM_WORLD, myrank, ierr)
    if (myrank.eq.0) then
       a=1;b=3
    else
       a=2;b=4
    endif
  
    if (myrank == 0) then
       call MPI_SENDRECV(b,1,MPI_REAL,1,0,
   .                     a,1,MPI_REAL,1,0,
   .                     MPI_COMM_WORLD,istat,ierr)
    elseif (myrank == 1) then
       call MPI_SENDRECV(b,1,MPI_REAL,0,0,
   .                     a,1,MPI_REAL,0,0,
   .                     MPI_COMM_WORLD,istat,ierr)
    end if
    if (myrank.eq.0) then
       write(*,*) b,a
    else
       write(*,*) a,b
    endif
    CALL MPI_FINALIZE(ierr)
    END
  </code></pre>
  
  <p>After this we get 3 4 and 3 4.
  My question is that is we replace the MPI_SENDRECV(if we assume that MPI_SENDRECV is send first and then receive)</p>
  
  <pre><code>if (myrank == 0) then
     call MPI_SEND(b,1,MPI_REAL,1,0,MPI_COMM_WORLD,ierr)
     call MPI_RECV(a,1,MPI_REAL,0,0,MPI_COMM_WORLD,istat,ierr)                  
  elseif (myrank == 1) then
     call MPI_SEND(b,1,MPI_REAL,0,0,MPI_COMM_WORLD,ierr)
     call MPI_RECV(a,1,MPI_REAL,1,0,MPI_COMM_WORLD,istat,ierr)                      
  end if
  </code></pre>
  
  <p>Then this will be deadlock
  So this means that MPI_SENDRECV it not first sends and then receives, but sends ans receives simultaneously,right?</p>