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*/