This commit is contained in:
2025-10-07 12:16:46 +02:00
parent 655b1f70fe
commit e65573abf0

View File

@@ -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
}