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