diff --git a/PoissonSolver/2D-mpi-sq/src/main.c b/PoissonSolver/2D-mpi-sq/src/main.c index 7c3f8b8..89e92d1 100644 --- a/PoissonSolver/2D-mpi-sq/src/main.c +++ b/PoissonSolver/2D-mpi-sq/src/main.c @@ -32,9 +32,9 @@ int main(int argc, char** argv) readParameter(¶ms, argv[1]); initSolver(&solver, ¶ms, 2); - // startTime = getTimeStamp(); - // solveRB(&solver); - // endTime = getTimeStamp(); + startTime = getTimeStamp(); + solveRB(&solver); + endTime = getTimeStamp(); writeResult(&solver, "p.dat"); // printf(" %.2fs\n", endTime - startTime); // writeResult(&solver, "p.dat"); diff --git a/PoissonSolver/2D-mpi-sq/src/solver.c b/PoissonSolver/2D-mpi-sq/src/solver.c index 0f979e1..d2091be 100644 --- a/PoissonSolver/2D-mpi-sq/src/solver.c +++ b/PoissonSolver/2D-mpi-sq/src/solver.c @@ -60,6 +60,15 @@ void initSolver(Solver* solver, Parameter* params, int problem) 0, &solver->cart_comm); MPI_Cart_coords(solver->cart_comm, rank, 2, solver->coords); + solver->boundary = NB; + int x_low, x_high, y_low, y_high; + MPI_Cart_shift(solver->cart_comm, 0, 1, &x_low, &x_high); + MPI_Cart_shift(solver->cart_comm, 1, 1, &y_low, &y_high); + if (x_low == MPI_PROC_NULL) solver->boundary += BOTTOM; + if (y_low == MPI_PROC_NULL) solver->boundary += LEFT; + if (x_high == MPI_PROC_NULL) solver->boundary += TOP; + if (y_high == MPI_PROC_NULL) solver->boundary += RIGHT; + solver->limax = distribute_dim(solver->coords[0], solver->dims[0], solver->imax); solver->ljmax = distribute_dim(solver->coords[1], solver->dims[1], solver->jmax); @@ -107,11 +116,11 @@ void initSolver(Solver* solver, Parameter* params, int problem) i_start, j_start); fflush(stdout); - for (int i = 0; i < solver->limax + 2; i++) { - for (int j = 0; j < solver->ljmax + 2; j++) { - P(i, j) = rank; - } - } + // for (int i = 0; i < solver->limax + 2; i++) { + // for (int j = 0; j < solver->ljmax + 2; j++) { + // P(i, j) = (double)solver->boundary; + // } + // } for (int i = 0; i < solver->limax + 2; i++) { for (int j = 0; j < solver->ljmax + 2; j++) { P(i, j) = sin(2.0 * PI * (i_start + i) * dx * 2.0) + @@ -181,16 +190,19 @@ void solveRB(Solver* solver) } jsw = 3 - jsw; } - // - // for (int i = 1; i < imax + 1; i++) { - // P(i, 0) = P(i, 1); - // P(i, jmax + 1) = P(i, jmax); - // } - // - // for (int j = 1; j < jmax + 1; j++) { - // P(0, j) = P(1, j); - // P(imax + 1, j) = P(imax, j); - // } + MPI_Allreduce(MPI_IN_PLACE, &res, 1, MPI_DOUBLE, MPI_SUM, MPI_COMM_WORLD); + if (solver->boundary & BOTTOM) + for (int j = 1; j < solver->ljmax + 1; j++) + P(0, j) = P(1, j); + if (solver->boundary & TOP) + for (int j = 1; j < solver->ljmax + 1; j++) + P(solver->limax + 1, j) = P(solver->limax, j); + if (solver->boundary & LEFT) + for (int i = 1; i < solver->limax + 1; i++) + P(i, 0) = P(i, 1); + if (solver->boundary & RIGHT) + for (int i = 1; i < solver->limax + 1; i++) + P(i, solver->ljmax + 1) = P(i, solver->ljmax); res = res / (double)(imax * jmax); #ifdef DEBUG @@ -199,8 +211,7 @@ void solveRB(Solver* solver) it++; } - // printf("Solver took %d iterations to reach %f\n", it, sqrt(res)); - printf("%d, %f\n", it, solver->omega); + if(solver->rank==0) printf("Solver took %d iterations to reach %f\n", it, sqrt(res)); } void writeResult(Solver* solver, char* filename) diff --git a/PoissonSolver/2D-mpi-sq/src/solver.h b/PoissonSolver/2D-mpi-sq/src/solver.h index 42d3eac..0b87fa6 100644 --- a/PoissonSolver/2D-mpi-sq/src/solver.h +++ b/PoissonSolver/2D-mpi-sq/src/solver.h @@ -6,11 +6,23 @@ #define __SOLVER_H_ #include "parameter.h" #include +typedef enum { + NB = 0b0000, + LEFT = 0b0001, + RIGHT = 0b0010, + TOP = 0b0100, + BOTTOM = 0b1000, + LFTO = LEFT + TOP, + LFBO = LEFT + BOTTOM, + RITO = RIGHT + TOP, + ROBO = RIGHT + BOTTOM +} boundary_t; typedef struct { + double dx, dy; int imax, jmax; - int limax,ljmax; + int limax, ljmax; double *p, *rhs; double eps, omega, rho; int itermax; @@ -21,6 +33,8 @@ typedef struct { int coords[2]; int dims[2]; int rank, size; + boundary_t boundary; + } Solver; extern void initSolver(Solver*, Parameter*, int problem);