task 8
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user