Actual source code: ex17.c
2: static char help[] = "Demonstrates PetscFOpens() and PetscSynchronizedFGets().\n\n";
4: #include <petscsys.h>
5: int main(int argc, char **argv)
6: {
7: const char line1[] = "hello 1\n";
8: const char line2[] = "hello 2\n";
9: const char filename[] = "testfile";
10: PetscMPIInt rank;
11: FILE *fp;
13: PetscFunctionBeginUser;
14: PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
15: MPI_Comm comm = PETSC_COMM_WORLD;
16: PetscCallMPI(MPI_Comm_rank(comm, &rank));
18: // -- Create the file
19: PetscCall(PetscFOpen(comm, filename, "w", &fp));
20: PetscCall(PetscFPrintf(comm, fp, line1));
21: PetscCall(PetscFPrintf(comm, fp, line2));
22: PetscCall(PetscSynchronizedFPrintf(comm, fp, "rank: %d\n", rank)); // Print rankid in order
23: PetscCall(PetscSynchronizedFlush(comm, fp));
24: PetscCall(PetscFClose(comm, fp));
26: { // -- Read the file
27: char line[512] = {0};
28: PetscBool line_check;
29: PetscMPIInt size;
30: PetscInt line_rank;
32: PetscCall(PetscFOpen(comm, filename, "r", &fp));
33: PetscCall(PetscSynchronizedFGets(comm, fp, sizeof(line), line));
34: PetscCall(PetscStrncmp(line, line1, sizeof(line1), &line_check));
35: PetscCheck(line_check, PETSC_COMM_SELF, PETSC_ERR_FILE_READ, "Line 1 not read correctly. Got '%s', expected '%s'", line, line1);
36: PetscCall(PetscSynchronizedFGets(comm, fp, sizeof(line), line));
37: PetscCall(PetscStrncmp(line, line2, sizeof(line2), &line_check));
38: PetscCheck(line_check, PETSC_COMM_SELF, PETSC_ERR_FILE_READ, "Line 2 not read correctly. Got '%s', expected '%s'", line, line2);
39: PetscCallMPI(MPI_Comm_size(comm, &size));
40: for (PetscInt i = 0; i < size; i++) {
41: PetscCall(PetscSynchronizedFGets(comm, fp, sizeof(line), line));
42: sscanf(line, "rank: %" PetscInt_FMT, &line_rank);
43: PetscCheck(i == line_rank, PETSC_COMM_SELF, PETSC_ERR_FILE_UNEXPECTED, "Did not find correct rank line in file. Expected %" PetscInt_FMT ", found %" PetscInt_FMT, i, line_rank);
44: }
46: PetscCall(PetscFClose(comm, fp));
47: }
49: PetscCall(PetscFinalize());
50: return 0;
51: }
53: /*TEST
55: test:
56: nsize: 3
58: TEST*/