1665c2dedSJed Brown #include <../src/sys/classes/viewer/impls/ascii/asciiimpl.h> /*I "petscviewer.h" I*/ 25c6c1daeSBarry Smith 35c6c1daeSBarry Smith #define QUEUESTRINGSIZE 8192 45c6c1daeSBarry Smith 5d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFileClose_ASCII(PetscViewer viewer) 6d71ae5a4SJacob Faibussowitsch { 75c6c1daeSBarry Smith PetscMPIInt rank; 85c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 95c6c1daeSBarry Smith int err; 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith PetscFunctionBegin; 1228b400f6SJacob Faibussowitsch PetscCheck(!vascii->sviewer, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 139566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 14dd400576SPatrick Sanan if (rank == 0 && vascii->fd != stderr && vascii->fd != PETSC_STDOUT) { 155c6c1daeSBarry Smith if (vascii->fd && vascii->closefile) { 165c6c1daeSBarry Smith err = fclose(vascii->fd); 1728b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fclose() failed on file"); 185c6c1daeSBarry Smith } 195c6c1daeSBarry Smith if (vascii->storecompressed) { 205c6c1daeSBarry Smith char par[PETSC_MAX_PATH_LEN], buf[PETSC_MAX_PATH_LEN]; 215c6c1daeSBarry Smith FILE *fp; 229566063dSJacob Faibussowitsch PetscCall(PetscStrncpy(par, "gzip ", sizeof(par))); 239566063dSJacob Faibussowitsch PetscCall(PetscStrlcat(par, vascii->filename, sizeof(par))); 245c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN) 259566063dSJacob Faibussowitsch PetscCall(PetscPOpen(PETSC_COMM_SELF, NULL, par, "r", &fp)); 2600045ab3SPierre Jolivet PetscCheck(!fgets(buf, 1024, fp), PETSC_COMM_SELF, PETSC_ERR_LIB, "Error from compression command %s %s", par, buf); 279566063dSJacob Faibussowitsch PetscCall(PetscPClose(PETSC_COMM_SELF, fp)); 285c6c1daeSBarry Smith #else 295c6c1daeSBarry Smith SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP_SYS, "Cannot run external programs on this machine"); 305c6c1daeSBarry Smith #endif 315c6c1daeSBarry Smith } 325c6c1daeSBarry Smith } 339566063dSJacob Faibussowitsch PetscCall(PetscFree(vascii->filename)); 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 355c6c1daeSBarry Smith } 365c6c1daeSBarry Smith 3734e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_ASCII(PetscViewer viewer) 38d71ae5a4SJacob Faibussowitsch { 395c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 405c6c1daeSBarry Smith PetscViewerLink *vlink; 41b8b5be36SMartin Diehl PetscMPIInt iflg; 425c6c1daeSBarry Smith 435c6c1daeSBarry Smith PetscFunctionBegin; 4428b400f6SJacob Faibussowitsch PetscCheck(!vascii->sviewer, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 459566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_ASCII(viewer)); 469566063dSJacob Faibussowitsch PetscCall(PetscFree(vascii)); 475c6c1daeSBarry Smith 485c6c1daeSBarry Smith /* remove the viewer from the list in the MPI Communicator */ 49c8025a54SPierre Jolivet if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, Petsc_DelViewer, &Petsc_Viewer_keyval, NULL)); 505c6c1daeSBarry Smith 51b8b5be36SMartin Diehl PetscCallMPI(MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_keyval, (void **)&vlink, &iflg)); 52b8b5be36SMartin Diehl if (iflg) { 535c6c1daeSBarry Smith if (vlink && vlink->viewer == viewer) { 54e5840a18SBarry Smith if (vlink->next) { 559566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_set_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_keyval, vlink->next)); 56e5840a18SBarry Smith } else { 579566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_keyval)); 58e5840a18SBarry Smith } 599566063dSJacob Faibussowitsch PetscCall(PetscFree(vlink)); 605c6c1daeSBarry Smith } else { 615c6c1daeSBarry Smith while (vlink && vlink->next) { 625c6c1daeSBarry Smith if (vlink->next->viewer == viewer) { 635c6c1daeSBarry Smith PetscViewerLink *nv = vlink->next; 645c6c1daeSBarry Smith vlink->next = vlink->next->next; 659566063dSJacob Faibussowitsch PetscCall(PetscFree(nv)); 665c6c1daeSBarry Smith } 675c6c1daeSBarry Smith vlink = vlink->next; 685c6c1daeSBarry Smith } 695c6c1daeSBarry Smith } 705c6c1daeSBarry Smith } 71aa139df6SJed Brown 72aa139df6SJed Brown if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) { 73aa139df6SJed Brown PetscViewer aviewer; 74b8b5be36SMartin Diehl PetscCallMPI(MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_Stdout_keyval, (void **)&aviewer, &iflg)); 75b8b5be36SMartin Diehl if (iflg && aviewer == viewer) PetscCallMPI(MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_Stdout_keyval)); 76aa139df6SJed Brown } 77aa139df6SJed Brown if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) { 78aa139df6SJed Brown PetscViewer aviewer; 79b8b5be36SMartin Diehl PetscCallMPI(MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_Stderr_keyval, (void **)&aviewer, &iflg)); 80b8b5be36SMartin Diehl if (iflg && aviewer == viewer) PetscCallMPI(MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer), Petsc_Viewer_Stderr_keyval)); 81aa139df6SJed Brown } 822e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", NULL)); 832e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", NULL)); 842e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", NULL)); 852e956fe4SStefano Zampini PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", NULL)); 863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 875c6c1daeSBarry Smith } 885c6c1daeSBarry Smith 8934e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_ASCII_SubViewer(PetscViewer viewer) 90d71ae5a4SJacob Faibussowitsch { 915c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 925fd66863SKarl Rupp 935c6c1daeSBarry Smith PetscFunctionBegin; 949566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(vascii->bviewer, 0, &viewer)); 953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 965c6c1daeSBarry Smith } 975c6c1daeSBarry Smith 985c6c1daeSBarry Smith /*@C 99811af0c4SBarry Smith PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII `PetscViewer`. 1005c6c1daeSBarry Smith 10135cb6cd3SPierre Jolivet Not Collective, depending on the viewer the value may be meaningless except for process 0 of the viewer; No Fortran Support 1025c6c1daeSBarry Smith 103f8859db6SBarry Smith Input Parameter: 1043f423023SBarry Smith . viewer - `PetscViewer` context, obtained from `PetscViewerASCIIOpen()` 105f8859db6SBarry Smith 106f8859db6SBarry Smith Output Parameter: 107f8859db6SBarry Smith . fd - file pointer 108f8859db6SBarry Smith 1095c6c1daeSBarry Smith Level: intermediate 1105c6c1daeSBarry Smith 111811af0c4SBarry Smith Note: 112c410d8ccSBarry Smith For the standard `PETSCVIEWERASCII` the value is valid only on MPI rank 0 of the viewer 113811af0c4SBarry Smith 1143f423023SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERASCII`, `PetscViewerASCIIOpen()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, 1153f423023SBarry Smith `PetscViewerCreate()`, `PetscViewerASCIIPrintf()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerFlush()` 1165c6c1daeSBarry Smith @*/ 117d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIGetPointer(PetscViewer viewer, FILE **fd) 118d71ae5a4SJacob Faibussowitsch { 1195c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1205c6c1daeSBarry Smith 1215c6c1daeSBarry Smith PetscFunctionBegin; 122c621c6acSBarry Smith PetscCheck(!vascii->fileunit, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot request file pointer for viewers that use Fortran files"); 1235c6c1daeSBarry Smith *fd = vascii->fd; 1243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1255c6c1daeSBarry Smith } 1265c6c1daeSBarry Smith 12734e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode) 128d71ae5a4SJacob Faibussowitsch { 1295c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1305c6c1daeSBarry Smith 1315c6c1daeSBarry Smith PetscFunctionBegin; 1325c6c1daeSBarry Smith *mode = vascii->mode; 1333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1345c6c1daeSBarry Smith } 1355c6c1daeSBarry Smith 13634e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode) 137d71ae5a4SJacob Faibussowitsch { 1385c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith PetscFunctionBegin; 1415c6c1daeSBarry Smith vascii->mode = mode; 1423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1435c6c1daeSBarry Smith } 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith /* 1465c6c1daeSBarry Smith If petsc_history is on, then all Petsc*Printf() results are saved 1475c6c1daeSBarry Smith if the appropriate (usually .petschistory) file. 1485c6c1daeSBarry Smith */ 14995c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 1505c6c1daeSBarry Smith 1515c6c1daeSBarry Smith /*@ 1523f423023SBarry Smith PetscViewerASCIISetTab - Causes `PetscViewer` to tab in a number of times before printing 1535c6c1daeSBarry Smith 154cf53795eSBarry Smith Not Collective, but only first processor in set has any effect; No Fortran Support 1555c6c1daeSBarry Smith 1565c6c1daeSBarry Smith Input Parameters: 157811af0c4SBarry Smith + viewer - obtained with `PetscViewerASCIIOpen()` 1585c6c1daeSBarry Smith - tabs - number of tabs 1595c6c1daeSBarry Smith 1605c6c1daeSBarry Smith Level: developer 1615c6c1daeSBarry Smith 1623f423023SBarry Smith Note: 1633f423023SBarry Smith `PetscViewerASCIIPushTab()` and `PetscViewerASCIIPopTab()` are the preferred usage 1643f423023SBarry Smith 1653f423023SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERASCII`, `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 1663f423023SBarry Smith `PetscViewerASCIIGetTab()`, 167db781477SPatrick Sanan `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 1683f423023SBarry Smith `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()`, 1693f423023SBarry Smith `PetscViewerASCIIPushTab()` 1705c6c1daeSBarry Smith @*/ 171d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIISetTab(PetscViewer viewer, PetscInt tabs) 172d71ae5a4SJacob Faibussowitsch { 1735c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 1749f196a02SMartin Diehl PetscBool isascii; 1755c6c1daeSBarry Smith 1765c6c1daeSBarry Smith PetscFunctionBegin; 1775c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 1789f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 1799f196a02SMartin Diehl if (isascii) ascii->tab = tabs; 1803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1815c6c1daeSBarry Smith } 1825c6c1daeSBarry Smith 1835c6c1daeSBarry Smith /*@ 184811af0c4SBarry Smith PetscViewerASCIIGetTab - Return the number of tabs used by `PetscViewer`. 1855c6c1daeSBarry Smith 186cf53795eSBarry Smith Not Collective, meaningful on first processor only; No Fortran Support 1875c6c1daeSBarry Smith 18820f4b53cSBarry Smith Input Parameter: 189811af0c4SBarry Smith . viewer - obtained with `PetscViewerASCIIOpen()` 190a2b725a8SWilliam Gropp 19120f4b53cSBarry Smith Output Parameter: 1925c6c1daeSBarry Smith . tabs - number of tabs 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith Level: developer 1955c6c1daeSBarry Smith 1963f423023SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERASCII`, `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 1973f423023SBarry Smith `PetscViewerASCIISetTab()`, 198db781477SPatrick Sanan `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 199db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()`, `PetscViewerASCIIPushTab()` 2005c6c1daeSBarry Smith @*/ 201d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIGetTab(PetscViewer viewer, PetscInt *tabs) 202d71ae5a4SJacob Faibussowitsch { 2035c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 2049f196a02SMartin Diehl PetscBool isascii; 2055c6c1daeSBarry Smith 2065c6c1daeSBarry Smith PetscFunctionBegin; 2075c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 2089f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 2099f196a02SMartin Diehl if (isascii && tabs) *tabs = ascii->tab; 2103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2115c6c1daeSBarry Smith } 2125c6c1daeSBarry Smith 2135c6c1daeSBarry Smith /*@ 2143f423023SBarry Smith PetscViewerASCIIAddTab - Add to the number of times a `PETSCVIEWERASCII` viewer tabs before printing 2155c6c1daeSBarry Smith 216cf53795eSBarry Smith Not Collective, but only first processor in set has any effect; No Fortran Support 2175c6c1daeSBarry Smith 2185c6c1daeSBarry Smith Input Parameters: 219811af0c4SBarry Smith + viewer - obtained with `PetscViewerASCIIOpen()` 2205c6c1daeSBarry Smith - tabs - number of tabs 2215c6c1daeSBarry Smith 2225c6c1daeSBarry Smith Level: developer 2235c6c1daeSBarry Smith 2243f423023SBarry Smith Note: 2253f423023SBarry Smith `PetscViewerASCIIPushTab()` and `PetscViewerASCIIPopTab()` are the preferred usage 2263f423023SBarry Smith 2273f423023SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERASCII`, `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 228db781477SPatrick Sanan `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 229db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()`, `PetscViewerASCIIPushTab()` 2305c6c1daeSBarry Smith @*/ 231d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIAddTab(PetscViewer viewer, PetscInt tabs) 232d71ae5a4SJacob Faibussowitsch { 2335c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 2349f196a02SMartin Diehl PetscBool isascii; 2355c6c1daeSBarry Smith 2365c6c1daeSBarry Smith PetscFunctionBegin; 2375c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 2389f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 2399f196a02SMartin Diehl if (isascii) ascii->tab += tabs; 2403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2415c6c1daeSBarry Smith } 2425c6c1daeSBarry Smith 2435c6c1daeSBarry Smith /*@ 2443f423023SBarry Smith PetscViewerASCIISubtractTab - Subtracts from the number of times a `PETSCVIEWERASCII` viewer tabs before printing 2455c6c1daeSBarry Smith 246cf53795eSBarry Smith Not Collective, but only first processor in set has any effect; No Fortran Support 2475c6c1daeSBarry Smith 2485c6c1daeSBarry Smith Input Parameters: 249811af0c4SBarry Smith + viewer - obtained with `PetscViewerASCIIOpen()` 2505c6c1daeSBarry Smith - tabs - number of tabs 2515c6c1daeSBarry Smith 2525c6c1daeSBarry Smith Level: developer 2535c6c1daeSBarry Smith 2543f423023SBarry Smith Note: 2553f423023SBarry Smith `PetscViewerASCIIPushTab()` and `PetscViewerASCIIPopTab()` are the preferred usage 2563f423023SBarry Smith 2573f423023SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERASCII`, `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 258db781477SPatrick Sanan `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 2593f423023SBarry Smith `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()`, 2603f423023SBarry Smith `PetscViewerASCIIPushTab()` 2615c6c1daeSBarry Smith @*/ 262d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIISubtractTab(PetscViewer viewer, PetscInt tabs) 263d71ae5a4SJacob Faibussowitsch { 2645c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 2659f196a02SMartin Diehl PetscBool isascii; 2665c6c1daeSBarry Smith 2675c6c1daeSBarry Smith PetscFunctionBegin; 2685c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 2699f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 2709f196a02SMartin Diehl if (isascii) ascii->tab -= tabs; 2713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2725c6c1daeSBarry Smith } 2735c6c1daeSBarry Smith 2745d83a8b1SBarry Smith /*@ 275811af0c4SBarry Smith PetscViewerASCIIPushSynchronized - Allows calls to `PetscViewerASCIISynchronizedPrintf()` for this viewer 2765c6c1daeSBarry Smith 277c3339decSBarry Smith Collective 2785c6c1daeSBarry Smith 27920f4b53cSBarry Smith Input Parameter: 280811af0c4SBarry Smith . viewer - obtained with `PetscViewerASCIIOpen()` 2815c6c1daeSBarry Smith 2825c6c1daeSBarry Smith Level: intermediate 2835c6c1daeSBarry Smith 284811af0c4SBarry Smith Note: 285811af0c4SBarry Smith See documentation of `PetscViewerASCIISynchronizedPrintf()` for more details how the synchronized output should be done properly. 2865c6c1daeSBarry Smith 287d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerFlush()`, `PetscViewerASCIIPopSynchronized()`, 288db781477SPatrick Sanan `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, `PetscViewerASCIIOpen()`, 289db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()` 2905c6c1daeSBarry Smith @*/ 291d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIPushSynchronized(PetscViewer viewer) 292d71ae5a4SJacob Faibussowitsch { 2935c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 2949f196a02SMartin Diehl PetscBool isascii; 2955c6c1daeSBarry Smith 2965c6c1daeSBarry Smith PetscFunctionBegin; 2975c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 29828b400f6SJacob Faibussowitsch PetscCheck(!ascii->sviewer, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 2999f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 3009f196a02SMartin Diehl if (isascii) ascii->allowsynchronized++; 3013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3021575c14dSBarry Smith } 3031575c14dSBarry Smith 3045d83a8b1SBarry Smith /*@ 305811af0c4SBarry Smith PetscViewerASCIIPopSynchronized - Undoes most recent `PetscViewerASCIIPushSynchronized()` for this viewer 3061575c14dSBarry Smith 307c3339decSBarry Smith Collective 3081575c14dSBarry Smith 30920f4b53cSBarry Smith Input Parameter: 310811af0c4SBarry Smith . viewer - obtained with `PetscViewerASCIIOpen()` 3111575c14dSBarry Smith 3121575c14dSBarry Smith Level: intermediate 3131575c14dSBarry Smith 314811af0c4SBarry Smith Note: 315811af0c4SBarry Smith See documentation of `PetscViewerASCIISynchronizedPrintf()` for more details how the synchronized output should be done properly. 3161575c14dSBarry Smith 317d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerASCIIPushSynchronized()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerFlush()`, 318db781477SPatrick Sanan `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, `PetscViewerASCIIOpen()`, 319db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()` 3201575c14dSBarry Smith @*/ 321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIPopSynchronized(PetscViewer viewer) 322d71ae5a4SJacob Faibussowitsch { 3231575c14dSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 3249f196a02SMartin Diehl PetscBool isascii; 3251575c14dSBarry Smith 3261575c14dSBarry Smith PetscFunctionBegin; 3271575c14dSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 32828b400f6SJacob Faibussowitsch PetscCheck(!ascii->sviewer, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 3299f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 3309f196a02SMartin Diehl if (isascii) { 3311575c14dSBarry Smith ascii->allowsynchronized--; 33208401ef6SPierre Jolivet PetscCheck(ascii->allowsynchronized >= 0, PETSC_COMM_SELF, PETSC_ERR_PLIB, "Called more times than PetscViewerASCIIPushSynchronized()"); 3331575c14dSBarry Smith } 3343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3355c6c1daeSBarry Smith } 3365c6c1daeSBarry Smith 3375d83a8b1SBarry Smith /*@ 338811af0c4SBarry Smith PetscViewerASCIIPushTab - Adds one more tab to the amount that `PetscViewerASCIIPrintf()` 3395c6c1daeSBarry Smith lines are tabbed. 3405c6c1daeSBarry Smith 341c410d8ccSBarry Smith Not Collective, but only first MPI rank in the viewer has any effect; No Fortran Support 3425c6c1daeSBarry Smith 34320f4b53cSBarry Smith Input Parameter: 344811af0c4SBarry Smith . viewer - obtained with `PetscViewerASCIIOpen()` 3455c6c1daeSBarry Smith 3465c6c1daeSBarry Smith Level: developer 3475c6c1daeSBarry Smith 348d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 349db781477SPatrick Sanan `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 350db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()` 3515c6c1daeSBarry Smith @*/ 352d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIPushTab(PetscViewer viewer) 353d71ae5a4SJacob Faibussowitsch { 3545c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 3559f196a02SMartin Diehl PetscBool isascii; 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith PetscFunctionBegin; 3585c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 3599f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 3609f196a02SMartin Diehl if (isascii) ascii->tab++; 3613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3625c6c1daeSBarry Smith } 3635c6c1daeSBarry Smith 3645d83a8b1SBarry Smith /*@ 3653f423023SBarry Smith PetscViewerASCIIPopTab - Removes one tab from the amount that `PetscViewerASCIIPrintf()` lines are tabbed that was provided by 3663f423023SBarry Smith `PetscViewerASCIIPushTab()` 3675c6c1daeSBarry Smith 368c410d8ccSBarry Smith Not Collective, but only first MPI rank in the viewer has any effect; No Fortran Support 3695c6c1daeSBarry Smith 37020f4b53cSBarry Smith Input Parameter: 371811af0c4SBarry Smith . viewer - obtained with `PetscViewerASCIIOpen()` 3725c6c1daeSBarry Smith 3735c6c1daeSBarry Smith Level: developer 3745c6c1daeSBarry Smith 375d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 376db781477SPatrick Sanan `PetscViewerASCIIPushTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 377db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()` 3785c6c1daeSBarry Smith @*/ 379d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIPopTab(PetscViewer viewer) 380d71ae5a4SJacob Faibussowitsch { 3815c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 3829f196a02SMartin Diehl PetscBool isascii; 3835c6c1daeSBarry Smith 3845c6c1daeSBarry Smith PetscFunctionBegin; 3855c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 3869f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 3879f196a02SMartin Diehl if (isascii) { 38808401ef6SPierre Jolivet PetscCheck(ascii->tab > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "More tabs popped than pushed"); 3895c6c1daeSBarry Smith ascii->tab--; 3905c6c1daeSBarry Smith } 3913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3925c6c1daeSBarry Smith } 3935c6c1daeSBarry Smith 3945c6c1daeSBarry Smith /*@ 395c410d8ccSBarry Smith PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the `PETSCVIEWERASCII` `PetscViewer` 3965c6c1daeSBarry Smith 397c410d8ccSBarry Smith Not Collective, but only first MPI rank in the viewer has any effect; No Fortran Support 3985c6c1daeSBarry Smith 3995c6c1daeSBarry Smith Input Parameters: 400811af0c4SBarry Smith + viewer - obtained with `PetscViewerASCIIOpen()` 401811af0c4SBarry Smith - flg - `PETSC_TRUE` or `PETSC_FALSE` 4025c6c1daeSBarry Smith 4035c6c1daeSBarry Smith Level: developer 4045c6c1daeSBarry Smith 405d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, 406db781477SPatrick Sanan `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, `PetscViewerASCIIPushTab()`, `PetscViewerASCIIOpen()`, 407db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()` 4085c6c1daeSBarry Smith @*/ 409d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIUseTabs(PetscViewer viewer, PetscBool flg) 410d71ae5a4SJacob Faibussowitsch { 4115c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 4129f196a02SMartin Diehl PetscBool isascii; 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith PetscFunctionBegin; 4155c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4169f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 4179f196a02SMartin Diehl if (isascii) { 418a297a907SKarl Rupp if (flg) ascii->tab = ascii->tab_store; 419a297a907SKarl Rupp else { 4205c6c1daeSBarry Smith ascii->tab_store = ascii->tab; 4215c6c1daeSBarry Smith ascii->tab = 0; 4225c6c1daeSBarry Smith } 4235c6c1daeSBarry Smith } 4243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4255c6c1daeSBarry Smith } 4265c6c1daeSBarry Smith 427e4096674SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 428e4096674SBarry Smith 429e4096674SBarry Smith #if defined(PETSC_HAVE_FORTRAN_CAPS) 430e4096674SBarry Smith #define petscviewerasciiopenwithfileunit_ PETSCVIEWERASCIIOPENWITHFILEUNIT 43157b1f488SBarry Smith #define petscviewerasciisetfileunit_ PETSCVIEWERASCIISETFILEUNIT 4329f0612e4SBarry Smith #define petscviewerasciistdoutsetfileunit_ PETSCVIEWERASCIISTDOUTSETFILEUNIT 4339f0612e4SBarry Smith #define petscfortranprinttofileunit_ PETSCFORTRANPRINTTOFILEUNIT 434e4096674SBarry Smith #elif !defined(PETSC_HAVE_FORTRAN_UNDERSCORE) 435e4096674SBarry Smith #define petscviewerasciiopenwithfileunit_ petscviewerasciiopenwithfileunit 436e4096674SBarry Smith #define petscviewerasciisetfileunit_ petscviewerasciisetfileunit 4379f0612e4SBarry Smith #define petscviewerasciistdoutsetfileunit_ petscviewerasciistdoutsetfileunit 4389f0612e4SBarry Smith #define petscfortranprinttofileunit_ petscfortranprinttofileunit 439e4096674SBarry Smith #endif 440e4096674SBarry Smith 441e4096674SBarry Smith #if defined(__cplusplus) 4429f0612e4SBarry Smith extern "C" void petscfortranprinttofileunit_(int *, const char *, PetscErrorCode *, PETSC_FORTRAN_CHARLEN_T); 443e4096674SBarry Smith #else 4449f0612e4SBarry Smith extern void petscfortranprinttofileunit_(int *, const char *, PetscErrorCode *, PETSC_FORTRAN_CHARLEN_T); 445e4096674SBarry Smith #endif 446e4096674SBarry Smith 447e4096674SBarry Smith #define PETSCDEFAULTBUFFERSIZE 8 * 1024 448e4096674SBarry Smith 4499f0612e4SBarry Smith static int PETSC_VIEWER_ASCII_STDOUT_fileunit = 0; 45057b1f488SBarry Smith 45157b1f488SBarry Smith // PetscClangLinter pragma disable: -fdoc-synopsis-macro-explicit-synopsis-valid-header 45257b1f488SBarry Smith /*MC 4539f0612e4SBarry Smith PetscViewerASCIIStdoutSetFileUnit - sets `PETSC_VIEWER_STDOUT_()` to write to a Fortran IO unit 45457b1f488SBarry Smith 45557b1f488SBarry Smith Synopsis: 45657b1f488SBarry Smith #include <petscviewer.h> 4579f0612e4SBarry Smith void PetscViewerASCIIStdoutSetFileUnit(PetscInt unit, PetscErrorCode ierr) 45857b1f488SBarry Smith 45957b1f488SBarry Smith Input Parameter: 46057b1f488SBarry Smith . unit - the unit number 46157b1f488SBarry Smith 46257b1f488SBarry Smith Output Parameter: 46357b1f488SBarry Smith . ierr - the error code 46457b1f488SBarry Smith 46557b1f488SBarry Smith Level: intermediate 46657b1f488SBarry Smith 46757b1f488SBarry Smith Notes: 4689f0612e4SBarry Smith Can be called before `PetscInitialize()` 4699f0612e4SBarry Smith 4709f0612e4SBarry Smith Immediately changes the output for all `PETSC_VIEWER_STDOUT_()` viewers 47157b1f488SBarry Smith 4721d031f67SBarry Smith This may not work currently with some viewers that (improperly) use the `fd` directly instead of `PetscViewerASCIIPrintf()` 47357b1f488SBarry Smith 47457b1f488SBarry Smith With this option, for example, `-log_options` results will be saved to the Fortran file 47557b1f488SBarry Smith 4761d031f67SBarry Smith Any process may call this but only the unit passed on the first process is used 47757b1f488SBarry Smith 47857b1f488SBarry Smith Fortran Note: 47957b1f488SBarry Smith Only for Fortran 48057b1f488SBarry Smith 48157b1f488SBarry Smith Developer Note: 4829f0612e4SBarry Smith `PetscViewerASCIIWORLDSetFilename()` and `PetscViewerASCIIWORLDSetFILE()` could be added 48357b1f488SBarry Smith 4849f0612e4SBarry Smith .seealso: `PetscViewerASCIISetFILE()`, `PETSCVIEWERASCII`, `PetscViewerASCIIOpenWithFileUnit()`, `PetscViewerASCIIStdoutSetFileUnit()`, 4859f0612e4SBarry Smith `PETSC_VIEWER_STDOUT_()`, `PetscViewerASCIIGetStdout()` 48657b1f488SBarry Smith M*/ 4879f0612e4SBarry Smith PETSC_EXTERN void petscviewerasciistdoutsetfileunit_(int *unit, PetscErrorCode *ierr) 48857b1f488SBarry Smith { 4899f0612e4SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 4909f0612e4SBarry Smith PETSC_VIEWER_ASCII_STDOUT_fileunit = *unit; 4919f0612e4SBarry Smith #endif 49257b1f488SBarry Smith } 49357b1f488SBarry Smith 4946dd63270SBarry Smith #include <petsc/private/ftnimpl.h> 49557b1f488SBarry Smith 49610450e9eSJacob Faibussowitsch // PetscClangLinter pragma disable: -fdoc-synopsis-macro-explicit-synopsis-valid-header 497489d2c6aSPierre Jolivet /*MC 4989f0612e4SBarry Smith PetscViewerASCIISetFileUnit - sets the `PETSCVIEWERASCII` `PetscViewer` to write to a Fortran IO unit 499e4096674SBarry Smith 50010450e9eSJacob Faibussowitsch Synopsis: 50110450e9eSJacob Faibussowitsch #include <petscviewer.h> 5020da4d79bSMartin Diehl void PetscViewerASCIISetFileUnit(PetscViewer viewer, PetscInt unit, PetscErrorCode ierr) 503e4096674SBarry Smith 504e4096674SBarry Smith Input Parameters: 5050da4d79bSMartin Diehl + viewer - the viewer 506e4096674SBarry Smith - unit - the unit number 507e4096674SBarry Smith 508e4096674SBarry Smith Output Parameter: 509e4096674SBarry Smith . ierr - the error code 510e4096674SBarry Smith 51110450e9eSJacob Faibussowitsch Level: intermediate 51210450e9eSJacob Faibussowitsch 513e4096674SBarry Smith Note: 514e4096674SBarry Smith `PetscViewerDestroy()` does not close the unit for this `PetscViewer` 515e4096674SBarry Smith 516aec76313SJacob Faibussowitsch Fortran Notes: 517e4096674SBarry Smith Only for Fortran, use `PetscViewerASCIISetFILE()` for C 518e4096674SBarry Smith 5199f0612e4SBarry Smith .seealso: `PetscViewerASCIISetFILE()`, `PETSCVIEWERASCII`, `PetscViewerASCIIOpenWithFileUnit()`, `PetscViewerASCIIStdoutSetFileUnit()` 520489d2c6aSPierre Jolivet M*/ 5210da4d79bSMartin Diehl PETSC_EXTERN void petscviewerasciisetfileunit_(PetscViewer *viewer, int *unit, PetscErrorCode *ierr) 522e4096674SBarry Smith { 52357b1f488SBarry Smith PetscViewer_ASCII *vascii; 52457b1f488SBarry Smith PetscViewer v; 525e4096674SBarry Smith 5260da4d79bSMartin Diehl PetscPatchDefaultViewers_Fortran(viewer, v); 52757b1f488SBarry Smith vascii = (PetscViewer_ASCII *)v->data; 528e4096674SBarry Smith if (vascii->mode == FILE_MODE_READ) { 529e4096674SBarry Smith *ierr = PETSC_ERR_ARG_WRONGSTATE; 530e4096674SBarry Smith return; 531e4096674SBarry Smith } 532e4096674SBarry Smith vascii->fileunit = *unit; 533e4096674SBarry Smith } 534e4096674SBarry Smith 53510450e9eSJacob Faibussowitsch // PetscClangLinter pragma disable: -fdoc-synopsis-macro-explicit-synopsis-valid-header 536489d2c6aSPierre Jolivet /*MC 537baca6076SPierre Jolivet PetscViewerASCIIOpenWithFileUnit - opens a `PETSCVIEWERASCII` to write to a Fortran IO unit 538e4096674SBarry Smith 53910450e9eSJacob Faibussowitsch Synopsis: 54010450e9eSJacob Faibussowitsch #include <petscviewer.h> 5419f0612e4SBarry Smith void PetscViewerASCIIOpenWithFileUnit((MPI_Fint comm, integer unit, PetscViewer viewer, PetscErrorCode ierr) 542e4096674SBarry Smith 543e4096674SBarry Smith Input Parameters: 544e4096674SBarry Smith + comm - the `MPI_Comm` to share the viewer 545e4096674SBarry Smith - unit - the unit number 546e4096674SBarry Smith 547e4096674SBarry Smith Output Parameters: 5480da4d79bSMartin Diehl + viewer - the viewer 549e4096674SBarry Smith - ierr - the error code 550e4096674SBarry Smith 55110450e9eSJacob Faibussowitsch Level: intermediate 55210450e9eSJacob Faibussowitsch 553e4096674SBarry Smith Note: 554e4096674SBarry Smith `PetscViewerDestroy()` does not close the unit for this `PetscViewer` 555e4096674SBarry Smith 556aec76313SJacob Faibussowitsch Fortran Notes: 557e4096674SBarry Smith Only for Fortran, use `PetscViewerASCIIOpenWithFILE()` for C 558e4096674SBarry Smith 559e4096674SBarry Smith .seealso: `PetscViewerASCIISetFileUnit()`, `PetscViewerASCIISetFILE()`, `PETSCVIEWERASCII`, `PetscViewerASCIIOpenWithFILE()` 560489d2c6aSPierre Jolivet M*/ 5610da4d79bSMartin Diehl PETSC_EXTERN void petscviewerasciiopenwithfileunit_(MPI_Fint *comm, int *unit, PetscViewer *viewer, PetscErrorCode *ierr) 562e4096674SBarry Smith { 5630da4d79bSMartin Diehl *ierr = PetscViewerCreate(MPI_Comm_f2c(*(MPI_Fint *)&*comm), viewer); 564e4096674SBarry Smith if (*ierr) return; 5650da4d79bSMartin Diehl *ierr = PetscViewerSetType(*viewer, PETSCVIEWERASCII); 566e4096674SBarry Smith if (*ierr) return; 5670da4d79bSMartin Diehl *ierr = PetscViewerFileSetMode(*viewer, FILE_MODE_WRITE); 568e4096674SBarry Smith if (*ierr) return; 5690da4d79bSMartin Diehl petscviewerasciisetfileunit_(viewer, unit, ierr); 570e4096674SBarry Smith } 571e4096674SBarry Smith 5729f0612e4SBarry Smith static PetscErrorCode PetscVFPrintfFortran(int unit, const char format[], va_list Argp) 573e4096674SBarry Smith { 574e4096674SBarry Smith PetscErrorCode ierr; 575e4096674SBarry Smith char str[PETSCDEFAULTBUFFERSIZE]; 576e4096674SBarry Smith size_t len; 577e4096674SBarry Smith 578e4096674SBarry Smith PetscFunctionBegin; 579e4096674SBarry Smith PetscCall(PetscVSNPrintf(str, sizeof(str), format, NULL, Argp)); 580e4096674SBarry Smith PetscCall(PetscStrlen(str, &len)); 5819f0612e4SBarry Smith petscfortranprinttofileunit_(&unit, str, &ierr, (int)len); 582e4096674SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 583e4096674SBarry Smith } 584e4096674SBarry Smith 5859f0612e4SBarry Smith static PetscErrorCode PetscFPrintfFortran(int unit, const char str[]) 586e4096674SBarry Smith { 587e4096674SBarry Smith PetscErrorCode ierr; 588e4096674SBarry Smith size_t len; 589e4096674SBarry Smith 590e4096674SBarry Smith PetscFunctionBegin; 591e4096674SBarry Smith PetscCall(PetscStrlen(str, &len)); 5929f0612e4SBarry Smith petscfortranprinttofileunit_(&unit, str, &ierr, (int)len); 593e4096674SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 594e4096674SBarry Smith } 595e4096674SBarry Smith 596e4096674SBarry Smith #else 597e4096674SBarry Smith 598e4096674SBarry Smith /* these will never be used; but are needed to link with */ 5999f0612e4SBarry Smith static PetscErrorCode PetscVFPrintfFortran(int unit, const char format[], va_list Argp) 600e4096674SBarry Smith { 601e4096674SBarry Smith PetscFunctionBegin; 602e4096674SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 603e4096674SBarry Smith } 604e4096674SBarry Smith 6059f0612e4SBarry Smith static PetscErrorCode PetscFPrintfFortran(int unit, const char str[]) 606e4096674SBarry Smith { 607e4096674SBarry Smith PetscFunctionBegin; 608e4096674SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 609e4096674SBarry Smith } 610e4096674SBarry Smith #endif 611e4096674SBarry Smith 61257b1f488SBarry Smith /*@ 6131d031f67SBarry Smith PetscViewerASCIIGetStdout - Creates a `PETSCVIEWERASCII` `PetscViewer` shared by all processes 614648c30bcSBarry Smith in a communicator that prints to `stdout`. Error returning version of `PETSC_VIEWER_STDOUT_()` 61557b1f488SBarry Smith 61657b1f488SBarry Smith Collective 61757b1f488SBarry Smith 61857b1f488SBarry Smith Input Parameter: 61957b1f488SBarry Smith . comm - the MPI communicator to share the `PetscViewer` 62057b1f488SBarry Smith 62157b1f488SBarry Smith Output Parameter: 62257b1f488SBarry Smith . viewer - the viewer 62357b1f488SBarry Smith 62457b1f488SBarry Smith Level: beginner 62557b1f488SBarry Smith 62657b1f488SBarry Smith Note: 627648c30bcSBarry Smith Use `PetscViewerDestroy()` to destroy it 62857b1f488SBarry Smith 62957b1f488SBarry Smith Developer Note: 63057b1f488SBarry Smith This should be used in all PETSc source code instead of `PETSC_VIEWER_STDOUT_()` since it allows error checking 63157b1f488SBarry Smith 632648c30bcSBarry Smith .seealso: [](sec_viewers), `PetscViewerASCIIGetStderr()`, `PETSC_VIEWER_DRAW_()`, `PetscViewerASCIIOpen()`, `PETSC_VIEWER_STDERR_`, `PETSC_VIEWER_STDOUT_WORLD`, 63357b1f488SBarry Smith `PETSC_VIEWER_STDOUT_SELF` 63457b1f488SBarry Smith @*/ 63557b1f488SBarry Smith PetscErrorCode PetscViewerASCIIGetStdout(MPI_Comm comm, PetscViewer *viewer) 63657b1f488SBarry Smith { 637b8b5be36SMartin Diehl PetscMPIInt iflg; 63857b1f488SBarry Smith MPI_Comm ncomm; 63957b1f488SBarry Smith 64057b1f488SBarry Smith PetscFunctionBegin; 641377f809aSBarry Smith PetscAssertPointer(viewer, 2); 64257b1f488SBarry Smith PetscCall(PetscSpinlockLock(&PetscViewerASCIISpinLockStdout)); 64357b1f488SBarry Smith PetscCall(PetscCommDuplicate(comm, &ncomm, NULL)); 64457b1f488SBarry Smith if (Petsc_Viewer_Stdout_keyval == MPI_KEYVAL_INVALID) PetscCallMPI(MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Stdout_keyval, NULL)); 645b8b5be36SMartin Diehl PetscCallMPI(MPI_Comm_get_attr(ncomm, Petsc_Viewer_Stdout_keyval, (void **)viewer, &iflg)); 646b8b5be36SMartin Diehl if (!iflg) { /* PetscViewer not yet created */ 64757b1f488SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 6489f0612e4SBarry Smith PetscCallMPI(MPI_Bcast(&PETSC_VIEWER_ASCII_STDOUT_fileunit, 1, MPI_INT, 0, comm)); 6499f0612e4SBarry Smith if (PETSC_VIEWER_ASCII_STDOUT_fileunit) { 65057b1f488SBarry Smith PetscErrorCode ierr; 6519f0612e4SBarry Smith MPI_Fint fcomm = MPI_Comm_c2f(ncomm); 65257b1f488SBarry Smith 6539f0612e4SBarry Smith petscviewerasciiopenwithfileunit_(&fcomm, &PETSC_VIEWER_ASCII_STDOUT_fileunit, viewer, &ierr); 65457b1f488SBarry Smith } else 65557b1f488SBarry Smith #endif 656648c30bcSBarry Smith { 6575e9aba71SBarry Smith PetscViewerFormat format; 6585e9aba71SBarry Smith PetscBool set; 6595e9aba71SBarry Smith 660648c30bcSBarry Smith PetscCall(PetscViewerCreate(ncomm, viewer)); 661648c30bcSBarry Smith PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERASCII)); 6625e9aba71SBarry Smith PetscCall(PetscOptionsGetEnum(NULL, NULL, "-petsc_viewer_stdout_format", PetscViewerFormats, (PetscEnum *)&format, &set)); 6635e9aba71SBarry Smith if (set) PetscCall(PetscViewerPushFormat(*viewer, format)); 664648c30bcSBarry Smith PetscCall(PetscViewerFileSetName(*viewer, "stdout")); 665648c30bcSBarry Smith } 66657b1f488SBarry Smith PetscCall(PetscObjectRegisterDestroy((PetscObject)*viewer)); 66757b1f488SBarry Smith PetscCallMPI(MPI_Comm_set_attr(ncomm, Petsc_Viewer_Stdout_keyval, (void *)*viewer)); 66857b1f488SBarry Smith } 66957b1f488SBarry Smith PetscCall(PetscCommDestroy(&ncomm)); 67057b1f488SBarry Smith PetscCall(PetscSpinlockUnlock(&PetscViewerASCIISpinLockStdout)); 6719f0612e4SBarry Smith #if defined(PETSC_USE_FORTRAN_BINDINGS) 6729f0612e4SBarry Smith ((PetscViewer_ASCII *)(*viewer)->data)->fileunit = PETSC_VIEWER_ASCII_STDOUT_fileunit; 6739f0612e4SBarry Smith #endif 67457b1f488SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 67557b1f488SBarry Smith } 67657b1f488SBarry Smith 6775c6c1daeSBarry Smith /*@C 6785c6c1daeSBarry Smith PetscViewerASCIIPrintf - Prints to a file, only from the first 6793f423023SBarry Smith processor in the `PetscViewer` of type `PETSCVIEWERASCII` 6805c6c1daeSBarry Smith 681c410d8ccSBarry Smith Not Collective, but only the first MPI rank in the viewer has any effect 6825c6c1daeSBarry Smith 6835c6c1daeSBarry Smith Input Parameters: 684811af0c4SBarry Smith + viewer - obtained with `PetscViewerASCIIOpen()` 6855c6c1daeSBarry Smith - format - the usual printf() format string 6865c6c1daeSBarry Smith 6875c6c1daeSBarry Smith Level: developer 6885c6c1daeSBarry Smith 689*3f7bdce8SBarry Smith Fortran Note: 690*3f7bdce8SBarry Smith The call sequence is `PetscViewerASCIIPrintf`(`PetscViewer`, character(*), int ierr). 6915c6c1daeSBarry Smith That is, you can only pass a single character string from Fortran. 6925c6c1daeSBarry Smith 693d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscPrintf()`, `PetscSynchronizedPrintf()`, `PetscViewerASCIIOpen()`, 694db781477SPatrick Sanan `PetscViewerASCIIPushTab()`, `PetscViewerASCIIPopTab()`, `PetscViewerASCIISynchronizedPrintf()`, 695db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerASCIIGetPointer()`, `PetscViewerASCIIPushSynchronized()` 6965c6c1daeSBarry Smith @*/ 697d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIPrintf(PetscViewer viewer, const char format[], ...) 698d71ae5a4SJacob Faibussowitsch { 6995c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 7005c6c1daeSBarry Smith PetscMPIInt rank; 701fe8fb074SBarry Smith PetscInt tab = 0, intab = ascii->tab; 7025c6c1daeSBarry Smith FILE *fd = ascii->fd; 7039f196a02SMartin Diehl PetscBool isascii; 7045c6c1daeSBarry Smith 7055c6c1daeSBarry Smith PetscFunctionBegin; 7065c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 70728b400f6SJacob Faibussowitsch PetscCheck(!ascii->sviewer, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 7084f572ea9SToby Isaac PetscAssertPointer(format, 2); 7099f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 7109f196a02SMartin Diehl PetscCheck(isascii, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not ASCII PetscViewer"); 7119566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 7123ba16761SJacob Faibussowitsch if (rank) PetscFunctionReturn(PETSC_SUCCESS); 7133f08860eSBarry Smith 7143f08860eSBarry Smith if (ascii->bviewer) { /* pass string up to parent viewer */ 7153f08860eSBarry Smith char *string; 7163f08860eSBarry Smith va_list Argp; 7173f08860eSBarry Smith size_t fullLength; 7183f08860eSBarry Smith 7199566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(QUEUESTRINGSIZE, &string)); 720ac530a7eSPierre Jolivet for (; tab < ascii->tab; tab++) string[2 * tab] = string[2 * tab + 1] = ' '; 7213f08860eSBarry Smith va_start(Argp, format); 722fe8fb074SBarry Smith PetscCall(PetscVSNPrintf(string + 2 * intab, QUEUESTRINGSIZE - 2 * intab, format, &fullLength, Argp)); 7233f08860eSBarry Smith va_end(Argp); 724fe8fb074SBarry Smith PetscCall(PetscViewerASCIISynchronizedPrintf(ascii->bviewer, "%s", string)); 7259566063dSJacob Faibussowitsch PetscCall(PetscFree(string)); 7263f08860eSBarry Smith } else { /* write directly to file */ 7275c6c1daeSBarry Smith va_list Argp; 728fe8fb074SBarry Smith 729dd2fa690SBarry Smith tab = intab; 730e4096674SBarry Smith while (tab--) { 731e4096674SBarry Smith if (!ascii->fileunit) PetscCall(PetscFPrintf(PETSC_COMM_SELF, fd, " ")); 732e4096674SBarry Smith else PetscCall(PetscFPrintfFortran(ascii->fileunit, " ")); 733e4096674SBarry Smith } 7345c6c1daeSBarry Smith 7355c6c1daeSBarry Smith va_start(Argp, format); 736e4096674SBarry Smith if (!ascii->fileunit) PetscCall((*PetscVFPrintf)(fd, format, Argp)); 737e4096674SBarry Smith else PetscCall(PetscVFPrintfFortran(ascii->fileunit, format, Argp)); 738eae3dc7dSJacob Faibussowitsch va_end(Argp); 739c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(fd)); 7405c6c1daeSBarry Smith } 7413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7425c6c1daeSBarry Smith } 7435c6c1daeSBarry Smith 7445d83a8b1SBarry Smith /*@ 745c410d8ccSBarry Smith PetscViewerFileSetName - Sets the name of the file the `PetscViewer` should use. 7465c6c1daeSBarry Smith 747c3339decSBarry Smith Collective 7485c6c1daeSBarry Smith 7495c6c1daeSBarry Smith Input Parameters: 7503f423023SBarry Smith + viewer - the `PetscViewer`; for example, of type `PETSCVIEWERASCII` or `PETSCVIEWERBINARY` 7515c6c1daeSBarry Smith - name - the name of the file it should use 7525c6c1daeSBarry Smith 7535c6c1daeSBarry Smith Level: advanced 7545c6c1daeSBarry Smith 755c410d8ccSBarry Smith Note: 756c410d8ccSBarry Smith This will have no effect on viewers that are not related to files 757c410d8ccSBarry Smith 758d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PetscViewerDestroy()`, 759db781477SPatrick Sanan `PetscViewerASCIIGetPointer()`, `PetscViewerASCIIPrintf()`, `PetscViewerASCIISynchronizedPrintf()` 7605c6c1daeSBarry Smith @*/ 761d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFileSetName(PetscViewer viewer, const char name[]) 762d71ae5a4SJacob Faibussowitsch { 763cc843e7aSLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 7645c6c1daeSBarry Smith 7655c6c1daeSBarry Smith PetscFunctionBegin; 7665c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 7674f572ea9SToby Isaac PetscAssertPointer(name, 2); 7689566063dSJacob Faibussowitsch PetscCall(PetscStrreplace(PetscObjectComm((PetscObject)viewer), name, filename, sizeof(filename))); 769cac4c232SBarry Smith PetscTryMethod(viewer, "PetscViewerFileSetName_C", (PetscViewer, const char[]), (viewer, filename)); 7703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7715c6c1daeSBarry Smith } 7725c6c1daeSBarry Smith 7735c6c1daeSBarry Smith /*@C 774c410d8ccSBarry Smith PetscViewerFileGetName - Gets the name of the file the `PetscViewer` is using 7755c6c1daeSBarry Smith 7765c6c1daeSBarry Smith Not Collective 7775c6c1daeSBarry Smith 7785c6c1daeSBarry Smith Input Parameter: 7793f423023SBarry Smith . viewer - the `PetscViewer` 7805c6c1daeSBarry Smith 7815c6c1daeSBarry Smith Output Parameter: 7825c6c1daeSBarry Smith . name - the name of the file it is using 7835c6c1daeSBarry Smith 7845c6c1daeSBarry Smith Level: advanced 7855c6c1daeSBarry Smith 786c410d8ccSBarry Smith Note: 787c410d8ccSBarry Smith This will have no effect on viewers that are not related to files 788c410d8ccSBarry Smith 789d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PetscViewerFileSetName()` 7905c6c1daeSBarry Smith @*/ 7915d83a8b1SBarry Smith PetscErrorCode PetscViewerFileGetName(PetscViewer viewer, const char *name[]) 792d71ae5a4SJacob Faibussowitsch { 7935c6c1daeSBarry Smith PetscFunctionBegin; 7945c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 7954f572ea9SToby Isaac PetscAssertPointer(name, 2); 796cac4c232SBarry Smith PetscUseMethod(viewer, "PetscViewerFileGetName_C", (PetscViewer, const char **), (viewer, name)); 7973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7985c6c1daeSBarry Smith } 7995c6c1daeSBarry Smith 80034e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerFileGetName_ASCII(PetscViewer viewer, const char **name) 801d71ae5a4SJacob Faibussowitsch { 8025c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 8035c6c1daeSBarry Smith 8045c6c1daeSBarry Smith PetscFunctionBegin; 8055c6c1daeSBarry Smith *name = vascii->filename; 8063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8075c6c1daeSBarry Smith } 8085c6c1daeSBarry Smith 809bf31d2d3SBarry Smith #include <errno.h> 81034e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer, const char name[]) 811d71ae5a4SJacob Faibussowitsch { 8125c6c1daeSBarry Smith size_t len; 813bbcf679cSJacob Faibussowitsch char fname[PETSC_MAX_PATH_LEN], *gz = NULL; 8145c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 8155c6c1daeSBarry Smith PetscBool isstderr, isstdout; 8165c6c1daeSBarry Smith PetscMPIInt rank; 8175c6c1daeSBarry Smith 8185c6c1daeSBarry Smith PetscFunctionBegin; 8199566063dSJacob Faibussowitsch PetscCall(PetscViewerFileClose_ASCII(viewer)); 8203ba16761SJacob Faibussowitsch if (!name) PetscFunctionReturn(PETSC_SUCCESS); 8219566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(name, &vascii->filename)); 8225c6c1daeSBarry Smith 8235c6c1daeSBarry Smith /* Is this file to be compressed */ 8245c6c1daeSBarry Smith vascii->storecompressed = PETSC_FALSE; 825a297a907SKarl Rupp 8269566063dSJacob Faibussowitsch PetscCall(PetscStrstr(vascii->filename, ".gz", &gz)); 8275c6c1daeSBarry Smith if (gz) { 8289566063dSJacob Faibussowitsch PetscCall(PetscStrlen(gz, &len)); 8295c6c1daeSBarry Smith if (len == 3) { 83008401ef6SPierre Jolivet PetscCheck(vascii->mode == FILE_MODE_WRITE, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Cannot open ASCII PetscViewer file that is compressed; uncompress it manually first"); 8315c6c1daeSBarry Smith *gz = 0; 8325c6c1daeSBarry Smith vascii->storecompressed = PETSC_TRUE; 8335c6c1daeSBarry Smith } 8345c6c1daeSBarry Smith } 8359566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 836dd400576SPatrick Sanan if (rank == 0) { 8379566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, "stderr", &isstderr)); 8389566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(name, "stdout", &isstdout)); 8395c6c1daeSBarry Smith /* empty filename means stdout */ 8405c6c1daeSBarry Smith if (name[0] == 0) isstdout = PETSC_TRUE; 8415c6c1daeSBarry Smith if (isstderr) vascii->fd = PETSC_STDERR; 8425c6c1daeSBarry Smith else if (isstdout) vascii->fd = PETSC_STDOUT; 8435c6c1daeSBarry Smith else { 8449566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(name, fname)); 8455c6c1daeSBarry Smith switch (vascii->mode) { 846d71ae5a4SJacob Faibussowitsch case FILE_MODE_READ: 847d71ae5a4SJacob Faibussowitsch vascii->fd = fopen(fname, "r"); 848d71ae5a4SJacob Faibussowitsch break; 849d71ae5a4SJacob Faibussowitsch case FILE_MODE_WRITE: 850d71ae5a4SJacob Faibussowitsch vascii->fd = fopen(fname, "w"); 851d71ae5a4SJacob Faibussowitsch break; 852d71ae5a4SJacob Faibussowitsch case FILE_MODE_APPEND: 853d71ae5a4SJacob Faibussowitsch vascii->fd = fopen(fname, "a"); 854d71ae5a4SJacob Faibussowitsch break; 8555c6c1daeSBarry Smith case FILE_MODE_UPDATE: 8565c6c1daeSBarry Smith vascii->fd = fopen(fname, "r+"); 857a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname, "w+"); 8585c6c1daeSBarry Smith break; 8595c6c1daeSBarry Smith case FILE_MODE_APPEND_UPDATE: 8605c6c1daeSBarry Smith /* I really want a file which is opened at the end for updating, 8615c6c1daeSBarry Smith not a+, which opens at the beginning, but makes writes at the end. 8625c6c1daeSBarry Smith */ 8635c6c1daeSBarry Smith vascii->fd = fopen(fname, "r+"); 864a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname, "w+"); 8653ba16761SJacob Faibussowitsch else { 8663ba16761SJacob Faibussowitsch int ret = fseek(vascii->fd, 0, SEEK_END); 8673ba16761SJacob Faibussowitsch PetscCheck(!ret, PETSC_COMM_SELF, PETSC_ERR_LIB, "fseek() failed with error code %d", ret); 8683ba16761SJacob Faibussowitsch } 8695c6c1daeSBarry Smith break; 870d71ae5a4SJacob Faibussowitsch default: 871d71ae5a4SJacob Faibussowitsch SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Unsupported file mode %s", PetscFileModes[vascii->mode]); 8725c6c1daeSBarry Smith } 873bf31d2d3SBarry Smith PetscCheck(vascii->fd, PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN, "Cannot open PetscViewer file: %s due to \"%s\"", fname, strerror(errno)); 8745c6c1daeSBarry Smith } 8755c6c1daeSBarry Smith } 8763ba16761SJacob Faibussowitsch PetscCall(PetscLogObjectState((PetscObject)viewer, "File: %s", name)); 8773ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8785c6c1daeSBarry Smith } 8795c6c1daeSBarry Smith 88034e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer, MPI_Comm subcomm, PetscViewer *outviewer) 881d71ae5a4SJacob Faibussowitsch { 8825c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data, *ovascii; 8835c6c1daeSBarry Smith 8845c6c1daeSBarry Smith PetscFunctionBegin; 88528b400f6SJacob Faibussowitsch PetscCheck(!vascii->sviewer, PETSC_COMM_SELF, PETSC_ERR_ORDER, "SubViewer already obtained from PetscViewer and not restored"); 886fe8fb074SBarry Smith PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 887e5afcf28SBarry Smith /* 8889530cbd7SBarry Smith The following line is a bug; it does another PetscViewerASCIIPushSynchronized() on viewer, but if it is removed the code won't work 8899530cbd7SBarry Smith because it relies on this behavior in other places. In particular this line causes the synchronized flush to occur when the viewer is destroyed 8909530cbd7SBarry Smith (since the count never gets to zero) in some examples this displays information that otherwise would be lost 8919530cbd7SBarry Smith 8929530cbd7SBarry Smith This code also means another call to PetscViewerASCIIPopSynchronized() must be made after the PetscViewerRestoreSubViewer(), see, for example, 8939530cbd7SBarry Smith PCView_GASM(). 894e5afcf28SBarry Smith */ 8959566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(viewer)); 896b4025f61SBarry Smith PetscCall(PetscViewerFlush(viewer)); 8979566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(subcomm, outviewer)); 8989566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*outviewer, PETSCVIEWERASCII)); 8999566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushSynchronized(*outviewer)); 9005c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII *)(*outviewer)->data; 9015c6c1daeSBarry Smith ovascii->fd = vascii->fd; 9029f0612e4SBarry Smith ovascii->fileunit = vascii->fileunit; 903ba5a0b41SBarry Smith ovascii->closefile = PETSC_FALSE; 9045c6c1daeSBarry Smith 9055c6c1daeSBarry Smith vascii->sviewer = *outviewer; 9065c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 9075c6c1daeSBarry Smith ((PetscViewer_ASCII *)((*outviewer)->data))->bviewer = viewer; 9083f08860eSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer; 9093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9105c6c1daeSBarry Smith } 9115c6c1daeSBarry Smith 91234e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer, MPI_Comm comm, PetscViewer *outviewer) 913d71ae5a4SJacob Faibussowitsch { 9145c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 9155c6c1daeSBarry Smith 9165c6c1daeSBarry Smith PetscFunctionBegin; 91728b400f6SJacob Faibussowitsch PetscCheck(ascii->sviewer, PETSC_COMM_SELF, PETSC_ERR_ORDER, "SubViewer never obtained from PetscViewer"); 91808401ef6SPierre Jolivet PetscCheck(ascii->sviewer == *outviewer, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "This PetscViewer did not generate this SubViewer"); 9195c6c1daeSBarry Smith 9209566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(*outviewer)); 921e5afcf28SBarry Smith ascii->sviewer = NULL; 9225c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 9239566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(outviewer)); 924fe8fb074SBarry Smith PetscCall(PetscViewerFlush(viewer)); 9259566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopSynchronized(viewer)); 9263ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9275c6c1daeSBarry Smith } 9285c6c1daeSBarry Smith 92934e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerView_ASCII(PetscViewer v, PetscViewer viewer) 930d71ae5a4SJacob Faibussowitsch { 9312bf49c77SBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)v->data; 9322bf49c77SBarry Smith 9332bf49c77SBarry Smith PetscFunctionBegin; 9349f0612e4SBarry Smith if (ascii->fileunit) PetscCall(PetscViewerASCIIPrintf(viewer, "Fortran FILE UNIT: %d\n", ascii->fileunit)); 93557b1f488SBarry Smith else if (ascii->filename) PetscCall(PetscViewerASCIIPrintf(viewer, "Filename: %s\n", ascii->filename)); 9363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9372bf49c77SBarry Smith } 9382bf49c77SBarry Smith 9399f0612e4SBarry Smith static PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer) 9409f0612e4SBarry Smith { 9419f0612e4SBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 9429f0612e4SBarry Smith MPI_Comm comm; 9439f0612e4SBarry Smith PetscMPIInt rank, size; 9449f0612e4SBarry Smith FILE *fd = vascii->fd; 9459f0612e4SBarry Smith 9469f0612e4SBarry Smith PetscFunctionBegin; 9479f0612e4SBarry Smith PetscCheck(!vascii->sviewer, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_WRONGSTATE, "Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 9489f0612e4SBarry Smith PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm)); 9499f0612e4SBarry Smith PetscCallMPI(MPI_Comm_rank(comm, &rank)); 9509f0612e4SBarry Smith PetscCallMPI(MPI_Comm_size(comm, &size)); 9519f0612e4SBarry Smith 9529f0612e4SBarry Smith if (!vascii->bviewer && rank == 0 && (vascii->mode != FILE_MODE_READ)) PetscCall(PetscFFlush(vascii->fd)); 9539f0612e4SBarry Smith 9549f0612e4SBarry Smith if (vascii->allowsynchronized) { 9559f0612e4SBarry Smith PetscMPIInt tag, i, j, n = 0, dummy = 0; 9569f0612e4SBarry Smith char *message; 9579f0612e4SBarry Smith MPI_Status status; 9589f0612e4SBarry Smith 9599f0612e4SBarry Smith PetscCall(PetscCommDuplicate(comm, &comm, &tag)); 9609f0612e4SBarry Smith 9619f0612e4SBarry Smith /* First processor waits for messages from all other processors */ 9629f0612e4SBarry Smith if (rank == 0) { 9639f0612e4SBarry Smith /* flush my own messages that I may have queued up */ 9649f0612e4SBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase, previous; 9659f0612e4SBarry Smith for (i = 0; i < vascii->petsc_printfqueuelength; i++) { 9669f0612e4SBarry Smith if (!vascii->bviewer) { 9679f0612e4SBarry Smith if (!vascii->fileunit) PetscCall(PetscFPrintf(comm, fd, "%s", next->string)); 9689f0612e4SBarry Smith else PetscCall(PetscFPrintfFortran(vascii->fileunit, next->string)); 9699f0612e4SBarry Smith } else { 9709f0612e4SBarry Smith PetscCall(PetscViewerASCIISynchronizedPrintf(vascii->bviewer, "%s", next->string)); 9719f0612e4SBarry Smith } 9729f0612e4SBarry Smith previous = next; 9739f0612e4SBarry Smith next = next->next; 9749f0612e4SBarry Smith PetscCall(PetscFree(previous->string)); 9759f0612e4SBarry Smith PetscCall(PetscFree(previous)); 9769f0612e4SBarry Smith } 9779f0612e4SBarry Smith vascii->petsc_printfqueue = NULL; 9789f0612e4SBarry Smith vascii->petsc_printfqueuelength = 0; 9799f0612e4SBarry Smith for (i = 1; i < size; i++) { 9809f0612e4SBarry Smith /* to prevent a flood of messages to process zero, request each message separately */ 9819f0612e4SBarry Smith PetscCallMPI(MPI_Send(&dummy, 1, MPI_INT, i, tag, comm)); 9829f0612e4SBarry Smith PetscCallMPI(MPI_Recv(&n, 1, MPI_INT, i, tag, comm, &status)); 9839f0612e4SBarry Smith for (j = 0; j < n; j++) { 9846497c311SBarry Smith size_t size; 9859f0612e4SBarry Smith 9866497c311SBarry Smith PetscCallMPI(MPI_Recv(&size, 1, MPIU_SIZE_T, i, tag, comm, &status)); 9879f0612e4SBarry Smith PetscCall(PetscMalloc1(size, &message)); 9886497c311SBarry Smith PetscCallMPI(MPI_Recv(message, (PetscMPIInt)size, MPI_CHAR, i, tag, comm, &status)); 9899f0612e4SBarry Smith if (!vascii->bviewer) { 9909f0612e4SBarry Smith if (!vascii->fileunit) PetscCall(PetscFPrintf(comm, fd, "%s", message)); 9919f0612e4SBarry Smith else PetscCall(PetscFPrintfFortran(vascii->fileunit, message)); 9929f0612e4SBarry Smith } else { 9939f0612e4SBarry Smith PetscCall(PetscViewerASCIISynchronizedPrintf(vascii->bviewer, "%s", message)); 9949f0612e4SBarry Smith } 9959f0612e4SBarry Smith PetscCall(PetscFree(message)); 9969f0612e4SBarry Smith } 9979f0612e4SBarry Smith } 9989f0612e4SBarry Smith } else { /* other processors send queue to processor 0 */ 9999f0612e4SBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase, previous; 10009f0612e4SBarry Smith 10019f0612e4SBarry Smith PetscCallMPI(MPI_Recv(&dummy, 1, MPI_INT, 0, tag, comm, &status)); 10029f0612e4SBarry Smith PetscCallMPI(MPI_Send(&vascii->petsc_printfqueuelength, 1, MPI_INT, 0, tag, comm)); 10039f0612e4SBarry Smith for (i = 0; i < vascii->petsc_printfqueuelength; i++) { 10046497c311SBarry Smith PetscCallMPI(MPI_Send(&next->size, 1, MPIU_SIZE_T, 0, tag, comm)); 10056497c311SBarry Smith PetscCallMPI(MPI_Send(next->string, (PetscMPIInt)next->size, MPI_CHAR, 0, tag, comm)); 10069f0612e4SBarry Smith previous = next; 10079f0612e4SBarry Smith next = next->next; 10089f0612e4SBarry Smith PetscCall(PetscFree(previous->string)); 10099f0612e4SBarry Smith PetscCall(PetscFree(previous)); 10109f0612e4SBarry Smith } 10119f0612e4SBarry Smith vascii->petsc_printfqueue = NULL; 10129f0612e4SBarry Smith vascii->petsc_printfqueuelength = 0; 10139f0612e4SBarry Smith } 10149f0612e4SBarry Smith PetscCall(PetscCommDestroy(&comm)); 10159f0612e4SBarry Smith } 10169f0612e4SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 10179f0612e4SBarry Smith } 10189f0612e4SBarry Smith 10198556b5ebSBarry Smith /*MC 1020648c30bcSBarry Smith PETSCVIEWERASCII - A viewer that prints to `stdout`, `stderr`, or an ASCII file 10218556b5ebSBarry Smith 1022811af0c4SBarry Smith Level: beginner 1023811af0c4SBarry Smith 1024d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSC_VIEWER_STDOUT_()`, `PETSC_VIEWER_STDOUT_SELF`, `PETSC_VIEWER_STDOUT_WORLD`, `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, 1025db781477SPatrick Sanan `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERBINARY`, `PETSCVIEWERMATLAB`, 1026db781477SPatrick Sanan `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()` 10278556b5ebSBarry Smith M*/ 1028d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer) 1029d71ae5a4SJacob Faibussowitsch { 10305c6c1daeSBarry Smith PetscViewer_ASCII *vascii; 10315c6c1daeSBarry Smith 10325c6c1daeSBarry Smith PetscFunctionBegin; 10334dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&vascii)); 10345c6c1daeSBarry Smith viewer->data = (void *)vascii; 10355c6c1daeSBarry Smith 10365c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_ASCII; 10375c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_ASCII; 1038559f443fSBarry Smith viewer->ops->getsubviewer = PetscViewerGetSubViewer_ASCII; 1039559f443fSBarry Smith viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_ASCII; 10402bf49c77SBarry Smith viewer->ops->view = PetscViewerView_ASCII; 10411d641e7bSMichael Lange viewer->ops->read = PetscViewerASCIIRead; 10425c6c1daeSBarry Smith 10435c6c1daeSBarry Smith /* defaults to stdout unless set with PetscViewerFileSetName() */ 10445c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 10455c6c1daeSBarry Smith vascii->mode = FILE_MODE_WRITE; 104602c9f0b5SLisandro Dalcin vascii->bviewer = NULL; 104702c9f0b5SLisandro Dalcin vascii->subviewer = NULL; 104802c9f0b5SLisandro Dalcin vascii->sviewer = NULL; 10495c6c1daeSBarry Smith vascii->tab = 0; 10505c6c1daeSBarry Smith vascii->tab_store = 0; 105102c9f0b5SLisandro Dalcin vascii->filename = NULL; 10525c6c1daeSBarry Smith vascii->closefile = PETSC_TRUE; 10535c6c1daeSBarry Smith 10549566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetName_C", PetscViewerFileSetName_ASCII)); 10559566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetName_C", PetscViewerFileGetName_ASCII)); 10569566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", PetscViewerFileGetMode_ASCII)); 10579566063dSJacob Faibussowitsch PetscCall(PetscObjectComposeFunction((PetscObject)viewer, "PetscViewerFileSetMode_C", PetscViewerFileSetMode_ASCII)); 10583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 10595c6c1daeSBarry Smith } 10605c6c1daeSBarry Smith 10615c6c1daeSBarry Smith /*@C 1062c410d8ccSBarry Smith PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified `PETSCVIEWERASCII` file from 10635c6c1daeSBarry Smith several processors. Output of the first processor is followed by that of the 10645c6c1daeSBarry Smith second, etc. 10655c6c1daeSBarry Smith 1066c410d8ccSBarry Smith Not Collective, must call collective `PetscViewerFlush()` to get the results flushed 10675c6c1daeSBarry Smith 10685c6c1daeSBarry Smith Input Parameters: 1069811af0c4SBarry Smith + viewer - the `PETSCVIEWERASCII` `PetscViewer` 10705c6c1daeSBarry Smith - format - the usual printf() format string 10715c6c1daeSBarry Smith 10725c6c1daeSBarry Smith Level: intermediate 10735c6c1daeSBarry Smith 107495452b02SPatrick Sanan Notes: 1075811af0c4SBarry Smith You must have previously called `PetscViewerASCIIPushSynchronized()` to allow this routine to be called. 1076e6abc3ddSVáclav Hapla Then you can do multiple independent calls to this routine. 1077811af0c4SBarry Smith 1078811af0c4SBarry Smith The actual synchronized print is then done using `PetscViewerFlush()`. 1079811af0c4SBarry Smith `PetscViewerASCIIPopSynchronized()` should be then called if we are already done with the synchronized output 1080e6abc3ddSVáclav Hapla to conclude the "synchronized session". 1081811af0c4SBarry Smith 1082e6abc3ddSVáclav Hapla So the typical calling sequence looks like 1083811af0c4SBarry Smith .vb 1084811af0c4SBarry Smith PetscViewerASCIIPushSynchronized(viewer); 1085811af0c4SBarry Smith PetscViewerASCIISynchronizedPrintf(viewer, ...); 1086811af0c4SBarry Smith PetscViewerASCIISynchronizedPrintf(viewer, ...); 1087811af0c4SBarry Smith ... 1088811af0c4SBarry Smith PetscViewerFlush(viewer); 1089811af0c4SBarry Smith PetscViewerASCIISynchronizedPrintf(viewer, ...); 1090811af0c4SBarry Smith PetscViewerASCIISynchronizedPrintf(viewer, ...); 1091811af0c4SBarry Smith ... 1092811af0c4SBarry Smith PetscViewerFlush(viewer); 1093811af0c4SBarry Smith PetscViewerASCIIPopSynchronized(viewer); 1094811af0c4SBarry Smith .ve 10955c6c1daeSBarry Smith 1096*3f7bdce8SBarry Smith Fortran Note: 1097*3f7bdce8SBarry Smith The call sequence is `PetscViewerASCIISynchronizedPrintf`(`PetscViewer`, `character(*)`, `PetscErrorCode` ierr) 1098*3f7bdce8SBarry Smith That is, you can only pass a single character string from Fortran. 10995c6c1daeSBarry Smith 1100d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerASCIIPushSynchronized()`, `PetscViewerFlush()`, `PetscViewerASCIIPopSynchronized()`, 1101db781477SPatrick Sanan `PetscSynchronizedPrintf()`, `PetscViewerASCIIPrintf()`, `PetscViewerASCIIOpen()`, 1102db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerDestroy()`, `PetscViewerSetType()` 11035c6c1daeSBarry Smith @*/ 1104d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIISynchronizedPrintf(PetscViewer viewer, const char format[], ...) 1105d71ae5a4SJacob Faibussowitsch { 11065c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 11073f08860eSBarry Smith PetscMPIInt rank; 1108fe8fb074SBarry Smith PetscInt tab = 0; 11095c6c1daeSBarry Smith MPI_Comm comm; 11109f196a02SMartin Diehl PetscBool isascii; 11115c6c1daeSBarry Smith 11125c6c1daeSBarry Smith PetscFunctionBegin; 11135c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 11144f572ea9SToby Isaac PetscAssertPointer(format, 2); 11159f196a02SMartin Diehl PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 11169f196a02SMartin Diehl PetscCheck(isascii, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Not ASCII PetscViewer"); 111728b400f6SJacob Faibussowitsch PetscCheck(vascii->allowsynchronized, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "First call PetscViewerASCIIPushSynchronized() to allow this call"); 11185c6c1daeSBarry Smith 11199566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm)); 11209566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 11215c6c1daeSBarry Smith 1122559f443fSBarry Smith if (vascii->bviewer) { 1123fe8fb074SBarry Smith char *string; 11245c6c1daeSBarry Smith va_list Argp; 1125fe8fb074SBarry Smith size_t fullLength; 11265c6c1daeSBarry Smith 1127fe8fb074SBarry Smith PetscCall(PetscCalloc1(QUEUESTRINGSIZE, &string)); 1128ac530a7eSPierre Jolivet for (; tab < vascii->tab; tab++) string[2 * tab] = string[2 * tab + 1] = ' '; 1129fe8fb074SBarry Smith va_start(Argp, format); 1130fe8fb074SBarry Smith PetscCall(PetscVSNPrintf(string + 2 * tab, QUEUESTRINGSIZE - 2 * tab, format, &fullLength, Argp)); 1131fe8fb074SBarry Smith va_end(Argp); 1132fe8fb074SBarry Smith PetscCall(PetscViewerASCIISynchronizedPrintf(vascii->bviewer, "%s", string)); 1133fe8fb074SBarry Smith PetscCall(PetscFree(string)); 1134fe8fb074SBarry Smith } else if (rank == 0) { /* First processor prints immediately to fp */ 1135fe8fb074SBarry Smith va_list Argp; 1136fe8fb074SBarry Smith FILE *fp = vascii->fd; 1137fe8fb074SBarry Smith 1138fe8fb074SBarry Smith tab = vascii->tab; 11399f0612e4SBarry Smith while (tab--) { 11409f0612e4SBarry Smith if (!vascii->fileunit) PetscCall(PetscFPrintf(PETSC_COMM_SELF, fp, " ")); 11419f0612e4SBarry Smith else PetscCall(PetscFPrintfFortran(vascii->fileunit, " ")); 11429f0612e4SBarry Smith } 11435c6c1daeSBarry Smith 11445c6c1daeSBarry Smith va_start(Argp, format); 11459f0612e4SBarry Smith if (!vascii->fileunit) PetscCall((*PetscVFPrintf)(fp, format, Argp)); 11469f0612e4SBarry Smith else PetscCall(PetscVFPrintfFortran(vascii->fileunit, format, Argp)); 1147eae3dc7dSJacob Faibussowitsch va_end(Argp); 1148c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(fp)); 11495c6c1daeSBarry Smith if (petsc_history) { 11505c6c1daeSBarry Smith va_start(Argp, format); 11519566063dSJacob Faibussowitsch PetscCall((*PetscVFPrintf)(petsc_history, format, Argp)); 1152eae3dc7dSJacob Faibussowitsch va_end(Argp); 1153c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(petsc_history)); 11545c6c1daeSBarry Smith } 1155559f443fSBarry Smith } else { /* other processors add to queue */ 11565c6c1daeSBarry Smith char *string; 11575c6c1daeSBarry Smith va_list Argp; 11585c6c1daeSBarry Smith size_t fullLength; 11595c6c1daeSBarry Smith PrintfQueue next; 11605c6c1daeSBarry Smith 11619566063dSJacob Faibussowitsch PetscCall(PetscNew(&next)); 1162559f443fSBarry Smith if (vascii->petsc_printfqueue) { 1163559f443fSBarry Smith vascii->petsc_printfqueue->next = next; 1164559f443fSBarry Smith vascii->petsc_printfqueue = next; 1165a297a907SKarl Rupp } else { 1166559f443fSBarry Smith vascii->petsc_printfqueuebase = vascii->petsc_printfqueue = next; 1167a297a907SKarl Rupp } 1168559f443fSBarry Smith vascii->petsc_printfqueuelength++; 11695c6c1daeSBarry Smith next->size = QUEUESTRINGSIZE; 11709566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(next->size, &next->string)); 11715c6c1daeSBarry Smith string = next->string; 1172f15bb73eSStefano Zampini 1173f15bb73eSStefano Zampini tab = vascii->tab; 11745c6c1daeSBarry Smith tab *= 2; 1175ad540459SPierre Jolivet while (tab--) *string++ = ' '; 11765c6c1daeSBarry Smith va_start(Argp, format); 11779566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(string, next->size - 2 * vascii->tab, format, &fullLength, Argp)); 11785c6c1daeSBarry Smith va_end(Argp); 1179835f2295SStefano Zampini if (fullLength > next->size - 2 * vascii->tab) { 11809566063dSJacob Faibussowitsch PetscCall(PetscFree(next->string)); 118114416c0eSBarry Smith next->size = fullLength + 2 * vascii->tab; 11829566063dSJacob Faibussowitsch PetscCall(PetscCalloc1(next->size, &next->string)); 118314416c0eSBarry Smith string = next->string; 118414416c0eSBarry Smith tab = 2 * vascii->tab; 1185ad540459SPierre Jolivet while (tab--) *string++ = ' '; 118614416c0eSBarry Smith va_start(Argp, format); 11879566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(string, next->size - 2 * vascii->tab, format, NULL, Argp)); 118814416c0eSBarry Smith va_end(Argp); 118914416c0eSBarry Smith } 11905c6c1daeSBarry Smith } 11913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 11925c6c1daeSBarry Smith } 11935c6c1daeSBarry Smith 11942655f987SMichael Lange /*@C 1195c410d8ccSBarry Smith PetscViewerASCIIRead - Reads from a `PETSCVIEWERASCII` file 11962655f987SMichael Lange 1197c410d8ccSBarry Smith Only MPI rank 0 in the `PetscViewer` may call this 11982655f987SMichael Lange 11992655f987SMichael Lange Input Parameters: 12003f423023SBarry Smith + viewer - the `PETSCVIEWERASCII` viewer 1201c410d8ccSBarry Smith . data - location to write the data, treated as an array of type indicated by `datatype` 1202060da220SMatthew G. Knepley . num - number of items of data to read 1203aec76313SJacob Faibussowitsch - dtype - type of data to read 12042655f987SMichael Lange 120520f4b53cSBarry Smith Output Parameter: 12063f423023SBarry Smith . count - number of items of data actually read, or `NULL` 1207f8e4bde8SMatthew G. Knepley 12082655f987SMichael Lange Level: beginner 12092655f987SMichael Lange 1210d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerASCIIOpen()`, `PetscViewerPushFormat()`, `PetscViewerDestroy()`, `PetscViewerCreate()`, `PetscViewerFileSetMode()`, `PetscViewerFileSetName()` 1211db781477SPatrick Sanan `VecView()`, `MatView()`, `VecLoad()`, `MatLoad()`, `PetscViewerBinaryGetDescriptor()`, 1212db781477SPatrick Sanan `PetscViewerBinaryGetInfoPointer()`, `PetscFileMode`, `PetscViewer`, `PetscViewerBinaryRead()` 12132655f987SMichael Lange @*/ 1214d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype) 1215d71ae5a4SJacob Faibussowitsch { 12162655f987SMichael Lange PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 12172655f987SMichael Lange FILE *fd = vascii->fd; 12182655f987SMichael Lange PetscInt i; 12193b7fe8c3SMatthew G. Knepley int ret = 0; 1220f8859db6SBarry Smith PetscMPIInt rank; 12212655f987SMichael Lange 12222655f987SMichael Lange PetscFunctionBegin; 12232655f987SMichael Lange PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 12249566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 1225c5853193SPierre Jolivet PetscCheck(rank == 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Can only be called from process 0 in the PetscViewer"); 1226060da220SMatthew G. Knepley for (i = 0; i < num; i++) { 1227f8e4bde8SMatthew G. Knepley if (dtype == PETSC_CHAR) ret = fscanf(fd, "%c", &(((char *)data)[i])); 1228f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_STRING) ret = fscanf(fd, "%s", &(((char *)data)[i])); 1229a05e1a72SSatish Balay else if (dtype == PETSC_INT) ret = fscanf(fd, "%" PetscInt_FMT, &(((PetscInt *)data)[i])); 1230f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_ENUM) ret = fscanf(fd, "%d", &(((int *)data)[i])); 12319e3e4c22SLisandro Dalcin else if (dtype == PETSC_INT64) ret = fscanf(fd, "%" PetscInt64_FMT, &(((PetscInt64 *)data)[i])); 1232972064b6SLisandro Dalcin else if (dtype == PETSC_LONG) ret = fscanf(fd, "%ld", &(((long *)data)[i])); 12336497c311SBarry Smith else if (dtype == PETSC_COUNT) ret = fscanf(fd, "%" PetscCount_FMT, &(((PetscCount *)data)[i])); 1234f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_FLOAT) ret = fscanf(fd, "%f", &(((float *)data)[i])); 1235f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_DOUBLE) ret = fscanf(fd, "%lg", &(((double *)data)[i])); 1236a6e181c6SToby Isaac #if defined(PETSC_USE_REAL___FLOAT128) 1237fba955ccSBarry Smith else if (dtype == PETSC___FLOAT128) { 1238fba955ccSBarry Smith double tmp; 1239fba955ccSBarry Smith ret = fscanf(fd, "%lg", &tmp); 1240a6e181c6SToby Isaac ((__float128 *)data)[i] = tmp; 1241a6e181c6SToby Isaac } 1242fba955ccSBarry Smith #endif 12439371c9d4SSatish Balay else 12449371c9d4SSatish Balay SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Data type %d not supported", (int)dtype); 124528b400f6SJacob Faibussowitsch PetscCheck(ret, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int)dtype); 1246f7d195e4SLawrence Mitchell if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */ 12472655f987SMichael Lange } 1248060da220SMatthew G. Knepley if (count) *count = i; 124908401ef6SPierre Jolivet else PetscCheck(ret >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %" PetscInt_FMT " < %" PetscInt_FMT " items", i, num); 12503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 12512655f987SMichael Lange } 1252