<PRE style='BACKGROUND: #e6e6e6;'><I><FONT COLOR="#008000">/* -*- Mode: C; c-basic-offset:4 ; -*- */
/*
* (C) 2001 by Argonne National Laboratory.
* See COPYRIGHT in top-level directory.
*/
/* This is an interactive version of cpi */</FONT></I><FONT COLOR="#A000A0">
#include "mpi.h"
#include <stdio.h>
#include <math.h>
</FONT><B><FONT COLOR="#0000FF">
double</FONT></B> f<B><FONT COLOR="#646464">(</FONT></B><B><FONT COLOR="#0000FF">double</FONT></B><B><FONT COLOR="#646464">);</FONT></B><B><FONT COLOR="#0000FF">
double</FONT></B> f<B><FONT COLOR="#646464">(</FONT></B><B><FONT COLOR="#0000FF">double</FONT></B> a<B><FONT COLOR="#646464">)
{</FONT></B><B><FONT COLOR="#0000FF">
return</FONT></B><B><FONT COLOR="#646464"> (</FONT></B><FONT COLOR="#800080">4.0</FONT><B><FONT COLOR="#646464"> / (</FONT></B><FONT COLOR="#800080">1.0</FONT><B><FONT COLOR="#646464"> +</FONT></B> a<B><FONT COLOR="#646464">*</FONT></B>a<B><FONT COLOR="#646464">));
}</FONT></B><B><FONT COLOR="#0000FF">
int</FONT></B><B><FONT COLOR="#0000FF"> main</FONT></B><B><FONT COLOR="#646464">(</FONT></B><B><FONT COLOR="#0000FF">int</FONT></B> argc<B><FONT COLOR="#646464">,</FONT></B><B><FONT COLOR="#0000FF">char</FONT></B><B><FONT COLOR="#646464"> *</FONT></B>argv<B><FONT COLOR="#646464">[])
{</FONT></B><B><FONT COLOR="#0000FF">
int</FONT></B> done<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">,</FONT></B> n<B><FONT COLOR="#646464">,</FONT></B> myid<B><FONT COLOR="#646464">,</FONT></B> numprocs<B><FONT COLOR="#646464">,</FONT></B> i<B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
double</FONT></B> PI25DT<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 3.141592653589793238462643</FONT><B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
double</FONT></B> mypi<B><FONT COLOR="#646464">,</FONT></B> pi<B><FONT COLOR="#646464">,</FONT></B> h<B><FONT COLOR="#646464">,</FONT></B> sum<B><FONT COLOR="#646464">,</FONT></B> x<B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
double</FONT></B> startwtime<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 0.0</FONT><B><FONT COLOR="#646464">,</FONT></B> endwtime<B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
int</FONT></B> namelen<B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
char</FONT></B> processor_name<B><FONT COLOR="#646464">[</FONT></B>MPI_MAX_PROCESSOR_NAME<B><FONT COLOR="#646464">];</FONT></B>
MPI_Init<B><FONT COLOR="#646464">(&</FONT></B>argc<B><FONT COLOR="#646464">,&</FONT></B>argv<B><FONT COLOR="#646464">);</FONT></B>
MPI_Comm_size<B><FONT COLOR="#646464">(</FONT></B>MPI_COMM_WORLD<B><FONT COLOR="#646464">,&</FONT></B>numprocs<B><FONT COLOR="#646464">);</FONT></B>
MPI_Comm_rank<B><FONT COLOR="#646464">(</FONT></B>MPI_COMM_WORLD<B><FONT COLOR="#646464">,&</FONT></B>myid<B><FONT COLOR="#646464">);</FONT></B>
MPI_Get_processor_name<B><FONT COLOR="#646464">(</FONT></B>processor_name<B><FONT COLOR="#646464">,&</FONT></B>namelen<B><FONT COLOR="#646464">);</FONT></B><I><FONT COLOR="#008000">
/*
fprintf(stdout,"Process %d of %d is on %s/n",
myid, numprocs, processor_name);
fflush(stdout);
*/</FONT></I><B><FONT COLOR="#0000FF">
while</FONT></B><B><FONT COLOR="#646464"> (!</FONT></B>done<B><FONT COLOR="#646464">) {</FONT></B><B><FONT COLOR="#0000FF">
if</FONT></B><B><FONT COLOR="#646464"> (</FONT></B>myid<B><FONT COLOR="#646464"> ==</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">) {</FONT></B>
fprintf<B><FONT COLOR="#646464">(</FONT></B>stdout<B><FONT COLOR="#646464">,</FONT></B><FONT COLOR="#FF00FF"> "Enter the number of intervals: (0 quits) "</FONT><B><FONT COLOR="#646464">);</FONT></B>
fflush<B><FONT COLOR="#646464">(</FONT></B>stdout<B><FONT COLOR="#646464">);</FONT></B><B><FONT COLOR="#0000FF">
if</FONT></B><B><FONT COLOR="#646464"> (</FONT></B>scanf<B><FONT COLOR="#646464">(</FONT></B><FONT COLOR="#FF00FF">"%d"</FONT><B><FONT COLOR="#646464">,&</FONT></B>n<B><FONT COLOR="#646464">) !=</FONT></B><FONT COLOR="#800080"> 1</FONT><B><FONT COLOR="#646464">) {</FONT></B>
fprintf<B><FONT COLOR="#646464">(</FONT></B> stdout<B><FONT COLOR="#646464">,</FONT></B><FONT COLOR="#FF00FF"> "No number entered; quitting/n"</FONT><B><FONT COLOR="#646464"> );</FONT></B>
n<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">;
}</FONT></B>
startwtime<B><FONT COLOR="#646464"> =</FONT></B> MPI_Wtime<B><FONT COLOR="#646464">();
}</FONT></B>
MPI_Bcast<B><FONT COLOR="#646464">(&</FONT></B>n<B><FONT COLOR="#646464">,</FONT></B><FONT COLOR="#800080"> 1</FONT><B><FONT COLOR="#646464">,</FONT></B> MPI_INT<B><FONT COLOR="#646464">,</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">,</FONT></B> MPI_COMM_WORLD<B><FONT COLOR="#646464">);</FONT></B><B><FONT COLOR="#0000FF">
if</FONT></B><B><FONT COLOR="#646464"> (</FONT></B>n<B><FONT COLOR="#646464"> ==</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">)</FONT></B>
done<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 1</FONT><B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
else</FONT></B><B><FONT COLOR="#646464"> {</FONT></B>
h<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 1.0</FONT><B><FONT COLOR="#646464"> / (</FONT></B><B><FONT COLOR="#0000FF">double</FONT></B><B><FONT COLOR="#646464">)</FONT></B> n<B><FONT COLOR="#646464">;</FONT></B>
sum<B><FONT COLOR="#646464"> =</FONT></B><FONT COLOR="#800080"> 0.0</FONT><B><FONT COLOR="#646464">;</FONT></B><B><FONT COLOR="#0000FF">
for</FONT></B><B><FONT COLOR="#646464"> (</FONT></B>i<B><FONT COLOR="#646464"> =</FONT></B> myid<B><FONT COLOR="#646464"> +</FONT></B><FONT COLOR="#800080"> 1</FONT><B><FONT COLOR="#646464">;</FONT></B> i<B><FONT COLOR="#646464"> <=</FONT></B> n<B><FONT COLOR="#646464">;</FONT></B> i<B><FONT COLOR="#646464"> +=</FONT></B> numprocs<B><FONT COLOR="#646464">) {</FONT></B>
x<B><FONT COLOR="#646464"> =</FONT></B> h<B><FONT COLOR="#646464"> * ((</FONT></B><B><FONT COLOR="#0000FF">double</FONT></B><B><FONT COLOR="#646464">)</FONT></B>i<B><FONT COLOR="#646464"> -</FONT></B><FONT COLOR="#800080"> 0.5</FONT><B><FONT COLOR="#646464">);</FONT></B>
sum<B><FONT COLOR="#646464"> +=</FONT></B> f<B><FONT COLOR="#646464">(</FONT></B>x<B><FONT COLOR="#646464">);
}</FONT></B>
mypi<B><FONT COLOR="#646464"> =</FONT></B> h<B><FONT COLOR="#646464"> *</FONT></B> sum<B><FONT COLOR="#646464">;</FONT></B>
MPI_Reduce<B><FONT COLOR="#646464">(&</FONT></B>mypi<B><FONT COLOR="#646464">, &</FONT></B>pi<B><FONT COLOR="#646464">,</FONT></B><FONT COLOR="#800080"> 1</FONT><B><FONT COLOR="#646464">,</FONT></B> MPI_DOUBLE<B><FONT COLOR="#646464">,</FONT></B> MPI_SUM<B><FONT COLOR="#646464">,</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">,</FONT></B> MPI_COMM_WORLD<B><FONT COLOR="#646464">);</FONT></B><B><FONT COLOR="#0000FF">
if</FONT></B><B><FONT COLOR="#646464"> (</FONT></B>myid<B><FONT COLOR="#646464"> ==</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">) {</FONT></B>
printf<B><FONT COLOR="#646464">(</FONT></B><FONT COLOR="#FF00FF">"pi is approximately %.16f, Error is %.16f/n"</FONT><B><FONT COLOR="#646464">,</FONT></B>
pi<B><FONT COLOR="#646464">,</FONT></B> fabs<B><FONT COLOR="#646464">(</FONT></B>pi<B><FONT COLOR="#646464"> -</FONT></B> PI25DT<B><FONT COLOR="#646464">));</FONT></B>
endwtime<B><FONT COLOR="#646464"> =</FONT></B> MPI_Wtime<B><FONT COLOR="#646464">();</FONT></B>
printf<B><FONT COLOR="#646464">(</FONT></B><FONT COLOR="#FF00FF">"wall clock time = %f/n"</FONT><B><FONT COLOR="#646464">,</FONT></B> endwtime<B><FONT COLOR="#646464">-</FONT></B>startwtime<B><FONT COLOR="#646464">);</FONT></B>
fflush<B><FONT COLOR="#646464">(</FONT></B> stdout<B><FONT COLOR="#646464"> );
}
}
}</FONT></B>
MPI_Finalize<B><FONT COLOR="#646464">();</FONT></B><B><FONT COLOR="#0000FF">
return</FONT></B><FONT COLOR="#800080"> 0</FONT><B><FONT COLOR="#646464">;
}</FONT></B>
</PRE>