program hello_mpi;

uses mpi,ctypes;

var numprocs,myid:cint;
    si:string[10];
    s:string;
    i:word;
    stat:MPI_Status;

begin
  MPI_init;
  MPI_comm_size(MPI_COMM_WORLD,numprocs);
  MPI_comm_rank(MPI_COMM_WORLD,myid);
  if myid=0 then
    begin
      writeln(myid,': We have ',numprocs,' processors');
      for i:=0 to numprocs-1 do
        begin
          str(i,si);
          s:='Hello '+si+'!';
          MPI_send(s,sizeof(s),MPI_CHAR,i,0,MPI_COMM_WORLD);
        end;
      for i:=0 to numprocs-1 do
        begin
          MPI_recv(s,sizeof(s),MPI_CHAR,i,0,MPI_COMM_WORLD,stat);
          writeln(myid,': ',s);
        end
    end
  else
    begin
      { receive from rank 0: }
      MPI_recv(s,sizeof(s),MPI_CHAR,0,0,MPI_COMM_WORLD,stat);
      writeln('Processor ',myid,' reporting for duty');
      { send to rank 0: }
      MPI_send(s,sizeof(s),MPI_CHAR,0,0,MPI_COMM_WORLD);
    end;
  MPI_finalize;
end.
