HP-MPI User's Guide (11th Edition)

Example applications
compute_pi_spawn.f
Appendix A 277
compute_pi_spawn.f
This example computes pi by integrating f(x) = 4/(1 + x**2) using
MPI_Spawn. It starts with one process and spawns a new world that does
the computation along with the original process. Each newly spawned
process receives the # of intervals used, calculates the areas of its
rectangles, and synchronizes for a global summation. The original
process 0 prints the result and the time it took.
program mainprog
include 'mpif.h'
double precision PI25DT
parameter(PI25DT = 3.141592653589793238462643d0)
double precision mypi, pi, h, sum, x, f, a
integer n, myid, numprocs, i, ierr
integer parenticomm, spawnicomm, mergedcomm, high
C
C Function to integrate
C
f(a) = 4.d0 / (1.d0 + a*a)
\
call MPI_INIT(ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, myid, ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numprocs, ierr)
call MPI_COMM_GET_PARENT(parenticomm, ierr)
if (parenticomm .eq. MPI_COMM_NULL) then
print *, "Original Process ", myid, " of ", numprocs,
+ " is alive"
call MPI_COMM_SPAWN("./compute_pi_spawn", MPI_ARGV_NULL, 3,
+ MPI_INFO_NULL, 0, MPI_COMM_WORLD, spawnicomm,
+ MPI_ERRCODES_IGNORE, ierr)
call MPI_INTERCOMM_MERGE(spawnicomm, 0, mergedcomm, ierr)
call MPI_COMM_FREE(spawnicomm, ierr)
else
print *, "Spawned Process ", myid, " of ", numprocs,
+ " is alive"
call MPI_INTERCOMM_MERGE(parenticomm, 1, mergedcomm, ierr)
call MPI_COMM_FREE(parenticomm, ierr)
endif
call MPI_COMM_RANK(mergedcomm, myid, ierr)
call MPI_COMM_SIZE(mergedcomm, numprocs, ierr)
print *, "Process ", myid, " of ", numprocs,
+ " in merged comm is alive"
sizetype = 1
sumtype = 2
if (myid .eq. 0) then
n = 100
endif
call MPI_BCAST(n, 1, MPI_INTEGER, 0, mergedcomm, ierr)
C