This commit is contained in:
2025-10-07 12:46:37 +02:00
parent 2126473078
commit c1f3e9a678
+19 -14
View File
@@ -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
}