Advertisement
Valemmil

integn.c

Sep 18th, 2023
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.15 KB | Source Code | 0 0
  1. #include "mpi.h"
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5.  
  6. static double f(double a);
  7. static double fi(double a);
  8.  
  9. void main(int argc, char *argv[])
  10. {
  11.     int done = 0, n, myid, numprocs, i;
  12.     double myfunk, funk, h, sum, x;
  13.     double xl = -0.5,   // low  border
  14.        xh =  0.8;   // high border
  15.     double startwtime, endwtime;
  16.     int  namelen;
  17.     char processor_name[MPI_MAX_PROCESSOR_NAME];
  18.     MPI_Status stats;
  19.        
  20.     MPI_Init(&argc,&argv);
  21.     MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
  22.     MPI_Comm_rank(MPI_COMM_WORLD,&myid);
  23.     MPI_Get_processor_name(processor_name,&namelen);
  24.    
  25.     fprintf(stderr,"Process %d on %s\n",
  26.         myid, processor_name);
  27.     fflush(stderr);
  28.    
  29.     n = 0;
  30.     while (!done)
  31.     {
  32.         if (myid == 0)
  33.         {
  34.         printf("Enter the number of intervals (0 quit) ");fflush(stdout);
  35.         scanf("%d",&n);
  36.        
  37.         startwtime = MPI_Wtime();
  38.        
  39.     /* Sending the number of intervals to other nodes */
  40.  
  41.     for (i=1; i < numprocs; i++)
  42.             {
  43.     MPI_Send (&n,                /* buffer               */
  44.                1,                  /* one data            */
  45.            MPI_INT,         /* type                */
  46.            i,                  /* to which node       */
  47.            1,                  /* number of message   */
  48.            MPI_COMM_WORLD);    /* common communicator  */
  49.         }
  50.     }
  51.  
  52.     else
  53.     {    
  54.     MPI_Recv  (&n,                 /* buffer               */
  55.                1,                 /* one data            */
  56.            MPI_INT,           /* type                */
  57.            0,                 /* to which node       */
  58.            1,                 /* number of message   */
  59.            MPI_COMM_WORLD,   /* common communicator  */
  60.            &stats);
  61.     }      
  62.         if (n == 0)
  63.             done = 1;
  64.         else
  65.         {
  66.             h   = (xh-xl) / (double) n;
  67.             sum = 0.0;
  68.             for (i = myid + 1; i <= n; i += numprocs)
  69.             {
  70.                 x = xl + h * ((double)i - 0.5);
  71.                 sum += f(x);
  72.             }
  73.             myfunk = h * sum;
  74.     printf("Process %d SUMM %.16f\n", myid, myfunk);
  75.    
  76.     /* Sending the local sum to node 0 */
  77.         if (myid !=0)
  78.         {
  79.     MPI_Send (&myfunk,                /* buffer               */
  80.                1,                  /* one data            */
  81.            MPI_DOUBLE,         /* type                */
  82.            0,                  /* to which node       */
  83.            1,                  /* number of message   */
  84.            MPI_COMM_WORLD);    /* common communicator  */
  85.         }
  86.            
  87.             if (myid == 0)
  88.         {
  89.  
  90.        funk = myfunk;
  91.        for (i=1; i< numprocs; i++)
  92.          { MPI_Recv (&myfunk,
  93.                  1,
  94.              MPI_DOUBLE,
  95.              i,
  96.              1,
  97.              MPI_COMM_WORLD,
  98.              &stats);
  99.        funk += myfunk;  
  100.      };
  101.  
  102.                 printf("Integral is approximately  %.16f, Error   %.16f\n",
  103.             funk, funk - fi(xh) + fi(xl));
  104.         endwtime = MPI_Wtime();
  105.         printf("Time of calculation = %f\n", endwtime-startwtime);         
  106.         }
  107.         }
  108.     }
  109.     MPI_Finalize();
  110. }
  111.  
  112.  
  113. static double f(double a)
  114. {
  115.       return cos(a);
  116. }
  117.  
  118. static double fi(double a)
  119. {
  120.     return sin(a);
  121. }
  122.  
  123.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement