|
Packit Service |
c5cf8c |
!**********************************************************************
|
|
Packit Service |
c5cf8c |
! pi3f90.f - compute pi by integrating f(x) = 4/(1 + x**2)
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! (C) 2001 by Argonne National Laboratory.
|
|
Packit Service |
c5cf8c |
! See COPYRIGHT in top-level directory.
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! Each node:
|
|
Packit Service |
c5cf8c |
! 1) receives the number of rectangles used in the approximation.
|
|
Packit Service |
c5cf8c |
! 2) calculates the areas of it's rectangles.
|
|
Packit Service |
c5cf8c |
! 3) Synchronizes for a global summation.
|
|
Packit Service |
c5cf8c |
! Node 0 prints the result.
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! Variables:
|
|
Packit Service |
c5cf8c |
!
|
|
Packit Service |
c5cf8c |
! pi the calculated result
|
|
Packit Service |
c5cf8c |
! n number of points of integration.
|
|
Packit Service |
c5cf8c |
! x midpoint of each rectangle's interval
|
|
Packit Service |
c5cf8c |
! f function to integrate
|
|
Packit Service |
c5cf8c |
! sum,pi area of rectangles
|
|
Packit Service |
c5cf8c |
! tmp temporary scratch space for global summation
|
|
Packit Service |
c5cf8c |
! i do loop index
|
|
Packit Service |
c5cf8c |
!****************************************************************************
|
|
Packit Service |
c5cf8c |
program main
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
use mpi
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
double precision PI25DT
|
|
Packit Service |
c5cf8c |
parameter (PI25DT = 3.141592653589793238462643d0)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
double precision mypi, pi, h, sum, x, f, a
|
|
Packit Service |
c5cf8c |
integer n, myid, numprocs, i, rc
|
|
Packit Service |
c5cf8c |
! function to integrate
|
|
Packit Service |
c5cf8c |
f(a) = 4.d0 / (1.d0 + a*a)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_INIT( ierr )
|
|
Packit Service |
c5cf8c |
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
|
|
Packit Service |
c5cf8c |
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
|
|
Packit Service |
c5cf8c |
print *, 'Process ', myid, ' of ', numprocs, ' is alive'
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
sizetype = 1
|
|
Packit Service |
c5cf8c |
sumtype = 2
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
do
|
|
Packit Service |
c5cf8c |
if ( myid .eq. 0 ) then
|
|
Packit Service |
c5cf8c |
write(6,98)
|
|
Packit Service |
c5cf8c |
98 format('Enter the number of intervals: (0 quits)')
|
|
Packit Service |
c5cf8c |
read(5,99) n
|
|
Packit Service |
c5cf8c |
99 format(i10)
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_BCAST(n,1,MPI_INTEGER,0,MPI_COMM_WORLD,ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! check for quit signal
|
|
Packit Service |
c5cf8c |
if ( n .le. 0 ) exit
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! calculate the interval size
|
|
Packit Service |
c5cf8c |
h = 1.0d0/n
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
sum = 0.0d0
|
|
Packit Service |
c5cf8c |
do i = myid+1, n, numprocs
|
|
Packit Service |
c5cf8c |
x = h * (dble(i) - 0.5d0)
|
|
Packit Service |
c5cf8c |
sum = sum + f(x)
|
|
Packit Service |
c5cf8c |
enddo
|
|
Packit Service |
c5cf8c |
mypi = h * sum
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! collect all the partial sums
|
|
Packit Service |
c5cf8c |
call MPI_REDUCE(mypi,pi,1,MPI_DOUBLE_PRECISION,MPI_SUM,0, &
|
|
Packit Service |
c5cf8c |
MPI_COMM_WORLD,ierr)
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
! node 0 prints the answer.
|
|
Packit Service |
c5cf8c |
if (myid .eq. 0) then
|
|
Packit Service |
c5cf8c |
write(6, 97) pi, abs(pi - PI25DT)
|
|
Packit Service |
c5cf8c |
97 format(' pi is approximately: ', F18.16, &
|
|
Packit Service |
c5cf8c |
' Error is: ', F18.16)
|
|
Packit Service |
c5cf8c |
endif
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
enddo
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
call MPI_FINALIZE(rc)
|
|
Packit Service |
c5cf8c |
stop
|
|
Packit Service |
c5cf8c |
end
|