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