diff --git a/exercise4/wave_2d_parallel.c b/exercise4/wave_2d_parallel.c index 6e3442e..841fe97 100644 --- a/exercise4/wave_2d_parallel.c +++ b/exercise4/wave_2d_parallel.c @@ -74,39 +74,44 @@ void move_buffer_window(void) { } // TASK: T8 -// Save the present time step in a numbered file under 'data/' void domain_save(int_t step) { // BEGIN: T8 char filename[256]; // Ensure output directory exists (ignore error if it already exists) - if (mkdir("data", 0755) != 0 && errno != EEXIST) { - perror("mkdir data"); - exit(EXIT_FAILURE); + if (world_rank == ROOT) { + if (mkdir("data", 0755) != 0 && errno != EEXIST) { + perror("mkdir data"); + exit(EXIT_FAILURE); + } } + MPI_Barrier(MPI_COMM_WORLD); + snprintf(filename, sizeof(filename), "data/%05" PRId64 ".dat", step); - FILE *out = fopen(filename, "wb"); - if (out == NULL) { + MPI_File fh; + int rc = MPI_File_open(cartesian_comm, filename, MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &fh); + if (rc != MPI_SUCCESS) { perror("fopen output file"); fprintf(stderr, "Failed to open '%s' for writing.\n", filename); exit(EXIT_FAILURE); } - for (int_t i = 0; i < M; ++i) { - size_t written = fwrite(&U(i, 0), sizeof(real_t), (size_t)N, out); - if (written != (size_t)N) { + MPI_Status status; + for (int_t i = 0; i < local_M; i++) { + MPI_Offset offset = ((coordinates[0] * local_M + i) * N // global row position + + coordinates[1] * local_N) * + sizeof(real_t); + rc = MPI_File_write_at(fh, offset, &U(i, 0), local_N, MPI_DOUBLE, &status); + if (rc != MPI_SUCCESS) { perror("fwrite"); - fclose(out); + MPI_File_close(&fh); exit(EXIT_FAILURE); } } - if (fclose(out) != 0) { - perror("fclose"); - exit(EXIT_FAILURE); - } + MPI_File_close(&fh); // END: T8 }