xref: /petsc/src/sys/classes/viewer/impls/ascii/filev.c (revision 3f08860eea72c60ab5998520c0bd5a036e7e882e)
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) {
63e5840a18SBarry Smith       if (vlink->next) {
64ce94432eSBarry Smith         ierr = MPI_Attr_put(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr);
65e5840a18SBarry Smith       } else {
66e5840a18SBarry Smith         ierr = MPI_Attr_delete(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval);CHKERRQ(ierr);
67e5840a18SBarry 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__
84*3f08860eSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_SubViewer"
85*3f08860eSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_SubViewer(PetscViewer viewer)
865c6c1daeSBarry Smith {
875c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
885c6c1daeSBarry Smith   PetscErrorCode    ierr;
895fd66863SKarl Rupp 
905c6c1daeSBarry Smith   PetscFunctionBegin;
91*3f08860eSBarry Smith   ierr = PetscViewerRestoreSubViewer(vascii->bviewer,0,&viewer);CHKERRQ(ierr);
92dd2fa690SBarry Smith   vascii->bviewer = NULL;
935c6c1daeSBarry Smith   PetscFunctionReturn(0);
945c6c1daeSBarry Smith }
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith #undef __FUNCT__
97*3f08860eSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII_SubViewer_0"
98*3f08860eSBarry Smith PetscErrorCode PetscViewerFlush_ASCII_SubViewer_0(PetscViewer viewer)
995c6c1daeSBarry Smith {
1005c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1015c6c1daeSBarry Smith   int               err;
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith   PetscFunctionBegin;
1045c6c1daeSBarry Smith   err = fflush(vascii->fd);
1055c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
1065c6c1daeSBarry Smith   PetscFunctionReturn(0);
1075c6c1daeSBarry Smith }
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith #undef __FUNCT__
1105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII"
1115c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer)
1125c6c1daeSBarry Smith {
1135c6c1daeSBarry Smith   PetscMPIInt       rank;
1145c6c1daeSBarry Smith   PetscErrorCode    ierr;
1155c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1165c6c1daeSBarry Smith   int               err;
1175c6c1daeSBarry Smith 
1185c6c1daeSBarry Smith   PetscFunctionBegin;
119ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
1205c6c1daeSBarry Smith   /* fflush() fails on OSX for read-only descriptors */
1215c6c1daeSBarry Smith   if (!rank && (vascii->mode != FILE_MODE_READ)) {
1225c6c1daeSBarry Smith     err = fflush(vascii->fd);
1235c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed");
1245c6c1daeSBarry Smith   }
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith   if (vascii->allowsynchronized) {
1275c6c1daeSBarry Smith     /* Also flush anything printed with PetscViewerASCIISynchronizedPrintf()  */
1280ec8b6e3SBarry Smith     ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)viewer),vascii->fd);CHKERRQ(ierr);
1295c6c1daeSBarry Smith   }
1305c6c1daeSBarry Smith   PetscFunctionReturn(0);
1315c6c1daeSBarry Smith }
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith #undef __FUNCT__
1345c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer"
1355c6c1daeSBarry Smith /*@C
1365c6c1daeSBarry Smith     PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer.
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith     Not Collective
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerASCIIOpen()
1415c6c1daeSBarry Smith -   fd - file pointer
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith     Level: intermediate
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith     Fortran Note:
1465c6c1daeSBarry Smith     This routine is not supported in Fortran.
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith   Concepts: PetscViewer^file pointer
1495c6c1daeSBarry Smith   Concepts: file pointer^getting from PetscViewer
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(),
1525c6c1daeSBarry Smith           PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush()
1535c6c1daeSBarry Smith @*/
1545c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd)
1555c6c1daeSBarry Smith {
1565c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith   PetscFunctionBegin;
1595c6c1daeSBarry Smith   *fd = vascii->fd;
1605c6c1daeSBarry Smith   PetscFunctionReturn(0);
1615c6c1daeSBarry Smith }
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith #undef __FUNCT__
1645c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetMode_ASCII"
1655c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode)
1665c6c1daeSBarry Smith {
1675c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith   PetscFunctionBegin;
1705c6c1daeSBarry Smith   *mode = vascii->mode;
1715c6c1daeSBarry Smith   PetscFunctionReturn(0);
1725c6c1daeSBarry Smith }
1735c6c1daeSBarry Smith 
1745c6c1daeSBarry Smith #undef __FUNCT__
1755c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII"
1765c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode)
1775c6c1daeSBarry Smith {
1785c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1795c6c1daeSBarry Smith 
1805c6c1daeSBarry Smith   PetscFunctionBegin;
1815c6c1daeSBarry Smith   vascii->mode = mode;
1825c6c1daeSBarry Smith   PetscFunctionReturn(0);
1835c6c1daeSBarry Smith }
1845c6c1daeSBarry Smith 
1855c6c1daeSBarry Smith /*
1865c6c1daeSBarry Smith    If petsc_history is on, then all Petsc*Printf() results are saved
1875c6c1daeSBarry Smith    if the appropriate (usually .petschistory) file.
1885c6c1daeSBarry Smith */
1895c6c1daeSBarry Smith extern FILE *petsc_history;
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith #undef __FUNCT__
1925c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab"
1935c6c1daeSBarry Smith /*@
1945c6c1daeSBarry Smith     PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith     Input Parameters:
1995c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2005c6c1daeSBarry Smith -    tabs - number of tabs
2015c6c1daeSBarry Smith 
2025c6c1daeSBarry Smith     Level: developer
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith     Fortran Note:
2055c6c1daeSBarry Smith     This routine is not supported in Fortran.
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2085c6c1daeSBarry Smith   Concepts: tab^setting
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(),
2115c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2125c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2135c6c1daeSBarry Smith @*/
2145c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs)
2155c6c1daeSBarry Smith {
2165c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2175c6c1daeSBarry Smith   PetscBool         iascii;
2185c6c1daeSBarry Smith   PetscErrorCode    ierr;
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith   PetscFunctionBegin;
2215c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2225c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
223a297a907SKarl Rupp   if (iascii) ascii->tab = tabs;
2245c6c1daeSBarry Smith   PetscFunctionReturn(0);
2255c6c1daeSBarry Smith }
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith #undef __FUNCT__
2285c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab"
2295c6c1daeSBarry Smith /*@
2305c6c1daeSBarry Smith     PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer.
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith     Not Collective, meaningful on first processor only.
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith     Input Parameters:
2355c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
2365c6c1daeSBarry Smith     Output Parameters:
2375c6c1daeSBarry Smith .    tabs - number of tabs
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith     Level: developer
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith     Fortran Note:
2425c6c1daeSBarry Smith     This routine is not supported in Fortran.
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2455c6c1daeSBarry Smith   Concepts: tab^retrieval
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(),
2485c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2495c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2505c6c1daeSBarry Smith @*/
2515c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs)
2525c6c1daeSBarry Smith {
2535c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2545c6c1daeSBarry Smith   PetscBool         iascii;
2555c6c1daeSBarry Smith   PetscErrorCode    ierr;
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith   PetscFunctionBegin;
2585c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2595c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
260a297a907SKarl Rupp   if (iascii && tabs) *tabs = ascii->tab;
2615c6c1daeSBarry Smith   PetscFunctionReturn(0);
2625c6c1daeSBarry Smith }
2635c6c1daeSBarry Smith 
2645c6c1daeSBarry Smith #undef __FUNCT__
2655c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab"
2665c6c1daeSBarry Smith /*@
2675c6c1daeSBarry Smith     PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing
2685c6c1daeSBarry Smith 
2695c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2705c6c1daeSBarry Smith 
2715c6c1daeSBarry Smith     Input Parameters:
2725c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
2735c6c1daeSBarry Smith -    tabs - number of tabs
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith     Level: developer
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith     Fortran Note:
2785c6c1daeSBarry Smith     This routine is not supported in Fortran.
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2815c6c1daeSBarry Smith   Concepts: tab^setting
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
2845c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2855c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2865c6c1daeSBarry Smith @*/
2875c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs)
2885c6c1daeSBarry Smith {
2895c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2905c6c1daeSBarry Smith   PetscBool         iascii;
2915c6c1daeSBarry Smith   PetscErrorCode    ierr;
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith   PetscFunctionBegin;
2945c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2955c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
296a297a907SKarl Rupp   if (iascii) ascii->tab += tabs;
2975c6c1daeSBarry Smith   PetscFunctionReturn(0);
2985c6c1daeSBarry Smith }
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith #undef __FUNCT__
3015c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab"
3025c6c1daeSBarry Smith /*@
3035c6c1daeSBarry Smith     PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3065c6c1daeSBarry Smith 
3075c6c1daeSBarry Smith     Input Parameters:
3085c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3095c6c1daeSBarry Smith -    tabs - number of tabs
3105c6c1daeSBarry Smith 
3115c6c1daeSBarry Smith     Level: developer
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith     Fortran Note:
3145c6c1daeSBarry Smith     This routine is not supported in Fortran.
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3175c6c1daeSBarry Smith   Concepts: tab^setting
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3205c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3215c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3225c6c1daeSBarry Smith @*/
3235c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs)
3245c6c1daeSBarry Smith {
3255c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3265c6c1daeSBarry Smith   PetscBool         iascii;
3275c6c1daeSBarry Smith   PetscErrorCode    ierr;
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith   PetscFunctionBegin;
3305c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3315c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
332a297a907SKarl Rupp   if (iascii) ascii->tab -= tabs;
3335c6c1daeSBarry Smith   PetscFunctionReturn(0);
3345c6c1daeSBarry Smith }
3355c6c1daeSBarry Smith 
3365c6c1daeSBarry Smith #undef __FUNCT__
3375c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow"
3385c6c1daeSBarry Smith /*@C
3395c6c1daeSBarry Smith     PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer
3405c6c1daeSBarry Smith 
3415c6c1daeSBarry Smith     Collective on PetscViewer
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith     Input Parameters:
3445c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
3455c6c1daeSBarry Smith -    allow - PETSC_TRUE to allow the synchronized printing
3465c6c1daeSBarry Smith 
3475c6c1daeSBarry Smith     Level: intermediate
3485c6c1daeSBarry Smith 
3495c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3505c6c1daeSBarry Smith   Concepts: tab^setting
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3535c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3545c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
3555c6c1daeSBarry Smith @*/
3565c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow)
3575c6c1daeSBarry Smith {
3585c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3595c6c1daeSBarry Smith   PetscBool         iascii;
3605c6c1daeSBarry Smith   PetscErrorCode    ierr;
3615c6c1daeSBarry Smith 
3625c6c1daeSBarry Smith   PetscFunctionBegin;
3635c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3645c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
365a297a907SKarl Rupp   if (iascii) ascii->allowsynchronized = allow;
3665c6c1daeSBarry Smith   PetscFunctionReturn(0);
3675c6c1daeSBarry Smith }
3685c6c1daeSBarry Smith 
3695c6c1daeSBarry Smith #undef __FUNCT__
3705c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab"
3715c6c1daeSBarry Smith /*@
3725c6c1daeSBarry Smith     PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf()
3735c6c1daeSBarry Smith      lines are tabbed.
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith     Input Parameters:
3785c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith     Level: developer
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith     Fortran Note:
3835c6c1daeSBarry Smith     This routine is not supported in Fortran.
3845c6c1daeSBarry Smith 
3855c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3865c6c1daeSBarry Smith   Concepts: tab^setting
3875c6c1daeSBarry Smith 
3885c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3895c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3905c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
3915c6c1daeSBarry Smith @*/
3925c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPushTab(PetscViewer viewer)
3935c6c1daeSBarry Smith {
3945c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3955c6c1daeSBarry Smith   PetscBool         iascii;
3965c6c1daeSBarry Smith   PetscErrorCode    ierr;
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith   PetscFunctionBegin;
3995c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4005c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
401a297a907SKarl Rupp   if (iascii) ascii->tab++;
4025c6c1daeSBarry Smith   PetscFunctionReturn(0);
4035c6c1daeSBarry Smith }
4045c6c1daeSBarry Smith 
4055c6c1daeSBarry Smith #undef __FUNCT__
4065c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab"
4075c6c1daeSBarry Smith /*@
4085c6c1daeSBarry Smith     PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf()
4095c6c1daeSBarry Smith      lines are tabbed.
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith     Input Parameters:
4145c6c1daeSBarry Smith .    viewer - optained with PetscViewerASCIIOpen()
4155c6c1daeSBarry Smith 
4165c6c1daeSBarry Smith     Level: developer
4175c6c1daeSBarry Smith 
4185c6c1daeSBarry Smith     Fortran Note:
4195c6c1daeSBarry Smith     This routine is not supported in Fortran.
4205c6c1daeSBarry Smith 
4215c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4225c6c1daeSBarry Smith   Concepts: tab^setting
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4255c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4265c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4275c6c1daeSBarry Smith @*/
4285c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPopTab(PetscViewer viewer)
4295c6c1daeSBarry Smith {
4305c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4315c6c1daeSBarry Smith   PetscErrorCode    ierr;
4325c6c1daeSBarry Smith   PetscBool         iascii;
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith   PetscFunctionBegin;
4355c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4365c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4375c6c1daeSBarry Smith   if (iascii) {
4385c6c1daeSBarry Smith     if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed");
4395c6c1daeSBarry Smith     ascii->tab--;
4405c6c1daeSBarry Smith   }
4415c6c1daeSBarry Smith   PetscFunctionReturn(0);
4425c6c1daeSBarry Smith }
4435c6c1daeSBarry Smith 
4445c6c1daeSBarry Smith #undef __FUNCT__
4455c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs"
4465c6c1daeSBarry Smith /*@
4475c6c1daeSBarry Smith     PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4505c6c1daeSBarry Smith 
4515c6c1daeSBarry Smith     Input Parameters:
4525c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
4535c6c1daeSBarry Smith -    flg - PETSC_TRUE or PETSC_FALSE
4545c6c1daeSBarry Smith 
4555c6c1daeSBarry Smith     Level: developer
4565c6c1daeSBarry Smith 
4575c6c1daeSBarry Smith     Fortran Note:
4585c6c1daeSBarry Smith     This routine is not supported in Fortran.
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4615c6c1daeSBarry Smith   Concepts: tab^setting
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4645c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(),
4655c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4665c6c1daeSBarry Smith @*/
4675c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg)
4685c6c1daeSBarry Smith {
4695c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4705c6c1daeSBarry Smith   PetscBool         iascii;
4715c6c1daeSBarry Smith   PetscErrorCode    ierr;
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith   PetscFunctionBegin;
4745c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4755c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4765c6c1daeSBarry Smith   if (iascii) {
477a297a907SKarl Rupp     if (flg) ascii->tab = ascii->tab_store;
478a297a907SKarl Rupp     else {
4795c6c1daeSBarry Smith       ascii->tab_store = ascii->tab;
4805c6c1daeSBarry Smith       ascii->tab       = 0;
4815c6c1daeSBarry Smith     }
4825c6c1daeSBarry Smith   }
4835c6c1daeSBarry Smith   PetscFunctionReturn(0);
4845c6c1daeSBarry Smith }
4855c6c1daeSBarry Smith 
4865c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */
4875c6c1daeSBarry Smith 
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith #undef __FUNCT__
4905c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf"
4915c6c1daeSBarry Smith /*@C
4925c6c1daeSBarry Smith     PetscViewerASCIIPrintf - Prints to a file, only from the first
4935c6c1daeSBarry Smith     processor in the PetscViewer
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith     Input Parameters:
4985c6c1daeSBarry Smith +    viewer - optained with PetscViewerASCIIOpen()
4995c6c1daeSBarry Smith -    format - the usual printf() format string
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith     Level: developer
5025c6c1daeSBarry Smith 
5035c6c1daeSBarry Smith     Fortran Note:
5045c6c1daeSBarry Smith     The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran.
5055c6c1daeSBarry Smith     That is, you can only pass a single character string from Fortran.
5065c6c1daeSBarry Smith 
5075c6c1daeSBarry Smith   Concepts: PetscViewerASCII^printing
5085c6c1daeSBarry Smith   Concepts: printing^to file
5095c6c1daeSBarry Smith   Concepts: printf
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(),
5125c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(),
5135c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow()
5145c6c1daeSBarry Smith @*/
5155c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...)
5165c6c1daeSBarry Smith {
5175c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5185c6c1daeSBarry Smith   PetscMPIInt       rank;
519dd2fa690SBarry Smith   PetscInt          tab,intab = ascii->tab;
5205c6c1daeSBarry Smith   PetscErrorCode    ierr;
5215c6c1daeSBarry Smith   FILE              *fd = ascii->fd;
522*3f08860eSBarry Smith   PetscBool         iascii;
5235c6c1daeSBarry Smith   int               err;
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith   PetscFunctionBegin;
5265c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5275c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
5285c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5295c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
530ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
531*3f08860eSBarry Smith   if (!rank) PetscFunctionReturn(0);
532*3f08860eSBarry Smith 
533*3f08860eSBarry Smith   if (ascii->bviewer) { /* pass string up to parent viewer */
534*3f08860eSBarry Smith     char        *string;
535*3f08860eSBarry Smith     va_list     Argp;
536*3f08860eSBarry Smith     size_t      fullLength;
537*3f08860eSBarry Smith 
538*3f08860eSBarry Smith     ierr       = PetscCalloc1(QUEUESTRINGSIZE, &string);CHKERRQ(ierr);
539*3f08860eSBarry Smith     tab        = intab;
540*3f08860eSBarry Smith     tab       *= 2;
541*3f08860eSBarry Smith     while (tab--) {
542*3f08860eSBarry Smith       *string++ = ' ';
543*3f08860eSBarry Smith     }
544*3f08860eSBarry Smith     va_start(Argp,format);
545*3f08860eSBarry Smith     ierr = PetscVSNPrintf(string,QUEUESTRINGSIZE-2*ascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
546*3f08860eSBarry Smith     va_end(Argp);
547*3f08860eSBarry Smith 
548*3f08860eSBarry Smith     ierr = PetscViewerASCIISynchronizedPrintf(ascii->bviewer,"%s",string);CHKERRQ(ierr);
549*3f08860eSBarry Smith     ierr = PetscFree(string);CHKERRQ(ierr);
550*3f08860eSBarry Smith   } else { /* write directly to file */
5515c6c1daeSBarry Smith     va_list Argp;
552dd2fa690SBarry Smith     tab = intab;
553a297a907SKarl Rupp     while (tab--) {
554a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
555a297a907SKarl Rupp     }
5565c6c1daeSBarry Smith 
5575c6c1daeSBarry Smith     va_start(Argp,format);
5585c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
5595c6c1daeSBarry Smith     err  = fflush(fd);
5605c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5615c6c1daeSBarry Smith     if (petsc_history) {
5625c6c1daeSBarry Smith       va_start(Argp,format);
563dd2fa690SBarry Smith       tab = intab;
564a297a907SKarl Rupp       while (tab--) {
565706d7a88SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history,"  ");CHKERRQ(ierr);
566a297a907SKarl Rupp       }
5675c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
5685c6c1daeSBarry Smith       err  = fflush(petsc_history);
5695c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5705c6c1daeSBarry Smith     }
5715c6c1daeSBarry Smith     va_end(Argp);
5725c6c1daeSBarry Smith   }
5735c6c1daeSBarry Smith   PetscFunctionReturn(0);
5745c6c1daeSBarry Smith }
5755c6c1daeSBarry Smith 
5765c6c1daeSBarry Smith #undef __FUNCT__
5775c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName"
5785c6c1daeSBarry Smith /*@C
5795c6c1daeSBarry Smith      PetscViewerFileSetName - Sets the name of the file the PetscViewer uses.
5805c6c1daeSBarry Smith 
5815c6c1daeSBarry Smith     Collective on PetscViewer
5825c6c1daeSBarry Smith 
5835c6c1daeSBarry Smith   Input Parameters:
5845c6c1daeSBarry Smith +  viewer - the PetscViewer; either ASCII or binary
5855c6c1daeSBarry Smith -  name - the name of the file it should use
5865c6c1daeSBarry Smith 
5875c6c1daeSBarry Smith     Level: advanced
5885c6c1daeSBarry Smith 
5895c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(),
5905c6c1daeSBarry Smith           PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
5915c6c1daeSBarry Smith 
5925c6c1daeSBarry Smith @*/
5935c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName(PetscViewer viewer,const char name[])
5945c6c1daeSBarry Smith {
5955c6c1daeSBarry Smith   PetscErrorCode ierr;
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith   PetscFunctionBegin;
5985c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5995c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
6005c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr);
6015c6c1daeSBarry Smith   PetscFunctionReturn(0);
6025c6c1daeSBarry Smith }
6035c6c1daeSBarry Smith 
6045c6c1daeSBarry Smith #undef __FUNCT__
6055c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName"
6065c6c1daeSBarry Smith /*@C
6075c6c1daeSBarry Smith      PetscViewerFileGetName - Gets the name of the file the PetscViewer uses.
6085c6c1daeSBarry Smith 
6095c6c1daeSBarry Smith     Not Collective
6105c6c1daeSBarry Smith 
6115c6c1daeSBarry Smith   Input Parameter:
6125c6c1daeSBarry Smith .  viewer - the PetscViewer; either ASCII or binary
6135c6c1daeSBarry Smith 
6145c6c1daeSBarry Smith   Output Parameter:
6155c6c1daeSBarry Smith .  name - the name of the file it is using
6165c6c1daeSBarry Smith 
6175c6c1daeSBarry Smith     Level: advanced
6185c6c1daeSBarry Smith 
6195c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName()
6205c6c1daeSBarry Smith 
6215c6c1daeSBarry Smith @*/
6225c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName(PetscViewer viewer,const char **name)
6235c6c1daeSBarry Smith {
6245c6c1daeSBarry Smith   PetscErrorCode ierr;
6255c6c1daeSBarry Smith 
6265c6c1daeSBarry Smith   PetscFunctionBegin;
6275c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6285c6c1daeSBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr);
6295c6c1daeSBarry Smith   PetscFunctionReturn(0);
6305c6c1daeSBarry Smith }
6315c6c1daeSBarry Smith 
6325c6c1daeSBarry Smith #undef __FUNCT__
6335c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII"
6345c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name)
6355c6c1daeSBarry Smith {
6365c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6375c6c1daeSBarry Smith 
6385c6c1daeSBarry Smith   PetscFunctionBegin;
6395c6c1daeSBarry Smith   *name = vascii->filename;
6405c6c1daeSBarry Smith   PetscFunctionReturn(0);
6415c6c1daeSBarry Smith }
6425c6c1daeSBarry Smith 
6435c6c1daeSBarry Smith #undef __FUNCT__
6445c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII"
6455c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[])
6465c6c1daeSBarry Smith {
6475c6c1daeSBarry Smith   PetscErrorCode    ierr;
6485c6c1daeSBarry Smith   size_t            len;
6495c6c1daeSBarry Smith   char              fname[PETSC_MAX_PATH_LEN],*gz;
6505c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
6515c6c1daeSBarry Smith   PetscBool         isstderr,isstdout;
6525c6c1daeSBarry Smith   PetscMPIInt       rank;
6535c6c1daeSBarry Smith 
6545c6c1daeSBarry Smith   PetscFunctionBegin;
6555c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
6565c6c1daeSBarry Smith   if (!name) PetscFunctionReturn(0);
6575c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr);
6585c6c1daeSBarry Smith 
6595c6c1daeSBarry Smith   /* Is this file to be compressed */
6605c6c1daeSBarry Smith   vascii->storecompressed = PETSC_FALSE;
661a297a907SKarl Rupp 
6625c6c1daeSBarry Smith   ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr);
6635c6c1daeSBarry Smith   if (gz) {
6645c6c1daeSBarry Smith     ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
6655c6c1daeSBarry Smith     if (len == 3) {
6665c6c1daeSBarry Smith       *gz = 0;
6675c6c1daeSBarry Smith       vascii->storecompressed = PETSC_TRUE;
6685c6c1daeSBarry Smith     }
6695c6c1daeSBarry Smith   }
670ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
6715c6c1daeSBarry Smith   if (!rank) {
6725c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr);
6735c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr);
6745c6c1daeSBarry Smith     /* empty filename means stdout */
6755c6c1daeSBarry Smith     if (name[0] == 0)  isstdout = PETSC_TRUE;
6765c6c1daeSBarry Smith     if (isstderr)      vascii->fd = PETSC_STDERR;
6775c6c1daeSBarry Smith     else if (isstdout) vascii->fd = PETSC_STDOUT;
6785c6c1daeSBarry Smith     else {
6795c6c1daeSBarry Smith 
6805c6c1daeSBarry Smith 
6815c6c1daeSBarry Smith       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
6825c6c1daeSBarry Smith       switch (vascii->mode) {
6835c6c1daeSBarry Smith       case FILE_MODE_READ:
6845c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r");
6855c6c1daeSBarry Smith         break;
6865c6c1daeSBarry Smith       case FILE_MODE_WRITE:
6875c6c1daeSBarry Smith         vascii->fd = fopen(fname,"w");
6885c6c1daeSBarry Smith         break;
6895c6c1daeSBarry Smith       case FILE_MODE_APPEND:
6905c6c1daeSBarry Smith         vascii->fd = fopen(fname,"a");
6915c6c1daeSBarry Smith         break;
6925c6c1daeSBarry Smith       case FILE_MODE_UPDATE:
6935c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
694a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
6955c6c1daeSBarry Smith         break;
6965c6c1daeSBarry Smith       case FILE_MODE_APPEND_UPDATE:
6975c6c1daeSBarry Smith         /* I really want a file which is opened at the end for updating,
6985c6c1daeSBarry Smith            not a+, which opens at the beginning, but makes writes at the end.
6995c6c1daeSBarry Smith         */
7005c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
701a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
702a297a907SKarl Rupp         else {
7035c6c1daeSBarry Smith           ierr     = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr);
7045c6c1daeSBarry Smith         }
7055c6c1daeSBarry Smith         break;
7065c6c1daeSBarry Smith       default:
7075c6c1daeSBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode);
7085c6c1daeSBarry Smith       }
7095c6c1daeSBarry Smith       if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname);
7105c6c1daeSBarry Smith     }
7115c6c1daeSBarry Smith   }
7125c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
7135c6c1daeSBarry Smith   PetscLogObjectState((PetscObject)viewer,"File: %s",name);
7145c6c1daeSBarry Smith #endif
7155c6c1daeSBarry Smith   PetscFunctionReturn(0);
7165c6c1daeSBarry Smith }
7175c6c1daeSBarry Smith 
7185c6c1daeSBarry Smith #undef __FUNCT__
719*3f08860eSBarry Smith #define __FUNCT__ "PetscViewerGetSubViewer_ASCII"
720*3f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
7215c6c1daeSBarry Smith {
7225c6c1daeSBarry Smith   PetscMPIInt       rank;
7235c6c1daeSBarry Smith   PetscErrorCode    ierr;
7245c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7255c6c1daeSBarry Smith 
7265c6c1daeSBarry Smith   PetscFunctionBegin;
727*3f08860eSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer already obtained from PetscViewer and not restored");
728*3f08860eSBarry Smith   ierr         = PetscViewerCreate(subcomm,outviewer);CHKERRQ(ierr);
7295c6c1daeSBarry Smith   ierr         = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr);
7305c6c1daeSBarry Smith   ovascii      = (PetscViewer_ASCII*)(*outviewer)->data;
7315c6c1daeSBarry Smith   ovascii->fd  = vascii->fd;
7325c6c1daeSBarry Smith   ovascii->tab = vascii->tab;
7335c6c1daeSBarry Smith 
7345c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
7355c6c1daeSBarry Smith 
7365c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
7375c6c1daeSBarry Smith 
738ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
7395c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
740*3f08860eSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer;
741a297a907SKarl Rupp   if (rank) (*outviewer)->ops->flush = 0;
742*3f08860eSBarry Smith   else      (*outviewer)->ops->flush = PetscViewerFlush_ASCII_SubViewer_0;
7435c6c1daeSBarry Smith   PetscFunctionReturn(0);
7445c6c1daeSBarry Smith }
7455c6c1daeSBarry Smith 
7465c6c1daeSBarry Smith #undef __FUNCT__
747*3f08860eSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubViewer_ASCII"
748*3f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
7495c6c1daeSBarry Smith {
7505c6c1daeSBarry Smith   PetscErrorCode    ierr;
7515c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)(*outviewer)->data;
7525c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
7535c6c1daeSBarry Smith 
7545c6c1daeSBarry Smith   PetscFunctionBegin;
755*3f08860eSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer PetscViewer never obtained from PetscViewer");
756*3f08860eSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate a SubViewer PetscViewer");
7575c6c1daeSBarry Smith 
7585c6c1daeSBarry Smith   ascii->sviewer             = 0;
7595c6c1daeSBarry Smith   vascii->fd                 = PETSC_STDOUT;
7605c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
7615c6c1daeSBarry Smith   ierr                       = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
7625c6c1daeSBarry Smith   ierr                       = PetscViewerFlush(viewer);CHKERRQ(ierr);
7635c6c1daeSBarry Smith   PetscFunctionReturn(0);
7645c6c1daeSBarry Smith }
7655c6c1daeSBarry Smith 
7665c6c1daeSBarry Smith #undef __FUNCT__
7672bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII"
7682bf49c77SBarry Smith PetscErrorCode  PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer)
7692bf49c77SBarry Smith {
7702bf49c77SBarry Smith   PetscErrorCode    ierr;
7712bf49c77SBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data;
7722bf49c77SBarry Smith 
7732bf49c77SBarry Smith   PetscFunctionBegin;
7742bf49c77SBarry Smith   if (ascii->filename) {
7752bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr);
7762bf49c77SBarry Smith   }
7772bf49c77SBarry Smith   PetscFunctionReturn(0);
7782bf49c77SBarry Smith }
7792bf49c77SBarry Smith 
7805c6c1daeSBarry Smith #undef __FUNCT__
7815c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII"
7828cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer)
7835c6c1daeSBarry Smith {
7845c6c1daeSBarry Smith   PetscViewer_ASCII *vascii;
7855c6c1daeSBarry Smith   PetscErrorCode    ierr;
7865c6c1daeSBarry Smith 
7875c6c1daeSBarry Smith   PetscFunctionBegin;
788b00a9115SJed Brown   ierr         = PetscNewLog(viewer,&vascii);CHKERRQ(ierr);
7895c6c1daeSBarry Smith   viewer->data = (void*)vascii;
7905c6c1daeSBarry Smith 
7915c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_ASCII;
7925c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_ASCII;
793*3f08860eSBarry Smith   viewer->ops->getsubcomm       = PetscViewerGetSubViewer_ASCII;
794*3f08860eSBarry Smith   viewer->ops->restoresubcomm   = PetscViewerRestoreSubViewer_ASCII;
7952bf49c77SBarry Smith   viewer->ops->view             = PetscViewerView_ASCII;
7961d641e7bSMichael Lange   viewer->ops->read             = PetscViewerASCIIRead;
7975c6c1daeSBarry Smith 
7985c6c1daeSBarry Smith   /* defaults to stdout unless set with PetscViewerFileSetName() */
7995c6c1daeSBarry Smith   vascii->fd        = PETSC_STDOUT;
8005c6c1daeSBarry Smith   vascii->mode      = FILE_MODE_WRITE;
8015c6c1daeSBarry Smith   vascii->bviewer   = 0;
802dd2fa690SBarry Smith   vascii->subviewer = 0;
8035c6c1daeSBarry Smith   vascii->sviewer   = 0;
8045c6c1daeSBarry Smith   vascii->tab       = 0;
8055c6c1daeSBarry Smith   vascii->tab_store = 0;
8065c6c1daeSBarry Smith   vascii->filename  = 0;
8075c6c1daeSBarry Smith   vascii->closefile = PETSC_TRUE;
8085c6c1daeSBarry Smith 
809bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr);
810bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr);
811bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr);
812bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr);
8135c6c1daeSBarry Smith   PetscFunctionReturn(0);
8145c6c1daeSBarry Smith }
8155c6c1daeSBarry Smith 
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith #undef __FUNCT__
8185c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedPrintf"
8195c6c1daeSBarry Smith /*@C
8205c6c1daeSBarry Smith     PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from
8215c6c1daeSBarry Smith     several processors.  Output of the first processor is followed by that of the
8225c6c1daeSBarry Smith     second, etc.
8235c6c1daeSBarry Smith 
8245c6c1daeSBarry Smith     Not Collective, must call collective PetscViewerFlush() to get the results out
8255c6c1daeSBarry Smith 
8265c6c1daeSBarry Smith     Input Parameters:
8275c6c1daeSBarry Smith +   viewer - the ASCII PetscViewer
8285c6c1daeSBarry Smith -   format - the usual printf() format string
8295c6c1daeSBarry Smith 
8305c6c1daeSBarry Smith     Level: intermediate
8315c6c1daeSBarry Smith 
8325c6c1daeSBarry Smith     Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called.
8335c6c1daeSBarry Smith 
8345c6c1daeSBarry Smith     Fortran Note:
8355c6c1daeSBarry Smith       Can only print a single character* string
8365c6c1daeSBarry Smith 
8375c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(),
8385c6c1daeSBarry Smith           PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(),
8395c6c1daeSBarry Smith           PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedAllow()
8405c6c1daeSBarry Smith 
8415c6c1daeSBarry Smith @*/
8425c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...)
8435c6c1daeSBarry Smith {
8445c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
8455c6c1daeSBarry Smith   PetscErrorCode    ierr;
846*3f08860eSBarry Smith   PetscMPIInt       rank;
8475c6c1daeSBarry Smith   PetscInt          tab = vascii->tab;
8485c6c1daeSBarry Smith   MPI_Comm          comm;
8495c6c1daeSBarry Smith   FILE              *fp;
8505c6c1daeSBarry Smith   PetscBool         iascii;
8515c6c1daeSBarry Smith   int               err;
8525c6c1daeSBarry Smith 
8535c6c1daeSBarry Smith   PetscFunctionBegin;
8545c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
8555c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
8565c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
8575c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
858*3f08860eSBarry Smith   if (!vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIISynchronizedAllow() to allow this call");
8595c6c1daeSBarry Smith 
860ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
8615c6c1daeSBarry Smith   fp   = vascii->fd;
8625c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
8635c6c1daeSBarry Smith 
864*3f08860eSBarry Smith   if (ascii->bviewer) { /* pass string up to parent viewer */
865*3f08860eSBarry Smith 
866*3f08860eSBarry Smith   } else if (!rank) {   /* First processor prints immediately to fp */
8675c6c1daeSBarry Smith     va_list Argp;
8685c6c1daeSBarry Smith 
869a297a907SKarl Rupp     while (tab--) {
870a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fp,"  ");CHKERRQ(ierr);
871a297a907SKarl Rupp     }
8725c6c1daeSBarry Smith 
8735c6c1daeSBarry Smith     va_start(Argp,format);
8745c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr);
8755c6c1daeSBarry Smith     err  = fflush(fp);
8765c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
8775c6c1daeSBarry Smith     if (petsc_history) {
8785c6c1daeSBarry Smith       va_start(Argp,format);
8795c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
8805c6c1daeSBarry Smith       err  = fflush(petsc_history);
8815c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
8825c6c1daeSBarry Smith     }
8835c6c1daeSBarry Smith     va_end(Argp);
8845c6c1daeSBarry Smith   } else { /* other processors add to local queue */
8855c6c1daeSBarry Smith     char        *string;
8865c6c1daeSBarry Smith     va_list     Argp;
8875c6c1daeSBarry Smith     size_t      fullLength;
8885c6c1daeSBarry Smith     PrintfQueue next;
8895c6c1daeSBarry Smith 
890b00a9115SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
891a297a907SKarl Rupp     if (petsc_printfqueue) {
892a297a907SKarl Rupp       petsc_printfqueue->next = next;
893a297a907SKarl Rupp       petsc_printfqueue       = next;
894a297a907SKarl Rupp     } else {
895a297a907SKarl Rupp       petsc_printfqueuebase = petsc_printfqueue = next;
896a297a907SKarl Rupp     }
8975c6c1daeSBarry Smith     petsc_printfqueuelength++;
8985c6c1daeSBarry Smith     next->size = QUEUESTRINGSIZE;
899785e854fSJed Brown     ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
9005c6c1daeSBarry Smith     ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
9015c6c1daeSBarry Smith     string     = next->string;
9025c6c1daeSBarry Smith     tab       *= 2;
903a297a907SKarl Rupp     while (tab--) {
904a297a907SKarl Rupp       *string++ = ' ';
905a297a907SKarl Rupp     }
9065c6c1daeSBarry Smith     va_start(Argp,format);
90722d28d08SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
9085c6c1daeSBarry Smith     va_end(Argp);
9095c6c1daeSBarry Smith   }
9105c6c1daeSBarry Smith   PetscFunctionReturn(0);
9115c6c1daeSBarry Smith }
9125c6c1daeSBarry Smith 
9132655f987SMichael Lange #undef __FUNCT__
9142655f987SMichael Lange #define __FUNCT__ "PetscViewerASCIIRead"
9152655f987SMichael Lange /*@C
9162655f987SMichael Lange    PetscViewerASCIIRead - Reads from am ASCII file
9172655f987SMichael Lange 
9182655f987SMichael Lange    Collective on MPI_Comm
9192655f987SMichael Lange 
9202655f987SMichael Lange    Input Parameters:
9212655f987SMichael Lange +  viewer - the ascii viewer
9222655f987SMichael Lange .  data - location to write the data
923060da220SMatthew G. Knepley .  num - number of items of data to read
9242655f987SMichael Lange -  datatype - type of data to read
9252655f987SMichael Lange 
926f8e4bde8SMatthew G. Knepley    Output Parameters:
927060da220SMatthew G. Knepley .  count - number of items of data actually read, or NULL
928f8e4bde8SMatthew G. Knepley 
9292655f987SMichael Lange    Level: beginner
9302655f987SMichael Lange 
9312655f987SMichael Lange    Concepts: ascii files
9322655f987SMichael Lange 
9332655f987SMichael Lange .seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(),
9342655f987SMichael Lange           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
9352655f987SMichael Lange           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
9362655f987SMichael Lange @*/
937060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype)
9382655f987SMichael Lange {
9392655f987SMichael Lange   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
9402655f987SMichael Lange   FILE              *fd = vascii->fd;
9412655f987SMichael Lange   PetscInt           i;
9423b7fe8c3SMatthew G. Knepley   int                ret = 0;
9432655f987SMichael Lange 
9442655f987SMichael Lange   PetscFunctionBegin;
9452655f987SMichael Lange   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
946060da220SMatthew G. Knepley   for (i=0; i<num; i++) {
947f8e4bde8SMatthew G. Knepley     if (dtype == PETSC_CHAR)         ret = fscanf(fd, "%c",  &(((char*)data)[i]));
948f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_STRING)  ret = fscanf(fd, "%s",  &(((char*)data)[i]));
949b9eae255SMichael Lange #if PETSC_USE_64BIT_INDICES
9500a3e67a1SMichael Lange #if (PETSC_SIZEOF_LONG_LONG == 8)
951f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%ld",  &(((PetscInt*)data)[i]));
9520a3e67a1SMichael Lange #else
953f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%lld",  &(((PetscInt*)data)[i]));
9540a3e67a1SMichael Lange #endif
955b9eae255SMichael Lange #else
956f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%d",  &(((PetscInt*)data)[i]));
957b9eae255SMichael Lange #endif
958f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_ENUM)    ret = fscanf(fd, "%d",  &(((int*)data)[i]));
959f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_FLOAT)   ret = fscanf(fd, "%f",  &(((float*)data)[i]));
960f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_DOUBLE)  ret = fscanf(fd, "%lg", &(((double*)data)[i]));
961f8e4bde8SMatthew G. Knepley     else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);}
962f8e4bde8SMatthew G. Knepley     if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype);
963f8e4bde8SMatthew G. Knepley     else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */
9642655f987SMichael Lange   }
965060da220SMatthew G. Knepley   if (count) *count = i;
966060da220SMatthew G. Knepley   else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num);
9672655f987SMichael Lange   PetscFunctionReturn(0);
9682655f987SMichael Lange }
9695c6c1daeSBarry Smith 
970