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() 2845c6c1daeSBarry Smith Output Parameters: 2855c6c1daeSBarry Smith . tabs - number of tabs 2865c6c1daeSBarry Smith 2875c6c1daeSBarry Smith Level: developer 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith Fortran Note: 2905c6c1daeSBarry Smith This routine is not supported in Fortran. 2915c6c1daeSBarry Smith 2925c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2935c6c1daeSBarry Smith Concepts: tab^retrieval 2945c6c1daeSBarry Smith 2955c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(), 2965c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2975c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2985c6c1daeSBarry Smith @*/ 2995c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs) 3005c6c1daeSBarry Smith { 3015c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3025c6c1daeSBarry Smith PetscBool iascii; 3035c6c1daeSBarry Smith PetscErrorCode ierr; 3045c6c1daeSBarry Smith 3055c6c1daeSBarry Smith PetscFunctionBegin; 3065c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3075c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 308a297a907SKarl Rupp if (iascii && tabs) *tabs = ascii->tab; 3095c6c1daeSBarry Smith PetscFunctionReturn(0); 3105c6c1daeSBarry Smith } 3115c6c1daeSBarry Smith 3125c6c1daeSBarry Smith /*@ 3135c6c1daeSBarry Smith PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing 3145c6c1daeSBarry Smith 3155c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3165c6c1daeSBarry Smith 3175c6c1daeSBarry Smith Input Parameters: 3181575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 3195c6c1daeSBarry Smith - tabs - number of tabs 3205c6c1daeSBarry Smith 3215c6c1daeSBarry Smith Level: developer 3225c6c1daeSBarry Smith 3235c6c1daeSBarry Smith Fortran Note: 3245c6c1daeSBarry Smith This routine is not supported in Fortran. 3255c6c1daeSBarry Smith 3265c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3275c6c1daeSBarry Smith Concepts: tab^setting 3285c6c1daeSBarry Smith 3295c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3305c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3315c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3325c6c1daeSBarry Smith @*/ 3335c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs) 3345c6c1daeSBarry Smith { 3355c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3365c6c1daeSBarry Smith PetscBool iascii; 3375c6c1daeSBarry Smith PetscErrorCode ierr; 3385c6c1daeSBarry Smith 3395c6c1daeSBarry Smith PetscFunctionBegin; 3405c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3415c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 342a297a907SKarl Rupp if (iascii) ascii->tab += tabs; 3435c6c1daeSBarry Smith PetscFunctionReturn(0); 3445c6c1daeSBarry Smith } 3455c6c1daeSBarry Smith 3465c6c1daeSBarry Smith /*@ 3475c6c1daeSBarry Smith PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing 3485c6c1daeSBarry Smith 3495c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith Input Parameters: 3521575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 3535c6c1daeSBarry Smith - tabs - number of tabs 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith Level: developer 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Fortran Note: 3585c6c1daeSBarry Smith This routine is not supported in Fortran. 3595c6c1daeSBarry Smith 3605c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3615c6c1daeSBarry Smith Concepts: tab^setting 3625c6c1daeSBarry Smith 3635c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3645c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3655c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3665c6c1daeSBarry Smith @*/ 3675c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs) 3685c6c1daeSBarry Smith { 3695c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3705c6c1daeSBarry Smith PetscBool iascii; 3715c6c1daeSBarry Smith PetscErrorCode ierr; 3725c6c1daeSBarry Smith 3735c6c1daeSBarry Smith PetscFunctionBegin; 3745c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3755c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 376a297a907SKarl Rupp if (iascii) ascii->tab -= tabs; 3775c6c1daeSBarry Smith PetscFunctionReturn(0); 3785c6c1daeSBarry Smith } 3795c6c1daeSBarry Smith 3805c6c1daeSBarry Smith /*@C 3811575c14dSBarry Smith PetscViewerASCIIPushSynchronized - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer 3825c6c1daeSBarry Smith 3835c6c1daeSBarry Smith Collective on PetscViewer 3845c6c1daeSBarry Smith 3855c6c1daeSBarry Smith Input Parameters: 3861575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 3875c6c1daeSBarry Smith 3885c6c1daeSBarry Smith Level: intermediate 3895c6c1daeSBarry Smith 390*e6abc3ddSVáclav Hapla Notes: 391*e6abc3ddSVáclav Hapla See documentation of PetscViewerASCIISynchronizedPrintf() for more details how the synchronized output should be done properly. 392*e6abc3ddSVáclav Hapla 3935c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3945c6c1daeSBarry Smith Concepts: tab^setting 3955c6c1daeSBarry Smith 396*e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush(), PetscViewerASCIIPopSynchronized(), 397*e6abc3ddSVáclav Hapla PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(), 398*e6abc3ddSVáclav Hapla PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType() 3995c6c1daeSBarry Smith @*/ 4001575c14dSBarry Smith PetscErrorCode PetscViewerASCIIPushSynchronized(PetscViewer viewer) 4015c6c1daeSBarry Smith { 4025c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4035c6c1daeSBarry Smith PetscBool iascii; 4045c6c1daeSBarry Smith PetscErrorCode ierr; 4055c6c1daeSBarry Smith 4065c6c1daeSBarry Smith PetscFunctionBegin; 4075c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4085c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4091575c14dSBarry Smith if (iascii) ascii->allowsynchronized++; 4101575c14dSBarry Smith PetscFunctionReturn(0); 4111575c14dSBarry Smith } 4121575c14dSBarry Smith 4131575c14dSBarry Smith /*@C 4141575c14dSBarry Smith PetscViewerASCIIPopSynchronized - Undoes most recent PetscViewerASCIIPushSynchronized() for this viewer 4151575c14dSBarry Smith 4161575c14dSBarry Smith Collective on PetscViewer 4171575c14dSBarry Smith 4181575c14dSBarry Smith Input Parameters: 4191575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 4201575c14dSBarry Smith 4211575c14dSBarry Smith Level: intermediate 4221575c14dSBarry Smith 423*e6abc3ddSVáclav Hapla Notes: 424*e6abc3ddSVáclav Hapla See documentation of PetscViewerASCIISynchronizedPrintf() for more details how the synchronized output should be done properly. 425*e6abc3ddSVáclav Hapla 4261575c14dSBarry Smith Concepts: PetscViewerASCII^formating 4271575c14dSBarry Smith Concepts: tab^setting 4281575c14dSBarry Smith 429*e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIIPushSynchronized(), PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush(), 430*e6abc3ddSVáclav Hapla PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(), 431*e6abc3ddSVáclav Hapla PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType() 4321575c14dSBarry Smith @*/ 4331575c14dSBarry Smith PetscErrorCode PetscViewerASCIIPopSynchronized(PetscViewer viewer) 4341575c14dSBarry Smith { 4351575c14dSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4361575c14dSBarry Smith PetscBool iascii; 4371575c14dSBarry Smith PetscErrorCode ierr; 4381575c14dSBarry Smith 4391575c14dSBarry Smith PetscFunctionBegin; 4401575c14dSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4411575c14dSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4421575c14dSBarry Smith if (iascii) { 4431575c14dSBarry Smith ascii->allowsynchronized--; 4441575c14dSBarry Smith if (ascii->allowsynchronized < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Called more times than PetscViewerASCIIPushSynchronized()"); 4451575c14dSBarry Smith } 4465c6c1daeSBarry Smith PetscFunctionReturn(0); 4475c6c1daeSBarry Smith } 4485c6c1daeSBarry Smith 4491c297824SMatthew G. Knepley /*@C 4505c6c1daeSBarry Smith PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf() 4515c6c1daeSBarry Smith lines are tabbed. 4525c6c1daeSBarry Smith 4535c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4545c6c1daeSBarry Smith 4555c6c1daeSBarry Smith Input Parameters: 4561575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 4575c6c1daeSBarry Smith 4585c6c1daeSBarry Smith Level: developer 4595c6c1daeSBarry Smith 4605c6c1daeSBarry Smith Fortran Note: 4615c6c1daeSBarry Smith This routine is not supported in Fortran. 4625c6c1daeSBarry Smith 4635c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4645c6c1daeSBarry Smith Concepts: tab^setting 4655c6c1daeSBarry Smith 4665c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4675c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4685c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4695c6c1daeSBarry Smith @*/ 4705c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPushTab(PetscViewer viewer) 4715c6c1daeSBarry Smith { 4725c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4735c6c1daeSBarry Smith PetscBool iascii; 4745c6c1daeSBarry Smith PetscErrorCode ierr; 4755c6c1daeSBarry Smith 4765c6c1daeSBarry Smith PetscFunctionBegin; 4775c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4785c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 479a297a907SKarl Rupp if (iascii) ascii->tab++; 4805c6c1daeSBarry Smith PetscFunctionReturn(0); 4815c6c1daeSBarry Smith } 4825c6c1daeSBarry Smith 4831c297824SMatthew G. Knepley /*@C 4845c6c1daeSBarry Smith PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf() 4855c6c1daeSBarry Smith lines are tabbed. 4865c6c1daeSBarry Smith 4875c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4885c6c1daeSBarry Smith 4895c6c1daeSBarry Smith Input Parameters: 4901575c14dSBarry Smith . viewer - obtained with PetscViewerASCIIOpen() 4915c6c1daeSBarry Smith 4925c6c1daeSBarry Smith Level: developer 4935c6c1daeSBarry Smith 4945c6c1daeSBarry Smith Fortran Note: 4955c6c1daeSBarry Smith This routine is not supported in Fortran. 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4985c6c1daeSBarry Smith Concepts: tab^setting 4995c6c1daeSBarry Smith 5005c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 5015c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 5025c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 5035c6c1daeSBarry Smith @*/ 5045c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPopTab(PetscViewer viewer) 5055c6c1daeSBarry Smith { 5065c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5075c6c1daeSBarry Smith PetscErrorCode ierr; 5085c6c1daeSBarry Smith PetscBool iascii; 5095c6c1daeSBarry Smith 5105c6c1daeSBarry Smith PetscFunctionBegin; 5115c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5125c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5135c6c1daeSBarry Smith if (iascii) { 5145c6c1daeSBarry Smith if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed"); 5155c6c1daeSBarry Smith ascii->tab--; 5165c6c1daeSBarry Smith } 5175c6c1daeSBarry Smith PetscFunctionReturn(0); 5185c6c1daeSBarry Smith } 5195c6c1daeSBarry Smith 5205c6c1daeSBarry Smith /*@ 5215c6c1daeSBarry Smith PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer 5225c6c1daeSBarry Smith 5235c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5245c6c1daeSBarry Smith 5255c6c1daeSBarry Smith Input Parameters: 5261575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 5275c6c1daeSBarry Smith - flg - PETSC_TRUE or PETSC_FALSE 5285c6c1daeSBarry Smith 5295c6c1daeSBarry Smith Level: developer 5305c6c1daeSBarry Smith 5315c6c1daeSBarry Smith Fortran Note: 5325c6c1daeSBarry Smith This routine is not supported in Fortran. 5335c6c1daeSBarry Smith 5345c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 5355c6c1daeSBarry Smith Concepts: tab^setting 5365c6c1daeSBarry Smith 5375c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 5385c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(), 5395c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 5405c6c1daeSBarry Smith @*/ 5415c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg) 5425c6c1daeSBarry Smith { 5435c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5445c6c1daeSBarry Smith PetscBool iascii; 5455c6c1daeSBarry Smith PetscErrorCode ierr; 5465c6c1daeSBarry Smith 5475c6c1daeSBarry Smith PetscFunctionBegin; 5485c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5495c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5505c6c1daeSBarry Smith if (iascii) { 551a297a907SKarl Rupp if (flg) ascii->tab = ascii->tab_store; 552a297a907SKarl Rupp else { 5535c6c1daeSBarry Smith ascii->tab_store = ascii->tab; 5545c6c1daeSBarry Smith ascii->tab = 0; 5555c6c1daeSBarry Smith } 5565c6c1daeSBarry Smith } 5575c6c1daeSBarry Smith PetscFunctionReturn(0); 5585c6c1daeSBarry Smith } 5595c6c1daeSBarry Smith 5605c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */ 5615c6c1daeSBarry Smith 5625c6c1daeSBarry Smith 5635c6c1daeSBarry Smith /*@C 5645c6c1daeSBarry Smith PetscViewerASCIIPrintf - Prints to a file, only from the first 5655c6c1daeSBarry Smith processor in the PetscViewer 5665c6c1daeSBarry Smith 5675c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5685c6c1daeSBarry Smith 5695c6c1daeSBarry Smith Input Parameters: 5701575c14dSBarry Smith + viewer - obtained with PetscViewerASCIIOpen() 5715c6c1daeSBarry Smith - format - the usual printf() format string 5725c6c1daeSBarry Smith 5735c6c1daeSBarry Smith Level: developer 5745c6c1daeSBarry Smith 5755c6c1daeSBarry Smith Fortran Note: 5765c6c1daeSBarry Smith The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran. 5775c6c1daeSBarry Smith That is, you can only pass a single character string from Fortran. 5785c6c1daeSBarry Smith 5795c6c1daeSBarry Smith Concepts: PetscViewerASCII^printing 5805c6c1daeSBarry Smith Concepts: printing^to file 5815c6c1daeSBarry Smith Concepts: printf 5825c6c1daeSBarry Smith 5835c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(), 5845c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), 5851575c14dSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushSynchronized() 5865c6c1daeSBarry Smith @*/ 5875c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...) 5885c6c1daeSBarry Smith { 5895c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5905c6c1daeSBarry Smith PetscMPIInt rank; 591dd2fa690SBarry Smith PetscInt tab,intab = ascii->tab; 5925c6c1daeSBarry Smith PetscErrorCode ierr; 5935c6c1daeSBarry Smith FILE *fd = ascii->fd; 5943f08860eSBarry Smith PetscBool iascii; 5955c6c1daeSBarry Smith int err; 5965c6c1daeSBarry Smith 5975c6c1daeSBarry Smith PetscFunctionBegin; 5985c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5995c6c1daeSBarry Smith PetscValidCharPointer(format,2); 6005c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 6015c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 602ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 603559f443fSBarry Smith if (rank) PetscFunctionReturn(0); 6043f08860eSBarry Smith 6053f08860eSBarry Smith if (ascii->bviewer) { /* pass string up to parent viewer */ 6063f08860eSBarry Smith char *string; 6073f08860eSBarry Smith va_list Argp; 6083f08860eSBarry Smith size_t fullLength; 6093f08860eSBarry Smith 6103f08860eSBarry Smith ierr = PetscCalloc1(QUEUESTRINGSIZE, &string);CHKERRQ(ierr); 6113f08860eSBarry Smith va_start(Argp,format); 6121575c14dSBarry Smith ierr = PetscVSNPrintf(string,QUEUESTRINGSIZE,format,&fullLength,Argp);CHKERRQ(ierr); 6133f08860eSBarry Smith va_end(Argp); 614559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%s",string);CHKERRQ(ierr); 6153f08860eSBarry Smith ierr = PetscFree(string);CHKERRQ(ierr); 6163f08860eSBarry Smith } else { /* write directly to file */ 6175c6c1daeSBarry Smith va_list Argp; 618559f443fSBarry Smith /* flush my own messages that I may have queued up */ 619559f443fSBarry Smith PrintfQueue next = ascii->petsc_printfqueuebase,previous; 620559f443fSBarry Smith PetscInt i; 621559f443fSBarry Smith for (i=0; i<ascii->petsc_printfqueuelength; i++) { 622559f443fSBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"%s",next->string);CHKERRQ(ierr); 623559f443fSBarry Smith previous = next; 624559f443fSBarry Smith next = next->next; 625559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 626559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 627559f443fSBarry Smith } 628559f443fSBarry Smith ascii->petsc_printfqueue = 0; 629559f443fSBarry Smith ascii->petsc_printfqueuelength = 0; 630dd2fa690SBarry Smith tab = intab; 631a297a907SKarl Rupp while (tab--) { 632a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fd," ");CHKERRQ(ierr); 633a297a907SKarl Rupp } 6345c6c1daeSBarry Smith 6355c6c1daeSBarry Smith va_start(Argp,format); 6365c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr); 6375c6c1daeSBarry Smith err = fflush(fd); 6385c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6395c6c1daeSBarry Smith if (petsc_history) { 6405c6c1daeSBarry Smith va_start(Argp,format); 641dd2fa690SBarry Smith tab = intab; 642a297a907SKarl Rupp while (tab--) { 643706d7a88SBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history," ");CHKERRQ(ierr); 644a297a907SKarl Rupp } 6455c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 6465c6c1daeSBarry Smith err = fflush(petsc_history); 6475c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6485c6c1daeSBarry Smith } 6495c6c1daeSBarry Smith va_end(Argp); 6505c6c1daeSBarry Smith } 6515c6c1daeSBarry Smith PetscFunctionReturn(0); 6525c6c1daeSBarry Smith } 6535c6c1daeSBarry Smith 6545c6c1daeSBarry Smith /*@C 6555c6c1daeSBarry Smith PetscViewerFileSetName - Sets the name of the file the PetscViewer uses. 6565c6c1daeSBarry Smith 6575c6c1daeSBarry Smith Collective on PetscViewer 6585c6c1daeSBarry Smith 6595c6c1daeSBarry Smith Input Parameters: 6605c6c1daeSBarry Smith + viewer - the PetscViewer; either ASCII or binary 6615c6c1daeSBarry Smith - name - the name of the file it should use 6625c6c1daeSBarry Smith 6635c6c1daeSBarry Smith Level: advanced 6645c6c1daeSBarry Smith 6655c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(), 6665c6c1daeSBarry Smith PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf() 6675c6c1daeSBarry Smith 6685c6c1daeSBarry Smith @*/ 6695c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName(PetscViewer viewer,const char name[]) 6705c6c1daeSBarry Smith { 6715c6c1daeSBarry Smith PetscErrorCode ierr; 6722fbecc10SBarry Smith char b[PETSC_MAX_PATH_LEN]; 6735c6c1daeSBarry Smith 6745c6c1daeSBarry Smith PetscFunctionBegin; 6755c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6765c6c1daeSBarry Smith PetscValidCharPointer(name,2); 6772fbecc10SBarry Smith ierr = PetscStrreplace(PetscObjectComm((PetscObject)viewer),name,b,sizeof(b));CHKERRQ(ierr); 6782fbecc10SBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,b));CHKERRQ(ierr); 6795c6c1daeSBarry Smith PetscFunctionReturn(0); 6805c6c1daeSBarry Smith } 6815c6c1daeSBarry Smith 6825c6c1daeSBarry Smith /*@C 6835c6c1daeSBarry Smith PetscViewerFileGetName - Gets the name of the file the PetscViewer uses. 6845c6c1daeSBarry Smith 6855c6c1daeSBarry Smith Not Collective 6865c6c1daeSBarry Smith 6875c6c1daeSBarry Smith Input Parameter: 6885c6c1daeSBarry Smith . viewer - the PetscViewer; either ASCII or binary 6895c6c1daeSBarry Smith 6905c6c1daeSBarry Smith Output Parameter: 6915c6c1daeSBarry Smith . name - the name of the file it is using 6925c6c1daeSBarry Smith 6935c6c1daeSBarry Smith Level: advanced 6945c6c1daeSBarry Smith 6955c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName() 6965c6c1daeSBarry Smith 6975c6c1daeSBarry Smith @*/ 6985c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName(PetscViewer viewer,const char **name) 6995c6c1daeSBarry Smith { 7005c6c1daeSBarry Smith PetscErrorCode ierr; 7015c6c1daeSBarry Smith 7025c6c1daeSBarry Smith PetscFunctionBegin; 7035c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 7046e05b1faSLisandro Dalcin PetscValidPointer(name,2); 705163d334eSBarry Smith ierr = PetscUseMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr); 7065c6c1daeSBarry Smith PetscFunctionReturn(0); 7075c6c1daeSBarry Smith } 7085c6c1daeSBarry Smith 7095c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name) 7105c6c1daeSBarry Smith { 7115c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 7125c6c1daeSBarry Smith 7135c6c1daeSBarry Smith PetscFunctionBegin; 7145c6c1daeSBarry Smith *name = vascii->filename; 7155c6c1daeSBarry Smith PetscFunctionReturn(0); 7165c6c1daeSBarry Smith } 7175c6c1daeSBarry Smith 7185c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[]) 7195c6c1daeSBarry Smith { 7205c6c1daeSBarry Smith PetscErrorCode ierr; 7215c6c1daeSBarry Smith size_t len; 7225c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN],*gz; 7235c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 7245c6c1daeSBarry Smith PetscBool isstderr,isstdout; 7255c6c1daeSBarry Smith PetscMPIInt rank; 7265c6c1daeSBarry Smith 7275c6c1daeSBarry Smith PetscFunctionBegin; 7285c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 7295c6c1daeSBarry Smith if (!name) PetscFunctionReturn(0); 7305c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr); 7315c6c1daeSBarry Smith 7325c6c1daeSBarry Smith /* Is this file to be compressed */ 7335c6c1daeSBarry Smith vascii->storecompressed = PETSC_FALSE; 734a297a907SKarl Rupp 7355c6c1daeSBarry Smith ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr); 7365c6c1daeSBarry Smith if (gz) { 7375c6c1daeSBarry Smith ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); 7385c6c1daeSBarry Smith if (len == 3) { 73908fb59bfSBarry 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"); 7405c6c1daeSBarry Smith *gz = 0; 7415c6c1daeSBarry Smith vascii->storecompressed = PETSC_TRUE; 7425c6c1daeSBarry Smith } 7435c6c1daeSBarry Smith } 744ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 7455c6c1daeSBarry Smith if (!rank) { 7465c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr); 7475c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr); 7485c6c1daeSBarry Smith /* empty filename means stdout */ 7495c6c1daeSBarry Smith if (name[0] == 0) isstdout = PETSC_TRUE; 7505c6c1daeSBarry Smith if (isstderr) vascii->fd = PETSC_STDERR; 7515c6c1daeSBarry Smith else if (isstdout) vascii->fd = PETSC_STDOUT; 7525c6c1daeSBarry Smith else { 7535c6c1daeSBarry Smith 7545c6c1daeSBarry Smith 7555c6c1daeSBarry Smith ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 7565c6c1daeSBarry Smith switch (vascii->mode) { 7575c6c1daeSBarry Smith case FILE_MODE_READ: 7585c6c1daeSBarry Smith vascii->fd = fopen(fname,"r"); 7595c6c1daeSBarry Smith break; 7605c6c1daeSBarry Smith case FILE_MODE_WRITE: 7615c6c1daeSBarry Smith vascii->fd = fopen(fname,"w"); 7625c6c1daeSBarry Smith break; 7635c6c1daeSBarry Smith case FILE_MODE_APPEND: 7645c6c1daeSBarry Smith vascii->fd = fopen(fname,"a"); 7655c6c1daeSBarry Smith break; 7665c6c1daeSBarry Smith case FILE_MODE_UPDATE: 7675c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 768a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 7695c6c1daeSBarry Smith break; 7705c6c1daeSBarry Smith case FILE_MODE_APPEND_UPDATE: 7715c6c1daeSBarry Smith /* I really want a file which is opened at the end for updating, 7725c6c1daeSBarry Smith not a+, which opens at the beginning, but makes writes at the end. 7735c6c1daeSBarry Smith */ 7745c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 775a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 776a297a907SKarl Rupp else { 7775c6c1daeSBarry Smith ierr = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr); 7785c6c1daeSBarry Smith } 7795c6c1daeSBarry Smith break; 7805c6c1daeSBarry Smith default: 7815c6c1daeSBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode); 7825c6c1daeSBarry Smith } 7835c6c1daeSBarry Smith if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname); 7845c6c1daeSBarry Smith } 7855c6c1daeSBarry Smith } 7865c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 7875c6c1daeSBarry Smith PetscLogObjectState((PetscObject)viewer,"File: %s",name); 7885c6c1daeSBarry Smith #endif 7895c6c1daeSBarry Smith PetscFunctionReturn(0); 7905c6c1daeSBarry Smith } 7915c6c1daeSBarry Smith 7923f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 7935c6c1daeSBarry Smith { 7945c6c1daeSBarry Smith PetscMPIInt rank; 7955c6c1daeSBarry Smith PetscErrorCode ierr; 7965c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii; 7975c6c1daeSBarry Smith 7985c6c1daeSBarry Smith PetscFunctionBegin; 7993f08860eSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer already obtained from PetscViewer and not restored"); 8001575c14dSBarry Smith ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 8013f08860eSBarry Smith ierr = PetscViewerCreate(subcomm,outviewer);CHKERRQ(ierr); 8025c6c1daeSBarry Smith ierr = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr); 8031575c14dSBarry Smith ierr = PetscViewerASCIIPushSynchronized(*outviewer);CHKERRQ(ierr); 8045c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 8055c6c1daeSBarry Smith ovascii->fd = vascii->fd; 8065c6c1daeSBarry Smith ovascii->tab = vascii->tab; 807ba5a0b41SBarry Smith ovascii->closefile = PETSC_FALSE; 8085c6c1daeSBarry Smith 8095c6c1daeSBarry Smith vascii->sviewer = *outviewer; 8105c6c1daeSBarry Smith 8115c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 8125c6c1daeSBarry Smith 813ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 8145c6c1daeSBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer; 8153f08860eSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer; 8165c6c1daeSBarry Smith PetscFunctionReturn(0); 8175c6c1daeSBarry Smith } 8185c6c1daeSBarry Smith 8193f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 8205c6c1daeSBarry Smith { 8215c6c1daeSBarry Smith PetscErrorCode ierr; 8225c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 8235c6c1daeSBarry Smith 8245c6c1daeSBarry Smith PetscFunctionBegin; 8251575c14dSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer never obtained from PetscViewer"); 8261575c14dSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate this SubViewer"); 8275c6c1daeSBarry Smith 8285c6c1daeSBarry Smith ascii->sviewer = 0; 8295c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 8305c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 8315c6c1daeSBarry Smith PetscFunctionReturn(0); 8325c6c1daeSBarry Smith } 8335c6c1daeSBarry Smith 8342bf49c77SBarry Smith PetscErrorCode PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer) 8352bf49c77SBarry Smith { 8362bf49c77SBarry Smith PetscErrorCode ierr; 8372bf49c77SBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data; 8382bf49c77SBarry Smith 8392bf49c77SBarry Smith PetscFunctionBegin; 8402bf49c77SBarry Smith if (ascii->filename) { 8412bf49c77SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr); 8422bf49c77SBarry Smith } 8432bf49c77SBarry Smith PetscFunctionReturn(0); 8442bf49c77SBarry Smith } 8452bf49c77SBarry Smith 8468556b5ebSBarry Smith /*MC 8478556b5ebSBarry Smith PETSCVIEWERASCII - A viewer that prints to stdout or an ASCII file 8488556b5ebSBarry Smith 8498556b5ebSBarry Smith 8508556b5ebSBarry Smith .seealso: PETSC_VIEWER_STDOUT_(),PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDOUT_WORLD,PetscViewerCreate(), PetscViewerASCIIOpen(), 8518556b5ebSBarry Smith PetscViewerMatlabOpen(), VecView(), DMView(), PetscViewerMatlabPutArray(), PETSCVIEWERBINARY, PETSCVIEWERMATLAB, 8528556b5ebSBarry Smith PetscViewerFileSetName(), PetscViewerFileSetMode(), PetscViewerFormat, PetscViewerType, PetscViewerSetType() 8538556b5ebSBarry Smith 8541b266c99SBarry Smith Level: beginner 8551b266c99SBarry Smith 8568556b5ebSBarry Smith M*/ 8578cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer) 8585c6c1daeSBarry Smith { 8595c6c1daeSBarry Smith PetscViewer_ASCII *vascii; 8605c6c1daeSBarry Smith PetscErrorCode ierr; 8615c6c1daeSBarry Smith 8625c6c1daeSBarry Smith PetscFunctionBegin; 863b00a9115SJed Brown ierr = PetscNewLog(viewer,&vascii);CHKERRQ(ierr); 8645c6c1daeSBarry Smith viewer->data = (void*)vascii; 8655c6c1daeSBarry Smith 8665c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_ASCII; 8675c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_ASCII; 868559f443fSBarry Smith viewer->ops->getsubviewer = PetscViewerGetSubViewer_ASCII; 869559f443fSBarry Smith viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_ASCII; 8702bf49c77SBarry Smith viewer->ops->view = PetscViewerView_ASCII; 8711d641e7bSMichael Lange viewer->ops->read = PetscViewerASCIIRead; 8725c6c1daeSBarry Smith 8735c6c1daeSBarry Smith /* defaults to stdout unless set with PetscViewerFileSetName() */ 8745c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 8755c6c1daeSBarry Smith vascii->mode = FILE_MODE_WRITE; 8765c6c1daeSBarry Smith vascii->bviewer = 0; 877dd2fa690SBarry Smith vascii->subviewer = 0; 8785c6c1daeSBarry Smith vascii->sviewer = 0; 8795c6c1daeSBarry Smith vascii->tab = 0; 8805c6c1daeSBarry Smith vascii->tab_store = 0; 8815c6c1daeSBarry Smith vascii->filename = 0; 8825c6c1daeSBarry Smith vascii->closefile = PETSC_TRUE; 8835c6c1daeSBarry Smith 884bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr); 885bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr); 886bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr); 887bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr); 8885c6c1daeSBarry Smith PetscFunctionReturn(0); 8895c6c1daeSBarry Smith } 8905c6c1daeSBarry Smith 8915c6c1daeSBarry Smith /*@C 8925c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from 8935c6c1daeSBarry Smith several processors. Output of the first processor is followed by that of the 8945c6c1daeSBarry Smith second, etc. 8955c6c1daeSBarry Smith 8965c6c1daeSBarry Smith Not Collective, must call collective PetscViewerFlush() to get the results out 8975c6c1daeSBarry Smith 8985c6c1daeSBarry Smith Input Parameters: 8995c6c1daeSBarry Smith + viewer - the ASCII PetscViewer 9005c6c1daeSBarry Smith - format - the usual printf() format string 9015c6c1daeSBarry Smith 9025c6c1daeSBarry Smith Level: intermediate 9035c6c1daeSBarry Smith 90495452b02SPatrick Sanan Notes: 905*e6abc3ddSVáclav Hapla You must have previously called PetscViewerASCIIPushSynchronized() to allow this routine to be called. 906*e6abc3ddSVáclav Hapla Then you can do multiple independent calls to this routine. 907*e6abc3ddSVáclav Hapla The actual synchronized print is then done using PetscViewerFlush(). 908*e6abc3ddSVáclav Hapla PetscViewerASCIIPopSynchronized() should be then called if we are already done with the synchronized output 909*e6abc3ddSVáclav Hapla to conclude the "synchronized session". 910*e6abc3ddSVáclav Hapla So the typical calling sequence looks like 911*e6abc3ddSVáclav Hapla $ PetscViewerASCIIPushSynchronized(viewer); 912*e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 913*e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 914*e6abc3ddSVáclav Hapla $ ... 915*e6abc3ddSVáclav Hapla $ PetscViewerFlush(viewer); 916*e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 917*e6abc3ddSVáclav Hapla $ PetscViewerASCIISynchronizedPrintf(viewer, ...); 918*e6abc3ddSVáclav Hapla $ ... 919*e6abc3ddSVáclav Hapla $ PetscViewerFlush(viewer); 920*e6abc3ddSVáclav Hapla $ PetscViewerASCIIPopSynchronized(viewer); 9215c6c1daeSBarry Smith 9225c6c1daeSBarry Smith Fortran Note: 9235c6c1daeSBarry Smith Can only print a single character* string 9245c6c1daeSBarry Smith 925*e6abc3ddSVáclav Hapla .seealso: PetscViewerASCIIPushSynchronized(), PetscViewerFlush(), PetscViewerASCIIPopSynchronized(), 926*e6abc3ddSVáclav Hapla PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIOpen(), 927*e6abc3ddSVáclav Hapla PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType() 9285c6c1daeSBarry Smith @*/ 9295c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...) 9305c6c1daeSBarry Smith { 9315c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 9325c6c1daeSBarry Smith PetscErrorCode ierr; 9333f08860eSBarry Smith PetscMPIInt rank; 9345c6c1daeSBarry Smith PetscInt tab = vascii->tab; 9355c6c1daeSBarry Smith MPI_Comm comm; 9365c6c1daeSBarry Smith FILE *fp; 937559f443fSBarry Smith PetscBool iascii,hasbviewer = PETSC_FALSE; 9385c6c1daeSBarry Smith int err; 9395c6c1daeSBarry Smith 9405c6c1daeSBarry Smith PetscFunctionBegin; 9415c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 9425c6c1daeSBarry Smith PetscValidCharPointer(format,2); 9435c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9445c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 9451575c14dSBarry Smith if (!vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIIPushSynchronized() to allow this call"); 9465c6c1daeSBarry Smith 947ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 9485c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 9495c6c1daeSBarry Smith 950559f443fSBarry Smith if (vascii->bviewer) { 951559f443fSBarry Smith hasbviewer = PETSC_TRUE; 952559f443fSBarry Smith if (!rank) { 953559f443fSBarry Smith vascii = (PetscViewer_ASCII*)vascii->bviewer->data; 954559f443fSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 955559f443fSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 956559f443fSBarry Smith } 957559f443fSBarry Smith } 9583f08860eSBarry Smith 959559f443fSBarry Smith fp = vascii->fd; 960559f443fSBarry Smith 961559f443fSBarry Smith if (!rank && !hasbviewer) { /* First processor prints immediately to fp */ 9625c6c1daeSBarry Smith va_list Argp; 963559f443fSBarry Smith /* flush my own messages that I may have queued up */ 964559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 965559f443fSBarry Smith PetscInt i; 966559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 967559f443fSBarry Smith ierr = PetscFPrintf(comm,fp,"%s",next->string);CHKERRQ(ierr); 968559f443fSBarry Smith previous = next; 969559f443fSBarry Smith next = next->next; 970559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 971559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 972559f443fSBarry Smith } 973559f443fSBarry Smith vascii->petsc_printfqueue = 0; 974559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 9755c6c1daeSBarry Smith 976a297a907SKarl Rupp while (tab--) { 977a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fp," ");CHKERRQ(ierr); 978a297a907SKarl Rupp } 9795c6c1daeSBarry Smith 9805c6c1daeSBarry Smith va_start(Argp,format); 9815c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr); 9825c6c1daeSBarry Smith err = fflush(fp); 9835c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9845c6c1daeSBarry Smith if (petsc_history) { 9855c6c1daeSBarry Smith va_start(Argp,format); 9865c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 9875c6c1daeSBarry Smith err = fflush(petsc_history); 9885c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9895c6c1daeSBarry Smith } 9905c6c1daeSBarry Smith va_end(Argp); 991559f443fSBarry Smith } else { /* other processors add to queue */ 9925c6c1daeSBarry Smith char *string; 9935c6c1daeSBarry Smith va_list Argp; 9945c6c1daeSBarry Smith size_t fullLength; 9955c6c1daeSBarry Smith PrintfQueue next; 9965c6c1daeSBarry Smith 997b00a9115SJed Brown ierr = PetscNew(&next);CHKERRQ(ierr); 998559f443fSBarry Smith if (vascii->petsc_printfqueue) { 999559f443fSBarry Smith vascii->petsc_printfqueue->next = next; 1000559f443fSBarry Smith vascii->petsc_printfqueue = next; 1001a297a907SKarl Rupp } else { 1002559f443fSBarry Smith vascii->petsc_printfqueuebase = vascii->petsc_printfqueue = next; 1003a297a907SKarl Rupp } 1004559f443fSBarry Smith vascii->petsc_printfqueuelength++; 10055c6c1daeSBarry Smith next->size = QUEUESTRINGSIZE; 1006785e854fSJed Brown ierr = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr); 10075c6c1daeSBarry Smith ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr); 10085c6c1daeSBarry Smith string = next->string; 10095c6c1daeSBarry Smith tab *= 2; 1010a297a907SKarl Rupp while (tab--) { 1011a297a907SKarl Rupp *string++ = ' '; 1012a297a907SKarl Rupp } 10135c6c1daeSBarry Smith va_start(Argp,format); 101422d28d08SBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr); 10155c6c1daeSBarry Smith va_end(Argp); 1016cb500232SBarry Smith if (fullLength > (size_t) (next->size-2*vascii->tab)) { 101714416c0eSBarry Smith ierr = PetscFree(next->string);CHKERRQ(ierr); 101814416c0eSBarry Smith next->size = fullLength + 2*vascii->tab; 101914416c0eSBarry Smith ierr = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr); 102014416c0eSBarry Smith ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr); 102114416c0eSBarry Smith string = next->string; 102214416c0eSBarry Smith tab = 2*vascii->tab; 102314416c0eSBarry Smith while (tab--) { 102414416c0eSBarry Smith *string++ = ' '; 102514416c0eSBarry Smith } 102614416c0eSBarry Smith va_start(Argp,format); 102714416c0eSBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,NULL,Argp);CHKERRQ(ierr); 102814416c0eSBarry Smith va_end(Argp); 102914416c0eSBarry Smith } 10305c6c1daeSBarry Smith } 10315c6c1daeSBarry Smith PetscFunctionReturn(0); 10325c6c1daeSBarry Smith } 10335c6c1daeSBarry Smith 10342655f987SMichael Lange /*@C 1035f8859db6SBarry Smith PetscViewerASCIIRead - Reads from a ASCII file 10362655f987SMichael Lange 1037f8859db6SBarry Smith Only process 0 in the PetscViewer may call this 10382655f987SMichael Lange 10392655f987SMichael Lange Input Parameters: 10402655f987SMichael Lange + viewer - the ascii viewer 10412655f987SMichael Lange . data - location to write the data 1042060da220SMatthew G. Knepley . num - number of items of data to read 10432655f987SMichael Lange - datatype - type of data to read 10442655f987SMichael Lange 1045f8e4bde8SMatthew G. Knepley Output Parameters: 1046060da220SMatthew G. Knepley . count - number of items of data actually read, or NULL 1047f8e4bde8SMatthew G. Knepley 10482655f987SMichael Lange Level: beginner 10492655f987SMichael Lange 10502655f987SMichael Lange Concepts: ascii files 10512655f987SMichael Lange 1052f8859db6SBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetName() 10532655f987SMichael Lange VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), 105405119932SBarry Smith PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscViewerBinaryRead() 10552655f987SMichael Lange @*/ 1056060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype) 10572655f987SMichael Lange { 10582655f987SMichael Lange PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 10592655f987SMichael Lange FILE *fd = vascii->fd; 10602655f987SMichael Lange PetscInt i; 10613b7fe8c3SMatthew G. Knepley int ret = 0; 1062f8859db6SBarry Smith PetscMPIInt rank; 1063f8859db6SBarry Smith PetscErrorCode ierr; 10642655f987SMichael Lange 10652655f987SMichael Lange PetscFunctionBegin; 10662655f987SMichael Lange PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 1067f8859db6SBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 1068f8859db6SBarry Smith if (rank) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG,"Can only be called from process 0 in the PetscViewer"); 1069060da220SMatthew G. Knepley for (i=0; i<num; i++) { 1070f8e4bde8SMatthew G. Knepley if (dtype == PETSC_CHAR) ret = fscanf(fd, "%c", &(((char*)data)[i])); 1071f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_STRING) ret = fscanf(fd, "%s", &(((char*)data)[i])); 1072a05e1a72SSatish Balay else if (dtype == PETSC_INT) ret = fscanf(fd, "%" PetscInt_FMT, &(((PetscInt*)data)[i])); 1073f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_ENUM) ret = fscanf(fd, "%d", &(((int*)data)[i])); 10749e3e4c22SLisandro Dalcin else if (dtype == PETSC_INT64) ret = fscanf(fd, "%" PetscInt64_FMT, &(((PetscInt64*)data)[i])); 1075972064b6SLisandro Dalcin else if (dtype == PETSC_LONG) ret = fscanf(fd, "%ld", &(((long*)data)[i])); 1076f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_FLOAT) ret = fscanf(fd, "%f", &(((float*)data)[i])); 1077f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_DOUBLE) ret = fscanf(fd, "%lg", &(((double*)data)[i])); 1078a6e181c6SToby Isaac #if defined(PETSC_USE_REAL___FLOAT128) 1079fba955ccSBarry Smith else if (dtype == PETSC___FLOAT128) { 1080fba955ccSBarry Smith double tmp; 1081fba955ccSBarry Smith ret = fscanf(fd, "%lg", &tmp); 1082a6e181c6SToby Isaac ((__float128*)data)[i] = tmp; 1083a6e181c6SToby Isaac } 1084fba955ccSBarry Smith #endif 1085f8e4bde8SMatthew G. Knepley else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);} 1086f8e4bde8SMatthew G. Knepley if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype); 1087f8e4bde8SMatthew G. Knepley else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */ 10882655f987SMichael Lange } 1089060da220SMatthew G. Knepley if (count) *count = i; 1090060da220SMatthew G. Knepley else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num); 10912655f987SMichael Lange PetscFunctionReturn(0); 10922655f987SMichael Lange } 10935c6c1daeSBarry Smith 1094