567
社区成员




int find_steady_state (int p, int id, int my_rows, double **u, double **w)
{
double diff; /* 当前进程最大温差 */
double global_diff; /* 全局最大温差 */
int i, j;
int its; /* 迭代次数 */
MPI_Status status;
double tdiff; /* 当前线程最大温差 */
its = 0;
for (;;) {
/* 交换辅助网格点上的近似解 */
if (id > 0)
MPI_Send (u[1], N, MPI_DOUBLE, id-1, 0, MPI_COMM_WORLD);
if (id < p-1) {
MPI_Send (u[my_rows-2], N, MPI_DOUBLE, id+1, 0, MPI_COMM_WORLD);
MPI_Recv (u[my_rows-1], N, MPI_DOUBLE, id+1, 0, MPI_COMM_WORLD,
&status);
}
if (id > 0)
MPI_Recv (u[0], N, MPI_DOUBLE, id-1, 0, MPI_COMM_WORLD, &status);
/* 更新求得的数值解 */
diff = 0.0;
#pragma omp parallel private (i, j, tdiff)
{
tdiff = 0.0;
#pragma omp for
for (i = 1; i < my_rows-1; i++)
for (j = 1; j < N-1; j++) {
w[i][j] = (u[i-1][j] + u[i+1][j] +
u[i][j-1] + u[i][j+1])/4.0;
if (fabs(w[i][j] - u[i][j]) > tdiff)
tdiff = fabs(w[i][j] - u[i][j]);
}
#pragma omp for nowait
for (i = 1; i < my_rows-1; i++)
for (j = 1; j < N-1; j++)
u[i][j] = w[i][j];
#pragma omp critical
if (tdiff > diff) diff = tdiff;
}
MPI_Allreduce (&diff, &global_diff, 1, MPI_DOUBLE, MPI_MAX,
MPI_COMM_WORLD);
/* 中止条件 */
if (global_diff <= EPSILON) break;
its++;
}
return its;
}