xref: /petsc/src/sys/classes/viewer/impls/ascii/filev.c (revision e5840a18bfed1d921346b699e44234a97291c09d)
15c6c1daeSBarry Smith 
2665c2dedSJed Brown #include <../src/sys/classes/viewer/impls/ascii/asciiimpl.h>  /*I "petscviewer.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;
16ce94432eSBarry 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 
60ce94432eSBarry 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*e5840a18SBarry Smith       if (vlink->next) {
64ce94432eSBarry Smith         ierr = MPI_Attr_put(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr);
65*e5840a18SBarry Smith       } else {
66*e5840a18SBarry Smith         ierr = MPI_Attr_delete(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval);CHKERRQ(ierr);
67*e5840a18SBarry Smith       }
685c6c1daeSBarry Smith       ierr = PetscFree(vlink);CHKERRQ(ierr);
695c6c1daeSBarry Smith     } else {
705c6c1daeSBarry Smith       while (vlink && vlink->next) {
715c6c1daeSBarry Smith         if (vlink->next->viewer == viewer) {
725c6c1daeSBarry Smith           PetscViewerLink *nv = vlink->next;
735c6c1daeSBarry Smith           vlink->next = vlink->next->next;
745c6c1daeSBarry Smith           ierr = PetscFree(nv);CHKERRQ(ierr);
755c6c1daeSBarry Smith         }
765c6c1daeSBarry Smith         vlink = vlink->next;
775c6c1daeSBarry Smith       }
785c6c1daeSBarry Smith     }
795c6c1daeSBarry Smith   }
805c6c1daeSBarry Smith   PetscFunctionReturn(0);
815c6c1daeSBarry Smith }
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith #undef __FUNCT__
845c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Singleton"
855c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Singleton(PetscViewer viewer)
865c6c1daeSBarry Smith {
875c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
885c6c1daeSBarry Smith   PetscErrorCode    ierr;
895fd66863SKarl Rupp 
905c6c1daeSBarry Smith   PetscFunctionBegin;
915c6c1daeSBarry Smith   ierr = PetscViewerRestoreSingleton(vascii->bviewer,&viewer);CHKERRQ(ierr);
92dd2fa690SBarry Smith   vascii->bviewer = NULL;
935c6c1daeSBarry Smith   PetscFunctionReturn(0);
945c6c1daeSBarry Smith }
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith #undef __FUNCT__
975c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Subcomm"
985c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Subcomm(PetscViewer viewer)
995c6c1daeSBarry Smith {
1005c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1015c6c1daeSBarry Smith   PetscErrorCode    ierr;
1025fd66863SKarl Rupp 
1035c6c1daeSBarry Smith   PetscFunctionBegin;
104dd2fa690SBarry Smith   ierr = PetscViewerRestoreSubcomm(vascii->subviewer,PetscObjectComm((PetscObject)viewer),&viewer);CHKERRQ(ierr);
105dd2fa690SBarry Smith   vascii->subviewer = NULL;
1065c6c1daeSBarry Smith   PetscFunctionReturn(0);
1075c6c1daeSBarry Smith }
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith #undef __FUNCT__
1105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII_Singleton_0"
1115c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII_Singleton_0(PetscViewer viewer)
1125c6c1daeSBarry Smith {
1135c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1145c6c1daeSBarry Smith   int               err;
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith   PetscFunctionBegin;
1175c6c1daeSBarry Smith   err = fflush(vascii->fd);
1185c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
1195c6c1daeSBarry Smith   PetscFunctionReturn(0);
1205c6c1daeSBarry Smith }
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith #undef __FUNCT__
1235c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII"
1245c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer)
1255c6c1daeSBarry Smith {
1265c6c1daeSBarry Smith   PetscMPIInt       rank;
1275c6c1daeSBarry Smith   PetscErrorCode    ierr;
1285c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1295c6c1daeSBarry Smith   int               err;
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith   PetscFunctionBegin;
132ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
1335c6c1daeSBarry Smith   /* fflush() fails on OSX for read-only descriptors */
1345c6c1daeSBarry Smith   if (!rank && (vascii->mode != FILE_MODE_READ)) {
1355c6c1daeSBarry Smith     err = fflush(vascii->fd);
1365c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed");
1375c6c1daeSBarry Smith   }
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith   if (vascii->allowsynchronized) {
1405c6c1daeSBarry Smith     /* Also flush anything printed with PetscViewerASCIISynchronizedPrintf()  */
1410ec8b6e3SBarry Smith     ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)viewer),vascii->fd);CHKERRQ(ierr);
1425c6c1daeSBarry Smith   }
1435c6c1daeSBarry Smith   PetscFunctionReturn(0);
1445c6c1daeSBarry Smith }
1455c6c1daeSBarry Smith 
1465c6c1daeSBarry Smith #undef __FUNCT__
1475c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer"
1485c6c1daeSBarry Smith /*@C
1495c6c1daeSBarry Smith     PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer.
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith     Not Collective
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerASCIIOpen()
1545c6c1daeSBarry Smith -   fd - file pointer
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith     Level: intermediate
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith     Fortran Note:
1595c6c1daeSBarry Smith     This routine is not supported in Fortran.
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith   Concepts: PetscViewer^file pointer
1625c6c1daeSBarry Smith   Concepts: file pointer^getting from PetscViewer
1635c6c1daeSBarry Smith 
1645c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(),
1655c6c1daeSBarry Smith           PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush()
1665c6c1daeSBarry Smith @*/
1675c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd)
1685c6c1daeSBarry Smith {
1695c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   PetscFunctionBegin;
1725c6c1daeSBarry Smith   *fd = vascii->fd;
1735c6c1daeSBarry Smith   PetscFunctionReturn(0);
1745c6c1daeSBarry Smith }
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith #undef __FUNCT__
1775c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetMode_ASCII"
1785c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode)
1795c6c1daeSBarry Smith {
1805c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   PetscFunctionBegin;
1835c6c1daeSBarry Smith   *mode = vascii->mode;
1845c6c1daeSBarry Smith   PetscFunctionReturn(0);
1855c6c1daeSBarry Smith }
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith #undef __FUNCT__
1885c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII"
1895c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode)
1905c6c1daeSBarry Smith {
1915c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith   PetscFunctionBegin;
1945c6c1daeSBarry Smith   vascii->mode = mode;
1955c6c1daeSBarry Smith   PetscFunctionReturn(0);
1965c6c1daeSBarry Smith }
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith /*
1995c6c1daeSBarry Smith    If petsc_history is on, then all Petsc*Printf() results are saved
2005c6c1daeSBarry Smith    if the appropriate (usually .petschistory) file.
2015c6c1daeSBarry Smith */
2025c6c1daeSBarry Smith extern FILE *petsc_history;
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith #undef __FUNCT__
2055c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab"
2065c6c1daeSBarry Smith /*@
2075c6c1daeSBarry Smith     PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith     Input Parameters:
2125c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2135c6c1daeSBarry Smith -    tabs - number of tabs
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith     Level: developer
2165c6c1daeSBarry Smith 
2175c6c1daeSBarry Smith     Fortran Note:
2185c6c1daeSBarry Smith     This routine is not supported in Fortran.
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2215c6c1daeSBarry Smith   Concepts: tab^setting
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(),
2245c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2255c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2265c6c1daeSBarry Smith @*/
2275c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs)
2285c6c1daeSBarry Smith {
2295c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2305c6c1daeSBarry Smith   PetscBool         iascii;
2315c6c1daeSBarry Smith   PetscErrorCode    ierr;
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith   PetscFunctionBegin;
2345c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2355c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
236a297a907SKarl Rupp   if (iascii) ascii->tab = tabs;
2375c6c1daeSBarry Smith   PetscFunctionReturn(0);
2385c6c1daeSBarry Smith }
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith #undef __FUNCT__
2415c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab"
2425c6c1daeSBarry Smith /*@
2435c6c1daeSBarry Smith     PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer.
2445c6c1daeSBarry Smith 
2455c6c1daeSBarry Smith     Not Collective, meaningful on first processor only.
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith     Input Parameters:
2485c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
2495c6c1daeSBarry Smith     Output Parameters:
2505c6c1daeSBarry Smith .    tabs - number of tabs
2515c6c1daeSBarry Smith 
2525c6c1daeSBarry Smith     Level: developer
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith     Fortran Note:
2555c6c1daeSBarry Smith     This routine is not supported in Fortran.
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2585c6c1daeSBarry Smith   Concepts: tab^retrieval
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(),
2615c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2625c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2635c6c1daeSBarry Smith @*/
2645c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs)
2655c6c1daeSBarry Smith {
2665c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2675c6c1daeSBarry Smith   PetscBool         iascii;
2685c6c1daeSBarry Smith   PetscErrorCode    ierr;
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith   PetscFunctionBegin;
2715c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2725c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
273a297a907SKarl Rupp   if (iascii && tabs) *tabs = ascii->tab;
2745c6c1daeSBarry Smith   PetscFunctionReturn(0);
2755c6c1daeSBarry Smith }
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith #undef __FUNCT__
2785c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab"
2795c6c1daeSBarry Smith /*@
2805c6c1daeSBarry Smith     PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith     Input Parameters:
2855c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2865c6c1daeSBarry Smith -    tabs - number of tabs
2875c6c1daeSBarry Smith 
2885c6c1daeSBarry Smith     Level: developer
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith     Fortran Note:
2915c6c1daeSBarry Smith     This routine is not supported in Fortran.
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2945c6c1daeSBarry Smith   Concepts: tab^setting
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
2975c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2985c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2995c6c1daeSBarry Smith @*/
3005c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs)
3015c6c1daeSBarry Smith {
3025c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3035c6c1daeSBarry Smith   PetscBool         iascii;
3045c6c1daeSBarry Smith   PetscErrorCode    ierr;
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith   PetscFunctionBegin;
3075c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3085c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
309a297a907SKarl Rupp   if (iascii) ascii->tab += tabs;
3105c6c1daeSBarry Smith   PetscFunctionReturn(0);
3115c6c1daeSBarry Smith }
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith #undef __FUNCT__
3145c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab"
3155c6c1daeSBarry Smith /*@
3165c6c1daeSBarry Smith     PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing
3175c6c1daeSBarry Smith 
3185c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3195c6c1daeSBarry Smith 
3205c6c1daeSBarry Smith     Input Parameters:
3215c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3225c6c1daeSBarry Smith -    tabs - number of tabs
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith     Level: developer
3255c6c1daeSBarry Smith 
3265c6c1daeSBarry Smith     Fortran Note:
3275c6c1daeSBarry Smith     This routine is not supported in Fortran.
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3305c6c1daeSBarry Smith   Concepts: tab^setting
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3335c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3345c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3355c6c1daeSBarry Smith @*/
3365c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs)
3375c6c1daeSBarry Smith {
3385c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3395c6c1daeSBarry Smith   PetscBool         iascii;
3405c6c1daeSBarry Smith   PetscErrorCode    ierr;
3415c6c1daeSBarry Smith 
3425c6c1daeSBarry Smith   PetscFunctionBegin;
3435c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3445c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
345a297a907SKarl Rupp   if (iascii) ascii->tab -= tabs;
3465c6c1daeSBarry Smith   PetscFunctionReturn(0);
3475c6c1daeSBarry Smith }
3485c6c1daeSBarry Smith 
3495c6c1daeSBarry Smith #undef __FUNCT__
3505c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow"
3515c6c1daeSBarry Smith /*@C
3525c6c1daeSBarry Smith     PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer
3535c6c1daeSBarry Smith 
3545c6c1daeSBarry Smith     Collective on PetscViewer
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith     Input Parameters:
3575c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3585c6c1daeSBarry Smith -    allow - PETSC_TRUE to allow the synchronized printing
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith     Level: intermediate
3615c6c1daeSBarry Smith 
3625c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3635c6c1daeSBarry Smith   Concepts: tab^setting
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3665c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3675c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
3685c6c1daeSBarry Smith @*/
3695c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow)
3705c6c1daeSBarry Smith {
3715c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3725c6c1daeSBarry Smith   PetscBool         iascii;
3735c6c1daeSBarry Smith   PetscErrorCode    ierr;
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith   PetscFunctionBegin;
3765c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3775c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
378a297a907SKarl Rupp   if (iascii) ascii->allowsynchronized = allow;
3795c6c1daeSBarry Smith   PetscFunctionReturn(0);
3805c6c1daeSBarry Smith }
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith #undef __FUNCT__
3835c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab"
3845c6c1daeSBarry Smith /*@
3855c6c1daeSBarry Smith     PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf()
3865c6c1daeSBarry Smith      lines are tabbed.
3875c6c1daeSBarry Smith 
3885c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3895c6c1daeSBarry Smith 
3905c6c1daeSBarry Smith     Input Parameters:
3915c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
3925c6c1daeSBarry Smith 
3935c6c1daeSBarry Smith     Level: developer
3945c6c1daeSBarry Smith 
3955c6c1daeSBarry Smith     Fortran Note:
3965c6c1daeSBarry Smith     This routine is not supported in Fortran.
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3995c6c1daeSBarry Smith   Concepts: tab^setting
4005c6c1daeSBarry Smith 
4015c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4025c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4035c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4045c6c1daeSBarry Smith @*/
4055c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPushTab(PetscViewer viewer)
4065c6c1daeSBarry Smith {
4075c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4085c6c1daeSBarry Smith   PetscBool         iascii;
4095c6c1daeSBarry Smith   PetscErrorCode    ierr;
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith   PetscFunctionBegin;
4125c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4135c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
414a297a907SKarl Rupp   if (iascii) ascii->tab++;
4155c6c1daeSBarry Smith   PetscFunctionReturn(0);
4165c6c1daeSBarry Smith }
4175c6c1daeSBarry Smith 
4185c6c1daeSBarry Smith #undef __FUNCT__
4195c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab"
4205c6c1daeSBarry Smith /*@
4215c6c1daeSBarry Smith     PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf()
4225c6c1daeSBarry Smith      lines are tabbed.
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4255c6c1daeSBarry Smith 
4265c6c1daeSBarry Smith     Input Parameters:
4275c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith     Level: developer
4305c6c1daeSBarry Smith 
4315c6c1daeSBarry Smith     Fortran Note:
4325c6c1daeSBarry Smith     This routine is not supported in Fortran.
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4355c6c1daeSBarry Smith   Concepts: tab^setting
4365c6c1daeSBarry Smith 
4375c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4385c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4395c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4405c6c1daeSBarry Smith @*/
4415c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPopTab(PetscViewer viewer)
4425c6c1daeSBarry Smith {
4435c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4445c6c1daeSBarry Smith   PetscErrorCode    ierr;
4455c6c1daeSBarry Smith   PetscBool         iascii;
4465c6c1daeSBarry Smith 
4475c6c1daeSBarry Smith   PetscFunctionBegin;
4485c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4495c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4505c6c1daeSBarry Smith   if (iascii) {
4515c6c1daeSBarry Smith     if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed");
4525c6c1daeSBarry Smith     ascii->tab--;
4535c6c1daeSBarry Smith   }
4545c6c1daeSBarry Smith   PetscFunctionReturn(0);
4555c6c1daeSBarry Smith }
4565c6c1daeSBarry Smith 
4575c6c1daeSBarry Smith #undef __FUNCT__
4585c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs"
4595c6c1daeSBarry Smith /*@
4605c6c1daeSBarry Smith     PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer
4615c6c1daeSBarry Smith 
4625c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith     Input Parameters:
4655c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
4665c6c1daeSBarry Smith -    flg - PETSC_TRUE or PETSC_FALSE
4675c6c1daeSBarry Smith 
4685c6c1daeSBarry Smith     Level: developer
4695c6c1daeSBarry Smith 
4705c6c1daeSBarry Smith     Fortran Note:
4715c6c1daeSBarry Smith     This routine is not supported in Fortran.
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4745c6c1daeSBarry Smith   Concepts: tab^setting
4755c6c1daeSBarry Smith 
4765c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4775c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(),
4785c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4795c6c1daeSBarry Smith @*/
4805c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg)
4815c6c1daeSBarry Smith {
4825c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4835c6c1daeSBarry Smith   PetscBool         iascii;
4845c6c1daeSBarry Smith   PetscErrorCode    ierr;
4855c6c1daeSBarry Smith 
4865c6c1daeSBarry Smith   PetscFunctionBegin;
4875c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4885c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4895c6c1daeSBarry Smith   if (iascii) {
490a297a907SKarl Rupp     if (flg) ascii->tab = ascii->tab_store;
491a297a907SKarl Rupp     else {
4925c6c1daeSBarry Smith       ascii->tab_store = ascii->tab;
4935c6c1daeSBarry Smith       ascii->tab       = 0;
4945c6c1daeSBarry Smith     }
4955c6c1daeSBarry Smith   }
4965c6c1daeSBarry Smith   PetscFunctionReturn(0);
4975c6c1daeSBarry Smith }
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith #include <../src/sys/fileio/mprint.h> /* defines the queue datastructures and variables */
5025c6c1daeSBarry Smith 
5035c6c1daeSBarry Smith #undef __FUNCT__
5045c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf"
5055c6c1daeSBarry Smith /*@C
5065c6c1daeSBarry Smith     PetscViewerASCIIPrintf - Prints to a file, only from the first
5075c6c1daeSBarry Smith     processor in the PetscViewer
5085c6c1daeSBarry Smith 
5095c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith     Input Parameters:
5125c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
5135c6c1daeSBarry Smith -    format - the usual printf() format string
5145c6c1daeSBarry Smith 
5155c6c1daeSBarry Smith     Level: developer
5165c6c1daeSBarry Smith 
5175c6c1daeSBarry Smith     Fortran Note:
5185c6c1daeSBarry Smith     The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran.
5195c6c1daeSBarry Smith     That is, you can only pass a single character string from Fortran.
5205c6c1daeSBarry Smith 
5215c6c1daeSBarry Smith   Concepts: PetscViewerASCII^printing
5225c6c1daeSBarry Smith   Concepts: printing^to file
5235c6c1daeSBarry Smith   Concepts: printf
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(),
5265c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(),
5275c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow()
5285c6c1daeSBarry Smith @*/
5295c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...)
5305c6c1daeSBarry Smith {
5315c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5325c6c1daeSBarry Smith   PetscMPIInt       rank;
533dd2fa690SBarry Smith   PetscInt          tab,intab = ascii->tab;
5345c6c1daeSBarry Smith   PetscErrorCode    ierr;
5355c6c1daeSBarry Smith   FILE              *fd = ascii->fd;
536dd2fa690SBarry Smith   PetscBool         iascii,issingleton = PETSC_FALSE;
5375c6c1daeSBarry Smith   int               err;
5385c6c1daeSBarry Smith 
5395c6c1daeSBarry Smith   PetscFunctionBegin;
5405c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5415c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
5425c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5435c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
544dd2fa690SBarry Smith   if (ascii->bviewer) {
545dd2fa690SBarry Smith     viewer      = ascii->bviewer;
546dd2fa690SBarry Smith     ascii       = (PetscViewer_ASCII*)viewer->data;
547dd2fa690SBarry Smith     fd          = ascii->fd;
548dd2fa690SBarry Smith     issingleton = PETSC_TRUE;
549dd2fa690SBarry Smith   }
5505c6c1daeSBarry Smith 
551ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
5525c6c1daeSBarry Smith   if (!rank) {
5535c6c1daeSBarry Smith     va_list Argp;
554dd2fa690SBarry Smith     tab = intab;
555a297a907SKarl Rupp     while (tab--) {
556a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
557a297a907SKarl Rupp     }
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith     va_start(Argp,format);
5605c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
5615c6c1daeSBarry Smith     err  = fflush(fd);
5625c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5635c6c1daeSBarry Smith     if (petsc_history) {
5645c6c1daeSBarry Smith       va_start(Argp,format);
565dd2fa690SBarry Smith       tab = intab;
566a297a907SKarl Rupp       while (tab--) {
567706d7a88SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history,"  ");CHKERRQ(ierr);
568a297a907SKarl Rupp       }
5695c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
5705c6c1daeSBarry Smith       err  = fflush(petsc_history);
5715c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5725c6c1daeSBarry Smith     }
5735c6c1daeSBarry Smith     va_end(Argp);
574dd2fa690SBarry Smith   } else if (issingleton) {
575dd2fa690SBarry Smith     char        *string;
576dd2fa690SBarry Smith     va_list     Argp;
577dd2fa690SBarry Smith     size_t      fullLength;
578dd2fa690SBarry Smith     PrintfQueue next;
579dd2fa690SBarry Smith 
5801cfcd2c5SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
581dd2fa690SBarry Smith     if (petsc_printfqueue) {
582dd2fa690SBarry Smith       petsc_printfqueue->next = next;
583dd2fa690SBarry Smith       petsc_printfqueue       = next;
584dd2fa690SBarry Smith     } else {
585dd2fa690SBarry Smith       petsc_printfqueuebase = petsc_printfqueue = next;
586dd2fa690SBarry Smith     }
587dd2fa690SBarry Smith     petsc_printfqueuelength++;
588dd2fa690SBarry Smith     next->size = QUEUESTRINGSIZE;
589854ce69bSBarry Smith     ierr       = PetscCalloc1(next->size, &next->string);CHKERRQ(ierr);
590dd2fa690SBarry Smith     string     = next->string;
591dd2fa690SBarry Smith     tab        = intab;
592dd2fa690SBarry Smith     tab       *= 2;
593dd2fa690SBarry Smith     while (tab--) {
594dd2fa690SBarry Smith       *string++ = ' ';
595dd2fa690SBarry Smith     }
596dd2fa690SBarry Smith     va_start(Argp,format);
597dd2fa690SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*ascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
598dd2fa690SBarry Smith     va_end(Argp);
5995c6c1daeSBarry Smith   }
6005c6c1daeSBarry Smith   PetscFunctionReturn(0);
6015c6c1daeSBarry Smith }
6025c6c1daeSBarry Smith 
6035c6c1daeSBarry Smith #undef __FUNCT__
6045c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName"
6055c6c1daeSBarry Smith /*@C
6065c6c1daeSBarry Smith      PetscViewerFileSetName - Sets the name of the file the PetscViewer uses.
6075c6c1daeSBarry Smith 
6085c6c1daeSBarry Smith     Collective on PetscViewer
6095c6c1daeSBarry Smith 
6105c6c1daeSBarry Smith   Input Parameters:
6115c6c1daeSBarry Smith +  viewer - the PetscViewer; either ASCII or binary
6125c6c1daeSBarry Smith -  name - the name of the file it should use
6135c6c1daeSBarry Smith 
6145c6c1daeSBarry Smith     Level: advanced
6155c6c1daeSBarry Smith 
6165c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(),
6175c6c1daeSBarry Smith           PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
6185c6c1daeSBarry Smith 
6195c6c1daeSBarry Smith @*/
6205c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName(PetscViewer viewer,const char name[])
6215c6c1daeSBarry Smith {
6225c6c1daeSBarry Smith   PetscErrorCode ierr;
6235c6c1daeSBarry Smith 
6245c6c1daeSBarry Smith   PetscFunctionBegin;
6255c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6265c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
6275c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr);
6285c6c1daeSBarry Smith   PetscFunctionReturn(0);
6295c6c1daeSBarry Smith }
6305c6c1daeSBarry Smith 
6315c6c1daeSBarry Smith #undef __FUNCT__
6325c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName"
6335c6c1daeSBarry Smith /*@C
6345c6c1daeSBarry Smith      PetscViewerFileGetName - Gets the name of the file the PetscViewer uses.
6355c6c1daeSBarry Smith 
6365c6c1daeSBarry Smith     Not Collective
6375c6c1daeSBarry Smith 
6385c6c1daeSBarry Smith   Input Parameter:
6395c6c1daeSBarry Smith .  viewer - the PetscViewer; either ASCII or binary
6405c6c1daeSBarry Smith 
6415c6c1daeSBarry Smith   Output Parameter:
6425c6c1daeSBarry Smith .  name - the name of the file it is using
6435c6c1daeSBarry Smith 
6445c6c1daeSBarry Smith     Level: advanced
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName()
6475c6c1daeSBarry Smith 
6485c6c1daeSBarry Smith @*/
6495c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName(PetscViewer viewer,const char **name)
6505c6c1daeSBarry Smith {
6515c6c1daeSBarry Smith   PetscErrorCode ierr;
6525c6c1daeSBarry Smith 
6535c6c1daeSBarry Smith   PetscFunctionBegin;
6545c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6555c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr);
6565c6c1daeSBarry Smith   PetscFunctionReturn(0);
6575c6c1daeSBarry Smith }
6585c6c1daeSBarry Smith 
6595c6c1daeSBarry Smith #undef __FUNCT__
6605c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII"
6615c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name)
6625c6c1daeSBarry Smith {
6635c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6645c6c1daeSBarry Smith 
6655c6c1daeSBarry Smith   PetscFunctionBegin;
6665c6c1daeSBarry Smith   *name = vascii->filename;
6675c6c1daeSBarry Smith   PetscFunctionReturn(0);
6685c6c1daeSBarry Smith }
6695c6c1daeSBarry Smith 
6705c6c1daeSBarry Smith #undef __FUNCT__
6715c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII"
6725c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[])
6735c6c1daeSBarry Smith {
6745c6c1daeSBarry Smith   PetscErrorCode    ierr;
6755c6c1daeSBarry Smith   size_t            len;
6765c6c1daeSBarry Smith   char              fname[PETSC_MAX_PATH_LEN],*gz;
6775c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6785c6c1daeSBarry Smith   PetscBool         isstderr,isstdout;
6795c6c1daeSBarry Smith   PetscMPIInt       rank;
6805c6c1daeSBarry Smith 
6815c6c1daeSBarry Smith   PetscFunctionBegin;
6825c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
6835c6c1daeSBarry Smith   if (!name) PetscFunctionReturn(0);
6845c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr);
6855c6c1daeSBarry Smith 
6865c6c1daeSBarry Smith   /* Is this file to be compressed */
6875c6c1daeSBarry Smith   vascii->storecompressed = PETSC_FALSE;
688a297a907SKarl Rupp 
6895c6c1daeSBarry Smith   ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr);
6905c6c1daeSBarry Smith   if (gz) {
6915c6c1daeSBarry Smith     ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
6925c6c1daeSBarry Smith     if (len == 3) {
6935c6c1daeSBarry Smith       *gz = 0;
6945c6c1daeSBarry Smith       vascii->storecompressed = PETSC_TRUE;
6955c6c1daeSBarry Smith     }
6965c6c1daeSBarry Smith   }
697ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
6985c6c1daeSBarry Smith   if (!rank) {
6995c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr);
7005c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr);
7015c6c1daeSBarry Smith     /* empty filename means stdout */
7025c6c1daeSBarry Smith     if (name[0] == 0)  isstdout = PETSC_TRUE;
7035c6c1daeSBarry Smith     if (isstderr)      vascii->fd = PETSC_STDERR;
7045c6c1daeSBarry Smith     else if (isstdout) vascii->fd = PETSC_STDOUT;
7055c6c1daeSBarry Smith     else {
7065c6c1daeSBarry Smith 
7075c6c1daeSBarry Smith 
7085c6c1daeSBarry Smith       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
7095c6c1daeSBarry Smith       switch (vascii->mode) {
7105c6c1daeSBarry Smith       case FILE_MODE_READ:
7115c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r");
7125c6c1daeSBarry Smith         break;
7135c6c1daeSBarry Smith       case FILE_MODE_WRITE:
7145c6c1daeSBarry Smith         vascii->fd = fopen(fname,"w");
7155c6c1daeSBarry Smith         break;
7165c6c1daeSBarry Smith       case FILE_MODE_APPEND:
7175c6c1daeSBarry Smith         vascii->fd = fopen(fname,"a");
7185c6c1daeSBarry Smith         break;
7195c6c1daeSBarry Smith       case FILE_MODE_UPDATE:
7205c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
721a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
7225c6c1daeSBarry Smith         break;
7235c6c1daeSBarry Smith       case FILE_MODE_APPEND_UPDATE:
7245c6c1daeSBarry Smith         /* I really want a file which is opened at the end for updating,
7255c6c1daeSBarry Smith            not a+, which opens at the beginning, but makes writes at the end.
7265c6c1daeSBarry Smith         */
7275c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
728a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
729a297a907SKarl Rupp         else {
7305c6c1daeSBarry Smith           ierr     = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr);
7315c6c1daeSBarry Smith         }
7325c6c1daeSBarry Smith         break;
7335c6c1daeSBarry Smith       default:
7345c6c1daeSBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode);
7355c6c1daeSBarry Smith       }
7365c6c1daeSBarry Smith       if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname);
7375c6c1daeSBarry Smith     }
7385c6c1daeSBarry Smith   }
7395c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
7405c6c1daeSBarry Smith   PetscLogObjectState((PetscObject)viewer,"File: %s",name);
7415c6c1daeSBarry Smith #endif
7425c6c1daeSBarry Smith   PetscFunctionReturn(0);
7435c6c1daeSBarry Smith }
7445c6c1daeSBarry Smith 
7455c6c1daeSBarry Smith #undef __FUNCT__
7465c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_ASCII"
7475c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer)
7485c6c1daeSBarry Smith {
7495c6c1daeSBarry Smith   PetscMPIInt       rank;
7505c6c1daeSBarry Smith   PetscErrorCode    ierr;
7515c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7525c6c1daeSBarry Smith   const char        *name;
7535c6c1daeSBarry Smith 
7545c6c1daeSBarry Smith   PetscFunctionBegin;
7555c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton already obtained from PetscViewer and not restored");
7565c6c1daeSBarry Smith   ierr         = PetscViewerCreate(PETSC_COMM_SELF,outviewer);CHKERRQ(ierr);
7575c6c1daeSBarry Smith   ierr         = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr);
7585c6c1daeSBarry Smith   ovascii      = (PetscViewer_ASCII*)(*outviewer)->data;
7595c6c1daeSBarry Smith   ovascii->fd  = vascii->fd;
7605c6c1daeSBarry Smith   ovascii->tab = vascii->tab;
7615c6c1daeSBarry Smith 
7625c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
7635c6c1daeSBarry Smith 
7645c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
7655c6c1daeSBarry Smith 
7665c6c1daeSBarry Smith   ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr);
7675c6c1daeSBarry Smith   ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr);
7685c6c1daeSBarry Smith 
769ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
7705c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
7715c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Singleton;
772a297a907SKarl Rupp   if (rank) (*outviewer)->ops->flush = 0;
773a297a907SKarl Rupp   else      (*outviewer)->ops->flush = PetscViewerFlush_ASCII_Singleton_0;
7745c6c1daeSBarry Smith   PetscFunctionReturn(0);
7755c6c1daeSBarry Smith }
7765c6c1daeSBarry Smith 
7775c6c1daeSBarry Smith #undef __FUNCT__
7785c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_ASCII"
7795c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer)
7805c6c1daeSBarry Smith {
7815c6c1daeSBarry Smith   PetscErrorCode    ierr;
7825c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)(*outviewer)->data;
7835c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
7845c6c1daeSBarry Smith 
7855c6c1daeSBarry Smith   PetscFunctionBegin;
7865c6c1daeSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton never obtained from PetscViewer");
7875c6c1daeSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate singleton");
7885c6c1daeSBarry Smith 
7895c6c1daeSBarry Smith   ascii->sviewer             = 0;
7905c6c1daeSBarry Smith   vascii->fd                 = PETSC_STDOUT;
7915c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
7925c6c1daeSBarry Smith   ierr                       = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
7935c6c1daeSBarry Smith   ierr                       = PetscViewerFlush(viewer);CHKERRQ(ierr);
7945c6c1daeSBarry Smith   PetscFunctionReturn(0);
7955c6c1daeSBarry Smith }
7965c6c1daeSBarry Smith 
7975c6c1daeSBarry Smith #undef __FUNCT__
7985c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm_ASCII"
7995c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
8005c6c1daeSBarry Smith {
8015c6c1daeSBarry Smith   PetscErrorCode    ierr;
8025c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
8035c6c1daeSBarry Smith   const char        *name;
8045c6c1daeSBarry Smith 
8055c6c1daeSBarry Smith   PetscFunctionBegin;
8065c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm viewer already obtained from PetscViewer and not restored");
8075c6c1daeSBarry Smith   /* Note that we need to open vascii->filename for the subcomm:
8085c6c1daeSBarry Smith      we can't count on reusing viewer's fd since the root in comm and subcomm may differ.
8095c6c1daeSBarry Smith      Further, if the subcomm happens to be the same as comm, PetscViewerASCIIOpen() will
8105c6c1daeSBarry Smith      will return the current viewer, having increfed it.
8115c6c1daeSBarry Smith    */
8125c6c1daeSBarry Smith   ierr = PetscViewerASCIIOpen(subcomm,vascii->filename, outviewer);CHKERRQ(ierr);
8135c6c1daeSBarry Smith   if (*outviewer == viewer) PetscFunctionReturn(0);
8145c6c1daeSBarry Smith   ovascii = (PetscViewer_ASCII*)(*outviewer)->data;
8155c6c1daeSBarry Smith 
8165c6c1daeSBarry Smith   ovascii->tab    = vascii->tab;
8175c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
8185c6c1daeSBarry Smith 
8195c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
8205c6c1daeSBarry Smith 
8215c6c1daeSBarry Smith   ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr);
8225c6c1daeSBarry Smith   ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr);
8235c6c1daeSBarry Smith 
824dd2fa690SBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->subviewer = viewer;
825a297a907SKarl Rupp 
8265c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Subcomm;
8275c6c1daeSBarry Smith   PetscFunctionReturn(0);
8285c6c1daeSBarry Smith }
8295c6c1daeSBarry Smith 
8305c6c1daeSBarry Smith #undef __FUNCT__
8315c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm_ASCII"
8325c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
8335c6c1daeSBarry Smith {
8345c6c1daeSBarry Smith   PetscErrorCode    ierr;
8355c6c1daeSBarry Smith   PetscViewer_ASCII *oascii = (PetscViewer_ASCII*)(*outviewer)->data;
8365c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
8375c6c1daeSBarry Smith 
8385c6c1daeSBarry Smith   PetscFunctionBegin;
8395c6c1daeSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm never obtained from PetscViewer");
8405c6c1daeSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"The given PetscViewer did not generate this subcomm viewer");
8415c6c1daeSBarry Smith 
8425c6c1daeSBarry Smith   ascii->sviewer             = 0;
8435c6c1daeSBarry Smith   oascii->fd                 = PETSC_STDOUT;
8445c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
845a297a907SKarl Rupp 
8465c6c1daeSBarry Smith   ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
8475c6c1daeSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
8485c6c1daeSBarry Smith   PetscFunctionReturn(0);
8495c6c1daeSBarry Smith }
8505c6c1daeSBarry Smith 
8512bf49c77SBarry Smith #undef __FUNCT__
8522bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII"
8532bf49c77SBarry Smith PetscErrorCode  PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer)
8542bf49c77SBarry Smith {
8552bf49c77SBarry Smith   PetscErrorCode    ierr;
8562bf49c77SBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data;
8572bf49c77SBarry Smith 
8582bf49c77SBarry Smith   PetscFunctionBegin;
8592bf49c77SBarry Smith   if (ascii->filename) {
8602bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr);
8612bf49c77SBarry Smith   }
8622bf49c77SBarry Smith   PetscFunctionReturn(0);
8632bf49c77SBarry Smith }
8642bf49c77SBarry Smith 
8655c6c1daeSBarry Smith #undef __FUNCT__
8665c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII"
8678cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer)
8685c6c1daeSBarry Smith {
8695c6c1daeSBarry Smith   PetscViewer_ASCII *vascii;
8705c6c1daeSBarry Smith   PetscErrorCode    ierr;
8715c6c1daeSBarry Smith 
8725c6c1daeSBarry Smith   PetscFunctionBegin;
873b00a9115SJed Brown   ierr         = PetscNewLog(viewer,&vascii);CHKERRQ(ierr);
8745c6c1daeSBarry Smith   viewer->data = (void*)vascii;
8755c6c1daeSBarry Smith 
8765c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_ASCII;
8775c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_ASCII;
8785c6c1daeSBarry Smith   viewer->ops->getsingleton     = PetscViewerGetSingleton_ASCII;
8795c6c1daeSBarry Smith   viewer->ops->restoresingleton = PetscViewerRestoreSingleton_ASCII;
8805c6c1daeSBarry Smith   viewer->ops->getsubcomm       = PetscViewerGetSubcomm_ASCII;
8815c6c1daeSBarry Smith   viewer->ops->restoresubcomm   = PetscViewerRestoreSubcomm_ASCII;
8822bf49c77SBarry Smith   viewer->ops->view             = PetscViewerView_ASCII;
8831d641e7bSMichael Lange   viewer->ops->read             = PetscViewerASCIIRead;
8845c6c1daeSBarry Smith 
8855c6c1daeSBarry Smith   /* defaults to stdout unless set with PetscViewerFileSetName() */
8865c6c1daeSBarry Smith   vascii->fd        = PETSC_STDOUT;
8875c6c1daeSBarry Smith   vascii->mode      = FILE_MODE_WRITE;
8885c6c1daeSBarry Smith   vascii->bviewer   = 0;
889dd2fa690SBarry Smith   vascii->subviewer = 0;
8905c6c1daeSBarry Smith   vascii->sviewer   = 0;
8915c6c1daeSBarry Smith   vascii->tab       = 0;
8925c6c1daeSBarry Smith   vascii->tab_store = 0;
8935c6c1daeSBarry Smith   vascii->filename  = 0;
8945c6c1daeSBarry Smith   vascii->closefile = PETSC_TRUE;
8955c6c1daeSBarry Smith 
896bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr);
897bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr);
898bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr);
899bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr);
9005c6c1daeSBarry Smith   PetscFunctionReturn(0);
9015c6c1daeSBarry Smith }
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");
945ce94432eSBarry 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 
949ce94432eSBarry 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     if (petsc_history) {
9665c6c1daeSBarry Smith       va_start(Argp,format);
9675c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
9685c6c1daeSBarry Smith       err  = fflush(petsc_history);
9695c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9705c6c1daeSBarry Smith     }
9715c6c1daeSBarry Smith     va_end(Argp);
9725c6c1daeSBarry Smith   } else { /* other processors add to local queue */
9735c6c1daeSBarry Smith     char        *string;
9745c6c1daeSBarry Smith     va_list     Argp;
9755c6c1daeSBarry Smith     size_t      fullLength;
9765c6c1daeSBarry Smith     PrintfQueue next;
9775c6c1daeSBarry Smith 
978b00a9115SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
979a297a907SKarl Rupp     if (petsc_printfqueue) {
980a297a907SKarl Rupp       petsc_printfqueue->next = next;
981a297a907SKarl Rupp       petsc_printfqueue       = next;
982a297a907SKarl Rupp     } else {
983a297a907SKarl Rupp       petsc_printfqueuebase = petsc_printfqueue = next;
984a297a907SKarl Rupp     }
9855c6c1daeSBarry Smith     petsc_printfqueuelength++;
9865c6c1daeSBarry Smith     next->size = QUEUESTRINGSIZE;
987785e854fSJed Brown     ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
9885c6c1daeSBarry Smith     ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
9895c6c1daeSBarry Smith     string     = next->string;
9905c6c1daeSBarry Smith     tab       *= 2;
991a297a907SKarl Rupp     while (tab--) {
992a297a907SKarl Rupp       *string++ = ' ';
993a297a907SKarl Rupp     }
9945c6c1daeSBarry Smith     va_start(Argp,format);
99522d28d08SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
9965c6c1daeSBarry Smith     va_end(Argp);
9975c6c1daeSBarry Smith   }
9985c6c1daeSBarry Smith   PetscFunctionReturn(0);
9995c6c1daeSBarry Smith }
10005c6c1daeSBarry Smith 
10012655f987SMichael Lange #undef __FUNCT__
10022655f987SMichael Lange #define __FUNCT__ "PetscViewerASCIIRead"
10032655f987SMichael Lange /*@C
10042655f987SMichael Lange    PetscViewerASCIIRead - Reads from am ASCII file
10052655f987SMichael Lange 
10062655f987SMichael Lange    Collective on MPI_Comm
10072655f987SMichael Lange 
10082655f987SMichael Lange    Input Parameters:
10092655f987SMichael Lange +  viewer - the ascii viewer
10102655f987SMichael Lange .  data - location to write the data
1011060da220SMatthew G. Knepley .  num - number of items of data to read
10122655f987SMichael Lange -  datatype - type of data to read
10132655f987SMichael Lange 
1014f8e4bde8SMatthew G. Knepley    Output Parameters:
1015060da220SMatthew G. Knepley .  count - number of items of data actually read, or NULL
1016f8e4bde8SMatthew G. Knepley 
10172655f987SMichael Lange    Level: beginner
10182655f987SMichael Lange 
10192655f987SMichael Lange    Concepts: ascii files
10202655f987SMichael Lange 
10212655f987SMichael Lange .seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(),
10222655f987SMichael Lange           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
10232655f987SMichael Lange           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
10242655f987SMichael Lange @*/
1025060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype)
10262655f987SMichael Lange {
10272655f987SMichael Lange   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
10282655f987SMichael Lange   FILE              *fd = vascii->fd;
10292655f987SMichael Lange   PetscInt           i;
10303b7fe8c3SMatthew G. Knepley   int                ret = 0;
10312655f987SMichael Lange 
10322655f987SMichael Lange   PetscFunctionBegin;
10332655f987SMichael Lange   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1034060da220SMatthew G. Knepley   for (i=0; i<num; i++) {
1035f8e4bde8SMatthew G. Knepley     if (dtype == PETSC_CHAR)         ret = fscanf(fd, "%c",  &(((char*)data)[i]));
1036f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_STRING)  ret = fscanf(fd, "%s",  &(((char*)data)[i]));
1037b9eae255SMichael Lange #if PETSC_USE_64BIT_INDICES
10380a3e67a1SMichael Lange #if (PETSC_SIZEOF_LONG_LONG == 8)
1039f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%ld",  &(((PetscInt*)data)[i]));
10400a3e67a1SMichael Lange #else
1041f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%lld",  &(((PetscInt*)data)[i]));
10420a3e67a1SMichael Lange #endif
1043b9eae255SMichael Lange #else
1044f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%d",  &(((PetscInt*)data)[i]));
1045b9eae255SMichael Lange #endif
1046f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_ENUM)    ret = fscanf(fd, "%d",  &(((int*)data)[i]));
1047f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_FLOAT)   ret = fscanf(fd, "%f",  &(((float*)data)[i]));
1048f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_DOUBLE)  ret = fscanf(fd, "%lg", &(((double*)data)[i]));
1049f8e4bde8SMatthew G. Knepley     else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);}
1050f8e4bde8SMatthew G. Knepley     if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype);
1051f8e4bde8SMatthew G. Knepley     else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */
10522655f987SMichael Lange   }
1053060da220SMatthew G. Knepley   if (count) *count = i;
1054060da220SMatthew G. Knepley   else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num);
10552655f987SMichael Lange   PetscFunctionReturn(0);
10562655f987SMichael Lange }
10575c6c1daeSBarry Smith 
1058