Advertisement
Guest User

Untitled

a guest
Feb 21st, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.42 KB | None | 0 0
  1. #include <math.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #define  Max(a,b) ((a)>(b)?(a):(b))
  5.  
  6. #define  N  384
  7. double   maxeps = 0.1e-7;
  8. int itmax = 100;
  9. int i,j,k;
  10. double eps;
  11. double A [N][N][N],  B [N][N][N];
  12.  
  13. void relax();
  14. void resid();
  15. void init();
  16. void verify();
  17. void wtime();
  18.  
  19. int main(int an, char **as)
  20. {
  21.         int it;
  22.         double time0, time1;
  23.         init();
  24.         /* time0=omp_get_wtime (); */
  25.         wtime(&time0);
  26.         for(it=1; it<=itmax; it++)
  27.         {
  28.                 eps = 0.;
  29.                 relax();
  30.                 resid();
  31.                 printf( "it=%4i   eps=%f\n", it,eps);
  32.                 if (eps < maxeps) break;
  33.         }
  34.         wtime(&time1);
  35.         /* time1=omp_get_wtime (); */
  36.         printf("Time in seconds=%gs\t",time1-time0);
  37.         verify();
  38.         return 0;
  39. }
  40.  
  41. void init()
  42. {
  43.         for(i=0; i<=N-1; i++)
  44.                 for(j=0; j<=N-1; j++)
  45.                         for(k=0; k<=N-1; k++)
  46.                         {
  47.                                 if(i==0 || i==N-1 || j==0 || j==N-1 || k==0 || k==N-1) A[i][j][k]= 0.;
  48.                                 else A[i][j][k]= ( 4. + i + j + k) ;
  49.                         }
  50. }
  51.  
  52. void relax()
  53. {
  54.         for(i=1; i<=N-2; i++)
  55.                 for(j=1; j<=N-2; j++)
  56.                         for(k=1; k<=N-2; k++)
  57.                         {
  58.                                 B[i][j][k]=(A[i-1][j][k]+A[i+1][j][k]+A[i][j-1][k]+A[i][j+1][k]+A[i][j][k-1]+A[i][j][k+1])/6.;
  59.                         }
  60. }
  61.  
  62. void resid()
  63. {
  64.         for(i=1; i<=N-2; i++)
  65.                 for(j=1; j<=N-2; j++)
  66.                         for(k=1; k<=N-2; k++)
  67.                         {
  68.                                 double e;
  69.                                 e = fabs(A[i][j][k] - B[i][j][k]);
  70.                                 A[i][j][k] = B[i][j][k];
  71.                                 eps = Max(eps,e);
  72.                         }
  73. }
  74.  
  75. void verify()
  76. {
  77.         double s;
  78.         s=0.;
  79.         for(i=0; i<=N-1; i++)
  80.                 for(j=0; j<=N-1; j++)
  81.                         for(k=0; k<=N-1; k++)
  82.                         {
  83.                                 s=s+A[i][j][k]*(i+1)*(j+1)*(k+1)/(N*N*N);
  84.                         }
  85.         printf("  S = %f\n",s);
  86. }
  87.  
  88. void wtime(double *t)
  89. {
  90.   static int sec = -1;
  91.   struct timeval tv;
  92.   gettimeofday(&tv, (void *)0);
  93.   if (sec < 0) sec = tv.tv_sec;
  94.   *t = (tv.tv_sec - sec) + 1.0e-6*tv.tv_usec;
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement