Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <math.h>
- #include <mpi.h>
- #include <stdio.h>
- const double A1 = 0;
- const double B1 = 100;
- const double A2 = 0;
- const double B2 = 100;
- const double PI = 3.1415926;
- const int N = 5e3;
- const int M = 5e3;
- #define PRECISION "3"
- double f(double x, double y)
- {
- return (exp(sin(PI * x) * cos(PI * y)) + 1) / ((B1 - A1) * (B2 - A2));
- }
- double q(int i, int j)
- {
- double result = 1;
- if (i == 0 || i == N - 1)
- {
- result *= 0.5;
- }
- if (j == 0 || j == M - 1)
- {
- result *= 0.5;
- }
- return result;
- }
- void usual()
- {
- double start_time = MPI_Wtime();
- double answer = 0;
- double h1 = (B1 - A1) / N;
- double h2 = (B2 - A2) / M;
- int i;
- for (i = 0; i < N; i++)
- {
- double xi = A1 + i * h1;
- int j;
- for (j = 0; j < M; j++)
- {
- double yi = A2 + j * h2;
- answer += f(xi, yi) * q(i, j);
- }
- }
- answer *= h1 * h2;
- printf("[%." PRECISION "lf sec] usual "
- "(answer = %." PRECISION "lf)\n",
- MPI_Wtime() - start_time, answer);
- }
- void external(int rank, int ncount)
- {
- double start_time = MPI_Wtime();
- double answer = 0;
- double h1 = (B1 - A1) / N;
- double h2 = (B2 - A2) / M;
- int i;
- for (i = 0; i < N; i++)
- {
- if (rank == i % ncount)
- {
- double xi = A1 + i * h1;
- int j;
- for (j = 0; j < M; j++)
- {
- double yi = A2 + j * h2;
- answer += f(xi, yi) * q(i, j);
- }
- }
- }
- if (rank)
- MPI_Send(&answer, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);
- else
- {
- for (i = 1; i < ncount; i++)
- {
- double s;
- MPI_Status st;
- MPI_Recv(&s, 1, MPI_DOUBLE, i, 0, MPI_COMM_WORLD, &st);
- answer += s;
- }
- answer *= h1 * h2;
- printf("[%." PRECISION "lf sec] parallel "
- "(answer = %." PRECISION "lf)\n",
- MPI_Wtime() - start_time, answer);
- }
- }
- int main()
- {
- MPI_Init(NULL, NULL);
- int rank, ncount;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &ncount);
- if (!rank)
- {
- printf("2.130997\n");
- usual();
- }
- external(rank, ncount);
- MPI_Finalize();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement