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; 14e5afcf28SBarry Smith if (vascii->sviewer) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 15ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 165c6c1daeSBarry Smith if (!rank && vascii->fd != stderr && vascii->fd != PETSC_STDOUT) { 175c6c1daeSBarry Smith if (vascii->fd && vascii->closefile) { 185c6c1daeSBarry Smith err = fclose(vascii->fd); 195c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 205c6c1daeSBarry Smith } 215c6c1daeSBarry Smith if (vascii->storecompressed) { 225c6c1daeSBarry Smith char par[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN]; 235c6c1daeSBarry Smith FILE *fp; 24a126751eSBarry Smith ierr = PetscStrncpy(par,"gzip ",sizeof(par));CHKERRQ(ierr); 25a126751eSBarry Smith ierr = PetscStrlcat(par,vascii->filename,sizeof(par));CHKERRQ(ierr); 265c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN) 270298fd71SBarry Smith ierr = PetscPOpen(PETSC_COMM_SELF,NULL,par,"r",&fp);CHKERRQ(ierr); 28f23aa3ddSBarry Smith if (fgets(buf,1024,fp)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from compression command %s\n%s",par,buf); 29016831caSBarry Smith ierr = PetscPClose(PETSC_COMM_SELF,fp);CHKERRQ(ierr); 305c6c1daeSBarry Smith #else 315c6c1daeSBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine"); 325c6c1daeSBarry Smith #endif 335c6c1daeSBarry Smith } 345c6c1daeSBarry Smith } 355c6c1daeSBarry Smith ierr = PetscFree(vascii->filename);CHKERRQ(ierr); 365c6c1daeSBarry Smith PetscFunctionReturn(0); 375c6c1daeSBarry Smith } 385c6c1daeSBarry Smith 395c6c1daeSBarry Smith /* ----------------------------------------------------------------------*/ 405c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII(PetscViewer viewer) 415c6c1daeSBarry Smith { 425c6c1daeSBarry Smith PetscErrorCode ierr; 435c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 445c6c1daeSBarry Smith PetscViewerLink *vlink; 455c6c1daeSBarry Smith PetscBool flg; 465c6c1daeSBarry Smith 475c6c1daeSBarry Smith PetscFunctionBegin; 48e5afcf28SBarry Smith if (vascii->sviewer) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 495c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 505c6c1daeSBarry Smith ierr = PetscFree(vascii);CHKERRQ(ierr); 515c6c1daeSBarry Smith 525c6c1daeSBarry Smith /* remove the viewer from the list in the MPI Communicator */ 535c6c1daeSBarry Smith if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) { 5412801b39SBarry Smith ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);CHKERRQ(ierr); 555c6c1daeSBarry Smith } 565c6c1daeSBarry Smith 5747435625SJed Brown ierr = MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr); 585c6c1daeSBarry Smith if (flg) { 595c6c1daeSBarry Smith if (vlink && vlink->viewer == viewer) { 60e5840a18SBarry Smith if (vlink->next) { 6147435625SJed Brown ierr = MPI_Comm_set_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr); 62e5840a18SBarry Smith } else { 6347435625SJed Brown ierr = MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval);CHKERRQ(ierr); 64e5840a18SBarry Smith } 655c6c1daeSBarry Smith ierr = PetscFree(vlink);CHKERRQ(ierr); 665c6c1daeSBarry Smith } else { 675c6c1daeSBarry Smith while (vlink && vlink->next) { 685c6c1daeSBarry Smith if (vlink->next->viewer == viewer) { 695c6c1daeSBarry Smith PetscViewerLink *nv = vlink->next; 705c6c1daeSBarry Smith vlink->next = vlink->next->next; 715c6c1daeSBarry Smith ierr = PetscFree(nv);CHKERRQ(ierr); 725c6c1daeSBarry Smith } 735c6c1daeSBarry Smith vlink = vlink->next; 745c6c1daeSBarry Smith } 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith } 77aa139df6SJed Brown 78aa139df6SJed Brown if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) { 79aa139df6SJed Brown PetscViewer aviewer; 8047435625SJed Brown ierr = MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stdout_keyval,(void**)&aviewer,(PetscMPIInt*)&flg);CHKERRQ(ierr); 81aa139df6SJed Brown if (flg && aviewer == viewer) { 8247435625SJed Brown ierr = MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stdout_keyval);CHKERRQ(ierr); 83aa139df6SJed Brown } 84aa139df6SJed Brown } 85aa139df6SJed Brown if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) { 86aa139df6SJed Brown PetscViewer aviewer; 8747435625SJed Brown ierr = MPI_Comm_get_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stderr_keyval,(void**)&aviewer,(PetscMPIInt*)&flg);CHKERRQ(ierr); 88aa139df6SJed Brown if (flg && aviewer == viewer) { 8947435625SJed Brown ierr = MPI_Comm_delete_attr(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_Stderr_keyval);CHKERRQ(ierr); 90aa139df6SJed Brown } 91aa139df6SJed Brown } 925c6c1daeSBarry Smith PetscFunctionReturn(0); 935c6c1daeSBarry Smith } 945c6c1daeSBarry Smith 953f08860eSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_SubViewer(PetscViewer viewer) 965c6c1daeSBarry Smith { 975c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 985c6c1daeSBarry Smith PetscErrorCode ierr; 995fd66863SKarl Rupp 1005c6c1daeSBarry Smith PetscFunctionBegin; 1013f08860eSBarry Smith ierr = PetscViewerRestoreSubViewer(vascii->bviewer,0,&viewer);CHKERRQ(ierr); 1025c6c1daeSBarry Smith PetscFunctionReturn(0); 1035c6c1daeSBarry Smith } 1045c6c1daeSBarry Smith 1055c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer) 1065c6c1daeSBarry Smith { 1075c6c1daeSBarry Smith PetscErrorCode ierr; 1085c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 1095c6c1daeSBarry Smith int err; 110559f443fSBarry Smith MPI_Comm comm; 111559f443fSBarry Smith PetscMPIInt rank,size; 112559f443fSBarry Smith FILE *fd = vascii->fd; 1135c6c1daeSBarry Smith 1145c6c1daeSBarry Smith PetscFunctionBegin; 115e5afcf28SBarry Smith if (vascii->sviewer) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 116559f443fSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 117559f443fSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 118559f443fSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 119559f443fSBarry Smith 120559f443fSBarry Smith if (!vascii->bviewer && !rank && (vascii->mode != FILE_MODE_READ)) { 1215c6c1daeSBarry Smith err = fflush(vascii->fd); 1225c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed"); 1235c6c1daeSBarry Smith } 1245c6c1daeSBarry Smith 1255c6c1daeSBarry Smith if (vascii->allowsynchronized) { 126559f443fSBarry Smith PetscMPIInt tag,i,j,n = 0,dummy = 0; 127559f443fSBarry Smith char *message; 128559f443fSBarry Smith MPI_Status status; 129559f443fSBarry Smith 130559f443fSBarry Smith ierr = PetscCommDuplicate(comm,&comm,&tag);CHKERRQ(ierr); 131559f443fSBarry Smith 132559f443fSBarry Smith /* First processor waits for messages from all other processors */ 133559f443fSBarry Smith if (!rank) { 134559f443fSBarry Smith /* flush my own messages that I may have queued up */ 135559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 136559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 137559f443fSBarry Smith if (!vascii->bviewer) { 138559f443fSBarry Smith ierr = PetscFPrintf(comm,fd,"%s",next->string);CHKERRQ(ierr); 139559f443fSBarry Smith } else { 140559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(vascii->bviewer,"%s",next->string);CHKERRQ(ierr); 141559f443fSBarry Smith } 142559f443fSBarry Smith previous = next; 143559f443fSBarry Smith next = next->next; 144559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 145559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 146559f443fSBarry Smith } 147*02c9f0b5SLisandro Dalcin vascii->petsc_printfqueue = NULL; 148559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 149559f443fSBarry Smith for (i=1; i<size; i++) { 150559f443fSBarry Smith /* to prevent a flood of messages to process zero, request each message separately */ 151559f443fSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,tag,comm);CHKERRQ(ierr); 152559f443fSBarry Smith ierr = MPI_Recv(&n,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr); 153559f443fSBarry Smith for (j=0; j<n; j++) { 154559f443fSBarry Smith PetscMPIInt size = 0; 155559f443fSBarry Smith 156559f443fSBarry Smith ierr = MPI_Recv(&size,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr); 157559f443fSBarry Smith ierr = PetscMalloc1(size, &message);CHKERRQ(ierr); 158559f443fSBarry Smith ierr = MPI_Recv(message,size,MPI_CHAR,i,tag,comm,&status);CHKERRQ(ierr); 159559f443fSBarry Smith if (!vascii->bviewer) { 160559f443fSBarry Smith ierr = PetscFPrintf(comm,fd,"%s",message);CHKERRQ(ierr); 161559f443fSBarry Smith } else { 162559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(vascii->bviewer,"%s",message);CHKERRQ(ierr); 163559f443fSBarry Smith } 164559f443fSBarry Smith ierr = PetscFree(message);CHKERRQ(ierr); 165559f443fSBarry Smith } 166559f443fSBarry Smith } 167559f443fSBarry Smith } else { /* other processors send queue to processor 0 */ 168559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 169559f443fSBarry Smith 170559f443fSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,0,tag,comm,&status);CHKERRQ(ierr); 171559f443fSBarry Smith ierr = MPI_Send(&vascii->petsc_printfqueuelength,1,MPI_INT,0,tag,comm);CHKERRQ(ierr); 172559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 173559f443fSBarry Smith ierr = MPI_Send(&next->size,1,MPI_INT,0,tag,comm);CHKERRQ(ierr); 174559f443fSBarry Smith ierr = MPI_Send(next->string,next->size,MPI_CHAR,0,tag,comm);CHKERRQ(ierr); 175559f443fSBarry Smith previous = next; 176559f443fSBarry Smith next = next->next; 177559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 178559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 179559f443fSBarry Smith } 180*02c9f0b5SLisandro Dalcin vascii->petsc_printfqueue = NULL; 181559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 182559f443fSBarry Smith } 183559f443fSBarry Smith ierr = PetscCommDestroy(&comm);CHKERRQ(ierr); 1845c6c1daeSBarry Smith } 1855c6c1daeSBarry Smith PetscFunctionReturn(0); 1865c6c1daeSBarry Smith } 1875c6c1daeSBarry Smith 1885c6c1daeSBarry Smith /*@C 1895c6c1daeSBarry Smith PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer. 1905c6c1daeSBarry Smith 191f8859db6SBarry Smith Not Collective, depending on the viewer the value may be meaningless except for process 0 of the viewer 1925c6c1daeSBarry Smith 193f8859db6SBarry Smith Input Parameter: 194f8859db6SBarry Smith . viewer - PetscViewer context, obtained from PetscViewerASCIIOpen() 195f8859db6SBarry Smith 196f8859db6SBarry Smith Output Parameter: 197f8859db6SBarry Smith . fd - file pointer 198f8859db6SBarry Smith 199f8859db6SBarry Smith Notes: for the standard PETSCVIEWERASCII the value is valid only on process 0 of the viewer 2005c6c1daeSBarry Smith 2015c6c1daeSBarry Smith Level: intermediate 2025c6c1daeSBarry Smith 2035c6c1daeSBarry Smith Fortran Note: 2045c6c1daeSBarry Smith This routine is not supported in Fortran. 2055c6c1daeSBarry Smith 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 2585c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(), 2595c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2605c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2615c6c1daeSBarry Smith @*/ 2625c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs) 2635c6c1daeSBarry Smith { 2645c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2655c6c1daeSBarry Smith PetscBool iascii; 2665c6c1daeSBarry Smith PetscErrorCode ierr; 2675c6c1daeSBarry Smith 2685c6c1daeSBarry Smith PetscFunctionBegin; 2695c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2705c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 271a297a907SKarl Rupp if (iascii) ascii->tab = tabs; 2725c6c1daeSBarry Smith PetscFunctionReturn(0); 2735c6c1daeSBarry Smith } 2745c6c1daeSBarry Smith 2755c6c1daeSBarry Smith /*@ 2765c6c1daeSBarry Smith PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer. 2775c6c1daeSBarry Smith 2785c6c1daeSBarry Smith Not Collective, meaningful on first processor only. 2795c6c1daeSBarry Smith 2805c6c1daeSBarry Smith Input Parameters: 2811575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 282a2b725a8SWilliam Gropp 2835c6c1daeSBarry Smith Output Parameters: 2845c6c1daeSBarry Smith . tabs - number of tabs 2855c6c1daeSBarry Smith 2865c6c1daeSBarry Smith Level: developer 2875c6c1daeSBarry Smith 2885c6c1daeSBarry Smith Fortran Note: 2895c6c1daeSBarry Smith This routine is not supported in Fortran. 2905c6c1daeSBarry Smith 2915c6c1daeSBarry Smith 2925c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(), 2935c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2945c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2955c6c1daeSBarry Smith @*/ 2965c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs) 2975c6c1daeSBarry Smith { 2985c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2995c6c1daeSBarry Smith PetscBool iascii; 3005c6c1daeSBarry Smith PetscErrorCode ierr; 3015c6c1daeSBarry Smith 3025c6c1daeSBarry Smith PetscFunctionBegin; 3035c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3045c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 305a297a907SKarl Rupp if (iascii && tabs) *tabs = ascii->tab; 3065c6c1daeSBarry Smith PetscFunctionReturn(0); 3075c6c1daeSBarry Smith } 3085c6c1daeSBarry Smith 3095c6c1daeSBarry Smith /*@ 3105c6c1daeSBarry Smith PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing 3115c6c1daeSBarry Smith 3125c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith Input Parameters: 3151575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 3165c6c1daeSBarry Smith - tabs - number of tabs 3175c6c1daeSBarry Smith 3185c6c1daeSBarry Smith Level: developer 3195c6c1daeSBarry Smith 3205c6c1daeSBarry Smith Fortran Note: 3215c6c1daeSBarry Smith This routine is not supported in Fortran. 3225c6c1daeSBarry Smith 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 3565c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3575c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3585c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3595c6c1daeSBarry Smith @*/ 3605c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs) 3615c6c1daeSBarry Smith { 3625c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3635c6c1daeSBarry Smith PetscBool iascii; 3645c6c1daeSBarry Smith PetscErrorCode ierr; 3655c6c1daeSBarry Smith 3665c6c1daeSBarry Smith PetscFunctionBegin; 3675c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3685c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 369a297a907SKarl Rupp if (iascii) ascii->tab -= tabs; 3705c6c1daeSBarry Smith PetscFunctionReturn(0); 3715c6c1daeSBarry Smith } 3725c6c1daeSBarry Smith 3735c6c1daeSBarry Smith /*@C 3741575c14dSBarry Smith PetscViewerASCIIPushSynchronized - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer 3755c6c1daeSBarry Smith 3765c6c1daeSBarry Smith Collective on PetscViewer 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith Input Parameters: 3791575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 3805c6c1daeSBarry Smith 3815c6c1daeSBarry Smith Level: intermediate 3825c6c1daeSBarry Smith 383e6abc3ddSVáclav Hapla Notes: 384e6abc3ddSVáclav Hapla See documentation of PetscViewerASCIISynchronizedPrintf() for more details how the synchronized output should be done properly. 3855c6c1daeSBarry Smith 3865c6c1daeSBarry Smith 387e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush(), PetscViewerASCIIPopSynchronized(), 388e6abc3ddSVáclav Hapla PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(), 389e6abc3ddSVáclav Hapla PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType() 3905c6c1daeSBarry Smith @*/ 3911575c14dSBarry Smith PetscErrorCode PetscViewerASCIIPushSynchronized(PetscViewer viewer) 3925c6c1daeSBarry Smith { 3935c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3945c6c1daeSBarry Smith PetscBool iascii; 3955c6c1daeSBarry Smith PetscErrorCode ierr; 3965c6c1daeSBarry Smith 3975c6c1daeSBarry Smith PetscFunctionBegin; 3985c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 399e5afcf28SBarry Smith if (ascii->sviewer) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 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 415e6abc3ddSVáclav Hapla Notes: 416e6abc3ddSVáclav Hapla See documentation of PetscViewerASCIISynchronizedPrintf() for more details how the synchronized output should be done properly. 4171575c14dSBarry Smith 4181575c14dSBarry Smith 419e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIIPushSynchronized(), PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush(), 420e6abc3ddSVáclav Hapla PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(), 421e6abc3ddSVáclav Hapla PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType() 4221575c14dSBarry Smith @*/ 4231575c14dSBarry Smith PetscErrorCode PetscViewerASCIIPopSynchronized(PetscViewer viewer) 4241575c14dSBarry Smith { 4251575c14dSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4261575c14dSBarry Smith PetscBool iascii; 4271575c14dSBarry Smith PetscErrorCode ierr; 4281575c14dSBarry Smith 4291575c14dSBarry Smith PetscFunctionBegin; 4301575c14dSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 431e5afcf28SBarry Smith if (ascii->sviewer) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 4321575c14dSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4331575c14dSBarry Smith if (iascii) { 4341575c14dSBarry Smith ascii->allowsynchronized--; 4351575c14dSBarry Smith if (ascii->allowsynchronized < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Called more times than PetscViewerASCIIPushSynchronized()"); 4361575c14dSBarry Smith } 4375c6c1daeSBarry Smith PetscFunctionReturn(0); 4385c6c1daeSBarry Smith } 4395c6c1daeSBarry Smith 4401c297824SMatthew G. Knepley /*@C 4415c6c1daeSBarry Smith PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf() 4425c6c1daeSBarry Smith lines are tabbed. 4435c6c1daeSBarry Smith 4445c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4455c6c1daeSBarry Smith 4465c6c1daeSBarry Smith Input Parameters: 4471575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith Level: developer 4505c6c1daeSBarry Smith 4515c6c1daeSBarry Smith Fortran Note: 4525c6c1daeSBarry Smith This routine is not supported in Fortran. 4535c6c1daeSBarry Smith 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 4875c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4885c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4895c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4905c6c1daeSBarry Smith @*/ 4915c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPopTab(PetscViewer viewer) 4925c6c1daeSBarry Smith { 4935c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4945c6c1daeSBarry Smith PetscErrorCode ierr; 4955c6c1daeSBarry Smith PetscBool iascii; 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith PetscFunctionBegin; 4985c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4995c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5005c6c1daeSBarry Smith if (iascii) { 5015c6c1daeSBarry Smith if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed"); 5025c6c1daeSBarry Smith ascii->tab--; 5035c6c1daeSBarry Smith } 5045c6c1daeSBarry Smith PetscFunctionReturn(0); 5055c6c1daeSBarry Smith } 5065c6c1daeSBarry Smith 5075c6c1daeSBarry Smith /*@ 5085c6c1daeSBarry Smith PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer 5095c6c1daeSBarry Smith 5105c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5115c6c1daeSBarry Smith 5125c6c1daeSBarry Smith Input Parameters: 5131575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 5145c6c1daeSBarry Smith - flg - PETSC_TRUE or PETSC_FALSE 5155c6c1daeSBarry Smith 5165c6c1daeSBarry Smith Level: developer 5175c6c1daeSBarry Smith 5185c6c1daeSBarry Smith Fortran Note: 5195c6c1daeSBarry Smith This routine is not supported in Fortran. 5205c6c1daeSBarry Smith 5215c6c1daeSBarry Smith 5225c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 5235c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(), 5245c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 5255c6c1daeSBarry Smith @*/ 5265c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg) 5275c6c1daeSBarry Smith { 5285c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5295c6c1daeSBarry Smith PetscBool iascii; 5305c6c1daeSBarry Smith PetscErrorCode ierr; 5315c6c1daeSBarry Smith 5325c6c1daeSBarry Smith PetscFunctionBegin; 5335c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5345c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5355c6c1daeSBarry Smith if (iascii) { 536a297a907SKarl Rupp if (flg) ascii->tab = ascii->tab_store; 537a297a907SKarl Rupp else { 5385c6c1daeSBarry Smith ascii->tab_store = ascii->tab; 5395c6c1daeSBarry Smith ascii->tab = 0; 5405c6c1daeSBarry Smith } 5415c6c1daeSBarry Smith } 5425c6c1daeSBarry Smith PetscFunctionReturn(0); 5435c6c1daeSBarry Smith } 5445c6c1daeSBarry Smith 5455c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */ 5465c6c1daeSBarry Smith 5475c6c1daeSBarry Smith 5485c6c1daeSBarry Smith /*@C 5495c6c1daeSBarry Smith PetscViewerASCIIPrintf - Prints to a file, only from the first 5505c6c1daeSBarry Smith processor in the PetscViewer 5515c6c1daeSBarry Smith 5525c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5535c6c1daeSBarry Smith 5545c6c1daeSBarry Smith Input Parameters: 5551575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 5565c6c1daeSBarry Smith - format - the usual printf() format string 5575c6c1daeSBarry Smith 5585c6c1daeSBarry Smith Level: developer 5595c6c1daeSBarry Smith 5605c6c1daeSBarry Smith Fortran Note: 5615c6c1daeSBarry Smith The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran. 5625c6c1daeSBarry Smith That is, you can only pass a single character string from Fortran. 5635c6c1daeSBarry Smith 5645c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(), 5655c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), 5661575c14dSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushSynchronized() 5675c6c1daeSBarry Smith @*/ 5685c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...) 5695c6c1daeSBarry Smith { 5705c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5715c6c1daeSBarry Smith PetscMPIInt rank; 572dd2fa690SBarry Smith PetscInt tab,intab = ascii->tab; 5735c6c1daeSBarry Smith PetscErrorCode ierr; 5745c6c1daeSBarry Smith FILE *fd = ascii->fd; 5753f08860eSBarry Smith PetscBool iascii; 5765c6c1daeSBarry Smith int err; 5775c6c1daeSBarry Smith 5785c6c1daeSBarry Smith PetscFunctionBegin; 5795c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 580e5afcf28SBarry Smith if (ascii->sviewer) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_ARG_WRONGSTATE,"Cannot call with outstanding call to PetscViewerRestoreSubViewer()"); 5815c6c1daeSBarry Smith PetscValidCharPointer(format,2); 5825c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5835c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 584ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 585559f443fSBarry Smith if (rank) PetscFunctionReturn(0); 5863f08860eSBarry Smith 5873f08860eSBarry Smith if (ascii->bviewer) { /* pass string up to parent viewer */ 5883f08860eSBarry Smith char *string; 5893f08860eSBarry Smith va_list Argp; 5903f08860eSBarry Smith size_t fullLength; 5913f08860eSBarry Smith 5923f08860eSBarry Smith ierr = PetscCalloc1(QUEUESTRINGSIZE, &string);CHKERRQ(ierr); 5933f08860eSBarry Smith va_start(Argp,format); 5941575c14dSBarry Smith ierr = PetscVSNPrintf(string,QUEUESTRINGSIZE,format,&fullLength,Argp);CHKERRQ(ierr); 5953f08860eSBarry Smith va_end(Argp); 596559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%s",string);CHKERRQ(ierr); 5973f08860eSBarry Smith ierr = PetscFree(string);CHKERRQ(ierr); 5983f08860eSBarry Smith } else { /* write directly to file */ 5995c6c1daeSBarry Smith va_list Argp; 600559f443fSBarry Smith /* flush my own messages that I may have queued up */ 601559f443fSBarry Smith PrintfQueue next = ascii->petsc_printfqueuebase,previous; 602559f443fSBarry Smith PetscInt i; 603559f443fSBarry Smith for (i=0; i<ascii->petsc_printfqueuelength; i++) { 604559f443fSBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"%s",next->string);CHKERRQ(ierr); 605559f443fSBarry Smith previous = next; 606559f443fSBarry Smith next = next->next; 607559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 608559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 609559f443fSBarry Smith } 610*02c9f0b5SLisandro Dalcin ascii->petsc_printfqueue = NULL; 611559f443fSBarry Smith ascii->petsc_printfqueuelength = 0; 612dd2fa690SBarry Smith tab = intab; 613a297a907SKarl Rupp while (tab--) { 614a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fd," ");CHKERRQ(ierr); 615a297a907SKarl Rupp } 6165c6c1daeSBarry Smith 6175c6c1daeSBarry Smith va_start(Argp,format); 6185c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr); 6195c6c1daeSBarry Smith err = fflush(fd); 6205c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6215c6c1daeSBarry Smith if (petsc_history) { 6225c6c1daeSBarry Smith va_start(Argp,format); 623dd2fa690SBarry Smith tab = intab; 624a297a907SKarl Rupp while (tab--) { 625706d7a88SBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history," ");CHKERRQ(ierr); 626a297a907SKarl Rupp } 6275c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 6285c6c1daeSBarry Smith err = fflush(petsc_history); 6295c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6305c6c1daeSBarry Smith } 6315c6c1daeSBarry Smith va_end(Argp); 6325c6c1daeSBarry Smith } 6335c6c1daeSBarry Smith PetscFunctionReturn(0); 6345c6c1daeSBarry Smith } 6355c6c1daeSBarry Smith 6365c6c1daeSBarry Smith /*@C 6375c6c1daeSBarry Smith PetscViewerFileSetName - Sets the name of the file the PetscViewer uses. 6385c6c1daeSBarry Smith 6395c6c1daeSBarry Smith Collective on PetscViewer 6405c6c1daeSBarry Smith 6415c6c1daeSBarry Smith Input Parameters: 6425c6c1daeSBarry Smith + viewer - the PetscViewer; either ASCII or binary 6435c6c1daeSBarry Smith - name - the name of the file it should use 6445c6c1daeSBarry Smith 6455c6c1daeSBarry Smith Level: advanced 6465c6c1daeSBarry Smith 6475c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(), 6485c6c1daeSBarry Smith PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf() 6495c6c1daeSBarry Smith 6505c6c1daeSBarry Smith @*/ 6515c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName(PetscViewer viewer,const char name[]) 6525c6c1daeSBarry Smith { 6535c6c1daeSBarry Smith PetscErrorCode ierr; 6542fbecc10SBarry Smith char b[PETSC_MAX_PATH_LEN]; 6555c6c1daeSBarry Smith 6565c6c1daeSBarry Smith PetscFunctionBegin; 6575c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6585c6c1daeSBarry Smith PetscValidCharPointer(name,2); 6592fbecc10SBarry Smith ierr = PetscStrreplace(PetscObjectComm((PetscObject)viewer),name,b,sizeof(b));CHKERRQ(ierr); 6602fbecc10SBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,b));CHKERRQ(ierr); 6615c6c1daeSBarry Smith PetscFunctionReturn(0); 6625c6c1daeSBarry Smith } 6635c6c1daeSBarry Smith 6645c6c1daeSBarry Smith /*@C 6655c6c1daeSBarry Smith PetscViewerFileGetName - Gets the name of the file the PetscViewer uses. 6665c6c1daeSBarry Smith 6675c6c1daeSBarry Smith Not Collective 6685c6c1daeSBarry Smith 6695c6c1daeSBarry Smith Input Parameter: 6705c6c1daeSBarry Smith . viewer - the PetscViewer; either ASCII or binary 6715c6c1daeSBarry Smith 6725c6c1daeSBarry Smith Output Parameter: 6735c6c1daeSBarry Smith . name - the name of the file it is using 6745c6c1daeSBarry Smith 6755c6c1daeSBarry Smith Level: advanced 6765c6c1daeSBarry Smith 6775c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName() 6785c6c1daeSBarry Smith 6795c6c1daeSBarry Smith @*/ 6805c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName(PetscViewer viewer,const char **name) 6815c6c1daeSBarry Smith { 6825c6c1daeSBarry Smith PetscErrorCode ierr; 6835c6c1daeSBarry Smith 6845c6c1daeSBarry Smith PetscFunctionBegin; 6855c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6866e05b1faSLisandro Dalcin PetscValidPointer(name,2); 687163d334eSBarry Smith ierr = PetscUseMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr); 6885c6c1daeSBarry Smith PetscFunctionReturn(0); 6895c6c1daeSBarry Smith } 6905c6c1daeSBarry Smith 6915c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name) 6925c6c1daeSBarry Smith { 6935c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 6945c6c1daeSBarry Smith 6955c6c1daeSBarry Smith PetscFunctionBegin; 6965c6c1daeSBarry Smith *name = vascii->filename; 6975c6c1daeSBarry Smith PetscFunctionReturn(0); 6985c6c1daeSBarry Smith } 6995c6c1daeSBarry Smith 7005c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[]) 7015c6c1daeSBarry Smith { 7025c6c1daeSBarry Smith PetscErrorCode ierr; 7035c6c1daeSBarry Smith size_t len; 7045c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN],*gz; 7055c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 7065c6c1daeSBarry Smith PetscBool isstderr,isstdout; 7075c6c1daeSBarry Smith PetscMPIInt rank; 7085c6c1daeSBarry Smith 7095c6c1daeSBarry Smith PetscFunctionBegin; 7105c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 7115c6c1daeSBarry Smith if (!name) PetscFunctionReturn(0); 7125c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr); 7135c6c1daeSBarry Smith 7145c6c1daeSBarry Smith /* Is this file to be compressed */ 7155c6c1daeSBarry Smith vascii->storecompressed = PETSC_FALSE; 716a297a907SKarl Rupp 7175c6c1daeSBarry Smith ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr); 7185c6c1daeSBarry Smith if (gz) { 7195c6c1daeSBarry Smith ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); 7205c6c1daeSBarry Smith if (len == 3) { 72108fb59bfSBarry 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"); 7225c6c1daeSBarry Smith *gz = 0; 7235c6c1daeSBarry Smith vascii->storecompressed = PETSC_TRUE; 7245c6c1daeSBarry Smith } 7255c6c1daeSBarry Smith } 726ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 7275c6c1daeSBarry Smith if (!rank) { 7285c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr); 7295c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr); 7305c6c1daeSBarry Smith /* empty filename means stdout */ 7315c6c1daeSBarry Smith if (name[0] == 0) isstdout = PETSC_TRUE; 7325c6c1daeSBarry Smith if (isstderr) vascii->fd = PETSC_STDERR; 7335c6c1daeSBarry Smith else if (isstdout) vascii->fd = PETSC_STDOUT; 7345c6c1daeSBarry Smith else { 7355c6c1daeSBarry Smith 7365c6c1daeSBarry Smith 7375c6c1daeSBarry Smith ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 7385c6c1daeSBarry Smith switch (vascii->mode) { 7395c6c1daeSBarry Smith case FILE_MODE_READ: 7405c6c1daeSBarry Smith vascii->fd = fopen(fname,"r"); 7415c6c1daeSBarry Smith break; 7425c6c1daeSBarry Smith case FILE_MODE_WRITE: 7435c6c1daeSBarry Smith vascii->fd = fopen(fname,"w"); 7445c6c1daeSBarry Smith break; 7455c6c1daeSBarry Smith case FILE_MODE_APPEND: 7465c6c1daeSBarry Smith vascii->fd = fopen(fname,"a"); 7475c6c1daeSBarry Smith break; 7485c6c1daeSBarry Smith case FILE_MODE_UPDATE: 7495c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 750a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 7515c6c1daeSBarry Smith break; 7525c6c1daeSBarry Smith case FILE_MODE_APPEND_UPDATE: 7535c6c1daeSBarry Smith /* I really want a file which is opened at the end for updating, 7545c6c1daeSBarry Smith not a+, which opens at the beginning, but makes writes at the end. 7555c6c1daeSBarry Smith */ 7565c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 757a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 758a297a907SKarl Rupp else { 7595c6c1daeSBarry Smith ierr = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr); 7605c6c1daeSBarry Smith } 7615c6c1daeSBarry Smith break; 7625c6c1daeSBarry Smith default: 7635c6c1daeSBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode); 7645c6c1daeSBarry Smith } 7655c6c1daeSBarry Smith if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname); 7665c6c1daeSBarry Smith } 7675c6c1daeSBarry Smith } 7685c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 7695c6c1daeSBarry Smith PetscLogObjectState((PetscObject)viewer,"File: %s",name); 7705c6c1daeSBarry Smith #endif 7715c6c1daeSBarry Smith PetscFunctionReturn(0); 7725c6c1daeSBarry Smith } 7735c6c1daeSBarry Smith 7743f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 7755c6c1daeSBarry Smith { 7765c6c1daeSBarry Smith PetscMPIInt rank; 7775c6c1daeSBarry Smith PetscErrorCode ierr; 7785c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii; 7795c6c1daeSBarry Smith 7805c6c1daeSBarry Smith PetscFunctionBegin; 781e5afcf28SBarry Smith ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 7823f08860eSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer already obtained from PetscViewer and not restored"); 783e5afcf28SBarry Smith /* 784e5afcf28SBarry Smith The following line is a bug; but if it is removed the code won't work because it relies on this behavior. In particular 785e5afcf28SBarry Smith this line causes the synchronized flush to occur when the viewer is destroyed (since the count never gets to zero) 786e5afcf28SBarry Smith in some examples this displays information that otherwise would be lost 787e5afcf28SBarry Smith */ 7881575c14dSBarry Smith ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 7893f08860eSBarry Smith ierr = PetscViewerCreate(subcomm,outviewer);CHKERRQ(ierr); 7905c6c1daeSBarry Smith ierr = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr); 7911575c14dSBarry Smith ierr = PetscViewerASCIIPushSynchronized(*outviewer);CHKERRQ(ierr); 7925c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 7935c6c1daeSBarry Smith ovascii->fd = vascii->fd; 7945c6c1daeSBarry Smith ovascii->tab = vascii->tab; 795ba5a0b41SBarry Smith ovascii->closefile = PETSC_FALSE; 7965c6c1daeSBarry Smith 7975c6c1daeSBarry Smith vascii->sviewer = *outviewer; 7985c6c1daeSBarry Smith 7995c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 8005c6c1daeSBarry Smith 801ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 8025c6c1daeSBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer; 8033f08860eSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer; 8045c6c1daeSBarry Smith PetscFunctionReturn(0); 8055c6c1daeSBarry Smith } 8065c6c1daeSBarry Smith 8073f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 8085c6c1daeSBarry Smith { 8095c6c1daeSBarry Smith PetscErrorCode ierr; 8105c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 8115c6c1daeSBarry Smith 8125c6c1daeSBarry Smith PetscFunctionBegin; 8131575c14dSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer never obtained from PetscViewer"); 8141575c14dSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate this SubViewer"); 8155c6c1daeSBarry Smith 816e5afcf28SBarry Smith ascii->sviewer = NULL; 8175c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 8185c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 819e5afcf28SBarry Smith ierr = PetscViewerASCIIPopSynchronized(viewer);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; 865*02c9f0b5SLisandro Dalcin vascii->bviewer = NULL; 866*02c9f0b5SLisandro Dalcin vascii->subviewer = NULL; 867*02c9f0b5SLisandro Dalcin vascii->sviewer = NULL; 8685c6c1daeSBarry Smith vascii->tab = 0; 8695c6c1daeSBarry Smith vascii->tab_store = 0; 870*02c9f0b5SLisandro Dalcin vascii->filename = NULL; 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 89395452b02SPatrick Sanan Notes: 894e6abc3ddSVáclav Hapla You must have previously called PetscViewerASCIIPushSynchronized() to allow this routine to be called. 895e6abc3ddSVáclav Hapla Then you can do multiple independent calls to this routine. 896e6abc3ddSVáclav Hapla The actual synchronized print is then done using PetscViewerFlush(). 897e6abc3ddSVáclav Hapla PetscViewerASCIIPopSynchronized() should be then called if we are already done with the synchronized output 898e6abc3ddSVáclav Hapla to conclude the "synchronized session". 899e6abc3ddSVáclav Hapla So the typical calling sequence looks like 900e6abc3ddSVáclav Hapla $ PetscViewerASCIIPushSynchronized(viewer); 901e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 902e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 903e6abc3ddSVáclav Hapla $ ... 904e6abc3ddSVáclav Hapla $ PetscViewerFlush(viewer); 905e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 906e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 907e6abc3ddSVáclav Hapla $ ... 908e6abc3ddSVáclav Hapla $ PetscViewerFlush(viewer); 909e6abc3ddSVáclav Hapla $ PetscViewerASCIIPopSynchronized(viewer); 9105c6c1daeSBarry Smith 9115c6c1daeSBarry Smith Fortran Note: 9125c6c1daeSBarry Smith Can only print a single character* string 9135c6c1daeSBarry Smith 914e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIIPushSynchronized(), PetscViewerFlush(), PetscViewerASCIIPopSynchronized(), 915e6abc3ddSVáclav Hapla PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(), 916e6abc3ddSVáclav Hapla PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType() 9175c6c1daeSBarry Smith @*/ 9185c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...) 9195c6c1daeSBarry Smith { 9205c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 9215c6c1daeSBarry Smith PetscErrorCode ierr; 9223f08860eSBarry Smith PetscMPIInt rank; 9235c6c1daeSBarry Smith PetscInt tab = vascii->tab; 9245c6c1daeSBarry Smith MPI_Comm comm; 9255c6c1daeSBarry Smith FILE *fp; 926559f443fSBarry Smith PetscBool iascii,hasbviewer = PETSC_FALSE; 9275c6c1daeSBarry Smith int err; 9285c6c1daeSBarry Smith 9295c6c1daeSBarry Smith PetscFunctionBegin; 9305c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 9315c6c1daeSBarry Smith PetscValidCharPointer(format,2); 9325c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9335c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 9341575c14dSBarry Smith if (!vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIIPushSynchronized() to allow this call"); 9355c6c1daeSBarry Smith 936ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 9375c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 9385c6c1daeSBarry Smith 939559f443fSBarry Smith if (vascii->bviewer) { 940559f443fSBarry Smith hasbviewer = PETSC_TRUE; 941559f443fSBarry Smith if (!rank) { 942559f443fSBarry Smith vascii = (PetscViewer_ASCII*)vascii->bviewer->data; 943559f443fSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 944559f443fSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 945559f443fSBarry Smith } 946559f443fSBarry Smith } 9473f08860eSBarry Smith 948559f443fSBarry Smith fp = vascii->fd; 949559f443fSBarry Smith 950559f443fSBarry Smith if (!rank && !hasbviewer) { /* First processor prints immediately to fp */ 9515c6c1daeSBarry Smith va_list Argp; 952559f443fSBarry Smith /* flush my own messages that I may have queued up */ 953559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 954559f443fSBarry Smith PetscInt i; 955559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 956559f443fSBarry Smith ierr = PetscFPrintf(comm,fp,"%s",next->string);CHKERRQ(ierr); 957559f443fSBarry Smith previous = next; 958559f443fSBarry Smith next = next->next; 959559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 960559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 961559f443fSBarry Smith } 962*02c9f0b5SLisandro Dalcin vascii->petsc_printfqueue = NULL; 963559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 9645c6c1daeSBarry Smith 965a297a907SKarl Rupp while (tab--) { 966a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fp," ");CHKERRQ(ierr); 967a297a907SKarl Rupp } 9685c6c1daeSBarry Smith 9695c6c1daeSBarry Smith va_start(Argp,format); 9705c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr); 9715c6c1daeSBarry Smith err = fflush(fp); 9725c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9735c6c1daeSBarry Smith if (petsc_history) { 9745c6c1daeSBarry Smith va_start(Argp,format); 9755c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 9765c6c1daeSBarry Smith err = fflush(petsc_history); 9775c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9785c6c1daeSBarry Smith } 9795c6c1daeSBarry Smith va_end(Argp); 980559f443fSBarry Smith } else { /* other processors add to queue */ 9815c6c1daeSBarry Smith char *string; 9825c6c1daeSBarry Smith va_list Argp; 9835c6c1daeSBarry Smith size_t fullLength; 9845c6c1daeSBarry Smith PrintfQueue next; 9855c6c1daeSBarry Smith 986b00a9115SJed Brown ierr = PetscNew(&next);CHKERRQ(ierr); 987559f443fSBarry Smith if (vascii->petsc_printfqueue) { 988559f443fSBarry Smith vascii->petsc_printfqueue->next = next; 989559f443fSBarry Smith vascii->petsc_printfqueue = next; 990a297a907SKarl Rupp } else { 991559f443fSBarry Smith vascii->petsc_printfqueuebase = vascii->petsc_printfqueue = next; 992a297a907SKarl Rupp } 993559f443fSBarry Smith vascii->petsc_printfqueuelength++; 9945c6c1daeSBarry Smith next->size = QUEUESTRINGSIZE; 995580bdb30SBarry Smith ierr = PetscCalloc1(next->size, &next->string);CHKERRQ(ierr); 9965c6c1daeSBarry Smith string = next->string; 9975c6c1daeSBarry Smith tab *= 2; 998a297a907SKarl Rupp while (tab--) { 999a297a907SKarl Rupp *string++ = ' '; 1000a297a907SKarl Rupp } 10015c6c1daeSBarry Smith va_start(Argp,format); 100222d28d08SBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr); 10035c6c1daeSBarry Smith va_end(Argp); 1004cb500232SBarry Smith if (fullLength > (size_t) (next->size-2*vascii->tab)) { 100514416c0eSBarry Smith ierr = PetscFree(next->string);CHKERRQ(ierr); 100614416c0eSBarry Smith next->size = fullLength + 2*vascii->tab; 1007580bdb30SBarry Smith ierr = PetscCalloc1(next->size, &next->string);CHKERRQ(ierr); 100814416c0eSBarry Smith string = next->string; 100914416c0eSBarry Smith tab = 2*vascii->tab; 101014416c0eSBarry Smith while (tab--) { 101114416c0eSBarry Smith *string++ = ' '; 101214416c0eSBarry Smith } 101314416c0eSBarry Smith va_start(Argp,format); 101414416c0eSBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,NULL,Argp);CHKERRQ(ierr); 101514416c0eSBarry Smith va_end(Argp); 101614416c0eSBarry Smith } 10175c6c1daeSBarry Smith } 10185c6c1daeSBarry Smith PetscFunctionReturn(0); 10195c6c1daeSBarry Smith } 10205c6c1daeSBarry Smith 10212655f987SMichael Lange /*@C 1022f8859db6SBarry Smith PetscViewerASCIIRead - Reads from a ASCII file 10232655f987SMichael Lange 1024f8859db6SBarry Smith Only process 0 in the PetscViewer may call this 10252655f987SMichael Lange 10262655f987SMichael Lange Input Parameters: 10272655f987SMichael Lange + viewer - the ascii viewer 10282655f987SMichael Lange . data - location to write the data 1029060da220SMatthew G. Knepley . num - number of items of data to read 10302655f987SMichael Lange - datatype - type of data to read 10312655f987SMichael Lange 1032f8e4bde8SMatthew G. Knepley Output Parameters: 1033060da220SMatthew G. Knepley . count - number of items of data actually read, or NULL 1034f8e4bde8SMatthew G. Knepley 10352655f987SMichael Lange Level: beginner 10362655f987SMichael Lange 1037f8859db6SBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetName() 10382655f987SMichael Lange VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), 103905119932SBarry Smith PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscViewerBinaryRead() 10402655f987SMichael Lange @*/ 1041060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype) 10422655f987SMichael Lange { 10432655f987SMichael Lange PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 10442655f987SMichael Lange FILE *fd = vascii->fd; 10452655f987SMichael Lange PetscInt i; 10463b7fe8c3SMatthew G. Knepley int ret = 0; 1047f8859db6SBarry Smith PetscMPIInt rank; 1048f8859db6SBarry Smith PetscErrorCode ierr; 10492655f987SMichael Lange 10502655f987SMichael Lange PetscFunctionBegin; 10512655f987SMichael Lange PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 1052f8859db6SBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 1053f8859db6SBarry Smith if (rank) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG,"Can only be called from process 0 in the PetscViewer"); 1054060da220SMatthew G. Knepley for (i=0; i<num; i++) { 1055f8e4bde8SMatthew G. Knepley if (dtype == PETSC_CHAR) ret = fscanf(fd, "%c", &(((char*)data)[i])); 1056f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_STRING) ret = fscanf(fd, "%s", &(((char*)data)[i])); 1057a05e1a72SSatish Balay else if (dtype == PETSC_INT) ret = fscanf(fd, "%" PetscInt_FMT, &(((PetscInt*)data)[i])); 1058f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_ENUM) ret = fscanf(fd, "%d", &(((int*)data)[i])); 10599e3e4c22SLisandro Dalcin else if (dtype == PETSC_INT64) ret = fscanf(fd, "%" PetscInt64_FMT, &(((PetscInt64*)data)[i])); 1060972064b6SLisandro Dalcin else if (dtype == PETSC_LONG) ret = fscanf(fd, "%ld", &(((long*)data)[i])); 1061f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_FLOAT) ret = fscanf(fd, "%f", &(((float*)data)[i])); 1062f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_DOUBLE) ret = fscanf(fd, "%lg", &(((double*)data)[i])); 1063a6e181c6SToby Isaac #if defined(PETSC_USE_REAL___FLOAT128) 1064fba955ccSBarry Smith else if (dtype == PETSC___FLOAT128) { 1065fba955ccSBarry Smith double tmp; 1066fba955ccSBarry Smith ret = fscanf(fd, "%lg", &tmp); 1067a6e181c6SToby Isaac ((__float128*)data)[i] = tmp; 1068a6e181c6SToby Isaac } 1069fba955ccSBarry Smith #endif 1070f8e4bde8SMatthew G. Knepley else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);} 1071f8e4bde8SMatthew G. Knepley if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype); 1072f8e4bde8SMatthew G. Knepley else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */ 10732655f987SMichael Lange } 1074060da220SMatthew G. Knepley if (count) *count = i; 1075060da220SMatthew G. Knepley else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num); 10762655f987SMichael Lange PetscFunctionReturn(0); 10772655f987SMichael Lange } 10785c6c1daeSBarry Smith 1079