xref: /petsc/src/sys/classes/viewer/impls/ascii/filev.c (revision 14416c0e5074abb147e16b55117fe92cd0cc8d23)
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 static PetscErrorCode PetscViewerFileClose_ASCII(PetscViewer viewer)
75c6c1daeSBarry Smith {
85c6c1daeSBarry Smith   PetscErrorCode    ierr;
95c6c1daeSBarry Smith   PetscMPIInt       rank;
105c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
115c6c1daeSBarry Smith   int               err;
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith   PetscFunctionBegin;
14ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
155c6c1daeSBarry Smith   if (!rank && vascii->fd != stderr && vascii->fd != PETSC_STDOUT) {
165c6c1daeSBarry Smith     if (vascii->fd && vascii->closefile) {
175c6c1daeSBarry Smith       err = fclose(vascii->fd);
185c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file");
195c6c1daeSBarry Smith     }
205c6c1daeSBarry Smith     if (vascii->storecompressed) {
215c6c1daeSBarry Smith       char par[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN];
225c6c1daeSBarry Smith       FILE *fp;
23a126751eSBarry Smith       ierr = PetscStrncpy(par,"gzip ",sizeof(par));CHKERRQ(ierr);
24a126751eSBarry Smith       ierr = PetscStrlcat(par,vascii->filename,sizeof(par));CHKERRQ(ierr);
255c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN)
260298fd71SBarry Smith       ierr = PetscPOpen(PETSC_COMM_SELF,NULL,par,"r",&fp);CHKERRQ(ierr);
27f23aa3ddSBarry Smith       if (fgets(buf,1024,fp)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from compression command %s\n%s",par,buf);
28016831caSBarry Smith       ierr = PetscPClose(PETSC_COMM_SELF,fp);CHKERRQ(ierr);
295c6c1daeSBarry Smith #else
305c6c1daeSBarry Smith       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine");
315c6c1daeSBarry Smith #endif
325c6c1daeSBarry Smith     }
335c6c1daeSBarry Smith   }
345c6c1daeSBarry Smith   ierr = PetscFree(vascii->filename);CHKERRQ(ierr);
355c6c1daeSBarry Smith   PetscFunctionReturn(0);
365c6c1daeSBarry Smith }
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith /* ----------------------------------------------------------------------*/
395c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII(PetscViewer viewer)
405c6c1daeSBarry Smith {
415c6c1daeSBarry Smith   PetscErrorCode    ierr;
425c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
435c6c1daeSBarry Smith   PetscViewerLink   *vlink;
445c6c1daeSBarry Smith   PetscBool         flg;
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith   PetscFunctionBegin;
475c6c1daeSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"ASCII PetscViewer destroyed before restoring singleton or subcomm PetscViewer");
485c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
495c6c1daeSBarry Smith   ierr = PetscFree(vascii);CHKERRQ(ierr);
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith   /* remove the viewer from the list in the MPI Communicator */
525c6c1daeSBarry Smith   if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) {
5312801b39SBarry Smith     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);CHKERRQ(ierr);
545c6c1daeSBarry Smith   }
555c6c1daeSBarry Smith 
5647435625SJed Brown   ierr = MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr);
575c6c1daeSBarry Smith   if (flg) {
585c6c1daeSBarry Smith     if (vlink && vlink->viewer == viewer) {
59e5840a18SBarry Smith       if (vlink->next) {
6047435625SJed Brown         ierr = MPI_Comm_set_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr);
61e5840a18SBarry Smith       } else {
6247435625SJed Brown         ierr = MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval);CHKERRQ(ierr);
63e5840a18SBarry Smith       }
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   }
76aa139df6SJed Brown 
77aa139df6SJed Brown   if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) {
78aa139df6SJed Brown     PetscViewer aviewer;
7947435625SJed Brown     ierr = MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stdout_keyval,(void**)&aviewer,(PetscMPIInt*)&flg);CHKERRQ(ierr);
80aa139df6SJed Brown     if (flg && aviewer == viewer) {
8147435625SJed Brown       ierr = MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stdout_keyval);CHKERRQ(ierr);
82aa139df6SJed Brown     }
83aa139df6SJed Brown   }
84aa139df6SJed Brown   if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) {
85aa139df6SJed Brown     PetscViewer aviewer;
8647435625SJed Brown     ierr = MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stderr_keyval,(void**)&aviewer,(PetscMPIInt*)&flg);CHKERRQ(ierr);
87aa139df6SJed Brown     if (flg && aviewer == viewer) {
8847435625SJed Brown       ierr = MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stderr_keyval);CHKERRQ(ierr);
89aa139df6SJed Brown     }
90aa139df6SJed Brown   }
915c6c1daeSBarry Smith   PetscFunctionReturn(0);
925c6c1daeSBarry Smith }
935c6c1daeSBarry Smith 
943f08860eSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_SubViewer(PetscViewer viewer)
955c6c1daeSBarry Smith {
965c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
975c6c1daeSBarry Smith   PetscErrorCode    ierr;
985fd66863SKarl Rupp 
995c6c1daeSBarry Smith   PetscFunctionBegin;
1003f08860eSBarry Smith   ierr = PetscViewerRestoreSubViewer(vascii->bviewer,0,&viewer);CHKERRQ(ierr);
1015c6c1daeSBarry Smith   PetscFunctionReturn(0);
1025c6c1daeSBarry Smith }
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer)
1055c6c1daeSBarry Smith {
1065c6c1daeSBarry Smith   PetscErrorCode    ierr;
1075c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
1085c6c1daeSBarry Smith   int               err;
109559f443fSBarry Smith   MPI_Comm          comm;
110559f443fSBarry Smith   PetscMPIInt       rank,size;
111559f443fSBarry Smith   FILE              *fd = vascii->fd;
1125c6c1daeSBarry Smith 
1135c6c1daeSBarry Smith   PetscFunctionBegin;
114559f443fSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
115559f443fSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
116559f443fSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
117559f443fSBarry Smith 
118559f443fSBarry Smith   if (!vascii->bviewer && !rank && (vascii->mode != FILE_MODE_READ)) {
1195c6c1daeSBarry Smith     err = fflush(vascii->fd);
1205c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed");
1215c6c1daeSBarry Smith   }
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith   if (vascii->allowsynchronized) {
124559f443fSBarry Smith     PetscMPIInt   tag,i,j,n = 0,dummy = 0;
125559f443fSBarry Smith     char          *message;
126559f443fSBarry Smith     MPI_Status    status;
127559f443fSBarry Smith 
128559f443fSBarry Smith     ierr = PetscCommDuplicate(comm,&comm,&tag);CHKERRQ(ierr);
129559f443fSBarry Smith 
130559f443fSBarry Smith     /* First processor waits for messages from all other processors */
131559f443fSBarry Smith     if (!rank) {
132559f443fSBarry Smith       /* flush my own messages that I may have queued up */
133559f443fSBarry Smith       PrintfQueue next = vascii->petsc_printfqueuebase,previous;
134559f443fSBarry Smith       for (i=0; i<vascii->petsc_printfqueuelength; i++) {
135559f443fSBarry Smith         if (!vascii->bviewer) {
136559f443fSBarry Smith           ierr = PetscFPrintf(comm,fd,"%s",next->string);CHKERRQ(ierr);
137559f443fSBarry Smith         } else {
138559f443fSBarry Smith           ierr = PetscViewerASCIISynchronizedPrintf(vascii->bviewer,"%s",next->string);CHKERRQ(ierr);
139559f443fSBarry Smith         }
140559f443fSBarry Smith         previous = next;
141559f443fSBarry Smith         next     = next->next;
142559f443fSBarry Smith         ierr     = PetscFree(previous->string);CHKERRQ(ierr);
143559f443fSBarry Smith         ierr     = PetscFree(previous);CHKERRQ(ierr);
144559f443fSBarry Smith       }
145559f443fSBarry Smith       vascii->petsc_printfqueue       = 0;
146559f443fSBarry Smith       vascii->petsc_printfqueuelength = 0;
147559f443fSBarry Smith       for (i=1; i<size; i++) {
148559f443fSBarry Smith         /* to prevent a flood of messages to process zero, request each message separately */
149559f443fSBarry Smith         ierr = MPI_Send(&dummy,1,MPI_INT,i,tag,comm);CHKERRQ(ierr);
150559f443fSBarry Smith         ierr = MPI_Recv(&n,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr);
151559f443fSBarry Smith         for (j=0; j<n; j++) {
152559f443fSBarry Smith           PetscMPIInt size = 0;
153559f443fSBarry Smith 
154559f443fSBarry Smith           ierr = MPI_Recv(&size,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr);
155559f443fSBarry Smith           ierr = PetscMalloc1(size, &message);CHKERRQ(ierr);
156559f443fSBarry Smith           ierr = MPI_Recv(message,size,MPI_CHAR,i,tag,comm,&status);CHKERRQ(ierr);
157559f443fSBarry Smith           if (!vascii->bviewer) {
158559f443fSBarry Smith             ierr = PetscFPrintf(comm,fd,"%s",message);CHKERRQ(ierr);
159559f443fSBarry Smith           } else {
160559f443fSBarry Smith             ierr = PetscViewerASCIISynchronizedPrintf(vascii->bviewer,"%s",message);CHKERRQ(ierr);
161559f443fSBarry Smith           }
162559f443fSBarry Smith           ierr = PetscFree(message);CHKERRQ(ierr);
163559f443fSBarry Smith         }
164559f443fSBarry Smith       }
165559f443fSBarry Smith     } else { /* other processors send queue to processor 0 */
166559f443fSBarry Smith       PrintfQueue next = vascii->petsc_printfqueuebase,previous;
167559f443fSBarry Smith 
168559f443fSBarry Smith       ierr = MPI_Recv(&dummy,1,MPI_INT,0,tag,comm,&status);CHKERRQ(ierr);
169559f443fSBarry Smith       ierr = MPI_Send(&vascii->petsc_printfqueuelength,1,MPI_INT,0,tag,comm);CHKERRQ(ierr);
170559f443fSBarry Smith       for (i=0; i<vascii->petsc_printfqueuelength; i++) {
171559f443fSBarry Smith         ierr     = MPI_Send(&next->size,1,MPI_INT,0,tag,comm);CHKERRQ(ierr);
172559f443fSBarry Smith         ierr     = MPI_Send(next->string,next->size,MPI_CHAR,0,tag,comm);CHKERRQ(ierr);
173559f443fSBarry Smith         previous = next;
174559f443fSBarry Smith         next     = next->next;
175559f443fSBarry Smith         ierr     = PetscFree(previous->string);CHKERRQ(ierr);
176559f443fSBarry Smith         ierr     = PetscFree(previous);CHKERRQ(ierr);
177559f443fSBarry Smith       }
178559f443fSBarry Smith       vascii->petsc_printfqueue       = 0;
179559f443fSBarry Smith       vascii->petsc_printfqueuelength = 0;
180559f443fSBarry Smith     }
181559f443fSBarry Smith     ierr = PetscCommDestroy(&comm);CHKERRQ(ierr);
1825c6c1daeSBarry Smith   }
1835c6c1daeSBarry Smith   PetscFunctionReturn(0);
1845c6c1daeSBarry Smith }
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith /*@C
1875c6c1daeSBarry Smith     PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer.
1885c6c1daeSBarry Smith 
1895c6c1daeSBarry Smith     Not Collective
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith +   viewer - PetscViewer context, obtained from PetscViewerASCIIOpen()
1925c6c1daeSBarry Smith -   fd - file pointer
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith     Level: intermediate
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith     Fortran Note:
1975c6c1daeSBarry Smith     This routine is not supported in Fortran.
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith   Concepts: PetscViewer^file pointer
2005c6c1daeSBarry Smith   Concepts: file pointer^getting from PetscViewer
2015c6c1daeSBarry Smith 
2025c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(),
2035c6c1daeSBarry Smith           PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush()
2045c6c1daeSBarry Smith @*/
2055c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd)
2065c6c1daeSBarry Smith {
2075c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith   PetscFunctionBegin;
2105c6c1daeSBarry Smith   *fd = vascii->fd;
2115c6c1daeSBarry Smith   PetscFunctionReturn(0);
2125c6c1daeSBarry Smith }
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode)
2155c6c1daeSBarry Smith {
2165c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2175c6c1daeSBarry Smith 
2185c6c1daeSBarry Smith   PetscFunctionBegin;
2195c6c1daeSBarry Smith   *mode = vascii->mode;
2205c6c1daeSBarry Smith   PetscFunctionReturn(0);
2215c6c1daeSBarry Smith }
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode)
2245c6c1daeSBarry Smith {
2255c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith   PetscFunctionBegin;
2285c6c1daeSBarry Smith   vascii->mode = mode;
2295c6c1daeSBarry Smith   PetscFunctionReturn(0);
2305c6c1daeSBarry Smith }
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith /*
2335c6c1daeSBarry Smith    If petsc_history is on, then all Petsc*Printf() results are saved
2345c6c1daeSBarry Smith    if the appropriate (usually .petschistory) file.
2355c6c1daeSBarry Smith */
2365c6c1daeSBarry Smith extern FILE *petsc_history;
2375c6c1daeSBarry Smith 
2385c6c1daeSBarry Smith /*@
2395c6c1daeSBarry Smith     PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith     Input Parameters:
2441575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
2455c6c1daeSBarry Smith -    tabs - number of tabs
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith     Level: developer
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith     Fortran Note:
2505c6c1daeSBarry Smith     This routine is not supported in Fortran.
2515c6c1daeSBarry Smith 
2525c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2535c6c1daeSBarry Smith   Concepts: tab^setting
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(),
2565c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2575c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2585c6c1daeSBarry Smith @*/
2595c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs)
2605c6c1daeSBarry Smith {
2615c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2625c6c1daeSBarry Smith   PetscBool         iascii;
2635c6c1daeSBarry Smith   PetscErrorCode    ierr;
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith   PetscFunctionBegin;
2665c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2675c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
268a297a907SKarl Rupp   if (iascii) ascii->tab = tabs;
2695c6c1daeSBarry Smith   PetscFunctionReturn(0);
2705c6c1daeSBarry Smith }
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith /*@
2735c6c1daeSBarry Smith     PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer.
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith     Not Collective, meaningful on first processor only.
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith     Input Parameters:
2781575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
2795c6c1daeSBarry Smith     Output Parameters:
2805c6c1daeSBarry Smith .    tabs - number of tabs
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith     Level: developer
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith     Fortran Note:
2855c6c1daeSBarry Smith     This routine is not supported in Fortran.
2865c6c1daeSBarry Smith 
2875c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2885c6c1daeSBarry Smith   Concepts: tab^retrieval
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(),
2915c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2925c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2935c6c1daeSBarry Smith @*/
2945c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs)
2955c6c1daeSBarry Smith {
2965c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2975c6c1daeSBarry Smith   PetscBool         iascii;
2985c6c1daeSBarry Smith   PetscErrorCode    ierr;
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith   PetscFunctionBegin;
3015c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3025c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
303a297a907SKarl Rupp   if (iascii && tabs) *tabs = ascii->tab;
3045c6c1daeSBarry Smith   PetscFunctionReturn(0);
3055c6c1daeSBarry Smith }
3065c6c1daeSBarry Smith 
3075c6c1daeSBarry Smith /*@
3085c6c1daeSBarry Smith     PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith     Input Parameters:
3131575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
3145c6c1daeSBarry Smith -    tabs - number of tabs
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith     Level: developer
3175c6c1daeSBarry Smith 
3185c6c1daeSBarry Smith     Fortran Note:
3195c6c1daeSBarry Smith     This routine is not supported in Fortran.
3205c6c1daeSBarry Smith 
3215c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3225c6c1daeSBarry Smith   Concepts: tab^setting
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3255c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3265c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3275c6c1daeSBarry Smith @*/
3285c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs)
3295c6c1daeSBarry Smith {
3305c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3315c6c1daeSBarry Smith   PetscBool         iascii;
3325c6c1daeSBarry Smith   PetscErrorCode    ierr;
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith   PetscFunctionBegin;
3355c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3365c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
337a297a907SKarl Rupp   if (iascii) ascii->tab += tabs;
3385c6c1daeSBarry Smith   PetscFunctionReturn(0);
3395c6c1daeSBarry Smith }
3405c6c1daeSBarry Smith 
3415c6c1daeSBarry Smith /*@
3425c6c1daeSBarry Smith     PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith     Input Parameters:
3471575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
3485c6c1daeSBarry Smith -    tabs - number of tabs
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith     Level: developer
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith     Fortran Note:
3535c6c1daeSBarry Smith     This routine is not supported in Fortran.
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3565c6c1daeSBarry Smith   Concepts: tab^setting
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3595c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3605c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3615c6c1daeSBarry Smith @*/
3625c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs)
3635c6c1daeSBarry Smith {
3645c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3655c6c1daeSBarry Smith   PetscBool         iascii;
3665c6c1daeSBarry Smith   PetscErrorCode    ierr;
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith   PetscFunctionBegin;
3695c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3705c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
371a297a907SKarl Rupp   if (iascii) ascii->tab -= tabs;
3725c6c1daeSBarry Smith   PetscFunctionReturn(0);
3735c6c1daeSBarry Smith }
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith /*@C
3761575c14dSBarry Smith     PetscViewerASCIIPushSynchronized - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith     Collective on PetscViewer
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith     Input Parameters:
3811575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith     Level: intermediate
3845c6c1daeSBarry Smith 
3855c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3865c6c1daeSBarry Smith   Concepts: tab^setting
3875c6c1daeSBarry Smith 
3881575c14dSBarry Smith .seealso: PetscViewerASCIIPopSynchronized(), PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3895c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3905c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
3915c6c1daeSBarry Smith @*/
3921575c14dSBarry Smith PetscErrorCode  PetscViewerASCIIPushSynchronized(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);
4011575c14dSBarry Smith   if (iascii) ascii->allowsynchronized++;
4021575c14dSBarry Smith   PetscFunctionReturn(0);
4031575c14dSBarry Smith }
4041575c14dSBarry Smith 
4051575c14dSBarry Smith /*@C
4061575c14dSBarry Smith     PetscViewerASCIIPopSynchronized - Undoes most recent PetscViewerASCIIPushSynchronized() for this viewer
4071575c14dSBarry Smith 
4081575c14dSBarry Smith     Collective on PetscViewer
4091575c14dSBarry Smith 
4101575c14dSBarry Smith     Input Parameters:
4111575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
4121575c14dSBarry Smith 
4131575c14dSBarry Smith     Level: intermediate
4141575c14dSBarry Smith 
4151575c14dSBarry Smith   Concepts: PetscViewerASCII^formating
4161575c14dSBarry Smith   Concepts: tab^setting
4171575c14dSBarry Smith 
4181575c14dSBarry Smith .seealso: PetscViewerASCIIPushSynchronized(), PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4191575c14dSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4201575c14dSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4211575c14dSBarry Smith @*/
4221575c14dSBarry Smith PetscErrorCode  PetscViewerASCIIPopSynchronized(PetscViewer viewer)
4231575c14dSBarry Smith {
4241575c14dSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4251575c14dSBarry Smith   PetscBool         iascii;
4261575c14dSBarry Smith   PetscErrorCode    ierr;
4271575c14dSBarry Smith 
4281575c14dSBarry Smith   PetscFunctionBegin;
4291575c14dSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4301575c14dSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4311575c14dSBarry Smith   if (iascii) {
4321575c14dSBarry Smith     ascii->allowsynchronized--;
4331575c14dSBarry Smith     if (ascii->allowsynchronized < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Called more times than PetscViewerASCIIPushSynchronized()");
4341575c14dSBarry Smith   }
4355c6c1daeSBarry Smith   PetscFunctionReturn(0);
4365c6c1daeSBarry Smith }
4375c6c1daeSBarry Smith 
4381c297824SMatthew G. Knepley /*@C
4395c6c1daeSBarry Smith     PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf()
4405c6c1daeSBarry Smith      lines are tabbed.
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4435c6c1daeSBarry Smith 
4445c6c1daeSBarry Smith     Input Parameters:
4451575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
4465c6c1daeSBarry Smith 
4475c6c1daeSBarry Smith     Level: developer
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith     Fortran Note:
4505c6c1daeSBarry Smith     This routine is not supported in Fortran.
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4535c6c1daeSBarry Smith   Concepts: tab^setting
4545c6c1daeSBarry Smith 
4555c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4565c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4575c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4585c6c1daeSBarry Smith @*/
4595c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPushTab(PetscViewer viewer)
4605c6c1daeSBarry Smith {
4615c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4625c6c1daeSBarry Smith   PetscBool         iascii;
4635c6c1daeSBarry Smith   PetscErrorCode    ierr;
4645c6c1daeSBarry Smith 
4655c6c1daeSBarry Smith   PetscFunctionBegin;
4665c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4675c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
468a297a907SKarl Rupp   if (iascii) ascii->tab++;
4695c6c1daeSBarry Smith   PetscFunctionReturn(0);
4705c6c1daeSBarry Smith }
4715c6c1daeSBarry Smith 
4721c297824SMatthew G. Knepley /*@C
4735c6c1daeSBarry Smith     PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf()
4745c6c1daeSBarry Smith      lines are tabbed.
4755c6c1daeSBarry Smith 
4765c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4775c6c1daeSBarry Smith 
4785c6c1daeSBarry Smith     Input Parameters:
4791575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith     Level: developer
4825c6c1daeSBarry Smith 
4835c6c1daeSBarry Smith     Fortran Note:
4845c6c1daeSBarry Smith     This routine is not supported in Fortran.
4855c6c1daeSBarry Smith 
4865c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4875c6c1daeSBarry Smith   Concepts: tab^setting
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4905c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4915c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4925c6c1daeSBarry Smith @*/
4935c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPopTab(PetscViewer viewer)
4945c6c1daeSBarry Smith {
4955c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4965c6c1daeSBarry Smith   PetscErrorCode    ierr;
4975c6c1daeSBarry Smith   PetscBool         iascii;
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith   PetscFunctionBegin;
5005c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5015c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5025c6c1daeSBarry Smith   if (iascii) {
5035c6c1daeSBarry Smith     if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed");
5045c6c1daeSBarry Smith     ascii->tab--;
5055c6c1daeSBarry Smith   }
5065c6c1daeSBarry Smith   PetscFunctionReturn(0);
5075c6c1daeSBarry Smith }
5085c6c1daeSBarry Smith 
5095c6c1daeSBarry Smith /*@
5105c6c1daeSBarry Smith     PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer
5115c6c1daeSBarry Smith 
5125c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5135c6c1daeSBarry Smith 
5145c6c1daeSBarry Smith     Input Parameters:
5151575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
5165c6c1daeSBarry Smith -    flg - PETSC_TRUE or PETSC_FALSE
5175c6c1daeSBarry Smith 
5185c6c1daeSBarry Smith     Level: developer
5195c6c1daeSBarry Smith 
5205c6c1daeSBarry Smith     Fortran Note:
5215c6c1daeSBarry Smith     This routine is not supported in Fortran.
5225c6c1daeSBarry Smith 
5235c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
5245c6c1daeSBarry Smith   Concepts: tab^setting
5255c6c1daeSBarry Smith 
5265c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
5275c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(),
5285c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
5295c6c1daeSBarry Smith @*/
5305c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg)
5315c6c1daeSBarry Smith {
5325c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5335c6c1daeSBarry Smith   PetscBool         iascii;
5345c6c1daeSBarry Smith   PetscErrorCode    ierr;
5355c6c1daeSBarry Smith 
5365c6c1daeSBarry Smith   PetscFunctionBegin;
5375c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5385c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5395c6c1daeSBarry Smith   if (iascii) {
540a297a907SKarl Rupp     if (flg) ascii->tab = ascii->tab_store;
541a297a907SKarl Rupp     else {
5425c6c1daeSBarry Smith       ascii->tab_store = ascii->tab;
5435c6c1daeSBarry Smith       ascii->tab       = 0;
5445c6c1daeSBarry Smith     }
5455c6c1daeSBarry Smith   }
5465c6c1daeSBarry Smith   PetscFunctionReturn(0);
5475c6c1daeSBarry Smith }
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */
5505c6c1daeSBarry Smith 
5515c6c1daeSBarry Smith 
5525c6c1daeSBarry Smith /*@C
5535c6c1daeSBarry Smith     PetscViewerASCIIPrintf - Prints to a file, only from the first
5545c6c1daeSBarry Smith     processor in the PetscViewer
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith     Input Parameters:
5591575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
5605c6c1daeSBarry Smith -    format - the usual printf() format string
5615c6c1daeSBarry Smith 
5625c6c1daeSBarry Smith     Level: developer
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith     Fortran Note:
5655c6c1daeSBarry Smith     The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran.
5665c6c1daeSBarry Smith     That is, you can only pass a single character string from Fortran.
5675c6c1daeSBarry Smith 
5685c6c1daeSBarry Smith   Concepts: PetscViewerASCII^printing
5695c6c1daeSBarry Smith   Concepts: printing^to file
5705c6c1daeSBarry Smith   Concepts: printf
5715c6c1daeSBarry Smith 
5725c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(),
5735c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(),
5741575c14dSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushSynchronized()
5755c6c1daeSBarry Smith @*/
5765c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...)
5775c6c1daeSBarry Smith {
5785c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5795c6c1daeSBarry Smith   PetscMPIInt       rank;
580dd2fa690SBarry Smith   PetscInt          tab,intab = ascii->tab;
5815c6c1daeSBarry Smith   PetscErrorCode    ierr;
5825c6c1daeSBarry Smith   FILE              *fd = ascii->fd;
5833f08860eSBarry Smith   PetscBool         iascii;
5845c6c1daeSBarry Smith   int               err;
5855c6c1daeSBarry Smith 
5865c6c1daeSBarry Smith   PetscFunctionBegin;
5875c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5885c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
5895c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5905c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
591ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
592559f443fSBarry Smith   if (rank) PetscFunctionReturn(0);
5933f08860eSBarry Smith 
5943f08860eSBarry Smith   if (ascii->bviewer) { /* pass string up to parent viewer */
5953f08860eSBarry Smith     char        *string;
5963f08860eSBarry Smith     va_list     Argp;
5973f08860eSBarry Smith     size_t      fullLength;
5983f08860eSBarry Smith 
5993f08860eSBarry Smith     ierr = PetscCalloc1(QUEUESTRINGSIZE, &string);CHKERRQ(ierr);
6003f08860eSBarry Smith     va_start(Argp,format);
6011575c14dSBarry Smith     ierr = PetscVSNPrintf(string,QUEUESTRINGSIZE,format,&fullLength,Argp);CHKERRQ(ierr);
6023f08860eSBarry Smith     va_end(Argp);
603559f443fSBarry Smith     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%s",string);CHKERRQ(ierr);
6043f08860eSBarry Smith     ierr = PetscFree(string);CHKERRQ(ierr);
6053f08860eSBarry Smith   } else { /* write directly to file */
6065c6c1daeSBarry Smith     va_list Argp;
607559f443fSBarry Smith     /* flush my own messages that I may have queued up */
608559f443fSBarry Smith     PrintfQueue next = ascii->petsc_printfqueuebase,previous;
609559f443fSBarry Smith     PetscInt    i;
610559f443fSBarry Smith     for (i=0; i<ascii->petsc_printfqueuelength; i++) {
611559f443fSBarry Smith       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"%s",next->string);CHKERRQ(ierr);
612559f443fSBarry Smith       previous = next;
613559f443fSBarry Smith       next     = next->next;
614559f443fSBarry Smith       ierr     = PetscFree(previous->string);CHKERRQ(ierr);
615559f443fSBarry Smith       ierr     = PetscFree(previous);CHKERRQ(ierr);
616559f443fSBarry Smith     }
617559f443fSBarry Smith     ascii->petsc_printfqueue       = 0;
618559f443fSBarry Smith     ascii->petsc_printfqueuelength = 0;
619dd2fa690SBarry Smith     tab = intab;
620a297a907SKarl Rupp     while (tab--) {
621a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
622a297a907SKarl Rupp     }
6235c6c1daeSBarry Smith 
6245c6c1daeSBarry Smith     va_start(Argp,format);
6255c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
6265c6c1daeSBarry Smith     err  = fflush(fd);
6275c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6285c6c1daeSBarry Smith     if (petsc_history) {
6295c6c1daeSBarry Smith       va_start(Argp,format);
630dd2fa690SBarry Smith       tab = intab;
631a297a907SKarl Rupp       while (tab--) {
632706d7a88SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history,"  ");CHKERRQ(ierr);
633a297a907SKarl Rupp       }
6345c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
6355c6c1daeSBarry Smith       err  = fflush(petsc_history);
6365c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6375c6c1daeSBarry Smith     }
6385c6c1daeSBarry Smith     va_end(Argp);
6395c6c1daeSBarry Smith   }
6405c6c1daeSBarry Smith   PetscFunctionReturn(0);
6415c6c1daeSBarry Smith }
6425c6c1daeSBarry Smith 
6435c6c1daeSBarry Smith /*@C
6445c6c1daeSBarry Smith      PetscViewerFileSetName - Sets the name of the file the PetscViewer uses.
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith     Collective on PetscViewer
6475c6c1daeSBarry Smith 
6485c6c1daeSBarry Smith   Input Parameters:
6495c6c1daeSBarry Smith +  viewer - the PetscViewer; either ASCII or binary
6505c6c1daeSBarry Smith -  name - the name of the file it should use
6515c6c1daeSBarry Smith 
6525c6c1daeSBarry Smith     Level: advanced
6535c6c1daeSBarry Smith 
6545c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(),
6555c6c1daeSBarry Smith           PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
6565c6c1daeSBarry Smith 
6575c6c1daeSBarry Smith @*/
6585c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName(PetscViewer viewer,const char name[])
6595c6c1daeSBarry Smith {
6605c6c1daeSBarry Smith   PetscErrorCode ierr;
6612fbecc10SBarry Smith   char           b[PETSC_MAX_PATH_LEN];
6625c6c1daeSBarry Smith 
6635c6c1daeSBarry Smith   PetscFunctionBegin;
6645c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6655c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
6662fbecc10SBarry Smith   ierr = PetscStrreplace(PetscObjectComm((PetscObject)viewer),name,b,sizeof(b));CHKERRQ(ierr);
6672fbecc10SBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,b));CHKERRQ(ierr);
6685c6c1daeSBarry Smith   PetscFunctionReturn(0);
6695c6c1daeSBarry Smith }
6705c6c1daeSBarry Smith 
6715c6c1daeSBarry Smith /*@C
6725c6c1daeSBarry Smith      PetscViewerFileGetName - Gets the name of the file the PetscViewer uses.
6735c6c1daeSBarry Smith 
6745c6c1daeSBarry Smith     Not Collective
6755c6c1daeSBarry Smith 
6765c6c1daeSBarry Smith   Input Parameter:
6775c6c1daeSBarry Smith .  viewer - the PetscViewer; either ASCII or binary
6785c6c1daeSBarry Smith 
6795c6c1daeSBarry Smith   Output Parameter:
6805c6c1daeSBarry Smith .  name - the name of the file it is using
6815c6c1daeSBarry Smith 
6825c6c1daeSBarry Smith     Level: advanced
6835c6c1daeSBarry Smith 
6845c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName()
6855c6c1daeSBarry Smith 
6865c6c1daeSBarry Smith @*/
6875c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName(PetscViewer viewer,const char **name)
6885c6c1daeSBarry Smith {
6895c6c1daeSBarry Smith   PetscErrorCode ierr;
6905c6c1daeSBarry Smith 
6915c6c1daeSBarry Smith   PetscFunctionBegin;
6925c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6936e05b1faSLisandro Dalcin   PetscValidPointer(name,2);
694163d334eSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr);
6955c6c1daeSBarry Smith   PetscFunctionReturn(0);
6965c6c1daeSBarry Smith }
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name)
6995c6c1daeSBarry Smith {
7005c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
7015c6c1daeSBarry Smith 
7025c6c1daeSBarry Smith   PetscFunctionBegin;
7035c6c1daeSBarry Smith   *name = vascii->filename;
7045c6c1daeSBarry Smith   PetscFunctionReturn(0);
7055c6c1daeSBarry Smith }
7065c6c1daeSBarry Smith 
7075c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[])
7085c6c1daeSBarry Smith {
7095c6c1daeSBarry Smith   PetscErrorCode    ierr;
7105c6c1daeSBarry Smith   size_t            len;
7115c6c1daeSBarry Smith   char              fname[PETSC_MAX_PATH_LEN],*gz;
7125c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
7135c6c1daeSBarry Smith   PetscBool         isstderr,isstdout;
7145c6c1daeSBarry Smith   PetscMPIInt       rank;
7155c6c1daeSBarry Smith 
7165c6c1daeSBarry Smith   PetscFunctionBegin;
7175c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
7185c6c1daeSBarry Smith   if (!name) PetscFunctionReturn(0);
7195c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr);
7205c6c1daeSBarry Smith 
7215c6c1daeSBarry Smith   /* Is this file to be compressed */
7225c6c1daeSBarry Smith   vascii->storecompressed = PETSC_FALSE;
723a297a907SKarl Rupp 
7245c6c1daeSBarry Smith   ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr);
7255c6c1daeSBarry Smith   if (gz) {
7265c6c1daeSBarry Smith     ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
7275c6c1daeSBarry Smith     if (len == 3) {
72808fb59bfSBarry Smith       if (vascii->mode != FILE_MODE_WRITE) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Cannot open ASCII PetscViewer file that is compressed; uncompress it manually first");
7295c6c1daeSBarry Smith       *gz = 0;
7305c6c1daeSBarry Smith       vascii->storecompressed = PETSC_TRUE;
7315c6c1daeSBarry Smith     }
7325c6c1daeSBarry Smith   }
733ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
7345c6c1daeSBarry Smith   if (!rank) {
7355c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr);
7365c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr);
7375c6c1daeSBarry Smith     /* empty filename means stdout */
7385c6c1daeSBarry Smith     if (name[0] == 0)  isstdout = PETSC_TRUE;
7395c6c1daeSBarry Smith     if (isstderr)      vascii->fd = PETSC_STDERR;
7405c6c1daeSBarry Smith     else if (isstdout) vascii->fd = PETSC_STDOUT;
7415c6c1daeSBarry Smith     else {
7425c6c1daeSBarry Smith 
7435c6c1daeSBarry Smith 
7445c6c1daeSBarry Smith       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
7455c6c1daeSBarry Smith       switch (vascii->mode) {
7465c6c1daeSBarry Smith       case FILE_MODE_READ:
7475c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r");
7485c6c1daeSBarry Smith         break;
7495c6c1daeSBarry Smith       case FILE_MODE_WRITE:
7505c6c1daeSBarry Smith         vascii->fd = fopen(fname,"w");
7515c6c1daeSBarry Smith         break;
7525c6c1daeSBarry Smith       case FILE_MODE_APPEND:
7535c6c1daeSBarry Smith         vascii->fd = fopen(fname,"a");
7545c6c1daeSBarry Smith         break;
7555c6c1daeSBarry Smith       case FILE_MODE_UPDATE:
7565c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
757a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
7585c6c1daeSBarry Smith         break;
7595c6c1daeSBarry Smith       case FILE_MODE_APPEND_UPDATE:
7605c6c1daeSBarry Smith         /* I really want a file which is opened at the end for updating,
7615c6c1daeSBarry Smith            not a+, which opens at the beginning, but makes writes at the end.
7625c6c1daeSBarry Smith         */
7635c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
764a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
765a297a907SKarl Rupp         else {
7665c6c1daeSBarry Smith           ierr     = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr);
7675c6c1daeSBarry Smith         }
7685c6c1daeSBarry Smith         break;
7695c6c1daeSBarry Smith       default:
7705c6c1daeSBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode);
7715c6c1daeSBarry Smith       }
7725c6c1daeSBarry Smith       if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname);
7735c6c1daeSBarry Smith     }
7745c6c1daeSBarry Smith   }
7755c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
7765c6c1daeSBarry Smith   PetscLogObjectState((PetscObject)viewer,"File: %s",name);
7775c6c1daeSBarry Smith #endif
7785c6c1daeSBarry Smith   PetscFunctionReturn(0);
7795c6c1daeSBarry Smith }
7805c6c1daeSBarry Smith 
7813f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
7825c6c1daeSBarry Smith {
7835c6c1daeSBarry Smith   PetscMPIInt       rank;
7845c6c1daeSBarry Smith   PetscErrorCode    ierr;
7855c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7865c6c1daeSBarry Smith 
7875c6c1daeSBarry Smith   PetscFunctionBegin;
7883f08860eSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer already obtained from PetscViewer and not restored");
7891575c14dSBarry Smith   ierr         = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
7903f08860eSBarry Smith   ierr         = PetscViewerCreate(subcomm,outviewer);CHKERRQ(ierr);
7915c6c1daeSBarry Smith   ierr         = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr);
7921575c14dSBarry Smith   ierr         = PetscViewerASCIIPushSynchronized(*outviewer);CHKERRQ(ierr);
7935c6c1daeSBarry Smith   ovascii      = (PetscViewer_ASCII*)(*outviewer)->data;
7945c6c1daeSBarry Smith   ovascii->fd  = vascii->fd;
7955c6c1daeSBarry Smith   ovascii->tab = vascii->tab;
796ba5a0b41SBarry Smith   ovascii->closefile = PETSC_FALSE;
7975c6c1daeSBarry Smith 
7985c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
7995c6c1daeSBarry Smith 
8005c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
8015c6c1daeSBarry Smith 
802ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
8035c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
8043f08860eSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer;
8055c6c1daeSBarry Smith   PetscFunctionReturn(0);
8065c6c1daeSBarry Smith }
8075c6c1daeSBarry Smith 
8083f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
8095c6c1daeSBarry Smith {
8105c6c1daeSBarry Smith   PetscErrorCode    ierr;
8115c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
8125c6c1daeSBarry Smith 
8135c6c1daeSBarry Smith   PetscFunctionBegin;
8141575c14dSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer never obtained from PetscViewer");
8151575c14dSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate this SubViewer");
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith   ascii->sviewer             = 0;
8185c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
8195c6c1daeSBarry Smith   ierr                       = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
8205c6c1daeSBarry Smith   PetscFunctionReturn(0);
8215c6c1daeSBarry Smith }
8225c6c1daeSBarry Smith 
8232bf49c77SBarry Smith PetscErrorCode  PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer)
8242bf49c77SBarry Smith {
8252bf49c77SBarry Smith   PetscErrorCode    ierr;
8262bf49c77SBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data;
8272bf49c77SBarry Smith 
8282bf49c77SBarry Smith   PetscFunctionBegin;
8292bf49c77SBarry Smith   if (ascii->filename) {
8302bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr);
8312bf49c77SBarry Smith   }
8322bf49c77SBarry Smith   PetscFunctionReturn(0);
8332bf49c77SBarry Smith }
8342bf49c77SBarry Smith 
8358556b5ebSBarry Smith /*MC
8368556b5ebSBarry Smith    PETSCVIEWERASCII - A viewer that prints to stdout or an ASCII file
8378556b5ebSBarry Smith 
8388556b5ebSBarry Smith 
8398556b5ebSBarry Smith .seealso:  PETSC_VIEWER_STDOUT_(),PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDOUT_WORLD,PetscViewerCreate(), PetscViewerASCIIOpen(),
8408556b5ebSBarry Smith            PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERBINARY, PETSCVIEWERMATLAB,
8418556b5ebSBarry Smith            PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType()
8428556b5ebSBarry Smith 
8431b266c99SBarry Smith   Level: beginner
8441b266c99SBarry Smith 
8458556b5ebSBarry Smith M*/
8468cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer)
8475c6c1daeSBarry Smith {
8485c6c1daeSBarry Smith   PetscViewer_ASCII *vascii;
8495c6c1daeSBarry Smith   PetscErrorCode    ierr;
8505c6c1daeSBarry Smith 
8515c6c1daeSBarry Smith   PetscFunctionBegin;
852b00a9115SJed Brown   ierr         = PetscNewLog(viewer,&vascii);CHKERRQ(ierr);
8535c6c1daeSBarry Smith   viewer->data = (void*)vascii;
8545c6c1daeSBarry Smith 
8555c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_ASCII;
8565c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_ASCII;
857559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_ASCII;
858559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_ASCII;
8592bf49c77SBarry Smith   viewer->ops->view             = PetscViewerView_ASCII;
8601d641e7bSMichael Lange   viewer->ops->read             = PetscViewerASCIIRead;
8615c6c1daeSBarry Smith 
8625c6c1daeSBarry Smith   /* defaults to stdout unless set with PetscViewerFileSetName() */
8635c6c1daeSBarry Smith   vascii->fd        = PETSC_STDOUT;
8645c6c1daeSBarry Smith   vascii->mode      = FILE_MODE_WRITE;
8655c6c1daeSBarry Smith   vascii->bviewer   = 0;
866dd2fa690SBarry Smith   vascii->subviewer = 0;
8675c6c1daeSBarry Smith   vascii->sviewer   = 0;
8685c6c1daeSBarry Smith   vascii->tab       = 0;
8695c6c1daeSBarry Smith   vascii->tab_store = 0;
8705c6c1daeSBarry Smith   vascii->filename  = 0;
8715c6c1daeSBarry Smith   vascii->closefile = PETSC_TRUE;
8725c6c1daeSBarry Smith 
873bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr);
874bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr);
875bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr);
876bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr);
8775c6c1daeSBarry Smith   PetscFunctionReturn(0);
8785c6c1daeSBarry Smith }
8795c6c1daeSBarry Smith 
8805c6c1daeSBarry Smith /*@C
8815c6c1daeSBarry Smith     PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from
8825c6c1daeSBarry Smith     several processors.  Output of the first processor is followed by that of the
8835c6c1daeSBarry Smith     second, etc.
8845c6c1daeSBarry Smith 
8855c6c1daeSBarry Smith     Not Collective, must call collective PetscViewerFlush() to get the results out
8865c6c1daeSBarry Smith 
8875c6c1daeSBarry Smith     Input Parameters:
8885c6c1daeSBarry Smith +   viewer - the ASCII PetscViewer
8895c6c1daeSBarry Smith -   format - the usual printf() format string
8905c6c1daeSBarry Smith 
8915c6c1daeSBarry Smith     Level: intermediate
8925c6c1daeSBarry Smith 
8935c6c1daeSBarry Smith     Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called.
8945c6c1daeSBarry Smith 
8955c6c1daeSBarry Smith     Fortran Note:
8965c6c1daeSBarry Smith       Can only print a single character* string
8975c6c1daeSBarry Smith 
8985c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(),
8995c6c1daeSBarry Smith           PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(),
9001575c14dSBarry Smith           PetscViewerASCIIPrintf(), PetscViewerASCIIPushSynchronized()
9015c6c1daeSBarry Smith 
9025c6c1daeSBarry Smith @*/
9035c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...)
9045c6c1daeSBarry Smith {
9055c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
9065c6c1daeSBarry Smith   PetscErrorCode    ierr;
9073f08860eSBarry Smith   PetscMPIInt       rank;
9085c6c1daeSBarry Smith   PetscInt          tab = vascii->tab;
9095c6c1daeSBarry Smith   MPI_Comm          comm;
9105c6c1daeSBarry Smith   FILE              *fp;
911559f443fSBarry Smith   PetscBool         iascii,hasbviewer = PETSC_FALSE;
9125c6c1daeSBarry Smith   int               err;
9135c6c1daeSBarry Smith 
9145c6c1daeSBarry Smith   PetscFunctionBegin;
9155c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
9165c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
9175c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9185c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
9191575c14dSBarry Smith   if (!vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIIPushSynchronized() to allow this call");
9205c6c1daeSBarry Smith 
921ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
9225c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
9235c6c1daeSBarry Smith 
924559f443fSBarry Smith   if (vascii->bviewer) {
925559f443fSBarry Smith     hasbviewer = PETSC_TRUE;
926559f443fSBarry Smith     if (!rank) {
927559f443fSBarry Smith       vascii = (PetscViewer_ASCII*)vascii->bviewer->data;
928559f443fSBarry Smith       ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
929559f443fSBarry Smith       ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
930559f443fSBarry Smith     }
931559f443fSBarry Smith   }
9323f08860eSBarry Smith 
933559f443fSBarry Smith   fp   = vascii->fd;
934559f443fSBarry Smith 
935559f443fSBarry Smith   if (!rank && !hasbviewer) {   /* First processor prints immediately to fp */
9365c6c1daeSBarry Smith     va_list Argp;
937559f443fSBarry Smith     /* flush my own messages that I may have queued up */
938559f443fSBarry Smith     PrintfQueue next = vascii->petsc_printfqueuebase,previous;
939559f443fSBarry Smith     PetscInt    i;
940559f443fSBarry Smith     for (i=0; i<vascii->petsc_printfqueuelength; i++) {
941559f443fSBarry Smith       ierr = PetscFPrintf(comm,fp,"%s",next->string);CHKERRQ(ierr);
942559f443fSBarry Smith       previous = next;
943559f443fSBarry Smith       next     = next->next;
944559f443fSBarry Smith       ierr     = PetscFree(previous->string);CHKERRQ(ierr);
945559f443fSBarry Smith       ierr     = PetscFree(previous);CHKERRQ(ierr);
946559f443fSBarry Smith     }
947559f443fSBarry Smith     vascii->petsc_printfqueue       = 0;
948559f443fSBarry Smith     vascii->petsc_printfqueuelength = 0;
9495c6c1daeSBarry Smith 
950a297a907SKarl Rupp     while (tab--) {
951a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fp,"  ");CHKERRQ(ierr);
952a297a907SKarl Rupp     }
9535c6c1daeSBarry Smith 
9545c6c1daeSBarry Smith     va_start(Argp,format);
9555c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr);
9565c6c1daeSBarry Smith     err  = fflush(fp);
9575c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9585c6c1daeSBarry Smith     if (petsc_history) {
9595c6c1daeSBarry Smith       va_start(Argp,format);
9605c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
9615c6c1daeSBarry Smith       err  = fflush(petsc_history);
9625c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9635c6c1daeSBarry Smith     }
9645c6c1daeSBarry Smith     va_end(Argp);
965559f443fSBarry Smith   } else { /* other processors add to queue */
9665c6c1daeSBarry Smith     char        *string;
9675c6c1daeSBarry Smith     va_list     Argp;
9685c6c1daeSBarry Smith     size_t      fullLength;
9695c6c1daeSBarry Smith     PrintfQueue next;
9705c6c1daeSBarry Smith 
971b00a9115SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
972559f443fSBarry Smith     if (vascii->petsc_printfqueue) {
973559f443fSBarry Smith       vascii->petsc_printfqueue->next = next;
974559f443fSBarry Smith       vascii->petsc_printfqueue       = next;
975a297a907SKarl Rupp     } else {
976559f443fSBarry Smith       vascii->petsc_printfqueuebase = vascii->petsc_printfqueue = next;
977a297a907SKarl Rupp     }
978559f443fSBarry Smith     vascii->petsc_printfqueuelength++;
9795c6c1daeSBarry Smith     next->size = QUEUESTRINGSIZE;
980785e854fSJed Brown     ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
9815c6c1daeSBarry Smith     ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
9825c6c1daeSBarry Smith     string     = next->string;
9835c6c1daeSBarry Smith     tab       *= 2;
984a297a907SKarl Rupp     while (tab--) {
985a297a907SKarl Rupp       *string++ = ' ';
986a297a907SKarl Rupp     }
9875c6c1daeSBarry Smith     va_start(Argp,format);
98822d28d08SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
9895c6c1daeSBarry Smith     va_end(Argp);
990*14416c0eSBarry Smith     if (fullLength > next->size-2*vascii->tab) {
991*14416c0eSBarry Smith       ierr = PetscFree(next->string);CHKERRQ(ierr);
992*14416c0eSBarry Smith       next->size = fullLength + 2*vascii->tab;
993*14416c0eSBarry Smith       ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
994*14416c0eSBarry Smith       ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
995*14416c0eSBarry Smith       string     = next->string;
996*14416c0eSBarry Smith       tab        = 2*vascii->tab;
997*14416c0eSBarry Smith       while (tab--) {
998*14416c0eSBarry Smith         *string++ = ' ';
999*14416c0eSBarry Smith       }
1000*14416c0eSBarry Smith       va_start(Argp,format);
1001*14416c0eSBarry Smith       ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,NULL,Argp);CHKERRQ(ierr);
1002*14416c0eSBarry Smith       va_end(Argp);
1003*14416c0eSBarry Smith     }
10045c6c1daeSBarry Smith   }
10055c6c1daeSBarry Smith   PetscFunctionReturn(0);
10065c6c1daeSBarry Smith }
10075c6c1daeSBarry Smith 
10082655f987SMichael Lange /*@C
10092655f987SMichael Lange    PetscViewerASCIIRead - Reads from am ASCII file
10102655f987SMichael Lange 
10112655f987SMichael Lange    Collective on MPI_Comm
10122655f987SMichael Lange 
10132655f987SMichael Lange    Input Parameters:
10142655f987SMichael Lange +  viewer - the ascii viewer
10152655f987SMichael Lange .  data - location to write the data
1016060da220SMatthew G. Knepley .  num - number of items of data to read
10172655f987SMichael Lange -  datatype - type of data to read
10182655f987SMichael Lange 
1019f8e4bde8SMatthew G. Knepley    Output Parameters:
1020060da220SMatthew G. Knepley .  count - number of items of data actually read, or NULL
1021f8e4bde8SMatthew G. Knepley 
10222655f987SMichael Lange    Level: beginner
10232655f987SMichael Lange 
10242655f987SMichael Lange    Concepts: ascii files
10252655f987SMichael Lange 
10266a9046bcSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
10272655f987SMichael Lange           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
10282655f987SMichael Lange           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead()
10292655f987SMichael Lange @*/
1030060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype)
10312655f987SMichael Lange {
10322655f987SMichael Lange   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
10332655f987SMichael Lange   FILE              *fd = vascii->fd;
10342655f987SMichael Lange   PetscInt           i;
10353b7fe8c3SMatthew G. Knepley   int                ret = 0;
10362655f987SMichael Lange 
10372655f987SMichael Lange   PetscFunctionBegin;
10382655f987SMichael Lange   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1039060da220SMatthew G. Knepley   for (i=0; i<num; i++) {
1040f8e4bde8SMatthew G. Knepley     if (dtype == PETSC_CHAR)         ret = fscanf(fd, "%c",  &(((char*)data)[i]));
1041f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_STRING)  ret = fscanf(fd, "%s",  &(((char*)data)[i]));
1042a05e1a72SSatish Balay     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%" PetscInt_FMT,  &(((PetscInt*)data)[i]));
1043f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_ENUM)    ret = fscanf(fd, "%d",  &(((int*)data)[i]));
1044f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_FLOAT)   ret = fscanf(fd, "%f",  &(((float*)data)[i]));
1045f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_DOUBLE)  ret = fscanf(fd, "%lg", &(((double*)data)[i]));
1046a6e181c6SToby Isaac #if defined(PETSC_USE_REAL___FLOAT128)
1047fba955ccSBarry Smith     else if (dtype == PETSC___FLOAT128) {
1048fba955ccSBarry Smith       double tmp;
1049fba955ccSBarry Smith       ret = fscanf(fd, "%lg", &tmp);
1050a6e181c6SToby Isaac       ((__float128*)data)[i] = tmp;
1051a6e181c6SToby Isaac     }
1052fba955ccSBarry Smith #endif
1053f8e4bde8SMatthew G. Knepley     else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);}
1054f8e4bde8SMatthew G. Knepley     if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype);
1055f8e4bde8SMatthew G. Knepley     else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */
10562655f987SMichael Lange   }
1057060da220SMatthew G. Knepley   if (count) *count = i;
1058060da220SMatthew G. Knepley   else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num);
10592655f987SMichael Lange   PetscFunctionReturn(0);
10602655f987SMichael Lange }
10615c6c1daeSBarry Smith 
1062