#include #include #include #include #include #define TOLERANCE 0.00002 /* termination criterion */ #define MAGIC 0.8 /* magic factor */ int even (int i) { return !(i & 1); } double stencil (double** G, int row, int col) { return (G[row-1][col] + G[row+1][col] + G[row][col-1] + G[row][col+1] ) / 4.0; } void alloc_grid(double ***Gptr, int N) { int i; double** G = (double**)malloc(N*sizeof(double*)); if ( G == 0 ) { fprintf(stderr, "malloc failed\n"); exit(42); } for (i = 0; i maxdiff ) maxdiff = diff; G[i][j] = G[i][j] + omega * (Gnew-G[i][j]); } } } iteration++; } while (maxdiff > stopdiff); if(gettimeofday(&end, 0) != 0) { fprintf(stderr, "could not do timing\n"); exit(1); } time = (end.tv_sec + (end.tv_usec / 1000000.0)) - (start.tv_sec + (start.tv_usec / 1000000.0)); fprintf(stderr, "SOR took %10.3f seconds\n", time); printf("Used %5d iterations, diff is %10.6f, allowed diff is %10.6f\n", iteration,maxdiff,stopdiff); if(print == 1) { print_grid(G, N); } return 0; }