Advertisement
Guest User

Code

a guest
Dec 14th, 2017
411
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.45 KB | None | 0 0
  1. #include <fcntl.h>
  2. #include <math.h>
  3. #include <omp.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <sys/stat.h>
  8. #include <sys/types.h>
  9. #include <unistd.h>
  10.  
  11. #define F(y) (exp(-(y)))
  12. #define dF(y) (-exp(-(y)))
  13. #define X(i) ((x0) + (i)*(h))
  14.  
  15. void reduce(int N, double h, double *y, double *A, double *B, double *C,
  16.             double *D, double *d)
  17. {
  18.     double p = h * h / 12.0;
  19.     double q = h * h * 5.0 / 6.0;
  20.     int stride = 1;
  21.  
  22.     A[0] = 0; B[0] = 1.0; C[0] = 0; D[0] = 0;
  23.  
  24.     A[N-1] = 0; B[N-1] = 1.0; C[N-1] = 0; D[N-1] = 0;
  25.  
  26.     #pragma omp parallel for
  27.     for (int i = 1; i < N - 1; i++) {
  28.         A[i] = 1 - dF(y[i - 1]) * p;
  29.         B[i] = -2 - dF(y[i]) * q;
  30.         C[i] = 1 - dF(y[i + 1]) * p;
  31.         D[i] = (y[i - 1] * dF(y[i - 1]) + F(y[i - 1])) * p +
  32.                (y[i] * dF(y[i]) + F(y[i])) * q +
  33.                (y[i + 1] * dF(y[i + 1]) + F(y[i + 1])) * p -
  34.                (y[i - 1] - 2 * y[i] + y[i + 1]);
  35.     }
  36.  
  37.     for (int n = N, low = 2; n > 1; n >>= 2, low <<= 1, stride <<= 1) {
  38.         #pragma omp parallel for
  39.         for (int i = low - 1; i < N; i += stride * 2) {
  40.             double alpha = -A[i] / B[i - stride];
  41.             double beta  = -C[i] / B[i + stride];
  42.  
  43.             A[i] = alpha * A[i - stride];
  44.             B[i] = B[i] + alpha * C[i - stride] + beta * A[i + stride];
  45.             C[i] = beta * C[i + stride];
  46.             D[i] = D[i] + alpha * D[i - stride] + beta * D[i + stride];
  47.         }
  48.     }
  49.  
  50.     d[0] = 0; d[N/2] = D[N / 2] / B[N / 2]; d[N - 1] = 0;
  51.  
  52.     for (stride >>= 1; stride >= 1; stride >>= 1) {
  53.         #pragma omp parallel for
  54.         for (int i = stride - 1; i < N; i += stride * 2)
  55.             d[i] = (D[i] - ((i - stride > 0) ? (A[i] * d[i - stride]) : 0.)
  56.                     - ((i + stride < N) ? (C[i] * d[i + stride]) : 0.)) / B[i];
  57.     }
  58. }
  59.  
  60. int main(int argc, char** argv)
  61. {
  62.     double b0 = 0, b1 = 1.7, db = 0.1;
  63.     double x0 = 0, xN = 1.0;
  64.     double eps = 0.000001;
  65.     int N = 3000;
  66.  
  67.     double h = fabs(xN - x0) / N;
  68.  
  69.     double *A = malloc((N + 1) * sizeof(double));
  70.     double *B = malloc((N + 1) * sizeof(double));
  71.     double *C = malloc((N + 1) * sizeof(double));
  72.     double *D = malloc((N + 1) * sizeof(double));
  73.     double *d = malloc((N + 1) * sizeof(double));
  74.     double *y = malloc((N + 1) * sizeof(double));
  75.  
  76.     int out_file = open("Kaziakhmedov.txt", O_WRONLY | O_CREAT);
  77.  
  78.     dprintf(out_file, "plot ");
  79.     /*
  80.      * Draw parameter range
  81.      */
  82.     for (double b = b0; b < b1; b += db)
  83.         dprintf(out_file, "'-' pt 7 ps 0.25 title 'b = %2.2lf', ", b);
  84.     dprintf(out_file, "'-' pt 7 ps 0.25 title 'b = %2.2lf'\n", b1);
  85.     /*
  86.      * Main calc
  87.      */
  88.     for (double b = b0; b <= b1 + eps; b += db) {
  89.         #pragma omp parallel for
  90.         for (int i = 0; i < N + 1; i++)
  91.             y[i] = 1.0 + X(i) * (b - 1.0);
  92.  
  93.         while (1) {
  94.             double max_delta = -1.;
  95.  
  96.             reduce(N + 1, h, y, A, B, C, D, d);
  97.             #pragma omp parallel for reduction(max:max_delta)
  98.             for (int i = 1; i < N; i++) {
  99.                 y[i] += d[i];
  100.                 if (fabs(d[i]) > max_delta)
  101.                     max_delta = fabs(d[i]);
  102.             }
  103.             if (max_delta < eps)
  104.                 break;
  105.         }
  106.  
  107.         for (int i = 0; i < N + 1; i++)
  108.             dprintf(out_file, "%lf %lf\n", X(i), y[i]);
  109.  
  110.         dprintf(out_file, "e\n");
  111.     }
  112.  
  113.     close(out_file);
  114.     return 0;
  115. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement