// Simple Monte Carlo program that calculates number pi

#include <stdio.h> 
#include <math.h>
#include <stdlib.h>
#include "mpi.h"

int main(argc,argv) 
  int  argc;
  char **argv;
{ 
  int numtasks, rank, n, n_bar, i, iseed, tt, in, local_in;
  double pi, r, rx, ry, time_finish, time_start;

  MPI_Init (&argc,&argv); 
  MPI_Comm_size(MPI_COMM_WORLD, &numtasks);   
  MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
  // printf ("Hello world from process %d of %d\n", rank, numtasks);

  // to use the same sequence of random numbers
  iseed = 10000;
  srand ( iseed );

  if (rank==0) {
    printf("Enter the number of random numbers: "); scanf("%d", &n);
    time_start = MPI_Wtime();
  }
  MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  n_bar = n/numtasks;

  local_in = 0;
  for (i=0; i<n_bar; i++) {
    rx = (double)rand()/(double)RAND_MAX;   
    ry = (double)rand()/(double)RAND_MAX;   
    // printf("random numbers: %f, \n %f", rx, ry);
    r = rx*rx + ry*ry;
    if (r < 1.0) 
      local_in++; 
  }
  MPI_Reduce(&local_in, &in, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
  if (rank==0) {
    time_finish = MPI_Wtime();
    pi = 4*(double)in/(double)n;

    printf("Pi: %f,  Points in circle: %u \n", pi, in);
    printf("WTime_time = %16.12f secs\n",time_finish-time_start);
  }

  MPI_Finalize();
}
