xref: /petsc/src/sys/classes/viewer/impls/ascii/filev.c (revision f8e4bde84cdee892096ab78baf4256ae384d8e42)
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) {
63ce94432eSBarry 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);
88dd2fa690SBarry Smith   vascii->bviewer = NULL;
895c6c1daeSBarry Smith   PetscFunctionReturn(0);
905c6c1daeSBarry Smith }
915c6c1daeSBarry Smith 
925c6c1daeSBarry Smith #undef __FUNCT__
935c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Subcomm"
945c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Subcomm(PetscViewer viewer)
955c6c1daeSBarry Smith {
965c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
975c6c1daeSBarry Smith   PetscErrorCode    ierr;
985fd66863SKarl Rupp 
995c6c1daeSBarry Smith   PetscFunctionBegin;
100dd2fa690SBarry Smith   ierr = PetscViewerRestoreSubcomm(vascii->subviewer,PetscObjectComm((PetscObject)viewer),&viewer);CHKERRQ(ierr);
101dd2fa690SBarry Smith   vascii->subviewer = NULL;
1025c6c1daeSBarry Smith   PetscFunctionReturn(0);
1035c6c1daeSBarry Smith }
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith #undef __FUNCT__
1065c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII_Singleton_0"
1075c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII_Singleton_0(PetscViewer viewer)
1085c6c1daeSBarry Smith {
1095c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1105c6c1daeSBarry Smith   int               err;
1115c6c1daeSBarry Smith 
1125c6c1daeSBarry Smith   PetscFunctionBegin;
1135c6c1daeSBarry Smith   err = fflush(vascii->fd);
1145c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
1155c6c1daeSBarry Smith   PetscFunctionReturn(0);
1165c6c1daeSBarry Smith }
1175c6c1daeSBarry Smith 
1185c6c1daeSBarry Smith #undef __FUNCT__
1195c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII"
1205c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer)
1215c6c1daeSBarry Smith {
1225c6c1daeSBarry Smith   PetscMPIInt       rank;
1235c6c1daeSBarry Smith   PetscErrorCode    ierr;
1245c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1255c6c1daeSBarry Smith   int               err;
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith   PetscFunctionBegin;
128ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
1295c6c1daeSBarry Smith   /* fflush() fails on OSX for read-only descriptors */
1305c6c1daeSBarry Smith   if (!rank && (vascii->mode != FILE_MODE_READ)) {
1315c6c1daeSBarry Smith     err = fflush(vascii->fd);
1325c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed");
1335c6c1daeSBarry Smith   }
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith   if (vascii->allowsynchronized) {
1365c6c1daeSBarry Smith     /* Also flush anything printed with PetscViewerASCIISynchronizedPrintf()  */
1370ec8b6e3SBarry Smith     ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)viewer),vascii->fd);CHKERRQ(ierr);
1385c6c1daeSBarry Smith   }
1395c6c1daeSBarry Smith   PetscFunctionReturn(0);
1405c6c1daeSBarry Smith }
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith #undef __FUNCT__
1435c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer"
1445c6c1daeSBarry Smith /*@C
1455c6c1daeSBarry Smith     PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer.
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith     Not Collective
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerASCIIOpen()
1505c6c1daeSBarry Smith -   fd - file pointer
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith     Level: intermediate
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith     Fortran Note:
1555c6c1daeSBarry Smith     This routine is not supported in Fortran.
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith   Concepts: PetscViewer^file pointer
1585c6c1daeSBarry Smith   Concepts: file pointer^getting from PetscViewer
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(),
1615c6c1daeSBarry Smith           PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush()
1625c6c1daeSBarry Smith @*/
1635c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd)
1645c6c1daeSBarry Smith {
1655c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1665c6c1daeSBarry Smith 
1675c6c1daeSBarry Smith   PetscFunctionBegin;
1685c6c1daeSBarry Smith   *fd = vascii->fd;
1695c6c1daeSBarry Smith   PetscFunctionReturn(0);
1705c6c1daeSBarry Smith }
1715c6c1daeSBarry Smith 
1725c6c1daeSBarry Smith #undef __FUNCT__
1735c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetMode_ASCII"
1745c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode)
1755c6c1daeSBarry Smith {
1765c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith   PetscFunctionBegin;
1795c6c1daeSBarry Smith   *mode = vascii->mode;
1805c6c1daeSBarry Smith   PetscFunctionReturn(0);
1815c6c1daeSBarry Smith }
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith #undef __FUNCT__
1845c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII"
1855c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode)
1865c6c1daeSBarry Smith {
1875c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1885c6c1daeSBarry Smith 
1895c6c1daeSBarry Smith   PetscFunctionBegin;
1905c6c1daeSBarry Smith   vascii->mode = mode;
1915c6c1daeSBarry Smith   PetscFunctionReturn(0);
1925c6c1daeSBarry Smith }
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith /*
1955c6c1daeSBarry Smith    If petsc_history is on, then all Petsc*Printf() results are saved
1965c6c1daeSBarry Smith    if the appropriate (usually .petschistory) file.
1975c6c1daeSBarry Smith */
1985c6c1daeSBarry Smith extern FILE *petsc_history;
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith #undef __FUNCT__
2015c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab"
2025c6c1daeSBarry Smith /*@
2035c6c1daeSBarry Smith     PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith     Input Parameters:
2085c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2095c6c1daeSBarry Smith -    tabs - number of tabs
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith     Level: developer
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith     Fortran Note:
2145c6c1daeSBarry Smith     This routine is not supported in Fortran.
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2175c6c1daeSBarry Smith   Concepts: tab^setting
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(),
2205c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2215c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2225c6c1daeSBarry Smith @*/
2235c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs)
2245c6c1daeSBarry Smith {
2255c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2265c6c1daeSBarry Smith   PetscBool         iascii;
2275c6c1daeSBarry Smith   PetscErrorCode    ierr;
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith   PetscFunctionBegin;
2305c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2315c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
232a297a907SKarl Rupp   if (iascii) ascii->tab = tabs;
2335c6c1daeSBarry Smith   PetscFunctionReturn(0);
2345c6c1daeSBarry Smith }
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith #undef __FUNCT__
2375c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab"
2385c6c1daeSBarry Smith /*@
2395c6c1daeSBarry Smith     PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer.
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith     Not Collective, meaningful on first processor only.
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith     Input Parameters:
2445c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
2455c6c1daeSBarry Smith     Output Parameters:
2465c6c1daeSBarry Smith .    tabs - number of tabs
2475c6c1daeSBarry Smith 
2485c6c1daeSBarry Smith     Level: developer
2495c6c1daeSBarry Smith 
2505c6c1daeSBarry Smith     Fortran Note:
2515c6c1daeSBarry Smith     This routine is not supported in Fortran.
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2545c6c1daeSBarry Smith   Concepts: tab^retrieval
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(),
2575c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2585c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2595c6c1daeSBarry Smith @*/
2605c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs)
2615c6c1daeSBarry Smith {
2625c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2635c6c1daeSBarry Smith   PetscBool         iascii;
2645c6c1daeSBarry Smith   PetscErrorCode    ierr;
2655c6c1daeSBarry Smith 
2665c6c1daeSBarry Smith   PetscFunctionBegin;
2675c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2685c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
269a297a907SKarl Rupp   if (iascii && tabs) *tabs = ascii->tab;
2705c6c1daeSBarry Smith   PetscFunctionReturn(0);
2715c6c1daeSBarry Smith }
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith #undef __FUNCT__
2745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab"
2755c6c1daeSBarry Smith /*@
2765c6c1daeSBarry Smith     PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing
2775c6c1daeSBarry Smith 
2785c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith     Input Parameters:
2815c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2825c6c1daeSBarry Smith -    tabs - number of tabs
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith     Level: developer
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith     Fortran Note:
2875c6c1daeSBarry Smith     This routine is not supported in Fortran.
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2905c6c1daeSBarry Smith   Concepts: tab^setting
2915c6c1daeSBarry Smith 
2925c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
2935c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2945c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2955c6c1daeSBarry Smith @*/
2965c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs)
2975c6c1daeSBarry Smith {
2985c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2995c6c1daeSBarry Smith   PetscBool         iascii;
3005c6c1daeSBarry Smith   PetscErrorCode    ierr;
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith   PetscFunctionBegin;
3035c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3045c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
305a297a907SKarl Rupp   if (iascii) ascii->tab += tabs;
3065c6c1daeSBarry Smith   PetscFunctionReturn(0);
3075c6c1daeSBarry Smith }
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith #undef __FUNCT__
3105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab"
3115c6c1daeSBarry Smith /*@
3125c6c1daeSBarry Smith     PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing
3135c6c1daeSBarry Smith 
3145c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith     Input Parameters:
3175c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3185c6c1daeSBarry Smith -    tabs - number of tabs
3195c6c1daeSBarry Smith 
3205c6c1daeSBarry Smith     Level: developer
3215c6c1daeSBarry Smith 
3225c6c1daeSBarry Smith     Fortran Note:
3235c6c1daeSBarry Smith     This routine is not supported in Fortran.
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3265c6c1daeSBarry Smith   Concepts: tab^setting
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3295c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3305c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3315c6c1daeSBarry Smith @*/
3325c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs)
3335c6c1daeSBarry Smith {
3345c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3355c6c1daeSBarry Smith   PetscBool         iascii;
3365c6c1daeSBarry Smith   PetscErrorCode    ierr;
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith   PetscFunctionBegin;
3395c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3405c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
341a297a907SKarl Rupp   if (iascii) ascii->tab -= tabs;
3425c6c1daeSBarry Smith   PetscFunctionReturn(0);
3435c6c1daeSBarry Smith }
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith #undef __FUNCT__
3465c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow"
3475c6c1daeSBarry Smith /*@C
3485c6c1daeSBarry Smith     PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith     Collective on PetscViewer
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith     Input Parameters:
3535c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3545c6c1daeSBarry Smith -    allow - PETSC_TRUE to allow the synchronized printing
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith     Level: intermediate
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3595c6c1daeSBarry Smith   Concepts: tab^setting
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3625c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3635c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
3645c6c1daeSBarry Smith @*/
3655c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow)
3665c6c1daeSBarry Smith {
3675c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3685c6c1daeSBarry Smith   PetscBool         iascii;
3695c6c1daeSBarry Smith   PetscErrorCode    ierr;
3705c6c1daeSBarry Smith 
3715c6c1daeSBarry Smith   PetscFunctionBegin;
3725c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3735c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
374a297a907SKarl Rupp   if (iascii) ascii->allowsynchronized = allow;
3755c6c1daeSBarry Smith   PetscFunctionReturn(0);
3765c6c1daeSBarry Smith }
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith #undef __FUNCT__
3795c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab"
3805c6c1daeSBarry Smith /*@
3815c6c1daeSBarry Smith     PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf()
3825c6c1daeSBarry Smith      lines are tabbed.
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith     Input Parameters:
3875c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith     Level: developer
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith     Fortran Note:
3925c6c1daeSBarry Smith     This routine is not supported in Fortran.
3935c6c1daeSBarry Smith 
3945c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3955c6c1daeSBarry Smith   Concepts: tab^setting
3965c6c1daeSBarry Smith 
3975c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3985c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3995c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4005c6c1daeSBarry Smith @*/
4015c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPushTab(PetscViewer viewer)
4025c6c1daeSBarry Smith {
4035c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4045c6c1daeSBarry Smith   PetscBool         iascii;
4055c6c1daeSBarry Smith   PetscErrorCode    ierr;
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith   PetscFunctionBegin;
4085c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4095c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
410a297a907SKarl Rupp   if (iascii) ascii->tab++;
4115c6c1daeSBarry Smith   PetscFunctionReturn(0);
4125c6c1daeSBarry Smith }
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith #undef __FUNCT__
4155c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab"
4165c6c1daeSBarry Smith /*@
4175c6c1daeSBarry Smith     PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf()
4185c6c1daeSBarry Smith      lines are tabbed.
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith     Input Parameters:
4235c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
4245c6c1daeSBarry Smith 
4255c6c1daeSBarry Smith     Level: developer
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith     Fortran Note:
4285c6c1daeSBarry Smith     This routine is not supported in Fortran.
4295c6c1daeSBarry Smith 
4305c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4315c6c1daeSBarry Smith   Concepts: tab^setting
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4345c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4355c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4365c6c1daeSBarry Smith @*/
4375c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPopTab(PetscViewer viewer)
4385c6c1daeSBarry Smith {
4395c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4405c6c1daeSBarry Smith   PetscErrorCode    ierr;
4415c6c1daeSBarry Smith   PetscBool         iascii;
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith   PetscFunctionBegin;
4445c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4455c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4465c6c1daeSBarry Smith   if (iascii) {
4475c6c1daeSBarry Smith     if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed");
4485c6c1daeSBarry Smith     ascii->tab--;
4495c6c1daeSBarry Smith   }
4505c6c1daeSBarry Smith   PetscFunctionReturn(0);
4515c6c1daeSBarry Smith }
4525c6c1daeSBarry Smith 
4535c6c1daeSBarry Smith #undef __FUNCT__
4545c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs"
4555c6c1daeSBarry Smith /*@
4565c6c1daeSBarry Smith     PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer
4575c6c1daeSBarry Smith 
4585c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith     Input Parameters:
4615c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
4625c6c1daeSBarry Smith -    flg - PETSC_TRUE or PETSC_FALSE
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith     Level: developer
4655c6c1daeSBarry Smith 
4665c6c1daeSBarry Smith     Fortran Note:
4675c6c1daeSBarry Smith     This routine is not supported in Fortran.
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4705c6c1daeSBarry Smith   Concepts: tab^setting
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4735c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(),
4745c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4755c6c1daeSBarry Smith @*/
4765c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg)
4775c6c1daeSBarry Smith {
4785c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4795c6c1daeSBarry Smith   PetscBool         iascii;
4805c6c1daeSBarry Smith   PetscErrorCode    ierr;
4815c6c1daeSBarry Smith 
4825c6c1daeSBarry Smith   PetscFunctionBegin;
4835c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4845c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4855c6c1daeSBarry Smith   if (iascii) {
486a297a907SKarl Rupp     if (flg) ascii->tab = ascii->tab_store;
487a297a907SKarl Rupp     else {
4885c6c1daeSBarry Smith       ascii->tab_store = ascii->tab;
4895c6c1daeSBarry Smith       ascii->tab       = 0;
4905c6c1daeSBarry Smith     }
4915c6c1daeSBarry Smith   }
4925c6c1daeSBarry Smith   PetscFunctionReturn(0);
4935c6c1daeSBarry Smith }
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith #include <../src/sys/fileio/mprint.h> /* defines the queue datastructures and variables */
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith #undef __FUNCT__
5005c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf"
5015c6c1daeSBarry Smith /*@C
5025c6c1daeSBarry Smith     PetscViewerASCIIPrintf - Prints to a file, only from the first
5035c6c1daeSBarry Smith     processor in the PetscViewer
5045c6c1daeSBarry Smith 
5055c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5065c6c1daeSBarry Smith 
5075c6c1daeSBarry Smith     Input Parameters:
5085c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
5095c6c1daeSBarry Smith -    format - the usual printf() format string
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith     Level: developer
5125c6c1daeSBarry Smith 
5135c6c1daeSBarry Smith     Fortran Note:
5145c6c1daeSBarry Smith     The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran.
5155c6c1daeSBarry Smith     That is, you can only pass a single character string from Fortran.
5165c6c1daeSBarry Smith 
5175c6c1daeSBarry Smith   Concepts: PetscViewerASCII^printing
5185c6c1daeSBarry Smith   Concepts: printing^to file
5195c6c1daeSBarry Smith   Concepts: printf
5205c6c1daeSBarry Smith 
5215c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(),
5225c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(),
5235c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow()
5245c6c1daeSBarry Smith @*/
5255c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...)
5265c6c1daeSBarry Smith {
5275c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5285c6c1daeSBarry Smith   PetscMPIInt       rank;
529dd2fa690SBarry Smith   PetscInt          tab,intab = ascii->tab;
5305c6c1daeSBarry Smith   PetscErrorCode    ierr;
5315c6c1daeSBarry Smith   FILE              *fd = ascii->fd;
532dd2fa690SBarry Smith   PetscBool         iascii,issingleton = PETSC_FALSE;
5335c6c1daeSBarry Smith   int               err;
5345c6c1daeSBarry Smith 
5355c6c1daeSBarry Smith   PetscFunctionBegin;
5365c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5375c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
5385c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5395c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
540dd2fa690SBarry Smith   if (ascii->bviewer) {
541dd2fa690SBarry Smith     viewer      = ascii->bviewer;
542dd2fa690SBarry Smith     ascii       = (PetscViewer_ASCII*)viewer->data;
543dd2fa690SBarry Smith     fd          = ascii->fd;
544dd2fa690SBarry Smith     issingleton = PETSC_TRUE;
545dd2fa690SBarry Smith   }
5465c6c1daeSBarry Smith 
547ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
5485c6c1daeSBarry Smith   if (!rank) {
5495c6c1daeSBarry Smith     va_list Argp;
550dd2fa690SBarry Smith     tab = intab;
551a297a907SKarl Rupp     while (tab--) {
552a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
553a297a907SKarl Rupp     }
5545c6c1daeSBarry Smith 
5555c6c1daeSBarry Smith     va_start(Argp,format);
5565c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
5575c6c1daeSBarry Smith     err  = fflush(fd);
5585c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5595c6c1daeSBarry Smith     if (petsc_history) {
5605c6c1daeSBarry Smith       va_start(Argp,format);
561dd2fa690SBarry Smith       tab = intab;
562a297a907SKarl Rupp       while (tab--) {
563706d7a88SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history,"  ");CHKERRQ(ierr);
564a297a907SKarl Rupp       }
5655c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
5665c6c1daeSBarry Smith       err  = fflush(petsc_history);
5675c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5685c6c1daeSBarry Smith     }
5695c6c1daeSBarry Smith     va_end(Argp);
570dd2fa690SBarry Smith   } else if (issingleton) {
571dd2fa690SBarry Smith     char        *string;
572dd2fa690SBarry Smith     va_list     Argp;
573dd2fa690SBarry Smith     size_t      fullLength;
574dd2fa690SBarry Smith     PrintfQueue next;
575dd2fa690SBarry Smith 
5761cfcd2c5SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
577dd2fa690SBarry Smith     if (petsc_printfqueue) {
578dd2fa690SBarry Smith       petsc_printfqueue->next = next;
579dd2fa690SBarry Smith       petsc_printfqueue       = next;
580dd2fa690SBarry Smith     } else {
581dd2fa690SBarry Smith       petsc_printfqueuebase = petsc_printfqueue = next;
582dd2fa690SBarry Smith     }
583dd2fa690SBarry Smith     petsc_printfqueuelength++;
584dd2fa690SBarry Smith     next->size = QUEUESTRINGSIZE;
585854ce69bSBarry Smith     ierr       = PetscCalloc1(next->size, &next->string);CHKERRQ(ierr);
586dd2fa690SBarry Smith     string     = next->string;
587dd2fa690SBarry Smith     tab        = intab;
588dd2fa690SBarry Smith     tab       *= 2;
589dd2fa690SBarry Smith     while (tab--) {
590dd2fa690SBarry Smith       *string++ = ' ';
591dd2fa690SBarry Smith     }
592dd2fa690SBarry Smith     va_start(Argp,format);
593dd2fa690SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*ascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
594dd2fa690SBarry Smith     va_end(Argp);
5955c6c1daeSBarry Smith   }
5965c6c1daeSBarry Smith   PetscFunctionReturn(0);
5975c6c1daeSBarry Smith }
5985c6c1daeSBarry Smith 
5995c6c1daeSBarry Smith #undef __FUNCT__
6005c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName"
6015c6c1daeSBarry Smith /*@C
6025c6c1daeSBarry Smith      PetscViewerFileSetName - Sets the name of the file the PetscViewer uses.
6035c6c1daeSBarry Smith 
6045c6c1daeSBarry Smith     Collective on PetscViewer
6055c6c1daeSBarry Smith 
6065c6c1daeSBarry Smith   Input Parameters:
6075c6c1daeSBarry Smith +  viewer - the PetscViewer; either ASCII or binary
6085c6c1daeSBarry Smith -  name - the name of the file it should use
6095c6c1daeSBarry Smith 
6105c6c1daeSBarry Smith     Level: advanced
6115c6c1daeSBarry Smith 
6125c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(),
6135c6c1daeSBarry Smith           PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
6145c6c1daeSBarry Smith 
6155c6c1daeSBarry Smith @*/
6165c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName(PetscViewer viewer,const char name[])
6175c6c1daeSBarry Smith {
6185c6c1daeSBarry Smith   PetscErrorCode ierr;
6195c6c1daeSBarry Smith 
6205c6c1daeSBarry Smith   PetscFunctionBegin;
6215c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6225c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
6235c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr);
6245c6c1daeSBarry Smith   PetscFunctionReturn(0);
6255c6c1daeSBarry Smith }
6265c6c1daeSBarry Smith 
6275c6c1daeSBarry Smith #undef __FUNCT__
6285c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName"
6295c6c1daeSBarry Smith /*@C
6305c6c1daeSBarry Smith      PetscViewerFileGetName - Gets the name of the file the PetscViewer uses.
6315c6c1daeSBarry Smith 
6325c6c1daeSBarry Smith     Not Collective
6335c6c1daeSBarry Smith 
6345c6c1daeSBarry Smith   Input Parameter:
6355c6c1daeSBarry Smith .  viewer - the PetscViewer; either ASCII or binary
6365c6c1daeSBarry Smith 
6375c6c1daeSBarry Smith   Output Parameter:
6385c6c1daeSBarry Smith .  name - the name of the file it is using
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith     Level: advanced
6415c6c1daeSBarry Smith 
6425c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName()
6435c6c1daeSBarry Smith 
6445c6c1daeSBarry Smith @*/
6455c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName(PetscViewer viewer,const char **name)
6465c6c1daeSBarry Smith {
6475c6c1daeSBarry Smith   PetscErrorCode ierr;
6485c6c1daeSBarry Smith 
6495c6c1daeSBarry Smith   PetscFunctionBegin;
6505c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6515c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr);
6525c6c1daeSBarry Smith   PetscFunctionReturn(0);
6535c6c1daeSBarry Smith }
6545c6c1daeSBarry Smith 
6555c6c1daeSBarry Smith #undef __FUNCT__
6565c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII"
6575c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name)
6585c6c1daeSBarry Smith {
6595c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6605c6c1daeSBarry Smith 
6615c6c1daeSBarry Smith   PetscFunctionBegin;
6625c6c1daeSBarry Smith   *name = vascii->filename;
6635c6c1daeSBarry Smith   PetscFunctionReturn(0);
6645c6c1daeSBarry Smith }
6655c6c1daeSBarry Smith 
6665c6c1daeSBarry Smith #undef __FUNCT__
6675c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII"
6685c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[])
6695c6c1daeSBarry Smith {
6705c6c1daeSBarry Smith   PetscErrorCode    ierr;
6715c6c1daeSBarry Smith   size_t            len;
6725c6c1daeSBarry Smith   char              fname[PETSC_MAX_PATH_LEN],*gz;
6735c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6745c6c1daeSBarry Smith   PetscBool         isstderr,isstdout;
6755c6c1daeSBarry Smith   PetscMPIInt       rank;
6765c6c1daeSBarry Smith 
6775c6c1daeSBarry Smith   PetscFunctionBegin;
6785c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
6795c6c1daeSBarry Smith   if (!name) PetscFunctionReturn(0);
6805c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr);
6815c6c1daeSBarry Smith 
6825c6c1daeSBarry Smith   /* Is this file to be compressed */
6835c6c1daeSBarry Smith   vascii->storecompressed = PETSC_FALSE;
684a297a907SKarl Rupp 
6855c6c1daeSBarry Smith   ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr);
6865c6c1daeSBarry Smith   if (gz) {
6875c6c1daeSBarry Smith     ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
6885c6c1daeSBarry Smith     if (len == 3) {
6895c6c1daeSBarry Smith       *gz = 0;
6905c6c1daeSBarry Smith       vascii->storecompressed = PETSC_TRUE;
6915c6c1daeSBarry Smith     }
6925c6c1daeSBarry Smith   }
693ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
6945c6c1daeSBarry Smith   if (!rank) {
6955c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr);
6965c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr);
6975c6c1daeSBarry Smith     /* empty filename means stdout */
6985c6c1daeSBarry Smith     if (name[0] == 0)  isstdout = PETSC_TRUE;
6995c6c1daeSBarry Smith     if (isstderr)      vascii->fd = PETSC_STDERR;
7005c6c1daeSBarry Smith     else if (isstdout) vascii->fd = PETSC_STDOUT;
7015c6c1daeSBarry Smith     else {
7025c6c1daeSBarry Smith 
7035c6c1daeSBarry Smith 
7045c6c1daeSBarry Smith       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
7055c6c1daeSBarry Smith       switch (vascii->mode) {
7065c6c1daeSBarry Smith       case FILE_MODE_READ:
7075c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r");
7085c6c1daeSBarry Smith         break;
7095c6c1daeSBarry Smith       case FILE_MODE_WRITE:
7105c6c1daeSBarry Smith         vascii->fd = fopen(fname,"w");
7115c6c1daeSBarry Smith         break;
7125c6c1daeSBarry Smith       case FILE_MODE_APPEND:
7135c6c1daeSBarry Smith         vascii->fd = fopen(fname,"a");
7145c6c1daeSBarry Smith         break;
7155c6c1daeSBarry Smith       case FILE_MODE_UPDATE:
7165c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
717a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
7185c6c1daeSBarry Smith         break;
7195c6c1daeSBarry Smith       case FILE_MODE_APPEND_UPDATE:
7205c6c1daeSBarry Smith         /* I really want a file which is opened at the end for updating,
7215c6c1daeSBarry Smith            not a+, which opens at the beginning, but makes writes at the end.
7225c6c1daeSBarry Smith         */
7235c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
724a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
725a297a907SKarl Rupp         else {
7265c6c1daeSBarry Smith           ierr     = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr);
7275c6c1daeSBarry Smith         }
7285c6c1daeSBarry Smith         break;
7295c6c1daeSBarry Smith       default:
7305c6c1daeSBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode);
7315c6c1daeSBarry Smith       }
7325c6c1daeSBarry Smith       if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname);
7335c6c1daeSBarry Smith     }
7345c6c1daeSBarry Smith   }
7355c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
7365c6c1daeSBarry Smith   PetscLogObjectState((PetscObject)viewer,"File: %s",name);
7375c6c1daeSBarry Smith #endif
7385c6c1daeSBarry Smith   PetscFunctionReturn(0);
7395c6c1daeSBarry Smith }
7405c6c1daeSBarry Smith 
7415c6c1daeSBarry Smith #undef __FUNCT__
7425c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_ASCII"
7435c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer)
7445c6c1daeSBarry Smith {
7455c6c1daeSBarry Smith   PetscMPIInt       rank;
7465c6c1daeSBarry Smith   PetscErrorCode    ierr;
7475c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7485c6c1daeSBarry Smith   const char        *name;
7495c6c1daeSBarry Smith 
7505c6c1daeSBarry Smith   PetscFunctionBegin;
7515c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton already obtained from PetscViewer and not restored");
7525c6c1daeSBarry Smith   ierr         = PetscViewerCreate(PETSC_COMM_SELF,outviewer);CHKERRQ(ierr);
7535c6c1daeSBarry Smith   ierr         = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr);
7545c6c1daeSBarry Smith   ovascii      = (PetscViewer_ASCII*)(*outviewer)->data;
7555c6c1daeSBarry Smith   ovascii->fd  = vascii->fd;
7565c6c1daeSBarry Smith   ovascii->tab = vascii->tab;
7575c6c1daeSBarry Smith 
7585c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
7595c6c1daeSBarry Smith 
7605c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
7615c6c1daeSBarry Smith 
7625c6c1daeSBarry Smith   ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr);
7635c6c1daeSBarry Smith   ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr);
7645c6c1daeSBarry Smith 
765ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
7665c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
7675c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Singleton;
768a297a907SKarl Rupp   if (rank) (*outviewer)->ops->flush = 0;
769a297a907SKarl Rupp   else      (*outviewer)->ops->flush = PetscViewerFlush_ASCII_Singleton_0;
7705c6c1daeSBarry Smith   PetscFunctionReturn(0);
7715c6c1daeSBarry Smith }
7725c6c1daeSBarry Smith 
7735c6c1daeSBarry Smith #undef __FUNCT__
7745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_ASCII"
7755c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer)
7765c6c1daeSBarry Smith {
7775c6c1daeSBarry Smith   PetscErrorCode    ierr;
7785c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)(*outviewer)->data;
7795c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
7805c6c1daeSBarry Smith 
7815c6c1daeSBarry Smith   PetscFunctionBegin;
7825c6c1daeSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton never obtained from PetscViewer");
7835c6c1daeSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate singleton");
7845c6c1daeSBarry Smith 
7855c6c1daeSBarry Smith   ascii->sviewer             = 0;
7865c6c1daeSBarry Smith   vascii->fd                 = PETSC_STDOUT;
7875c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
7885c6c1daeSBarry Smith   ierr                       = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
7895c6c1daeSBarry Smith   ierr                       = PetscViewerFlush(viewer);CHKERRQ(ierr);
7905c6c1daeSBarry Smith   PetscFunctionReturn(0);
7915c6c1daeSBarry Smith }
7925c6c1daeSBarry Smith 
7935c6c1daeSBarry Smith #undef __FUNCT__
7945c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm_ASCII"
7955c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
7965c6c1daeSBarry Smith {
7975c6c1daeSBarry Smith   PetscErrorCode    ierr;
7985c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7995c6c1daeSBarry Smith   const char        *name;
8005c6c1daeSBarry Smith 
8015c6c1daeSBarry Smith   PetscFunctionBegin;
8025c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm viewer already obtained from PetscViewer and not restored");
8035c6c1daeSBarry Smith   /* Note that we need to open vascii->filename for the subcomm:
8045c6c1daeSBarry Smith      we can't count on reusing viewer's fd since the root in comm and subcomm may differ.
8055c6c1daeSBarry Smith      Further, if the subcomm happens to be the same as comm, PetscViewerASCIIOpen() will
8065c6c1daeSBarry Smith      will return the current viewer, having increfed it.
8075c6c1daeSBarry Smith    */
8085c6c1daeSBarry Smith   ierr = PetscViewerASCIIOpen(subcomm,vascii->filename, outviewer);CHKERRQ(ierr);
8095c6c1daeSBarry Smith   if (*outviewer == viewer) PetscFunctionReturn(0);
8105c6c1daeSBarry Smith   ovascii = (PetscViewer_ASCII*)(*outviewer)->data;
8115c6c1daeSBarry Smith 
8125c6c1daeSBarry Smith   ovascii->tab    = vascii->tab;
8135c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
8145c6c1daeSBarry Smith 
8155c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith   ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr);
8185c6c1daeSBarry Smith   ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr);
8195c6c1daeSBarry Smith 
820dd2fa690SBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->subviewer = viewer;
821a297a907SKarl Rupp 
8225c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Subcomm;
8235c6c1daeSBarry Smith   PetscFunctionReturn(0);
8245c6c1daeSBarry Smith }
8255c6c1daeSBarry Smith 
8265c6c1daeSBarry Smith #undef __FUNCT__
8275c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm_ASCII"
8285c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
8295c6c1daeSBarry Smith {
8305c6c1daeSBarry Smith   PetscErrorCode    ierr;
8315c6c1daeSBarry Smith   PetscViewer_ASCII *oascii = (PetscViewer_ASCII*)(*outviewer)->data;
8325c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
8335c6c1daeSBarry Smith 
8345c6c1daeSBarry Smith   PetscFunctionBegin;
8355c6c1daeSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm never obtained from PetscViewer");
8365c6c1daeSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"The given PetscViewer did not generate this subcomm viewer");
8375c6c1daeSBarry Smith 
8385c6c1daeSBarry Smith   ascii->sviewer             = 0;
8395c6c1daeSBarry Smith   oascii->fd                 = PETSC_STDOUT;
8405c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
841a297a907SKarl Rupp 
8425c6c1daeSBarry Smith   ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
8435c6c1daeSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
8445c6c1daeSBarry Smith   PetscFunctionReturn(0);
8455c6c1daeSBarry Smith }
8465c6c1daeSBarry Smith 
8472bf49c77SBarry Smith #undef __FUNCT__
8482bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII"
8492bf49c77SBarry Smith PetscErrorCode  PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer)
8502bf49c77SBarry Smith {
8512bf49c77SBarry Smith   PetscErrorCode    ierr;
8522bf49c77SBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data;
8532bf49c77SBarry Smith 
8542bf49c77SBarry Smith   PetscFunctionBegin;
8552bf49c77SBarry Smith   if (ascii->filename) {
8562bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr);
8572bf49c77SBarry Smith   }
8582bf49c77SBarry Smith   PetscFunctionReturn(0);
8592bf49c77SBarry Smith }
8602bf49c77SBarry Smith 
8615c6c1daeSBarry Smith #undef __FUNCT__
8625c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII"
8638cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer)
8645c6c1daeSBarry Smith {
8655c6c1daeSBarry Smith   PetscViewer_ASCII *vascii;
8665c6c1daeSBarry Smith   PetscErrorCode    ierr;
8675c6c1daeSBarry Smith 
8685c6c1daeSBarry Smith   PetscFunctionBegin;
869b00a9115SJed Brown   ierr         = PetscNewLog(viewer,&vascii);CHKERRQ(ierr);
8705c6c1daeSBarry Smith   viewer->data = (void*)vascii;
8715c6c1daeSBarry Smith 
8725c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_ASCII;
8735c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_ASCII;
8745c6c1daeSBarry Smith   viewer->ops->getsingleton     = PetscViewerGetSingleton_ASCII;
8755c6c1daeSBarry Smith   viewer->ops->restoresingleton = PetscViewerRestoreSingleton_ASCII;
8765c6c1daeSBarry Smith   viewer->ops->getsubcomm       = PetscViewerGetSubcomm_ASCII;
8775c6c1daeSBarry Smith   viewer->ops->restoresubcomm   = PetscViewerRestoreSubcomm_ASCII;
8782bf49c77SBarry Smith   viewer->ops->view             = PetscViewerView_ASCII;
8791d641e7bSMichael Lange   viewer->ops->read             = PetscViewerASCIIRead;
8805c6c1daeSBarry Smith 
8815c6c1daeSBarry Smith   /* defaults to stdout unless set with PetscViewerFileSetName() */
8825c6c1daeSBarry Smith   vascii->fd        = PETSC_STDOUT;
8835c6c1daeSBarry Smith   vascii->mode      = FILE_MODE_WRITE;
8845c6c1daeSBarry Smith   vascii->bviewer   = 0;
885dd2fa690SBarry Smith   vascii->subviewer = 0;
8865c6c1daeSBarry Smith   vascii->sviewer   = 0;
8875c6c1daeSBarry Smith   vascii->tab       = 0;
8885c6c1daeSBarry Smith   vascii->tab_store = 0;
8895c6c1daeSBarry Smith   vascii->filename  = 0;
8905c6c1daeSBarry Smith   vascii->closefile = PETSC_TRUE;
8915c6c1daeSBarry Smith 
892bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr);
893bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr);
894bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr);
895bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr);
8965c6c1daeSBarry Smith   PetscFunctionReturn(0);
8975c6c1daeSBarry Smith }
8985c6c1daeSBarry Smith 
8995c6c1daeSBarry Smith 
9005c6c1daeSBarry Smith #undef __FUNCT__
9015c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedPrintf"
9025c6c1daeSBarry Smith /*@C
9035c6c1daeSBarry Smith     PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from
9045c6c1daeSBarry Smith     several processors.  Output of the first processor is followed by that of the
9055c6c1daeSBarry Smith     second, etc.
9065c6c1daeSBarry Smith 
9075c6c1daeSBarry Smith     Not Collective, must call collective PetscViewerFlush() to get the results out
9085c6c1daeSBarry Smith 
9095c6c1daeSBarry Smith     Input Parameters:
9105c6c1daeSBarry Smith +   viewer - the ASCII PetscViewer
9115c6c1daeSBarry Smith -   format - the usual printf() format string
9125c6c1daeSBarry Smith 
9135c6c1daeSBarry Smith     Level: intermediate
9145c6c1daeSBarry Smith 
9155c6c1daeSBarry Smith     Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called.
9165c6c1daeSBarry Smith 
9175c6c1daeSBarry Smith     Fortran Note:
9185c6c1daeSBarry Smith       Can only print a single character* string
9195c6c1daeSBarry Smith 
9205c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(),
9215c6c1daeSBarry Smith           PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(),
9225c6c1daeSBarry Smith           PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedAllow()
9235c6c1daeSBarry Smith 
9245c6c1daeSBarry Smith @*/
9255c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...)
9265c6c1daeSBarry Smith {
9275c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
9285c6c1daeSBarry Smith   PetscErrorCode    ierr;
9295c6c1daeSBarry Smith   PetscMPIInt       rank,size;
9305c6c1daeSBarry Smith   PetscInt          tab = vascii->tab;
9315c6c1daeSBarry Smith   MPI_Comm          comm;
9325c6c1daeSBarry Smith   FILE              *fp;
9335c6c1daeSBarry Smith   PetscBool         iascii;
9345c6c1daeSBarry Smith   int               err;
9355c6c1daeSBarry Smith 
9365c6c1daeSBarry Smith   PetscFunctionBegin;
9375c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
9385c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
9395c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9405c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
941ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr);
9425c6c1daeSBarry Smith   if (size > 1 && !vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIISynchronizedAllow() to allow this call");
9435c6c1daeSBarry Smith   if (!viewer->ops->flush) PetscFunctionReturn(0); /* This viewer obtained via PetscViewerGetSubcomm_ASCII(), should not participate. */
9445c6c1daeSBarry Smith 
945ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
9465c6c1daeSBarry Smith   fp   = vascii->fd;
9475c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
9485c6c1daeSBarry Smith 
9495c6c1daeSBarry Smith   /* First processor prints immediately to fp */
9505c6c1daeSBarry Smith   if (!rank) {
9515c6c1daeSBarry Smith     va_list Argp;
9525c6c1daeSBarry Smith 
953a297a907SKarl Rupp     while (tab--) {
954a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fp,"  ");CHKERRQ(ierr);
955a297a907SKarl Rupp     }
9565c6c1daeSBarry Smith 
9575c6c1daeSBarry Smith     va_start(Argp,format);
9585c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr);
9595c6c1daeSBarry Smith     err  = fflush(fp);
9605c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9615c6c1daeSBarry Smith     if (petsc_history) {
9625c6c1daeSBarry Smith       va_start(Argp,format);
9635c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
9645c6c1daeSBarry Smith       err  = fflush(petsc_history);
9655c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9665c6c1daeSBarry Smith     }
9675c6c1daeSBarry Smith     va_end(Argp);
9685c6c1daeSBarry Smith   } else { /* other processors add to local queue */
9695c6c1daeSBarry Smith     char        *string;
9705c6c1daeSBarry Smith     va_list     Argp;
9715c6c1daeSBarry Smith     size_t      fullLength;
9725c6c1daeSBarry Smith     PrintfQueue next;
9735c6c1daeSBarry Smith 
974b00a9115SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
975a297a907SKarl Rupp     if (petsc_printfqueue) {
976a297a907SKarl Rupp       petsc_printfqueue->next = next;
977a297a907SKarl Rupp       petsc_printfqueue       = next;
978a297a907SKarl Rupp     } else {
979a297a907SKarl Rupp       petsc_printfqueuebase = petsc_printfqueue = next;
980a297a907SKarl Rupp     }
9815c6c1daeSBarry Smith     petsc_printfqueuelength++;
9825c6c1daeSBarry Smith     next->size = QUEUESTRINGSIZE;
983785e854fSJed Brown     ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
9845c6c1daeSBarry Smith     ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
9855c6c1daeSBarry Smith     string     = next->string;
9865c6c1daeSBarry Smith     tab       *= 2;
987a297a907SKarl Rupp     while (tab--) {
988a297a907SKarl Rupp       *string++ = ' ';
989a297a907SKarl Rupp     }
9905c6c1daeSBarry Smith     va_start(Argp,format);
99122d28d08SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
9925c6c1daeSBarry Smith     va_end(Argp);
9935c6c1daeSBarry Smith   }
9945c6c1daeSBarry Smith   PetscFunctionReturn(0);
9955c6c1daeSBarry Smith }
9965c6c1daeSBarry Smith 
9972655f987SMichael Lange #undef __FUNCT__
9982655f987SMichael Lange #define __FUNCT__ "PetscViewerASCIIRead"
9992655f987SMichael Lange /*@C
10002655f987SMichael Lange    PetscViewerASCIIRead - Reads from am ASCII file
10012655f987SMichael Lange 
10022655f987SMichael Lange    Collective on MPI_Comm
10032655f987SMichael Lange 
10042655f987SMichael Lange    Input Parameters:
10052655f987SMichael Lange +  viewer - the ascii viewer
10062655f987SMichael Lange .  data - location to write the data
10072655f987SMichael Lange .  count - number of items of data to read
10082655f987SMichael Lange -  datatype - type of data to read
10092655f987SMichael Lange 
1010*f8e4bde8SMatthew G. Knepley    Output Parameters:
1011*f8e4bde8SMatthew G. Knepley .  count - number of items of data actually read
1012*f8e4bde8SMatthew G. Knepley 
10132655f987SMichael Lange    Level: beginner
10142655f987SMichael Lange 
10152655f987SMichael Lange    Concepts: ascii files
10162655f987SMichael Lange 
10172655f987SMichael Lange .seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(),
10182655f987SMichael Lange           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
10192655f987SMichael Lange           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
10202655f987SMichael Lange @*/
1021*f8e4bde8SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt *count,PetscDataType dtype)
10222655f987SMichael Lange {
10232655f987SMichael Lange   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
10242655f987SMichael Lange   FILE              *fd = vascii->fd;
10252655f987SMichael Lange   PetscInt           i;
1026*f8e4bde8SMatthew G. Knepley   int                ret;
10272655f987SMichael Lange 
10282655f987SMichael Lange   PetscFunctionBegin;
10292655f987SMichael Lange   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1030*f8e4bde8SMatthew G. Knepley   for (i=0; i<*count; i++) {
1031*f8e4bde8SMatthew G. Knepley     if (dtype == PETSC_CHAR)         ret = fscanf(fd, "%c",  &(((char*)data)[i]));
1032*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_STRING)  ret = fscanf(fd, "%s",  &(((char*)data)[i]));
1033b9eae255SMichael Lange #if PETSC_USE_64BIT_INDICES
10340a3e67a1SMichael Lange #if (PETSC_SIZEOF_LONG_LONG == 8)
1035*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%ld",  &(((PetscInt*)data)[i]));
10360a3e67a1SMichael Lange #else
1037*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%lld",  &(((PetscInt*)data)[i]));
10380a3e67a1SMichael Lange #endif
1039b9eae255SMichael Lange #else
1040*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%d",  &(((PetscInt*)data)[i]));
1041b9eae255SMichael Lange #endif
1042*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_ENUM)    ret = fscanf(fd, "%d",  &(((int*)data)[i]));
1043*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_FLOAT)   ret = fscanf(fd, "%f",  &(((float*)data)[i]));
1044*f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_DOUBLE)  ret = fscanf(fd, "%lg", &(((double*)data)[i]));
1045*f8e4bde8SMatthew G. Knepley     else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);}
1046*f8e4bde8SMatthew G. Knepley     if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype);
1047*f8e4bde8SMatthew G. Knepley     else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */
10482655f987SMichael Lange   }
1049*f8e4bde8SMatthew G. Knepley   *count = i;
10502655f987SMichael Lange   PetscFunctionReturn(0);
10512655f987SMichael Lange }
10525c6c1daeSBarry Smith 
1053