xref: /petsc/src/sys/classes/viewer/impls/ascii/filev.c (revision a2b725a8db0d6bf6cc2a1c6df7dd8029aadfff6e)
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 
189f8859db6SBarry Smith     Not Collective, depending on the viewer the value may be meaningless except for process 0 of the viewer
1905c6c1daeSBarry Smith 
191f8859db6SBarry Smith     Input Parameter:
192f8859db6SBarry Smith .    viewer - PetscViewer context, obtained from PetscViewerASCIIOpen()
193f8859db6SBarry Smith 
194f8859db6SBarry Smith     Output Parameter:
195f8859db6SBarry Smith .    fd - file pointer
196f8859db6SBarry Smith 
197f8859db6SBarry Smith     Notes: for the standard PETSCVIEWERASCII the value is valid only on process 0 of the viewer
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith     Level: intermediate
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith     Fortran Note:
2025c6c1daeSBarry Smith     This routine is not supported in Fortran.
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith   Concepts: PetscViewer^file pointer
2055c6c1daeSBarry Smith   Concepts: file pointer^getting from PetscViewer
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(),
2085c6c1daeSBarry Smith           PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush()
2095c6c1daeSBarry Smith @*/
2105c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd)
2115c6c1daeSBarry Smith {
2125c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith   PetscFunctionBegin;
2155c6c1daeSBarry Smith   *fd = vascii->fd;
2165c6c1daeSBarry Smith   PetscFunctionReturn(0);
2175c6c1daeSBarry Smith }
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode)
2205c6c1daeSBarry Smith {
2215c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith   PetscFunctionBegin;
2245c6c1daeSBarry Smith   *mode = vascii->mode;
2255c6c1daeSBarry Smith   PetscFunctionReturn(0);
2265c6c1daeSBarry Smith }
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode)
2295c6c1daeSBarry Smith {
2305c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith   PetscFunctionBegin;
2335c6c1daeSBarry Smith   vascii->mode = mode;
2345c6c1daeSBarry Smith   PetscFunctionReturn(0);
2355c6c1daeSBarry Smith }
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith /*
2385c6c1daeSBarry Smith    If petsc_history is on, then all Petsc*Printf() results are saved
2395c6c1daeSBarry Smith    if the appropriate (usually .petschistory) file.
2405c6c1daeSBarry Smith */
24195c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith /*@
2445c6c1daeSBarry Smith     PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times
2455c6c1daeSBarry Smith 
2465c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
2475c6c1daeSBarry Smith 
2485c6c1daeSBarry Smith     Input Parameters:
2491575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
2505c6c1daeSBarry Smith -    tabs - number of tabs
2515c6c1daeSBarry Smith 
2525c6c1daeSBarry Smith     Level: developer
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith     Fortran Note:
2555c6c1daeSBarry Smith     This routine is not supported in Fortran.
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2585c6c1daeSBarry Smith   Concepts: tab^setting
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(),
2615c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2625c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2635c6c1daeSBarry Smith @*/
2645c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs)
2655c6c1daeSBarry Smith {
2665c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
2675c6c1daeSBarry Smith   PetscBool         iascii;
2685c6c1daeSBarry Smith   PetscErrorCode    ierr;
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith   PetscFunctionBegin;
2715c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2725c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
273a297a907SKarl Rupp   if (iascii) ascii->tab = tabs;
2745c6c1daeSBarry Smith   PetscFunctionReturn(0);
2755c6c1daeSBarry Smith }
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith /*@
2785c6c1daeSBarry Smith     PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer.
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith     Not Collective, meaningful on first processor only.
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith     Input Parameters:
2831575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
284*a2b725a8SWilliam Gropp 
2855c6c1daeSBarry Smith     Output Parameters:
2865c6c1daeSBarry Smith .    tabs - number of tabs
2875c6c1daeSBarry Smith 
2885c6c1daeSBarry Smith     Level: developer
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith     Fortran Note:
2915c6c1daeSBarry Smith     This routine is not supported in Fortran.
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
2945c6c1daeSBarry Smith   Concepts: tab^retrieval
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(),
2975c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
2985c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
2995c6c1daeSBarry Smith @*/
3005c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs)
3015c6c1daeSBarry Smith {
3025c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3035c6c1daeSBarry Smith   PetscBool         iascii;
3045c6c1daeSBarry Smith   PetscErrorCode    ierr;
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith   PetscFunctionBegin;
3075c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3085c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
309a297a907SKarl Rupp   if (iascii && tabs) *tabs = ascii->tab;
3105c6c1daeSBarry Smith   PetscFunctionReturn(0);
3115c6c1daeSBarry Smith }
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith /*@
3145c6c1daeSBarry Smith     PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3175c6c1daeSBarry Smith 
3185c6c1daeSBarry Smith     Input Parameters:
3191575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
3205c6c1daeSBarry Smith -    tabs - number of tabs
3215c6c1daeSBarry Smith 
3225c6c1daeSBarry Smith     Level: developer
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith     Fortran Note:
3255c6c1daeSBarry Smith     This routine is not supported in Fortran.
3265c6c1daeSBarry Smith 
3275c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3285c6c1daeSBarry Smith   Concepts: tab^setting
3295c6c1daeSBarry Smith 
3305c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3315c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3325c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3335c6c1daeSBarry Smith @*/
3345c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs)
3355c6c1daeSBarry Smith {
3365c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3375c6c1daeSBarry Smith   PetscBool         iascii;
3385c6c1daeSBarry Smith   PetscErrorCode    ierr;
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith   PetscFunctionBegin;
3415c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3425c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
343a297a907SKarl Rupp   if (iascii) ascii->tab += tabs;
3445c6c1daeSBarry Smith   PetscFunctionReturn(0);
3455c6c1daeSBarry Smith }
3465c6c1daeSBarry Smith 
3475c6c1daeSBarry Smith /*@
3485c6c1daeSBarry Smith     PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith     Input Parameters:
3531575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
3545c6c1daeSBarry Smith -    tabs - number of tabs
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith     Level: developer
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith     Fortran Note:
3595c6c1daeSBarry Smith     This routine is not supported in Fortran.
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3625c6c1daeSBarry Smith   Concepts: tab^setting
3635c6c1daeSBarry Smith 
3645c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
3655c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
3665c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab()
3675c6c1daeSBarry Smith @*/
3685c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs)
3695c6c1daeSBarry Smith {
3705c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
3715c6c1daeSBarry Smith   PetscBool         iascii;
3725c6c1daeSBarry Smith   PetscErrorCode    ierr;
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith   PetscFunctionBegin;
3755c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3765c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
377a297a907SKarl Rupp   if (iascii) ascii->tab -= tabs;
3785c6c1daeSBarry Smith   PetscFunctionReturn(0);
3795c6c1daeSBarry Smith }
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith /*@C
3821575c14dSBarry Smith     PetscViewerASCIIPushSynchronized - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith     Collective on PetscViewer
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith     Input Parameters:
3871575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith     Level: intermediate
3905c6c1daeSBarry Smith 
391e6abc3ddSVáclav Hapla     Notes:
392e6abc3ddSVáclav Hapla     See documentation of PetscViewerASCIISynchronizedPrintf() for more details how the synchronized output should be done properly.
393e6abc3ddSVáclav Hapla 
3945c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
3955c6c1daeSBarry Smith   Concepts: tab^setting
3965c6c1daeSBarry Smith 
397e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush(), PetscViewerASCIIPopSynchronized(),
398e6abc3ddSVáclav Hapla           PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(),
399e6abc3ddSVáclav Hapla           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType()
4005c6c1daeSBarry Smith @*/
4011575c14dSBarry Smith PetscErrorCode  PetscViewerASCIIPushSynchronized(PetscViewer viewer)
4025c6c1daeSBarry Smith {
4035c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4045c6c1daeSBarry Smith   PetscBool         iascii;
4055c6c1daeSBarry Smith   PetscErrorCode    ierr;
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith   PetscFunctionBegin;
4085c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4095c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4101575c14dSBarry Smith   if (iascii) ascii->allowsynchronized++;
4111575c14dSBarry Smith   PetscFunctionReturn(0);
4121575c14dSBarry Smith }
4131575c14dSBarry Smith 
4141575c14dSBarry Smith /*@C
4151575c14dSBarry Smith     PetscViewerASCIIPopSynchronized - Undoes most recent PetscViewerASCIIPushSynchronized() for this viewer
4161575c14dSBarry Smith 
4171575c14dSBarry Smith     Collective on PetscViewer
4181575c14dSBarry Smith 
4191575c14dSBarry Smith     Input Parameters:
4201575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
4211575c14dSBarry Smith 
4221575c14dSBarry Smith     Level: intermediate
4231575c14dSBarry Smith 
424e6abc3ddSVáclav Hapla     Notes:
425e6abc3ddSVáclav Hapla     See documentation of PetscViewerASCIISynchronizedPrintf() for more details how the synchronized output should be done properly.
426e6abc3ddSVáclav Hapla 
4271575c14dSBarry Smith   Concepts: PetscViewerASCII^formating
4281575c14dSBarry Smith   Concepts: tab^setting
4291575c14dSBarry Smith 
430e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIIPushSynchronized(), PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush(),
431e6abc3ddSVáclav Hapla           PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(),
432e6abc3ddSVáclav Hapla           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType()
4331575c14dSBarry Smith @*/
4341575c14dSBarry Smith PetscErrorCode  PetscViewerASCIIPopSynchronized(PetscViewer viewer)
4351575c14dSBarry Smith {
4361575c14dSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4371575c14dSBarry Smith   PetscBool         iascii;
4381575c14dSBarry Smith   PetscErrorCode    ierr;
4391575c14dSBarry Smith 
4401575c14dSBarry Smith   PetscFunctionBegin;
4411575c14dSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4421575c14dSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
4431575c14dSBarry Smith   if (iascii) {
4441575c14dSBarry Smith     ascii->allowsynchronized--;
4451575c14dSBarry Smith     if (ascii->allowsynchronized < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Called more times than PetscViewerASCIIPushSynchronized()");
4461575c14dSBarry Smith   }
4475c6c1daeSBarry Smith   PetscFunctionReturn(0);
4485c6c1daeSBarry Smith }
4495c6c1daeSBarry Smith 
4501c297824SMatthew G. Knepley /*@C
4515c6c1daeSBarry Smith     PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf()
4525c6c1daeSBarry Smith      lines are tabbed.
4535c6c1daeSBarry Smith 
4545c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4555c6c1daeSBarry Smith 
4565c6c1daeSBarry Smith     Input Parameters:
4571575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
4585c6c1daeSBarry Smith 
4595c6c1daeSBarry Smith     Level: developer
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith     Fortran Note:
4625c6c1daeSBarry Smith     This routine is not supported in Fortran.
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4655c6c1daeSBarry Smith   Concepts: tab^setting
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
4685c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
4695c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
4705c6c1daeSBarry Smith @*/
4715c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPushTab(PetscViewer viewer)
4725c6c1daeSBarry Smith {
4735c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
4745c6c1daeSBarry Smith   PetscBool         iascii;
4755c6c1daeSBarry Smith   PetscErrorCode    ierr;
4765c6c1daeSBarry Smith 
4775c6c1daeSBarry Smith   PetscFunctionBegin;
4785c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
4795c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
480a297a907SKarl Rupp   if (iascii) ascii->tab++;
4815c6c1daeSBarry Smith   PetscFunctionReturn(0);
4825c6c1daeSBarry Smith }
4835c6c1daeSBarry Smith 
4841c297824SMatthew G. Knepley /*@C
4855c6c1daeSBarry Smith     PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf()
4865c6c1daeSBarry Smith      lines are tabbed.
4875c6c1daeSBarry Smith 
4885c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith     Input Parameters:
4911575c14dSBarry Smith .    viewer - obtained with PetscViewerASCIIOpen()
4925c6c1daeSBarry Smith 
4935c6c1daeSBarry Smith     Level: developer
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith     Fortran Note:
4965c6c1daeSBarry Smith     This routine is not supported in Fortran.
4975c6c1daeSBarry Smith 
4985c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
4995c6c1daeSBarry Smith   Concepts: tab^setting
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
5025c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(),
5035c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
5045c6c1daeSBarry Smith @*/
5055c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPopTab(PetscViewer viewer)
5065c6c1daeSBarry Smith {
5075c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5085c6c1daeSBarry Smith   PetscErrorCode    ierr;
5095c6c1daeSBarry Smith   PetscBool         iascii;
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith   PetscFunctionBegin;
5125c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5135c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5145c6c1daeSBarry Smith   if (iascii) {
5155c6c1daeSBarry Smith     if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed");
5165c6c1daeSBarry Smith     ascii->tab--;
5175c6c1daeSBarry Smith   }
5185c6c1daeSBarry Smith   PetscFunctionReturn(0);
5195c6c1daeSBarry Smith }
5205c6c1daeSBarry Smith 
5215c6c1daeSBarry Smith /*@
5225c6c1daeSBarry Smith     PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer
5235c6c1daeSBarry Smith 
5245c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5255c6c1daeSBarry Smith 
5265c6c1daeSBarry Smith     Input Parameters:
5271575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
5285c6c1daeSBarry Smith -    flg - PETSC_TRUE or PETSC_FALSE
5295c6c1daeSBarry Smith 
5305c6c1daeSBarry Smith     Level: developer
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith     Fortran Note:
5335c6c1daeSBarry Smith     This routine is not supported in Fortran.
5345c6c1daeSBarry Smith 
5355c6c1daeSBarry Smith   Concepts: PetscViewerASCII^formating
5365c6c1daeSBarry Smith   Concepts: tab^setting
5375c6c1daeSBarry Smith 
5385c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(),
5395c6c1daeSBarry Smith           PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(),
5405c6c1daeSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer()
5415c6c1daeSBarry Smith @*/
5425c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg)
5435c6c1daeSBarry Smith {
5445c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5455c6c1daeSBarry Smith   PetscBool         iascii;
5465c6c1daeSBarry Smith   PetscErrorCode    ierr;
5475c6c1daeSBarry Smith 
5485c6c1daeSBarry Smith   PetscFunctionBegin;
5495c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
5505c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
5515c6c1daeSBarry Smith   if (iascii) {
552a297a907SKarl Rupp     if (flg) ascii->tab = ascii->tab_store;
553a297a907SKarl Rupp     else {
5545c6c1daeSBarry Smith       ascii->tab_store = ascii->tab;
5555c6c1daeSBarry Smith       ascii->tab       = 0;
5565c6c1daeSBarry Smith     }
5575c6c1daeSBarry Smith   }
5585c6c1daeSBarry Smith   PetscFunctionReturn(0);
5595c6c1daeSBarry Smith }
5605c6c1daeSBarry Smith 
5615c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */
5625c6c1daeSBarry Smith 
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith /*@C
5655c6c1daeSBarry Smith     PetscViewerASCIIPrintf - Prints to a file, only from the first
5665c6c1daeSBarry Smith     processor in the PetscViewer
5675c6c1daeSBarry Smith 
5685c6c1daeSBarry Smith     Not Collective, but only first processor in set has any effect
5695c6c1daeSBarry Smith 
5705c6c1daeSBarry Smith     Input Parameters:
5711575c14dSBarry Smith +    viewer - obtained with PetscViewerASCIIOpen()
5725c6c1daeSBarry Smith -    format - the usual printf() format string
5735c6c1daeSBarry Smith 
5745c6c1daeSBarry Smith     Level: developer
5755c6c1daeSBarry Smith 
5765c6c1daeSBarry Smith     Fortran Note:
5775c6c1daeSBarry Smith     The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran.
5785c6c1daeSBarry Smith     That is, you can only pass a single character string from Fortran.
5795c6c1daeSBarry Smith 
5805c6c1daeSBarry Smith   Concepts: PetscViewerASCII^printing
5815c6c1daeSBarry Smith   Concepts: printing^to file
5825c6c1daeSBarry Smith   Concepts: printf
5835c6c1daeSBarry Smith 
5845c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(),
5855c6c1daeSBarry Smith           PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(),
5861575c14dSBarry Smith           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushSynchronized()
5875c6c1daeSBarry Smith @*/
5885c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...)
5895c6c1daeSBarry Smith {
5905c6c1daeSBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data;
5915c6c1daeSBarry Smith   PetscMPIInt       rank;
592dd2fa690SBarry Smith   PetscInt          tab,intab = ascii->tab;
5935c6c1daeSBarry Smith   PetscErrorCode    ierr;
5945c6c1daeSBarry Smith   FILE              *fd = ascii->fd;
5953f08860eSBarry Smith   PetscBool         iascii;
5965c6c1daeSBarry Smith   int               err;
5975c6c1daeSBarry Smith 
5985c6c1daeSBarry Smith   PetscFunctionBegin;
5995c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6005c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
6015c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
6025c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
603ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
604559f443fSBarry Smith   if (rank) PetscFunctionReturn(0);
6053f08860eSBarry Smith 
6063f08860eSBarry Smith   if (ascii->bviewer) { /* pass string up to parent viewer */
6073f08860eSBarry Smith     char        *string;
6083f08860eSBarry Smith     va_list     Argp;
6093f08860eSBarry Smith     size_t      fullLength;
6103f08860eSBarry Smith 
6113f08860eSBarry Smith     ierr = PetscCalloc1(QUEUESTRINGSIZE, &string);CHKERRQ(ierr);
6123f08860eSBarry Smith     va_start(Argp,format);
6131575c14dSBarry Smith     ierr = PetscVSNPrintf(string,QUEUESTRINGSIZE,format,&fullLength,Argp);CHKERRQ(ierr);
6143f08860eSBarry Smith     va_end(Argp);
615559f443fSBarry Smith     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%s",string);CHKERRQ(ierr);
6163f08860eSBarry Smith     ierr = PetscFree(string);CHKERRQ(ierr);
6173f08860eSBarry Smith   } else { /* write directly to file */
6185c6c1daeSBarry Smith     va_list Argp;
619559f443fSBarry Smith     /* flush my own messages that I may have queued up */
620559f443fSBarry Smith     PrintfQueue next = ascii->petsc_printfqueuebase,previous;
621559f443fSBarry Smith     PetscInt    i;
622559f443fSBarry Smith     for (i=0; i<ascii->petsc_printfqueuelength; i++) {
623559f443fSBarry Smith       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"%s",next->string);CHKERRQ(ierr);
624559f443fSBarry Smith       previous = next;
625559f443fSBarry Smith       next     = next->next;
626559f443fSBarry Smith       ierr     = PetscFree(previous->string);CHKERRQ(ierr);
627559f443fSBarry Smith       ierr     = PetscFree(previous);CHKERRQ(ierr);
628559f443fSBarry Smith     }
629559f443fSBarry Smith     ascii->petsc_printfqueue       = 0;
630559f443fSBarry Smith     ascii->petsc_printfqueuelength = 0;
631dd2fa690SBarry Smith     tab = intab;
632a297a907SKarl Rupp     while (tab--) {
633a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"  ");CHKERRQ(ierr);
634a297a907SKarl Rupp     }
6355c6c1daeSBarry Smith 
6365c6c1daeSBarry Smith     va_start(Argp,format);
6375c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr);
6385c6c1daeSBarry Smith     err  = fflush(fd);
6395c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6405c6c1daeSBarry Smith     if (petsc_history) {
6415c6c1daeSBarry Smith       va_start(Argp,format);
642dd2fa690SBarry Smith       tab = intab;
643a297a907SKarl Rupp       while (tab--) {
644706d7a88SBarry Smith         ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history,"  ");CHKERRQ(ierr);
645a297a907SKarl Rupp       }
6465c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
6475c6c1daeSBarry Smith       err  = fflush(petsc_history);
6485c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6495c6c1daeSBarry Smith     }
6505c6c1daeSBarry Smith     va_end(Argp);
6515c6c1daeSBarry Smith   }
6525c6c1daeSBarry Smith   PetscFunctionReturn(0);
6535c6c1daeSBarry Smith }
6545c6c1daeSBarry Smith 
6555c6c1daeSBarry Smith /*@C
6565c6c1daeSBarry Smith      PetscViewerFileSetName - Sets the name of the file the PetscViewer uses.
6575c6c1daeSBarry Smith 
6585c6c1daeSBarry Smith     Collective on PetscViewer
6595c6c1daeSBarry Smith 
6605c6c1daeSBarry Smith   Input Parameters:
6615c6c1daeSBarry Smith +  viewer - the PetscViewer; either ASCII or binary
6625c6c1daeSBarry Smith -  name - the name of the file it should use
6635c6c1daeSBarry Smith 
6645c6c1daeSBarry Smith     Level: advanced
6655c6c1daeSBarry Smith 
6665c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(),
6675c6c1daeSBarry Smith           PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf()
6685c6c1daeSBarry Smith 
6695c6c1daeSBarry Smith @*/
6705c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName(PetscViewer viewer,const char name[])
6715c6c1daeSBarry Smith {
6725c6c1daeSBarry Smith   PetscErrorCode ierr;
6732fbecc10SBarry Smith   char           b[PETSC_MAX_PATH_LEN];
6745c6c1daeSBarry Smith 
6755c6c1daeSBarry Smith   PetscFunctionBegin;
6765c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
6775c6c1daeSBarry Smith   PetscValidCharPointer(name,2);
6782fbecc10SBarry Smith   ierr = PetscStrreplace(PetscObjectComm((PetscObject)viewer),name,b,sizeof(b));CHKERRQ(ierr);
6792fbecc10SBarry Smith   ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,b));CHKERRQ(ierr);
6805c6c1daeSBarry Smith   PetscFunctionReturn(0);
6815c6c1daeSBarry Smith }
6825c6c1daeSBarry Smith 
6835c6c1daeSBarry Smith /*@C
6845c6c1daeSBarry Smith      PetscViewerFileGetName - Gets the name of the file the PetscViewer uses.
6855c6c1daeSBarry Smith 
6865c6c1daeSBarry Smith     Not Collective
6875c6c1daeSBarry Smith 
6885c6c1daeSBarry Smith   Input Parameter:
6895c6c1daeSBarry Smith .  viewer - the PetscViewer; either ASCII or binary
6905c6c1daeSBarry Smith 
6915c6c1daeSBarry Smith   Output Parameter:
6925c6c1daeSBarry Smith .  name - the name of the file it is using
6935c6c1daeSBarry Smith 
6945c6c1daeSBarry Smith     Level: advanced
6955c6c1daeSBarry Smith 
6965c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName()
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith @*/
6995c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName(PetscViewer viewer,const char **name)
7005c6c1daeSBarry Smith {
7015c6c1daeSBarry Smith   PetscErrorCode ierr;
7025c6c1daeSBarry Smith 
7035c6c1daeSBarry Smith   PetscFunctionBegin;
7045c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
7056e05b1faSLisandro Dalcin   PetscValidPointer(name,2);
706163d334eSBarry Smith   ierr = PetscUseMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr);
7075c6c1daeSBarry Smith   PetscFunctionReturn(0);
7085c6c1daeSBarry Smith }
7095c6c1daeSBarry Smith 
7105c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name)
7115c6c1daeSBarry Smith {
7125c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
7135c6c1daeSBarry Smith 
7145c6c1daeSBarry Smith   PetscFunctionBegin;
7155c6c1daeSBarry Smith   *name = vascii->filename;
7165c6c1daeSBarry Smith   PetscFunctionReturn(0);
7175c6c1daeSBarry Smith }
7185c6c1daeSBarry Smith 
7195c6c1daeSBarry Smith PetscErrorCode  PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[])
7205c6c1daeSBarry Smith {
7215c6c1daeSBarry Smith   PetscErrorCode    ierr;
7225c6c1daeSBarry Smith   size_t            len;
7235c6c1daeSBarry Smith   char              fname[PETSC_MAX_PATH_LEN],*gz;
7245c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
7255c6c1daeSBarry Smith   PetscBool         isstderr,isstdout;
7265c6c1daeSBarry Smith   PetscMPIInt       rank;
7275c6c1daeSBarry Smith 
7285c6c1daeSBarry Smith   PetscFunctionBegin;
7295c6c1daeSBarry Smith   ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr);
7305c6c1daeSBarry Smith   if (!name) PetscFunctionReturn(0);
7315c6c1daeSBarry Smith   ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr);
7325c6c1daeSBarry Smith 
7335c6c1daeSBarry Smith   /* Is this file to be compressed */
7345c6c1daeSBarry Smith   vascii->storecompressed = PETSC_FALSE;
735a297a907SKarl Rupp 
7365c6c1daeSBarry Smith   ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr);
7375c6c1daeSBarry Smith   if (gz) {
7385c6c1daeSBarry Smith     ierr = PetscStrlen(gz,&len);CHKERRQ(ierr);
7395c6c1daeSBarry Smith     if (len == 3) {
74008fb59bfSBarry 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");
7415c6c1daeSBarry Smith       *gz = 0;
7425c6c1daeSBarry Smith       vascii->storecompressed = PETSC_TRUE;
7435c6c1daeSBarry Smith     }
7445c6c1daeSBarry Smith   }
745ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
7465c6c1daeSBarry Smith   if (!rank) {
7475c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr);
7485c6c1daeSBarry Smith     ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr);
7495c6c1daeSBarry Smith     /* empty filename means stdout */
7505c6c1daeSBarry Smith     if (name[0] == 0)  isstdout = PETSC_TRUE;
7515c6c1daeSBarry Smith     if (isstderr)      vascii->fd = PETSC_STDERR;
7525c6c1daeSBarry Smith     else if (isstdout) vascii->fd = PETSC_STDOUT;
7535c6c1daeSBarry Smith     else {
7545c6c1daeSBarry Smith 
7555c6c1daeSBarry Smith 
7565c6c1daeSBarry Smith       ierr = PetscFixFilename(name,fname);CHKERRQ(ierr);
7575c6c1daeSBarry Smith       switch (vascii->mode) {
7585c6c1daeSBarry Smith       case FILE_MODE_READ:
7595c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r");
7605c6c1daeSBarry Smith         break;
7615c6c1daeSBarry Smith       case FILE_MODE_WRITE:
7625c6c1daeSBarry Smith         vascii->fd = fopen(fname,"w");
7635c6c1daeSBarry Smith         break;
7645c6c1daeSBarry Smith       case FILE_MODE_APPEND:
7655c6c1daeSBarry Smith         vascii->fd = fopen(fname,"a");
7665c6c1daeSBarry Smith         break;
7675c6c1daeSBarry Smith       case FILE_MODE_UPDATE:
7685c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
769a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
7705c6c1daeSBarry Smith         break;
7715c6c1daeSBarry Smith       case FILE_MODE_APPEND_UPDATE:
7725c6c1daeSBarry Smith         /* I really want a file which is opened at the end for updating,
7735c6c1daeSBarry Smith            not a+, which opens at the beginning, but makes writes at the end.
7745c6c1daeSBarry Smith         */
7755c6c1daeSBarry Smith         vascii->fd = fopen(fname,"r+");
776a297a907SKarl Rupp         if (!vascii->fd) vascii->fd = fopen(fname,"w+");
777a297a907SKarl Rupp         else {
7785c6c1daeSBarry Smith           ierr     = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr);
7795c6c1daeSBarry Smith         }
7805c6c1daeSBarry Smith         break;
7815c6c1daeSBarry Smith       default:
7825c6c1daeSBarry Smith         SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode);
7835c6c1daeSBarry Smith       }
7845c6c1daeSBarry Smith       if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname);
7855c6c1daeSBarry Smith     }
7865c6c1daeSBarry Smith   }
7875c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
7885c6c1daeSBarry Smith   PetscLogObjectState((PetscObject)viewer,"File: %s",name);
7895c6c1daeSBarry Smith #endif
7905c6c1daeSBarry Smith   PetscFunctionReturn(0);
7915c6c1daeSBarry Smith }
7925c6c1daeSBarry Smith 
7933f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
7945c6c1daeSBarry Smith {
7955c6c1daeSBarry Smith   PetscMPIInt       rank;
7965c6c1daeSBarry Smith   PetscErrorCode    ierr;
7975c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii;
7985c6c1daeSBarry Smith 
7995c6c1daeSBarry Smith   PetscFunctionBegin;
8003f08860eSBarry Smith   if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer already obtained from PetscViewer and not restored");
8011575c14dSBarry Smith   ierr         = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
8023f08860eSBarry Smith   ierr         = PetscViewerCreate(subcomm,outviewer);CHKERRQ(ierr);
8035c6c1daeSBarry Smith   ierr         = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr);
8041575c14dSBarry Smith   ierr         = PetscViewerASCIIPushSynchronized(*outviewer);CHKERRQ(ierr);
8055c6c1daeSBarry Smith   ovascii      = (PetscViewer_ASCII*)(*outviewer)->data;
8065c6c1daeSBarry Smith   ovascii->fd  = vascii->fd;
8075c6c1daeSBarry Smith   ovascii->tab = vascii->tab;
808ba5a0b41SBarry Smith   ovascii->closefile = PETSC_FALSE;
8095c6c1daeSBarry Smith 
8105c6c1daeSBarry Smith   vascii->sviewer = *outviewer;
8115c6c1daeSBarry Smith 
8125c6c1daeSBarry Smith   (*outviewer)->format  = viewer->format;
8135c6c1daeSBarry Smith 
814ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
8155c6c1daeSBarry Smith   ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer;
8163f08860eSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer;
8175c6c1daeSBarry Smith   PetscFunctionReturn(0);
8185c6c1daeSBarry Smith }
8195c6c1daeSBarry Smith 
8203f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
8215c6c1daeSBarry Smith {
8225c6c1daeSBarry Smith   PetscErrorCode    ierr;
8235c6c1daeSBarry Smith   PetscViewer_ASCII *ascii  = (PetscViewer_ASCII*)viewer->data;
8245c6c1daeSBarry Smith 
8255c6c1daeSBarry Smith   PetscFunctionBegin;
8261575c14dSBarry Smith   if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer never obtained from PetscViewer");
8271575c14dSBarry Smith   if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate this SubViewer");
8285c6c1daeSBarry Smith 
8295c6c1daeSBarry Smith   ascii->sviewer             = 0;
8305c6c1daeSBarry Smith   (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII;
8315c6c1daeSBarry Smith   ierr                       = PetscViewerDestroy(outviewer);CHKERRQ(ierr);
8325c6c1daeSBarry Smith   PetscFunctionReturn(0);
8335c6c1daeSBarry Smith }
8345c6c1daeSBarry Smith 
8352bf49c77SBarry Smith PetscErrorCode  PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer)
8362bf49c77SBarry Smith {
8372bf49c77SBarry Smith   PetscErrorCode    ierr;
8382bf49c77SBarry Smith   PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data;
8392bf49c77SBarry Smith 
8402bf49c77SBarry Smith   PetscFunctionBegin;
8412bf49c77SBarry Smith   if (ascii->filename) {
8422bf49c77SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr);
8432bf49c77SBarry Smith   }
8442bf49c77SBarry Smith   PetscFunctionReturn(0);
8452bf49c77SBarry Smith }
8462bf49c77SBarry Smith 
8478556b5ebSBarry Smith /*MC
8488556b5ebSBarry Smith    PETSCVIEWERASCII - A viewer that prints to stdout or an ASCII file
8498556b5ebSBarry Smith 
8508556b5ebSBarry Smith 
8518556b5ebSBarry Smith .seealso:  PETSC_VIEWER_STDOUT_(),PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDOUT_WORLD,PetscViewerCreate(), PetscViewerASCIIOpen(),
8528556b5ebSBarry Smith            PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERBINARY, PETSCVIEWERMATLAB,
8538556b5ebSBarry Smith            PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType()
8548556b5ebSBarry Smith 
8551b266c99SBarry Smith   Level: beginner
8561b266c99SBarry Smith 
8578556b5ebSBarry Smith M*/
8588cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer)
8595c6c1daeSBarry Smith {
8605c6c1daeSBarry Smith   PetscViewer_ASCII *vascii;
8615c6c1daeSBarry Smith   PetscErrorCode    ierr;
8625c6c1daeSBarry Smith 
8635c6c1daeSBarry Smith   PetscFunctionBegin;
864b00a9115SJed Brown   ierr         = PetscNewLog(viewer,&vascii);CHKERRQ(ierr);
8655c6c1daeSBarry Smith   viewer->data = (void*)vascii;
8665c6c1daeSBarry Smith 
8675c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_ASCII;
8685c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_ASCII;
869559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_ASCII;
870559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_ASCII;
8712bf49c77SBarry Smith   viewer->ops->view             = PetscViewerView_ASCII;
8721d641e7bSMichael Lange   viewer->ops->read             = PetscViewerASCIIRead;
8735c6c1daeSBarry Smith 
8745c6c1daeSBarry Smith   /* defaults to stdout unless set with PetscViewerFileSetName() */
8755c6c1daeSBarry Smith   vascii->fd        = PETSC_STDOUT;
8765c6c1daeSBarry Smith   vascii->mode      = FILE_MODE_WRITE;
8775c6c1daeSBarry Smith   vascii->bviewer   = 0;
878dd2fa690SBarry Smith   vascii->subviewer = 0;
8795c6c1daeSBarry Smith   vascii->sviewer   = 0;
8805c6c1daeSBarry Smith   vascii->tab       = 0;
8815c6c1daeSBarry Smith   vascii->tab_store = 0;
8825c6c1daeSBarry Smith   vascii->filename  = 0;
8835c6c1daeSBarry Smith   vascii->closefile = PETSC_TRUE;
8845c6c1daeSBarry Smith 
885bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr);
886bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr);
887bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr);
888bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr);
8895c6c1daeSBarry Smith   PetscFunctionReturn(0);
8905c6c1daeSBarry Smith }
8915c6c1daeSBarry Smith 
8925c6c1daeSBarry Smith /*@C
8935c6c1daeSBarry Smith     PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from
8945c6c1daeSBarry Smith     several processors.  Output of the first processor is followed by that of the
8955c6c1daeSBarry Smith     second, etc.
8965c6c1daeSBarry Smith 
8975c6c1daeSBarry Smith     Not Collective, must call collective PetscViewerFlush() to get the results out
8985c6c1daeSBarry Smith 
8995c6c1daeSBarry Smith     Input Parameters:
9005c6c1daeSBarry Smith +   viewer - the ASCII PetscViewer
9015c6c1daeSBarry Smith -   format - the usual printf() format string
9025c6c1daeSBarry Smith 
9035c6c1daeSBarry Smith     Level: intermediate
9045c6c1daeSBarry Smith 
90595452b02SPatrick Sanan     Notes:
906e6abc3ddSVáclav Hapla     You must have previously called PetscViewerASCIIPushSynchronized() to allow this routine to be called.
907e6abc3ddSVáclav Hapla     Then you can do multiple independent calls to this routine.
908e6abc3ddSVáclav Hapla     The actual synchronized print is then done using PetscViewerFlush().
909e6abc3ddSVáclav Hapla     PetscViewerASCIIPopSynchronized() should be then called if we are already done with the synchronized output
910e6abc3ddSVáclav Hapla     to conclude the "synchronized session".
911e6abc3ddSVáclav Hapla     So the typical calling sequence looks like
912e6abc3ddSVáclav Hapla $ PetscViewerASCIIPushSynchronized(viewer);
913e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...);
914e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...);
915e6abc3ddSVáclav Hapla $ ...
916e6abc3ddSVáclav Hapla $ PetscViewerFlush(viewer);
917e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...);
918e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...);
919e6abc3ddSVáclav Hapla $ ...
920e6abc3ddSVáclav Hapla $ PetscViewerFlush(viewer);
921e6abc3ddSVáclav Hapla $ PetscViewerASCIIPopSynchronized(viewer);
9225c6c1daeSBarry Smith 
9235c6c1daeSBarry Smith     Fortran Note:
9245c6c1daeSBarry Smith       Can only print a single character* string
9255c6c1daeSBarry Smith 
926e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIIPushSynchronized(), PetscViewerFlush(), PetscViewerASCIIPopSynchronized(),
927e6abc3ddSVáclav Hapla           PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(),
928e6abc3ddSVáclav Hapla           PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType()
9295c6c1daeSBarry Smith @*/
9305c6c1daeSBarry Smith PetscErrorCode  PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...)
9315c6c1daeSBarry Smith {
9325c6c1daeSBarry Smith   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
9335c6c1daeSBarry Smith   PetscErrorCode    ierr;
9343f08860eSBarry Smith   PetscMPIInt       rank;
9355c6c1daeSBarry Smith   PetscInt          tab = vascii->tab;
9365c6c1daeSBarry Smith   MPI_Comm          comm;
9375c6c1daeSBarry Smith   FILE              *fp;
938559f443fSBarry Smith   PetscBool         iascii,hasbviewer = PETSC_FALSE;
9395c6c1daeSBarry Smith   int               err;
9405c6c1daeSBarry Smith 
9415c6c1daeSBarry Smith   PetscFunctionBegin;
9425c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
9435c6c1daeSBarry Smith   PetscValidCharPointer(format,2);
9445c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
9455c6c1daeSBarry Smith   if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer");
9461575c14dSBarry Smith   if (!vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIIPushSynchronized() to allow this call");
9475c6c1daeSBarry Smith 
948ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
9495c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
9505c6c1daeSBarry Smith 
951559f443fSBarry Smith   if (vascii->bviewer) {
952559f443fSBarry Smith     hasbviewer = PETSC_TRUE;
953559f443fSBarry Smith     if (!rank) {
954559f443fSBarry Smith       vascii = (PetscViewer_ASCII*)vascii->bviewer->data;
955559f443fSBarry Smith       ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
956559f443fSBarry Smith       ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr);
957559f443fSBarry Smith     }
958559f443fSBarry Smith   }
9593f08860eSBarry Smith 
960559f443fSBarry Smith   fp   = vascii->fd;
961559f443fSBarry Smith 
962559f443fSBarry Smith   if (!rank && !hasbviewer) {   /* First processor prints immediately to fp */
9635c6c1daeSBarry Smith     va_list Argp;
964559f443fSBarry Smith     /* flush my own messages that I may have queued up */
965559f443fSBarry Smith     PrintfQueue next = vascii->petsc_printfqueuebase,previous;
966559f443fSBarry Smith     PetscInt    i;
967559f443fSBarry Smith     for (i=0; i<vascii->petsc_printfqueuelength; i++) {
968559f443fSBarry Smith       ierr = PetscFPrintf(comm,fp,"%s",next->string);CHKERRQ(ierr);
969559f443fSBarry Smith       previous = next;
970559f443fSBarry Smith       next     = next->next;
971559f443fSBarry Smith       ierr     = PetscFree(previous->string);CHKERRQ(ierr);
972559f443fSBarry Smith       ierr     = PetscFree(previous);CHKERRQ(ierr);
973559f443fSBarry Smith     }
974559f443fSBarry Smith     vascii->petsc_printfqueue       = 0;
975559f443fSBarry Smith     vascii->petsc_printfqueuelength = 0;
9765c6c1daeSBarry Smith 
977a297a907SKarl Rupp     while (tab--) {
978a297a907SKarl Rupp       ierr = PetscFPrintf(PETSC_COMM_SELF,fp,"  ");CHKERRQ(ierr);
979a297a907SKarl Rupp     }
9805c6c1daeSBarry Smith 
9815c6c1daeSBarry Smith     va_start(Argp,format);
9825c6c1daeSBarry Smith     ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr);
9835c6c1daeSBarry Smith     err  = fflush(fp);
9845c6c1daeSBarry Smith     if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9855c6c1daeSBarry Smith     if (petsc_history) {
9865c6c1daeSBarry Smith       va_start(Argp,format);
9875c6c1daeSBarry Smith       ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr);
9885c6c1daeSBarry Smith       err  = fflush(petsc_history);
9895c6c1daeSBarry Smith       if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
9905c6c1daeSBarry Smith     }
9915c6c1daeSBarry Smith     va_end(Argp);
992559f443fSBarry Smith   } else { /* other processors add to queue */
9935c6c1daeSBarry Smith     char        *string;
9945c6c1daeSBarry Smith     va_list     Argp;
9955c6c1daeSBarry Smith     size_t      fullLength;
9965c6c1daeSBarry Smith     PrintfQueue next;
9975c6c1daeSBarry Smith 
998b00a9115SJed Brown     ierr = PetscNew(&next);CHKERRQ(ierr);
999559f443fSBarry Smith     if (vascii->petsc_printfqueue) {
1000559f443fSBarry Smith       vascii->petsc_printfqueue->next = next;
1001559f443fSBarry Smith       vascii->petsc_printfqueue       = next;
1002a297a907SKarl Rupp     } else {
1003559f443fSBarry Smith       vascii->petsc_printfqueuebase = vascii->petsc_printfqueue = next;
1004a297a907SKarl Rupp     }
1005559f443fSBarry Smith     vascii->petsc_printfqueuelength++;
10065c6c1daeSBarry Smith     next->size = QUEUESTRINGSIZE;
1007785e854fSJed Brown     ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
10085c6c1daeSBarry Smith     ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
10095c6c1daeSBarry Smith     string     = next->string;
10105c6c1daeSBarry Smith     tab       *= 2;
1011a297a907SKarl Rupp     while (tab--) {
1012a297a907SKarl Rupp       *string++ = ' ';
1013a297a907SKarl Rupp     }
10145c6c1daeSBarry Smith     va_start(Argp,format);
101522d28d08SBarry Smith     ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr);
10165c6c1daeSBarry Smith     va_end(Argp);
1017cb500232SBarry Smith     if (fullLength > (size_t) (next->size-2*vascii->tab)) {
101814416c0eSBarry Smith       ierr       = PetscFree(next->string);CHKERRQ(ierr);
101914416c0eSBarry Smith       next->size = fullLength + 2*vascii->tab;
102014416c0eSBarry Smith       ierr       = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr);
102114416c0eSBarry Smith       ierr       = PetscMemzero(next->string,next->size);CHKERRQ(ierr);
102214416c0eSBarry Smith       string     = next->string;
102314416c0eSBarry Smith       tab        = 2*vascii->tab;
102414416c0eSBarry Smith       while (tab--) {
102514416c0eSBarry Smith         *string++ = ' ';
102614416c0eSBarry Smith       }
102714416c0eSBarry Smith       va_start(Argp,format);
102814416c0eSBarry Smith       ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,NULL,Argp);CHKERRQ(ierr);
102914416c0eSBarry Smith       va_end(Argp);
103014416c0eSBarry Smith     }
10315c6c1daeSBarry Smith   }
10325c6c1daeSBarry Smith   PetscFunctionReturn(0);
10335c6c1daeSBarry Smith }
10345c6c1daeSBarry Smith 
10352655f987SMichael Lange /*@C
1036f8859db6SBarry Smith    PetscViewerASCIIRead - Reads from a ASCII file
10372655f987SMichael Lange 
1038f8859db6SBarry Smith    Only process 0 in the PetscViewer may call this
10392655f987SMichael Lange 
10402655f987SMichael Lange    Input Parameters:
10412655f987SMichael Lange +  viewer - the ascii viewer
10422655f987SMichael Lange .  data - location to write the data
1043060da220SMatthew G. Knepley .  num - number of items of data to read
10442655f987SMichael Lange -  datatype - type of data to read
10452655f987SMichael Lange 
1046f8e4bde8SMatthew G. Knepley    Output Parameters:
1047060da220SMatthew G. Knepley .  count - number of items of data actually read, or NULL
1048f8e4bde8SMatthew G. Knepley 
10492655f987SMichael Lange    Level: beginner
10502655f987SMichael Lange 
10512655f987SMichael Lange    Concepts: ascii files
10522655f987SMichael Lange 
1053f8859db6SBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetName()
10542655f987SMichael Lange           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
105505119932SBarry Smith           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscViewerBinaryRead()
10562655f987SMichael Lange @*/
1057060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype)
10582655f987SMichael Lange {
10592655f987SMichael Lange   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;
10602655f987SMichael Lange   FILE              *fd = vascii->fd;
10612655f987SMichael Lange   PetscInt           i;
10623b7fe8c3SMatthew G. Knepley   int                ret = 0;
1063f8859db6SBarry Smith   PetscMPIInt        rank;
1064f8859db6SBarry Smith   PetscErrorCode     ierr;
10652655f987SMichael Lange 
10662655f987SMichael Lange   PetscFunctionBegin;
10672655f987SMichael Lange   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
1068f8859db6SBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr);
1069f8859db6SBarry Smith   if (rank) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG,"Can only be called from process 0 in the PetscViewer");
1070060da220SMatthew G. Knepley   for (i=0; i<num; i++) {
1071f8e4bde8SMatthew G. Knepley     if (dtype == PETSC_CHAR)         ret = fscanf(fd, "%c",  &(((char*)data)[i]));
1072f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_STRING)  ret = fscanf(fd, "%s",  &(((char*)data)[i]));
1073a05e1a72SSatish Balay     else if (dtype == PETSC_INT)     ret = fscanf(fd, "%" PetscInt_FMT,  &(((PetscInt*)data)[i]));
1074f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_ENUM)    ret = fscanf(fd, "%d",  &(((int*)data)[i]));
10759e3e4c22SLisandro Dalcin     else if (dtype == PETSC_INT64)   ret = fscanf(fd, "%" PetscInt64_FMT,  &(((PetscInt64*)data)[i]));
1076972064b6SLisandro Dalcin     else if (dtype == PETSC_LONG)    ret = fscanf(fd, "%ld", &(((long*)data)[i]));
1077f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_FLOAT)   ret = fscanf(fd, "%f",  &(((float*)data)[i]));
1078f8e4bde8SMatthew G. Knepley     else if (dtype == PETSC_DOUBLE)  ret = fscanf(fd, "%lg", &(((double*)data)[i]));
1079a6e181c6SToby Isaac #if defined(PETSC_USE_REAL___FLOAT128)
1080fba955ccSBarry Smith     else if (dtype == PETSC___FLOAT128) {
1081fba955ccSBarry Smith       double tmp;
1082fba955ccSBarry Smith       ret = fscanf(fd, "%lg", &tmp);
1083a6e181c6SToby Isaac       ((__float128*)data)[i] = tmp;
1084a6e181c6SToby Isaac     }
1085fba955ccSBarry Smith #endif
1086f8e4bde8SMatthew G. Knepley     else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);}
1087f8e4bde8SMatthew G. Knepley     if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype);
1088f8e4bde8SMatthew G. Knepley     else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */
10892655f987SMichael Lange   }
1090060da220SMatthew G. Knepley   if (count) *count = i;
1091060da220SMatthew G. Knepley   else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num);
10922655f987SMichael Lange   PetscFunctionReturn(0);
10932655f987SMichael Lange }
10945c6c1daeSBarry Smith 
1095