Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <omp.h>
- #include <math.h>
- #include <stdio.h>
- #define A 8.2
- #define B -0.7
- #define C 0.64
- #define D 0.18
- #define ts 3 //квадрат -на скольких нитях будет выполняться
- double F(double x1, double x2)
- {
- return A*x1 + B*x2 + exp(C*x1*x1 + D*x2*x2);
- }
- int main()
- {
- double xmax = 5.0, ymax = 5.0;
- double h1 = 0.1, h2 = 0.001, x = -xmax, y = -ymax;
- double minMas[ts*ts * 3];//массив с минимумами
- double tn = omp_get_wtime();
- #pragma omp parallel num_tss(ts*ts) firstprivate (x,y)
- {
- int rank = omp_get_ts_num();
- //Разбиение на квадраты
- double lxBlock = 2 * xmax / ts;//длина блока
- double lyBlock = 2 * ymax / ts;//высота блока
- x += (rank%ts)*lxBlock;//левый нижний
- y += (rank / ts)*lyBlock;//левый нижний
- int nx = (int)(lxBlock / h1 + 1);//кол-во точек по х
- int ny = (int)(lyBlock / h1 + 1);//кол-во точек по у
- double min[3];//0 - значение, 1- х, 2-у
- min[0] = F(x, y);
- min[1] = x;
- min[2] = y;
- for (int i = 0; i < nx; i++)
- for (int j = 0; j < ny; j++)
- if (F(x + i*h1, y + j*h1) < min[0]) {
- min[0] = F(x + i*h1, y + j*h1);
- min[1] = x + i*h1;
- min[2] = y + j*h1;
- }
- minMas[rank * 3] = min[0];
- minMas[rank * 3 + 1] = min[1];
- minMas[rank * 3 + 2] = min[2];
- }
- double minFin[3];//финальный минимум
- minFin[0] = minMas[0];
- minFin[1] = minMas[1];
- minFin[2] = minMas[2];
- int minRank = 0;
- for (int i = 1; i < ts*ts; i++)
- {
- if (minFin[0] > minMas[i * 3])
- {
- minFin[0] = minMas[i * 3];
- minFin[1] = minMas[i * 3 + 1];
- minFin[2] = minMas[i * 3 + 2];
- minRank = i;
- }
- }
- x = (minRank%ts)*(xmax - x) / ts - xmax;//левый нижний
- y = (minRank / ts)*(ymax - y) / ts - ymax;//левый нижний
- #pragma omp parallel num_tss(ts*ts) firstprivate(x,y)
- {
- int rank = omp_get_ts_num();
- double lxBlock = 2 * xmax / (ts*ts);
- double lyBlock = 2 * ymax / (ts*ts);
- x = x + (rank%ts)*lxBlock;
- y = y + (rank / ts)*lyBlock;
- int nx = (int)(lxBlock / h2 + 1);
- int ny = (int)(lyBlock / h2 + 1);
- //ищем более точные минимумы
- double min[3];
- min[0] = F(x, y);
- min[1] = x;
- min[2] = y;
- for (int i = 0; i < nx; i++)
- for (int j = 0; j < ny; j++)
- if (F(x + i*h2, y + j*h2) < min[0]) {
- min[0] = F(x + i*h2, y + j*h2);
- min[1] = x + i*h2;
- min[2] = y + j*h2;
- }
- minMas[rank * 3] = min[0];
- minMas[rank * 3 + 1] = min[1];
- minMas[rank * 3 + 2] = min[2];
- }
- minFin[0] = minMas[0];
- minFin[1] = minMas[1];
- minFin[2] = minMas[2];
- for (int i = 1; i < ts*ts; i++)
- {
- if (minFin[0] > minMas[i * 3])
- {
- minFin[0] = minMas[i * 3];
- minFin[1] = minMas[i * 3 + 1];
- minFin[2] = minMas[i * 3 + 2];
- }
- }
- double tk = omp_get_wtime();
- FILE *f;
- f = fopen("outOMP.txt", "w");
- fprintf(f, "%f\nTime=%f\n", minFin[0], tk-tn);
- fclose(f);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement