xref: /petsc/src/sys/classes/viewer/impls/ascii/filev.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/ascii/asciiimpl.h>  /*I     "petscsys.h"   I*/
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith #define QUEUESTRINGSIZE 8192
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith #undef __FUNCT__
75c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileClose_ASCII"
85c6c1daeSBarry Smith static PetscErrorCode PetscViewerFileClose_ASCII(PetscViewer viewer)
95c6c1daeSBarry Smith {
105c6c1daeSBarry Smith   PetscErrorCode    ierr;
115c6c1daeSBarry Smith   PetscMPIInt       rank;
125c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
135c6c1daeSBarry Smith   int               err;
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith   PetscFunctionBegin;
16*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
175c6c1daeSBarry Smith   if (!rank && vascii->fd != stderr && vascii->fd != PETSC_STDOUT) {
185c6c1daeSBarry Smith     if (vascii->fd && vascii->closefile) {
195c6c1daeSBarry Smith       err = fclose(vascii->fd);
205c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
215c6c1daeSBarry Smith     }
225c6c1daeSBarry Smith     if (vascii->storecompressed) {
235c6c1daeSBarry Smith       char par[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN];
245c6c1daeSBarry Smith       FILE *fp;
255c6c1daeSBarry Smith       ierr = PetscStrcpy(par,"gzip ");CHKERRQ(ierr);
265c6c1daeSBarry Smith       ierr = PetscStrcat(par,vascii->filename);CHKERRQ(ierr);
275c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN)
280298fd71SBarry Smith       ierr = PetscPOpen(PETSC_COMM_SELF,NULL,par,"r",&fp);CHKERRQ(ierr);
29f23aa3ddSBarry Smith       if (fgets(buf,1024,fp)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from compression command %s\n%s",par,buf);
300298fd71SBarry Smith       ierr = PetscPClose(PETSC_COMM_SELF,fp,NULL);CHKERRQ(ierr);
315c6c1daeSBarry Smith #else
325c6c1daeSBarry Smith       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine");
335c6c1daeSBarry Smith #endif
345c6c1daeSBarry Smith     }
355c6c1daeSBarry Smith   }
365c6c1daeSBarry Smith   ierr = PetscFree(vascii->filename);CHKERRQ(ierr);
375c6c1daeSBarry Smith   PetscFunctionReturn(0);
385c6c1daeSBarry Smith }
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith /* ----------------------------------------------------------------------*/
415c6c1daeSBarry Smith #undef __FUNCT__
425c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII"
435c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII(PetscViewer viewer)
445c6c1daeSBarry Smith {
455c6c1daeSBarry Smith   PetscErrorCode    ierr;
465c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
475c6c1daeSBarry Smith   PetscViewerLink   *vlink;
485c6c1daeSBarry Smith   PetscBool         flg;
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith   PetscFunctionBegin;
515c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"ASCII PetscViewer destroyed before restoring singleton or subcomm PetscViewer");
525c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
535c6c1daeSBarry Smith   ierr = PetscFree(vascii);CHKERRQ(ierr);
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith   /* remove the viewer from the list in the MPI Communicator */
565c6c1daeSBarry Smith   if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) {
575c6c1daeSBarry Smith     ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);CHKERRQ(ierr);
585c6c1daeSBarry Smith   }
595c6c1daeSBarry Smith 
60*ce94432eSBarry Smith   ierr = MPI_Attr_get(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr);
615c6c1daeSBarry Smith   if (flg) {
625c6c1daeSBarry Smith     if (vlink && vlink->viewer == viewer) {
63*ce94432eSBarry Smith       ierr = MPI_Attr_put(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr);
645c6c1daeSBarry Smith       ierr = PetscFree(vlink);CHKERRQ(ierr);
655c6c1daeSBarry Smith     } else {
665c6c1daeSBarry Smith       while (vlink && vlink->next) {
675c6c1daeSBarry Smith         if (vlink->next->viewer == viewer) {
685c6c1daeSBarry Smith           PetscViewerLink *nv = vlink->next;
695c6c1daeSBarry Smith           vlink->next = vlink->next->next;
705c6c1daeSBarry Smith           ierr = PetscFree(nv);CHKERRQ(ierr);
715c6c1daeSBarry Smith         }
725c6c1daeSBarry Smith         vlink = vlink->next;
735c6c1daeSBarry Smith       }
745c6c1daeSBarry Smith     }
755c6c1daeSBarry Smith   }
765c6c1daeSBarry Smith   PetscFunctionReturn(0);
775c6c1daeSBarry Smith }
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith #undef __FUNCT__
805c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Singleton"
815c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Singleton(PetscViewer viewer)
825c6c1daeSBarry Smith {
835c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
845c6c1daeSBarry Smith   PetscErrorCode    ierr;
855fd66863SKarl Rupp 
865c6c1daeSBarry Smith   PetscFunctionBegin;
875c6c1daeSBarry Smith   ierr = PetscViewerRestoreSingleton(vascii->bviewer,&viewer);CHKERRQ(ierr);
885c6c1daeSBarry Smith   PetscFunctionReturn(0);
895c6c1daeSBarry Smith }
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith #undef __FUNCT__
925c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Subcomm"
935c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Subcomm(PetscViewer viewer)
945c6c1daeSBarry Smith {
955c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
965c6c1daeSBarry Smith   PetscErrorCode    ierr;
975fd66863SKarl Rupp 
985c6c1daeSBarry Smith   PetscFunctionBegin;
99*ce94432eSBarry Smith   ierr = PetscViewerRestoreSubcomm(vascii->bviewer,PetscObjectComm((PetscObject)viewer),&viewer);CHKERRQ(ierr);
1005c6c1daeSBarry Smith   PetscFunctionReturn(0);
1015c6c1daeSBarry Smith }
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith #undef __FUNCT__
1045c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII_Singleton_0"
1055c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII_Singleton_0(PetscViewer viewer)
1065c6c1daeSBarry Smith {
1075c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1085c6c1daeSBarry Smith   int               err;
1095c6c1daeSBarry Smith 
1105c6c1daeSBarry Smith   PetscFunctionBegin;
1115c6c1daeSBarry Smith   err = fflush(vascii->fd);
1125c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
1135c6c1daeSBarry Smith   PetscFunctionReturn(0);
1145c6c1daeSBarry Smith }
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith #undef __FUNCT__
1175c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII"
1185c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer)
1195c6c1daeSBarry Smith {
1205c6c1daeSBarry Smith   PetscMPIInt       rank;
1215c6c1daeSBarry Smith   PetscErrorCode    ierr;
1225c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1235c6c1daeSBarry Smith   int               err;
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith   PetscFunctionBegin;
126*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
1275c6c1daeSBarry Smith   /* fflush() fails on OSX for read-only descriptors */
1285c6c1daeSBarry Smith   if (!rank && (vascii->mode != FILE_MODE_READ)) {
1295c6c1daeSBarry Smith     err = fflush(vascii->fd);
1305c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed");
1315c6c1daeSBarry Smith   }
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   if (vascii->allowsynchronized) {
1345c6c1daeSBarry Smith     /* Also flush anything printed with PetscViewerASCIISynchronizedPrintf()  */
135*ce94432eSBarry Smith     ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)viewer));CHKERRQ(ierr);
1365c6c1daeSBarry Smith   }
1375c6c1daeSBarry Smith   PetscFunctionReturn(0);
1385c6c1daeSBarry Smith }
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith #undef __FUNCT__
1415c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer"
1425c6c1daeSBarry Smith /*@C
1435c6c1daeSBarry Smith     PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer.
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith     Not Collective
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerASCIIOpen()
1485c6c1daeSBarry Smith -   fd - file pointer
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith     Level: intermediate
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith     Fortran Note:
1535c6c1daeSBarry Smith     This routine is not supported in Fortran.
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   Concepts: PetscViewer^file pointer
1565c6c1daeSBarry Smith   Concepts: file pointer^getting from PetscViewer
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(),
1595c6c1daeSBarry Smith           PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush()
1605c6c1daeSBarry Smith @*/
1615c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd)
1625c6c1daeSBarry Smith {
1635c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith   PetscFunctionBegin;
1665c6c1daeSBarry Smith   *fd = vascii->fd;
1675c6c1daeSBarry Smith   PetscFunctionReturn(0);
1685c6c1daeSBarry Smith }
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith EXTERN_C_BEGIN
1715c6c1daeSBarry Smith #undef __FUNCT__
1725c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetMode_ASCII"
1735c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode)
1745c6c1daeSBarry Smith {
1755c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith   PetscFunctionBegin;
1785c6c1daeSBarry Smith   *mode = vascii->mode;
1795c6c1daeSBarry Smith   PetscFunctionReturn(0);
1805c6c1daeSBarry Smith }
1815c6c1daeSBarry Smith EXTERN_C_END
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith /*@C
1845c6c1daeSBarry Smith     PetscViewerFileSetMode - Sets the mode in which to open the file.
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith     Not Collective
1875c6c1daeSBarry Smith 
1885c6c1daeSBarry Smith +   viewer - viewer context, obtained from PetscViewerCreate()
1895c6c1daeSBarry Smith -   mode   - The file mode
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith     Level: intermediate
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith     Fortran Note:
1945c6c1daeSBarry Smith     This routine is not supported in Fortran.
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith .keywords: Viewer, file, get, pointer
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerBinaryOpen()
1995c6c1daeSBarry Smith @*/
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith EXTERN_C_BEGIN
2025c6c1daeSBarry Smith #undef __FUNCT__
2035c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII"
2045c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode)
2055c6c1daeSBarry Smith {
2065c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith   PetscFunctionBegin;
2095c6c1daeSBarry Smith   vascii->mode = mode;
2105c6c1daeSBarry Smith   PetscFunctionReturn(0);
2115c6c1daeSBarry Smith }
2125c6c1daeSBarry Smith EXTERN_C_END
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith /*
2155c6c1daeSBarry Smith    If petsc_history is on, then all Petsc*Printf() results are saved
2165c6c1daeSBarry Smith    if the appropriate (usually .petschistory) file.
2175c6c1daeSBarry Smith */
2185c6c1daeSBarry Smith extern FILE *petsc_history;
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith #undef __FUNCT__
2215c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab"
2225c6c1daeSBarry Smith /*@
2235c6c1daeSBarry Smith     PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith     Input Parameters:
2285c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2295c6c1daeSBarry Smith -    tabs - number of tabs
2305c6c1daeSBarry Smith 
2315c6c1daeSBarry Smith     Level: developer
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith     Fortran Note:
2345c6c1daeSBarry Smith     This routine is not supported in Fortran.
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2375c6c1daeSBarry Smith   Concepts: tab^setting
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(),
2405c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2415c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2425c6c1daeSBarry Smith @*/
2435c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs)
2445c6c1daeSBarry Smith {
2455c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2465c6c1daeSBarry Smith   PetscBool         iascii;
2475c6c1daeSBarry Smith   PetscErrorCode    ierr;
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith   PetscFunctionBegin;
2505c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2515c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
252a297a907SKarl Rupp   if (iascii) ascii->tab = tabs;
2535c6c1daeSBarry Smith   PetscFunctionReturn(0);
2545c6c1daeSBarry Smith }
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith #undef __FUNCT__
2575c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab"
2585c6c1daeSBarry Smith /*@
2595c6c1daeSBarry Smith     PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer.
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith     Not Collective, meaningful on first processor only.
2625c6c1daeSBarry Smith 
2635c6c1daeSBarry Smith     Input Parameters:
2645c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
2655c6c1daeSBarry Smith     Output Parameters:
2665c6c1daeSBarry Smith .    tabs - number of tabs
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith     Level: developer
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith     Fortran Note:
2715c6c1daeSBarry Smith     This routine is not supported in Fortran.
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2745c6c1daeSBarry Smith   Concepts: tab^retrieval
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(),
2775c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2785c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2795c6c1daeSBarry Smith @*/
2805c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs)
2815c6c1daeSBarry Smith {
2825c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2835c6c1daeSBarry Smith   PetscBool         iascii;
2845c6c1daeSBarry Smith   PetscErrorCode    ierr;
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith   PetscFunctionBegin;
2875c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2885c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
289a297a907SKarl Rupp   if (iascii && tabs) *tabs = ascii->tab;
2905c6c1daeSBarry Smith   PetscFunctionReturn(0);
2915c6c1daeSBarry Smith }
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith #undef __FUNCT__
2945c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab"
2955c6c1daeSBarry Smith /*@
2965c6c1daeSBarry Smith     PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing
2975c6c1daeSBarry Smith 
2985c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith     Input Parameters:
3015c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3025c6c1daeSBarry Smith -    tabs - number of tabs
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith     Level: developer
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith     Fortran Note:
3075c6c1daeSBarry Smith     This routine is not supported in Fortran.
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3105c6c1daeSBarry Smith   Concepts: tab^setting
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3135c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3145c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3155c6c1daeSBarry Smith @*/
3165c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs)
3175c6c1daeSBarry Smith {
3185c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3195c6c1daeSBarry Smith   PetscBool         iascii;
3205c6c1daeSBarry Smith   PetscErrorCode    ierr;
3215c6c1daeSBarry Smith 
3225c6c1daeSBarry Smith   PetscFunctionBegin;
3235c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3245c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
325a297a907SKarl Rupp   if (iascii) ascii->tab += tabs;
3265c6c1daeSBarry Smith   PetscFunctionReturn(0);
3275c6c1daeSBarry Smith }
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith #undef __FUNCT__
3305c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab"
3315c6c1daeSBarry Smith /*@
3325c6c1daeSBarry Smith     PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3355c6c1daeSBarry Smith 
3365c6c1daeSBarry Smith     Input Parameters:
3375c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3385c6c1daeSBarry Smith -    tabs - number of tabs
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith     Level: developer
3415c6c1daeSBarry Smith 
3425c6c1daeSBarry Smith     Fortran Note:
3435c6c1daeSBarry Smith     This routine is not supported in Fortran.
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3465c6c1daeSBarry Smith   Concepts: tab^setting
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3495c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3505c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3515c6c1daeSBarry Smith @*/
3525c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs)
3535c6c1daeSBarry Smith {
3545c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3555c6c1daeSBarry Smith   PetscBool         iascii;
3565c6c1daeSBarry Smith   PetscErrorCode    ierr;
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith   PetscFunctionBegin;
3595c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3605c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
361a297a907SKarl Rupp   if (iascii) ascii->tab -= tabs;
3625c6c1daeSBarry Smith   PetscFunctionReturn(0);
3635c6c1daeSBarry Smith }
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith #undef __FUNCT__
3665c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow"
3675c6c1daeSBarry Smith /*@C
3685c6c1daeSBarry Smith     PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer
3695c6c1daeSBarry Smith 
3705c6c1daeSBarry Smith     Collective on PetscViewer
3715c6c1daeSBarry Smith 
3725c6c1daeSBarry Smith     Input Parameters:
3735c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3745c6c1daeSBarry Smith -    allow - PETSC_TRUE to allow the synchronized printing
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith     Level: intermediate
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3795c6c1daeSBarry Smith   Concepts: tab^setting
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3825c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3835c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
3845c6c1daeSBarry Smith @*/
3855c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow)
3865c6c1daeSBarry Smith {
3875c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3885c6c1daeSBarry Smith   PetscBool         iascii;
3895c6c1daeSBarry Smith   PetscErrorCode    ierr;
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith   PetscFunctionBegin;
3925c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3935c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
394a297a907SKarl Rupp   if (iascii) ascii->allowsynchronized = allow;
3955c6c1daeSBarry Smith   PetscFunctionReturn(0);
3965c6c1daeSBarry Smith }
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith #undef __FUNCT__
3995c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab"
4005c6c1daeSBarry Smith /*@
4015c6c1daeSBarry Smith     PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf()
4025c6c1daeSBarry Smith      lines are tabbed.
4035c6c1daeSBarry Smith 
4045c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4055c6c1daeSBarry Smith 
4065c6c1daeSBarry Smith     Input Parameters:
4075c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith     Level: developer
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith     Fortran Note:
4125c6c1daeSBarry Smith     This routine is not supported in Fortran.
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4155c6c1daeSBarry Smith   Concepts: tab^setting
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4185c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4195c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4205c6c1daeSBarry Smith @*/
4215c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPushTab(PetscViewer viewer)
4225c6c1daeSBarry Smith {
4235c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4245c6c1daeSBarry Smith   PetscBool         iascii;
4255c6c1daeSBarry Smith   PetscErrorCode    ierr;
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith   PetscFunctionBegin;
4285c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4295c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
430a297a907SKarl Rupp   if (iascii) ascii->tab++;
4315c6c1daeSBarry Smith   PetscFunctionReturn(0);
4325c6c1daeSBarry Smith }
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith #undef __FUNCT__
4355c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab"
4365c6c1daeSBarry Smith /*@
4375c6c1daeSBarry Smith     PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf()
4385c6c1daeSBarry Smith      lines are tabbed.
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith     Input Parameters:
4435c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
4445c6c1daeSBarry Smith 
4455c6c1daeSBarry Smith     Level: developer
4465c6c1daeSBarry Smith 
4475c6c1daeSBarry Smith     Fortran Note:
4485c6c1daeSBarry Smith     This routine is not supported in Fortran.
4495c6c1daeSBarry Smith 
4505c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4515c6c1daeSBarry Smith   Concepts: tab^setting
4525c6c1daeSBarry Smith 
4535c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4545c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4555c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4565c6c1daeSBarry Smith @*/
4575c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPopTab(PetscViewer viewer)
4585c6c1daeSBarry Smith {
4595c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4605c6c1daeSBarry Smith   PetscErrorCode    ierr;
4615c6c1daeSBarry Smith   PetscBool         iascii;
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith   PetscFunctionBegin;
4645c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4655c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4665c6c1daeSBarry Smith   if (iascii) {
4675c6c1daeSBarry Smith     if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed");
4685c6c1daeSBarry Smith     ascii->tab--;
4695c6c1daeSBarry Smith   }
4705c6c1daeSBarry Smith   PetscFunctionReturn(0);
4715c6c1daeSBarry Smith }
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith #undef __FUNCT__
4745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs"
4755c6c1daeSBarry Smith /*@
4765c6c1daeSBarry Smith     PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer
4775c6c1daeSBarry Smith 
4785c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4795c6c1daeSBarry Smith 
4805c6c1daeSBarry Smith     Input Parameters:
4815c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
4825c6c1daeSBarry Smith -    flg - PETSC_TRUE or PETSC_FALSE
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith     Level: developer
4855c6c1daeSBarry Smith 
4865c6c1daeSBarry Smith     Fortran Note:
4875c6c1daeSBarry Smith     This routine is not supported in Fortran.
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4905c6c1daeSBarry Smith   Concepts: tab^setting
4915c6c1daeSBarry Smith 
4925c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4935c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(),
4945c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4955c6c1daeSBarry Smith @*/
4965c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg)
4975c6c1daeSBarry Smith {
4985c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4995c6c1daeSBarry Smith   PetscBool         iascii;
5005c6c1daeSBarry Smith   PetscErrorCode    ierr;
5015c6c1daeSBarry Smith 
5025c6c1daeSBarry Smith   PetscFunctionBegin;
5035c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5045c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5055c6c1daeSBarry Smith   if (iascii) {
506a297a907SKarl Rupp     if (flg) ascii->tab = ascii->tab_store;
507a297a907SKarl Rupp     else {
5085c6c1daeSBarry Smith       ascii->tab_store = ascii->tab;
5095c6c1daeSBarry Smith       ascii->tab       = 0;
5105c6c1daeSBarry Smith     }
5115c6c1daeSBarry Smith   }
5125c6c1daeSBarry Smith   PetscFunctionReturn(0);
5135c6c1daeSBarry Smith }
5145c6c1daeSBarry Smith 
5155c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */
5165c6c1daeSBarry Smith 
5175c6c1daeSBarry Smith #include <../src/sys/fileio/mprint.h> /* defines the queue datastructures and variables */
5185c6c1daeSBarry Smith 
5195c6c1daeSBarry Smith #undef __FUNCT__
5205c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf"
5215c6c1daeSBarry Smith /*@C
5225c6c1daeSBarry Smith     PetscViewerASCIIPrintf - Prints to a file, only from the first
5235c6c1daeSBarry Smith     processor in the PetscViewer
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5265c6c1daeSBarry Smith 
5275c6c1daeSBarry Smith     Input Parameters:
5285c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
5295c6c1daeSBarry Smith -    format - the usual printf() format string
5305c6c1daeSBarry Smith 
5315c6c1daeSBarry Smith     Level: developer
5325c6c1daeSBarry Smith 
5335c6c1daeSBarry Smith     Fortran Note:
5345c6c1daeSBarry Smith     The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran.
5355c6c1daeSBarry Smith     That is, you can only pass a single character string from Fortran.
5365c6c1daeSBarry Smith 
5375c6c1daeSBarry Smith   Concepts: PetscViewerASCII^printing
5385c6c1daeSBarry Smith   Concepts: printing^to file
5395c6c1daeSBarry Smith   Concepts: printf
5405c6c1daeSBarry Smith 
5415c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(),
5425c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(),
5435c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow()
5445c6c1daeSBarry Smith @*/
5455c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...)
5465c6c1daeSBarry Smith {
5475c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5485c6c1daeSBarry Smith   PetscMPIInt       rank;
5495c6c1daeSBarry Smith   PetscInt          tab;
5505c6c1daeSBarry Smith   PetscErrorCode    ierr;
5515c6c1daeSBarry Smith   FILE              *fd = ascii->fd;
5525c6c1daeSBarry Smith   PetscBool         iascii;
5535c6c1daeSBarry Smith   int               err;
5545c6c1daeSBarry Smith 
5555c6c1daeSBarry Smith   PetscFunctionBegin;
5565c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5575c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
5585c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5595c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
5605c6c1daeSBarry Smith 
561*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
5625c6c1daeSBarry Smith   if (!rank) {
5635c6c1daeSBarry Smith     va_list Argp;
564a297a907SKarl Rupp     if (ascii->bviewer) petsc_printfqueuefile = fd;
5655c6c1daeSBarry Smith 
5665c6c1daeSBarry Smith     tab = ascii->tab;
567a297a907SKarl Rupp     while (tab--) {
568a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
569a297a907SKarl Rupp     }
5705c6c1daeSBarry Smith 
5715c6c1daeSBarry Smith     va_start(Argp,format);
5725c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
5735c6c1daeSBarry Smith     err  = fflush(fd);
5745c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5755c6c1daeSBarry Smith     if (petsc_history) {
5765c6c1daeSBarry Smith       va_start(Argp,format);
5775c6c1daeSBarry Smith       tab = ascii->tab;
578a297a907SKarl Rupp       while (tab--) {
579a297a907SKarl Rupp         ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
580a297a907SKarl Rupp       }
5815c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
5825c6c1daeSBarry Smith       err  = fflush(petsc_history);
5835c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5845c6c1daeSBarry Smith     }
5855c6c1daeSBarry Smith     va_end(Argp);
5865c6c1daeSBarry Smith   }
5875c6c1daeSBarry Smith   PetscFunctionReturn(0);
5885c6c1daeSBarry Smith }
5895c6c1daeSBarry Smith 
5905c6c1daeSBarry Smith #undef __FUNCT__
5915c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName"
5925c6c1daeSBarry Smith /*@C
5935c6c1daeSBarry Smith      PetscViewerFileSetName - Sets the name of the file the PetscViewer uses.
5945c6c1daeSBarry Smith 
5955c6c1daeSBarry Smith     Collective on PetscViewer
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith   Input Parameters:
5985c6c1daeSBarry Smith +  viewer - the PetscViewer; either ASCII or binary
5995c6c1daeSBarry Smith -  name - the name of the file it should use
6005c6c1daeSBarry Smith 
6015c6c1daeSBarry Smith     Level: advanced
6025c6c1daeSBarry Smith 
6035c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(),
6045c6c1daeSBarry Smith           PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
6055c6c1daeSBarry Smith 
6065c6c1daeSBarry Smith @*/
6075c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName(PetscViewer viewer,const char name[])
6085c6c1daeSBarry Smith {
6095c6c1daeSBarry Smith   PetscErrorCode ierr;
6105c6c1daeSBarry Smith 
6115c6c1daeSBarry Smith   PetscFunctionBegin;
6125c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6135c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
6145c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr);
6155c6c1daeSBarry Smith   PetscFunctionReturn(0);
6165c6c1daeSBarry Smith }
6175c6c1daeSBarry Smith 
6185c6c1daeSBarry Smith #undef __FUNCT__
6195c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName"
6205c6c1daeSBarry Smith /*@C
6215c6c1daeSBarry Smith      PetscViewerFileGetName - Gets the name of the file the PetscViewer uses.
6225c6c1daeSBarry Smith 
6235c6c1daeSBarry Smith     Not Collective
6245c6c1daeSBarry Smith 
6255c6c1daeSBarry Smith   Input Parameter:
6265c6c1daeSBarry Smith .  viewer - the PetscViewer; either ASCII or binary
6275c6c1daeSBarry Smith 
6285c6c1daeSBarry Smith   Output Parameter:
6295c6c1daeSBarry Smith .  name - the name of the file it is using
6305c6c1daeSBarry Smith 
6315c6c1daeSBarry Smith     Level: advanced
6325c6c1daeSBarry Smith 
6335c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName()
6345c6c1daeSBarry Smith 
6355c6c1daeSBarry Smith @*/
6365c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName(PetscViewer viewer,const char **name)
6375c6c1daeSBarry Smith {
6385c6c1daeSBarry Smith   PetscErrorCode ierr;
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith   PetscFunctionBegin;
6415c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6425c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr);
6435c6c1daeSBarry Smith   PetscFunctionReturn(0);
6445c6c1daeSBarry Smith }
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith EXTERN_C_BEGIN
6475c6c1daeSBarry Smith #undef __FUNCT__
6485c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII"
6495c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name)
6505c6c1daeSBarry Smith {
6515c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6525c6c1daeSBarry Smith 
6535c6c1daeSBarry Smith   PetscFunctionBegin;
6545c6c1daeSBarry Smith   *name = vascii->filename;
6555c6c1daeSBarry Smith   PetscFunctionReturn(0);
6565c6c1daeSBarry Smith }
6575c6c1daeSBarry Smith EXTERN_C_END
6585c6c1daeSBarry Smith 
6595c6c1daeSBarry Smith 
6605c6c1daeSBarry Smith EXTERN_C_BEGIN
6615c6c1daeSBarry Smith #undef __FUNCT__
6625c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII"
6635c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[])
6645c6c1daeSBarry Smith {
6655c6c1daeSBarry Smith   PetscErrorCode    ierr;
6665c6c1daeSBarry Smith   size_t            len;
6675c6c1daeSBarry Smith   char              fname[PETSC_MAX_PATH_LEN],*gz;
6685c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6695c6c1daeSBarry Smith   PetscBool         isstderr,isstdout;
6705c6c1daeSBarry Smith   PetscMPIInt       rank;
6715c6c1daeSBarry Smith 
6725c6c1daeSBarry Smith   PetscFunctionBegin;
6735c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
6745c6c1daeSBarry Smith   if (!name) PetscFunctionReturn(0);
6755c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr);
6765c6c1daeSBarry Smith 
6775c6c1daeSBarry Smith   /* Is this file to be compressed */
6785c6c1daeSBarry Smith   vascii->storecompressed = PETSC_FALSE;
679a297a907SKarl Rupp 
6805c6c1daeSBarry Smith   ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr);
6815c6c1daeSBarry Smith   if (gz) {
6825c6c1daeSBarry Smith     ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
6835c6c1daeSBarry Smith     if (len == 3) {
6845c6c1daeSBarry Smith       *gz = 0;
6855c6c1daeSBarry Smith       vascii->storecompressed = PETSC_TRUE;
6865c6c1daeSBarry Smith     }
6875c6c1daeSBarry Smith   }
688*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
6895c6c1daeSBarry Smith   if (!rank) {
6905c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr);
6915c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr);
6925c6c1daeSBarry Smith     /* empty filename means stdout */
6935c6c1daeSBarry Smith     if (name[0] == 0)  isstdout = PETSC_TRUE;
6945c6c1daeSBarry Smith     if (isstderr)      vascii->fd = PETSC_STDERR;
6955c6c1daeSBarry Smith     else if (isstdout) vascii->fd = PETSC_STDOUT;
6965c6c1daeSBarry Smith     else {
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith 
6995c6c1daeSBarry Smith       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
7005c6c1daeSBarry Smith       switch (vascii->mode) {
7015c6c1daeSBarry Smith       case FILE_MODE_READ:
7025c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r");
7035c6c1daeSBarry Smith         break;
7045c6c1daeSBarry Smith       case FILE_MODE_WRITE:
7055c6c1daeSBarry Smith         vascii->fd = fopen(fname,"w");
7065c6c1daeSBarry Smith         break;
7075c6c1daeSBarry Smith       case FILE_MODE_APPEND:
7085c6c1daeSBarry Smith         vascii->fd = fopen(fname,"a");
7095c6c1daeSBarry Smith         break;
7105c6c1daeSBarry Smith       case FILE_MODE_UPDATE:
7115c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
712a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
7135c6c1daeSBarry Smith         break;
7145c6c1daeSBarry Smith       case FILE_MODE_APPEND_UPDATE:
7155c6c1daeSBarry Smith         /* I really want a file which is opened at the end for updating,
7165c6c1daeSBarry Smith            not a+, which opens at the beginning, but makes writes at the end.
7175c6c1daeSBarry Smith         */
7185c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
719a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
720a297a907SKarl Rupp         else {
7215c6c1daeSBarry Smith           ierr     = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr);
7225c6c1daeSBarry Smith         }
7235c6c1daeSBarry Smith         break;
7245c6c1daeSBarry Smith       default:
7255c6c1daeSBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode);
7265c6c1daeSBarry Smith       }
7275c6c1daeSBarry Smith       if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname);
7285c6c1daeSBarry Smith     }
7295c6c1daeSBarry Smith   }
7305c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
7315c6c1daeSBarry Smith   PetscLogObjectState((PetscObject)viewer,"File: %s",name);
7325c6c1daeSBarry Smith #endif
7335c6c1daeSBarry Smith   PetscFunctionReturn(0);
7345c6c1daeSBarry Smith }
7355c6c1daeSBarry Smith EXTERN_C_END
7365c6c1daeSBarry Smith 
7375c6c1daeSBarry Smith #undef __FUNCT__
7385c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_ASCII"
7395c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer)
7405c6c1daeSBarry Smith {
7415c6c1daeSBarry Smith   PetscMPIInt       rank;
7425c6c1daeSBarry Smith   PetscErrorCode    ierr;
7435c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7445c6c1daeSBarry Smith   const char        *name;
7455c6c1daeSBarry Smith 
7465c6c1daeSBarry Smith   PetscFunctionBegin;
7475c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton already obtained from PetscViewer and not restored");
7485c6c1daeSBarry Smith   ierr         = PetscViewerCreate(PETSC_COMM_SELF,outviewer);CHKERRQ(ierr);
7495c6c1daeSBarry Smith   ierr         = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr);
7505c6c1daeSBarry Smith   ovascii      = (PetscViewer_ASCII*)(*outviewer)->data;
7515c6c1daeSBarry Smith   ovascii->fd  = vascii->fd;
7525c6c1daeSBarry Smith   ovascii->tab = vascii->tab;
7535c6c1daeSBarry Smith 
7545c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
7555c6c1daeSBarry Smith 
7565c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
7575c6c1daeSBarry Smith   (*outviewer)->iformat = viewer->iformat;
7585c6c1daeSBarry Smith 
7595c6c1daeSBarry Smith   ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr);
7605c6c1daeSBarry Smith   ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr);
7615c6c1daeSBarry Smith 
762*ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
7635c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
7645c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Singleton;
765a297a907SKarl Rupp   if (rank) (*outviewer)->ops->flush = 0;
766a297a907SKarl Rupp   else      (*outviewer)->ops->flush = PetscViewerFlush_ASCII_Singleton_0;
7675c6c1daeSBarry Smith   PetscFunctionReturn(0);
7685c6c1daeSBarry Smith }
7695c6c1daeSBarry Smith 
7705c6c1daeSBarry Smith #undef __FUNCT__
7715c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_ASCII"
7725c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer)
7735c6c1daeSBarry Smith {
7745c6c1daeSBarry Smith   PetscErrorCode    ierr;
7755c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)(*outviewer)->data;
7765c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
7775c6c1daeSBarry Smith 
7785c6c1daeSBarry Smith   PetscFunctionBegin;
7795c6c1daeSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton never obtained from PetscViewer");
7805c6c1daeSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate singleton");
7815c6c1daeSBarry Smith 
7825c6c1daeSBarry Smith   ascii->sviewer             = 0;
7835c6c1daeSBarry Smith   vascii->fd                 = PETSC_STDOUT;
7845c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
7855c6c1daeSBarry Smith   ierr                       = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
7865c6c1daeSBarry Smith   ierr                       = PetscViewerFlush(viewer);CHKERRQ(ierr);
7875c6c1daeSBarry Smith   PetscFunctionReturn(0);
7885c6c1daeSBarry Smith }
7895c6c1daeSBarry Smith 
7905c6c1daeSBarry Smith #undef __FUNCT__
7915c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm_ASCII"
7925c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
7935c6c1daeSBarry Smith {
7945c6c1daeSBarry Smith   PetscErrorCode    ierr;
7955c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7965c6c1daeSBarry Smith   const char        *name;
7975c6c1daeSBarry Smith 
7985c6c1daeSBarry Smith   PetscFunctionBegin;
7995c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm viewer already obtained from PetscViewer and not restored");
8005c6c1daeSBarry Smith   /* Note that we need to open vascii->filename for the subcomm:
8015c6c1daeSBarry Smith      we can't count on reusing viewer's fd since the root in comm and subcomm may differ.
8025c6c1daeSBarry Smith      Further, if the subcomm happens to be the same as comm, PetscViewerASCIIOpen() will
8035c6c1daeSBarry Smith      will return the current viewer, having increfed it.
8045c6c1daeSBarry Smith    */
8055c6c1daeSBarry Smith   ierr = PetscViewerASCIIOpen(subcomm,vascii->filename, outviewer);CHKERRQ(ierr);
8065c6c1daeSBarry Smith   if (*outviewer == viewer) PetscFunctionReturn(0);
8075c6c1daeSBarry Smith   ovascii = (PetscViewer_ASCII*)(*outviewer)->data;
8085c6c1daeSBarry Smith 
8095c6c1daeSBarry Smith   ovascii->tab    = vascii->tab;
8105c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
8115c6c1daeSBarry Smith 
8125c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
8135c6c1daeSBarry Smith   (*outviewer)->iformat = viewer->iformat;
8145c6c1daeSBarry Smith 
8155c6c1daeSBarry Smith   ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr);
8165c6c1daeSBarry Smith   ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr);
8175c6c1daeSBarry Smith 
8185c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
819a297a907SKarl Rupp 
8205c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Subcomm;
8215c6c1daeSBarry Smith   PetscFunctionReturn(0);
8225c6c1daeSBarry Smith }
8235c6c1daeSBarry Smith 
8245c6c1daeSBarry Smith #undef __FUNCT__
8255c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm_ASCII"
8265c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
8275c6c1daeSBarry Smith {
8285c6c1daeSBarry Smith   PetscErrorCode    ierr;
8295c6c1daeSBarry Smith   PetscViewer_ASCII *oascii = (PetscViewer_ASCII*)(*outviewer)->data;
8305c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
8315c6c1daeSBarry Smith 
8325c6c1daeSBarry Smith   PetscFunctionBegin;
8335c6c1daeSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm never obtained from PetscViewer");
8345c6c1daeSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"The given PetscViewer did not generate this subcomm viewer");
8355c6c1daeSBarry Smith 
8365c6c1daeSBarry Smith   ascii->sviewer             = 0;
8375c6c1daeSBarry Smith   oascii->fd                 = PETSC_STDOUT;
8385c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
839a297a907SKarl Rupp 
8405c6c1daeSBarry Smith   ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
8415c6c1daeSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
8425c6c1daeSBarry Smith   PetscFunctionReturn(0);
8435c6c1daeSBarry Smith }
8445c6c1daeSBarry Smith 
8452bf49c77SBarry Smith #undef __FUNCT__
8462bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII"
8472bf49c77SBarry Smith PetscErrorCode  PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer)
8482bf49c77SBarry Smith {
8492bf49c77SBarry Smith   PetscErrorCode    ierr;
8502bf49c77SBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data;
8512bf49c77SBarry Smith 
8522bf49c77SBarry Smith   PetscFunctionBegin;
8532bf49c77SBarry Smith   if (ascii->filename) {
8542bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr);
8552bf49c77SBarry Smith   }
8562bf49c77SBarry Smith   PetscFunctionReturn(0);
8572bf49c77SBarry Smith }
8582bf49c77SBarry Smith 
8595c6c1daeSBarry Smith EXTERN_C_BEGIN
8605c6c1daeSBarry Smith #undef __FUNCT__
8615c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII"
8625c6c1daeSBarry Smith PetscErrorCode  PetscViewerCreate_ASCII(PetscViewer viewer)
8635c6c1daeSBarry Smith {
8645c6c1daeSBarry Smith   PetscViewer_ASCII *vascii;
8655c6c1daeSBarry Smith   PetscErrorCode    ierr;
8665c6c1daeSBarry Smith 
8675c6c1daeSBarry Smith   PetscFunctionBegin;
8685c6c1daeSBarry Smith   ierr         = PetscNewLog(viewer,PetscViewer_ASCII,&vascii);CHKERRQ(ierr);
8695c6c1daeSBarry Smith   viewer->data = (void*)vascii;
8705c6c1daeSBarry Smith 
8715c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_ASCII;
8725c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_ASCII;
8735c6c1daeSBarry Smith   viewer->ops->getsingleton     = PetscViewerGetSingleton_ASCII;
8745c6c1daeSBarry Smith   viewer->ops->restoresingleton = PetscViewerRestoreSingleton_ASCII;
8755c6c1daeSBarry Smith   viewer->ops->getsubcomm       = PetscViewerGetSubcomm_ASCII;
8765c6c1daeSBarry Smith   viewer->ops->restoresubcomm   = PetscViewerRestoreSubcomm_ASCII;
8772bf49c77SBarry Smith   viewer->ops->view             = PetscViewerView_ASCII;
8785c6c1daeSBarry Smith 
8795c6c1daeSBarry Smith   /* defaults to stdout unless set with PetscViewerFileSetName() */
8805c6c1daeSBarry Smith   vascii->fd        = PETSC_STDOUT;
8815c6c1daeSBarry Smith   vascii->mode      = FILE_MODE_WRITE;
8825c6c1daeSBarry Smith   vascii->bviewer   = 0;
8835c6c1daeSBarry Smith   vascii->sviewer   = 0;
8845c6c1daeSBarry Smith   viewer->format    = PETSC_VIEWER_DEFAULT;
8855c6c1daeSBarry Smith   viewer->iformat   = 0;
8865c6c1daeSBarry Smith   vascii->tab       = 0;
8875c6c1daeSBarry Smith   vascii->tab_store = 0;
8885c6c1daeSBarry Smith   vascii->filename  = 0;
8895c6c1daeSBarry Smith   vascii->closefile = PETSC_TRUE;
8905c6c1daeSBarry Smith 
8915c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileSetName_C","PetscViewerFileSetName_ASCII",
8925c6c1daeSBarry Smith                                            PetscViewerFileSetName_ASCII);CHKERRQ(ierr);
8935c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileGetName_C","PetscViewerFileGetName_ASCII",
8945c6c1daeSBarry Smith                                            PetscViewerFileGetName_ASCII);CHKERRQ(ierr);
8955c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileGetMode_C","PetscViewerFileGetMode_ASCII",
8965c6c1daeSBarry Smith                                            PetscViewerFileGetMode_ASCII);CHKERRQ(ierr);
8975c6c1daeSBarry Smith   ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileSetMode_C","PetscViewerFileSetMode_ASCII",
8985c6c1daeSBarry Smith                                            PetscViewerFileSetMode_ASCII);CHKERRQ(ierr);
8995c6c1daeSBarry Smith   PetscFunctionReturn(0);
9005c6c1daeSBarry Smith }
9015c6c1daeSBarry Smith EXTERN_C_END
9025c6c1daeSBarry Smith 
9035c6c1daeSBarry Smith 
9045c6c1daeSBarry Smith #undef __FUNCT__
9055c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedPrintf"
9065c6c1daeSBarry Smith /*@C
9075c6c1daeSBarry Smith     PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from
9085c6c1daeSBarry Smith     several processors.  Output of the first processor is followed by that of the
9095c6c1daeSBarry Smith     second, etc.
9105c6c1daeSBarry Smith 
9115c6c1daeSBarry Smith     Not Collective, must call collective PetscViewerFlush() to get the results out
9125c6c1daeSBarry Smith 
9135c6c1daeSBarry Smith     Input Parameters:
9145c6c1daeSBarry Smith +   viewer - the ASCII PetscViewer
9155c6c1daeSBarry Smith -   format - the usual printf() format string
9165c6c1daeSBarry Smith 
9175c6c1daeSBarry Smith     Level: intermediate
9185c6c1daeSBarry Smith 
9195c6c1daeSBarry Smith     Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called.
9205c6c1daeSBarry Smith 
9215c6c1daeSBarry Smith     Fortran Note:
9225c6c1daeSBarry Smith       Can only print a single character* string
9235c6c1daeSBarry Smith 
9245c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(),
9255c6c1daeSBarry Smith           PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(),
9265c6c1daeSBarry Smith           PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedAllow()
9275c6c1daeSBarry Smith 
9285c6c1daeSBarry Smith @*/
9295c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...)
9305c6c1daeSBarry Smith {
9315c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
9325c6c1daeSBarry Smith   PetscErrorCode    ierr;
9335c6c1daeSBarry Smith   PetscMPIInt       rank,size;
9345c6c1daeSBarry Smith   PetscInt          tab = vascii->tab;
9355c6c1daeSBarry Smith   MPI_Comm          comm;
9365c6c1daeSBarry Smith   FILE              *fp;
9375c6c1daeSBarry Smith   PetscBool         iascii;
9385c6c1daeSBarry Smith   int               err;
9395c6c1daeSBarry Smith 
9405c6c1daeSBarry Smith   PetscFunctionBegin;
9415c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
9425c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
9435c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9445c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
945*ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr);
9465c6c1daeSBarry Smith   if (size > 1 && !vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIISynchronizedAllow() to allow this call");
9475c6c1daeSBarry Smith   if (!viewer->ops->flush) PetscFunctionReturn(0); /* This viewer obtained via PetscViewerGetSubcomm_ASCII(), should not participate. */
9485c6c1daeSBarry Smith 
949*ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
9505c6c1daeSBarry Smith   fp   = vascii->fd;
9515c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
9525c6c1daeSBarry Smith 
9535c6c1daeSBarry Smith   /* First processor prints immediately to fp */
9545c6c1daeSBarry Smith   if (!rank) {
9555c6c1daeSBarry Smith     va_list Argp;
9565c6c1daeSBarry Smith 
957a297a907SKarl Rupp     while (tab--) {
958a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fp,"  ");CHKERRQ(ierr);
959a297a907SKarl Rupp     }
9605c6c1daeSBarry Smith 
9615c6c1daeSBarry Smith     va_start(Argp,format);
9625c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr);
9635c6c1daeSBarry Smith     err  = fflush(fp);
9645c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9655c6c1daeSBarry Smith     petsc_printfqueuefile = fp;
9665c6c1daeSBarry Smith     if (petsc_history) {
9675c6c1daeSBarry Smith       va_start(Argp,format);
9685c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
9695c6c1daeSBarry Smith       err  = fflush(petsc_history);
9705c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9715c6c1daeSBarry Smith     }
9725c6c1daeSBarry Smith     va_end(Argp);
9735c6c1daeSBarry Smith   } else { /* other processors add to local queue */
9745c6c1daeSBarry Smith     char        *string;
9755c6c1daeSBarry Smith     va_list     Argp;
9765c6c1daeSBarry Smith     size_t      fullLength;
9775c6c1daeSBarry Smith     PrintfQueue next;
9785c6c1daeSBarry Smith 
9795c6c1daeSBarry Smith     ierr = PetscNew(struct _PrintfQueue,&next);CHKERRQ(ierr);
980a297a907SKarl Rupp     if (petsc_printfqueue) {
981a297a907SKarl Rupp       petsc_printfqueue->next = next;
982a297a907SKarl Rupp       petsc_printfqueue       = next;
983a297a907SKarl Rupp     } else {
984a297a907SKarl Rupp       petsc_printfqueuebase = petsc_printfqueue = next;
985a297a907SKarl Rupp     }
9865c6c1daeSBarry Smith     petsc_printfqueuelength++;
9875c6c1daeSBarry Smith     next->size = QUEUESTRINGSIZE;
9885c6c1daeSBarry Smith     ierr       = PetscMalloc(next->size*sizeof(char), &next->string);CHKERRQ(ierr);
9895c6c1daeSBarry Smith     ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
9905c6c1daeSBarry Smith     string     = next->string;
9915c6c1daeSBarry Smith     tab       *= 2;
992a297a907SKarl Rupp     while (tab--) {
993a297a907SKarl Rupp       *string++ = ' ';
994a297a907SKarl Rupp     }
9955c6c1daeSBarry Smith     va_start(Argp,format);
99622d28d08SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
9975c6c1daeSBarry Smith     va_end(Argp);
9985c6c1daeSBarry Smith   }
9995c6c1daeSBarry Smith   PetscFunctionReturn(0);
10005c6c1daeSBarry Smith }
10015c6c1daeSBarry Smith 
10025c6c1daeSBarry Smith 
1003