! ! Copyright 2006 Sun Microsystems, Inc. All rights reserved. ! Use is subject to license terms. ! ! Sun, Sun Microsystems, the Sun logo, Sun HPC ClusterTools, Sun PFS, ! Sun C++, Sun MPI, Prism, Sun Prism, and all Sun-based trademarks and logos, ! are trademarks or registered trademarks of Sun Microsystems, Inc. in ! the United States and other countries. ! ! ! Estimate pi via Monte-Carlo method. ! ! Each process sums how many of samplesize random points generated ! in the square (-1,-1),(-1,1),(1,1),(1,-1) fall in the circle of ! radius 1 and center (0,0), and then estimates pi from the formula ! pi = (4 * sum) / samplesize. ! The final estimate of pi is calculated at rank 0 as the average of ! all the estimates. ! program monte include 'mpif.h' double precision drand external drand double precision x, y, pi, pisum integer*4 ierr, rank, np integer*4 incircle, samplesize parameter(samplesize=2000000) call MPI_INIT(ierr) call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr) call MPI_COMM_SIZE(MPI_COMM_WORLD, np, ierr) ! seed random number generator x = drand(2 + 11*rank) incircle = 0 do i = 1, samplesize x = drand(0)*2.0d0 - 1.0d0 ! generate a random point y = drand(0)*2.0d0 - 1.0d0 if ((x*x + y*y) .lt. 1.0d0) then incircle = incircle+1 ! point is in the circle endif end do pi = 4.0d0 * DBLE(incircle) / DBLE(samplesize) ! sum estimates at rank 0 call MPI_REDUCE(pi, pisum, 1, MPI_DOUBLE_PRECISION, MPI_SUM, & 0 , MPI_COMM_WORLD, ierr) if (rank .eq. 0) then ! final estimate is the average pi = pisum / DBLE(np) print '(A,I4,A,F8.6,A)','Monte-Carlo estimate of pi by ',np, & ' processes is ',pi,'.' endif call MPI_FINALIZE(ierr) end