diff --git a/exercise4/wave_2d_parallel.c b/exercise4/wave_2d_parallel.c index ba49f2f..0b14a81 100644 --- a/exercise4/wave_2d_parallel.c +++ b/exercise4/wave_2d_parallel.c @@ -46,6 +46,8 @@ MPI_Comm cartesian_comm; int coordinates[2], dims[2] = { 0 }; int cartesian_rank; +int up, down, left, right; +int up_left, up_right, down_left, down_right; // END: T1b // Simulation parameters: size, step count, and how often to save the state @@ -231,7 +233,49 @@ void get_corner_procs(void) { // Communicate the border between processes. void border_exchange(void) { // BEGIN: T6 - ; + + // rows + MPI_Sendrecv(&U(0, 0), local_N, MPI_DOUBLE, up, 0, + &U(local_M, 0), local_N, MPI_DOUBLE, down, 0, + cartesian_comm, MPI_STATUS_IGNORE); + + MPI_Sendrecv(&U(local_M - 1, 0), local_N, MPI_DOUBLE, down, 1, + &U(-1, 0), local_N, MPI_DOUBLE, up, 1, + cartesian_comm, MPI_STATUS_IGNORE); + + // columns + MPI_Datatype column_type; + MPI_Type_vector(local_M, 1, local_N + 2, MPI_DOUBLE, &column_type); + MPI_Type_commit(&column_type); + + MPI_Sendrecv(&U(0, 0), 1, column_type, left, 2, + &U(0, local_N), 1, column_type, right, 2, + cartesian_comm, MPI_STATUS_IGNORE); + + MPI_Sendrecv(&U(0, local_N - 1), 1, column_type, right, 3, + &U(0, -1), 1, column_type, left, 3, + cartesian_comm, MPI_STATUS_IGNORE); + + MPI_Type_free(&column_type); + + // corners + get_corner_procs(); + + MPI_Sendrecv(&U(0, 0), 1, MPI_DOUBLE, up_left, 4, + &U(local_M, local_N), 1, MPI_DOUBLE, down_right, 4, + cartesian_comm, MPI_STATUS_IGNORE); + + MPI_Sendrecv(&U(0, local_N - 1), 1, MPI_DOUBLE, up_right, 5, + &U(local_M, -1), 1, MPI_DOUBLE, down_left, 5, + cartesian_comm, MPI_STATUS_IGNORE); + + MPI_Sendrecv(&U(local_M - 1, 0), 1, MPI_DOUBLE, down_left, 6, + &U(-1, local_N), 1, MPI_DOUBLE, up_right, 6, + cartesian_comm, MPI_STATUS_IGNORE); + + MPI_Sendrecv(&U(local_M - 1, local_N - 1), 1, MPI_DOUBLE, down_right, 7, + &U(-1, -1), 1, MPI_DOUBLE, up_left, 7, + cartesian_comm, MPI_STATUS_IGNORE); // END: T6 }