/* ===========================================================
   compute Pi by integrating the function 1/SQRT(1-x^2)

   Serial version
   =========================================================== */

using namespace std;

#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <sys/time.h>


double f(double a)
{
   return( 2.0 / sqrt(1 - a*a) );
}

/* =======================
   MAIN
   ======================= */

int main(int argc, char *argv[])
{
   int    N;
   double pi;
   double w;      // Width of rectangle

   struct timeval start_time, stop_time;
   int elapsed;

   /* -----
      Check command line
      ----- */
   if ( argc != 2 )
   {
      cout << "Usage: " << argv[0] << " Num_Intervals" << endl;
      exit(1);
   }

   /* -----
      Get number of intervals and number of threads
      ----- */
   N = atoi(argv[1]);
   w = 1.0/(double) N;


   pi = 0.0;

   gettimeofday(&start_time, NULL);    // Check start time

   /* ======================================================================
      Calaculate pi by adding area of rectangles

      Use this version to transfrom to a parallel version interactively...
      ====================================================================== */

   int    i;
   double x;
   for (i = 0; i < N; i = i + 1)
   {
      x = (i + 0.5)*w;
      pi = pi +  w*f(x);
   }

   /* ====================================================================== */

   gettimeofday(&stop_time, NULL);     // Check stop time

   cout << "Computed Pi = " << pi << endl << endl;

   elapsed = (stop_time.tv_sec*1000000 + stop_time.tv_usec) -
                (start_time.tv_sec*1000000 + start_time.tv_usec);
   cout << "Elapsed time = " << elapsed << " microseconds" << endl;
}


