program knock c c this program demonstrates a very simple MPI program illustrating c communication between two nodes. Node 0 sends a message consisting c of 3 integers to node 1. Upon receipt, node 1 replies with another c message consisting of 3 integers. c implicit none c get definition of MPI constants include 'mpif.h' c c define variables c ierror = error indicator c nproc = number of processors participating c idproc = each processor's id number (0 <= idproc < nproc) c len = length of message (in words) c tag = message tag, used to distinguish between messages integer ierror, nproc, idproc, len, tag c status = status array returned by MPI_RECV integer status(MPI_STATUS_SIZE) c sendmsg = message being sent c recvmsg = message being received c replymsg = reply message being sent integer sendmsg(3), recvmsg(3), replymsg(3) data sendmsg /1802399587,1798073198,1868786465/ data replymsg /2003332903,1931506792,1701995839/ data len /3/, tag /1/ c c initialize the MPI execution environment call MPI_INIT(ierror) c stop if MPI could not be initialized if (ierror.ne.0) stop c determine nproc, number of participating processors call MPI_COMM_SIZE(MPI_COMM_WORLD,nproc,ierror) c determine idproc, the processor's id call MPI_COMM_RANK(MPI_COMM_WORLD,idproc,ierror) c c use only even number of processors nproc = 2*(nproc/2) if (idproc.lt.nproc) then c even processor sends and prints message, c then receives and prints reply if (mod(idproc,2).eq.0) then call MPI_SEND(sendmsg,len,MPI_INTEGER,idproc+1,tag, &MPI_COMM_WORLD,ierror) write (*,'("proc",i2," sent: ",3a4)') idproc, sendmsg call MPI_RECV(recvmsg,len,MPI_INTEGER,idproc+1,tag+1, &MPI_COMM_WORLD,status,ierror) write (*,'("proc",i2," received: ",3a4)') idproc, recvmsg c odd processor receives and prints message, c then sends reply and prints it else call MPI_RECV(recvmsg,len,MPI_INTEGER,idproc-1,tag, &MPI_COMM_WORLD,status,ierror) write (*,'("proc",i2," received: ",3a4)') idproc, recvmsg call MPI_SEND(replymsg,len,MPI_INTEGER,idproc-1,tag+1, &MPI_COMM_WORLD,ierror) write (*,'("proc",i2," sent: ",3a4)') idproc, replymsg endif endif c c terminate MPI execution environment call MPI_FINALIZE(ierror) c if (idproc.lt.nproc) then write (*,*) 'hit carriage return to continue' pause endif stop end