Advertisement
Guest User

Untitled

a guest
May 25th, 2017
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.91 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <math.h>
  5. #include <omp.h>
  6.  
  7. #define MATRIX_HEIGHT 15 * 1024
  8. #define MATRIX_WIDTH  15 * 1024
  9.  
  10. #define EPS 0.0000001
  11. #define TETTA 0.0001
  12.  
  13. long double countNorm(const double *vector) {
  14.     long double result = 0;
  15. #pragma omp parallel for reduction(+:result)
  16.     for (int i = 0; i < MATRIX_WIDTH; i++) {
  17.         result += (vector[i] * vector[i]);
  18.     }
  19.     result = sqrt(result);
  20.     return result;
  21. }
  22.  
  23. void printfMatrix(const double *m1) {
  24.     for (int i = 0; i < MATRIX_WIDTH; i++) {
  25.         printf("%lf\n",m1[i]);
  26.     }
  27. }
  28.  
  29. int main() {
  30.     double *a = (double *)calloc(MATRIX_WIDTH * MATRIX_HEIGHT,sizeof(double));
  31.     double *b = (double *)calloc(MATRIX_WIDTH,sizeof(double));
  32.  
  33.     for (int i = 0; i < MATRIX_HEIGHT; i++) {
  34.         for (int j = 0; j < MATRIX_WIDTH; j++) {
  35.             if (i == j) {
  36.                 a[i * MATRIX_WIDTH + j] = 2.0;
  37.             }
  38.             else {
  39.                 a[i * MATRIX_WIDTH + j] = 1.0;
  40.             }
  41.         }
  42.         b[i] = MATRIX_WIDTH + 1;
  43.     }
  44.  
  45.     long double b_norm = countNorm(b);
  46.  
  47.     double *x = (double *)calloc(MATRIX_WIDTH,sizeof(double));
  48.     for (int i = 0; i < MATRIX_WIDTH; i++) {
  49.         x[i] = 2.0;
  50.     }
  51.  
  52.     long double result = 1.0;
  53.     double *AxMinB = (double *)calloc(MATRIX_WIDTH,sizeof(double));
  54.     double *AxMult = (double *)calloc(MATRIX_WIDTH,sizeof(double));
  55.     int flag = 1;
  56.     int counter = 2;
  57.     while (flag) {
  58. #pragma omp parallel for       
  59.         for (int i = 0; i < MATRIX_WIDTH; i++) {
  60.             AxMult[i] = 0.0;
  61.         }
  62.  
  63. #pragma omp parallel for
  64.         for (int i = 0; i < MATRIX_HEIGHT; i++) {
  65.             for (int j = 0; j < MATRIX_WIDTH; j++) {
  66.                 AxMult[i] += a[i*MATRIX_WIDTH + j]*x[j];
  67.             }
  68.             AxMinB[i] = AxMult[i] - b[i];
  69.         }
  70.         result = countNorm(AxMinB) / b_norm;
  71.         if (result <= EPS) {
  72.             flag = 0;
  73.         }
  74. #pragma omp parallel for
  75.         for (int j = 0; j < MATRIX_WIDTH; j++) {
  76.             x[j] -= AxMinB[j] * TETTA;
  77.         }
  78.     }
  79.  
  80.     printfMatrix(x);
  81.     free(a);
  82.     free(b);
  83.     free(x);
  84.     free(AxMinB);
  85.     free(AxMult);
  86.  
  87.     return 0;
  88. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement