Skip to content
Snippets Groups Projects
Select Git revision
  • master
1 result

run_example_Cu_L23

Blame
  • pi_serial.c 3.27 KiB
    #include <stdio.h>
    #include <stdlib.h>
    
    void srandom (unsigned seed);
    double dboard (int darts);
    #define DARTS 50000     /* number of throws at dartboard */
    #define ROUNDS 10       /* number of times "darts" is iterated */
    #define MASTER 0        /* task ID of master task */
    
    int main (int argc, char *argv[])
    {
      double  homepi,         /* value of pi calculated by current task */
              pi,             /* average of pi after "darts" is thrown */
              avepi,          /* average pi value for all iterations */
              pirecv,         /* pi received from worker */
              pisum;          /* sum of workers pi values */
      int     i, n;
    
      srandom (0);
    
      avepi = 0;
      for (i = 0; i < ROUNDS; i++) {
        pi = dboard(DARTS);
    
        /* Master calculates the average value of pi over all iterations */
        avepi = ((avepi * i) + pi)/(i + 1); 
        printf("   After %8d throws, average value of pi = %10.8f\n",
               (DARTS * (i + 1)),avepi);
    
      } 
    
      return 0;
    }
    
    
    
    /******************************************************************************
    * FILE: dboard.c
    * DESCRIPTION:
    *   Used in pi calculation example codes. 
    *   See mpi_pi_send.c and mpi_pi_reduce.c  
    *   Throw darts at board.  Done by generating random numbers 
    *   between 0 and 1 and converting them to values for x and y 
    *   coordinates and then testing to see if they "land" in 
    *   the circle."  If so, score is incremented.  After throwing the 
    *   specified number of darts, pi is calculated.  The computed value 
    *   of pi is returned as the value of this function, dboard. 
    *   Note:  the seed value for rand() is set in pi_send.f or pi_reduce.f. 
    * AUTHOR: unknown
    * LAST REVISED: 04/14/05 Blaise Barney
    ****************************************************************************/
    /*
    Explanation of constants and variables used in this function:
      darts       = number of throws at dartboard
      score       = number of darts that hit circle
      n           = index variable
      r           = random number between 0 and 1
      x_coord     = x coordinate, between -1 and 1
      x_sqr       = square of x coordinate
      y_coord     = y coordinate, between -1 and 1
      y_sqr       = square of y coordinate
      pi          = computed value of pi
    */
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #define sqr(x) ((x)*(x))
    long random(void);
    
    double dboard(int darts)
    {
      double x_coord, y_coord, pi, r; 
      int score, n;
      unsigned int cconst;  /* must be 4-bytes in size */
      /*************************************************************************
       * The cconst variable must be 4 bytes. We check this and bail if it is
       * not the right size
       ************************************************************************/
      if (sizeof(cconst) != 4) {
        printf("Wrong data size for cconst variable in dboard routine!\n");
        printf("See comments in source file. Quitting.\n");
        exit(1);
      }
      cconst = 2 << (31 - 1);
      score = 0;
    
      /* "throw darts at board" */
      for (n = 1; n <= darts; n++) {
        /* generate random numbers for x and y coordinates */
        r = (double)random()/cconst;
        x_coord = (2.0 * r) - 1.0;
        r = (double)random()/cconst;
        y_coord = (2.0 * r) - 1.0;
    
        /* if dart lands in circle, increment score */
        if ((sqr(x_coord) + sqr(y_coord)) <= 1.0)
          score++;
      }
    
      /* calculate pi */
      pi = 4.0 * (double)score/(double)darts;
      return(pi);
    }