15c6c1daeSBarry Smith 2665c2dedSJed Brown #include <../src/sys/classes/viewer/impls/ascii/asciiimpl.h> /*I "petscviewer.h" I*/ 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith #define QUEUESTRINGSIZE 8192 55c6c1daeSBarry Smith 65c6c1daeSBarry Smith #undef __FUNCT__ 75c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileClose_ASCII" 85c6c1daeSBarry Smith static PetscErrorCode PetscViewerFileClose_ASCII(PetscViewer viewer) 95c6c1daeSBarry Smith { 105c6c1daeSBarry Smith PetscErrorCode ierr; 115c6c1daeSBarry Smith PetscMPIInt rank; 125c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 135c6c1daeSBarry Smith int err; 145c6c1daeSBarry Smith 155c6c1daeSBarry Smith PetscFunctionBegin; 16ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 175c6c1daeSBarry Smith if (!rank && vascii->fd != stderr && vascii->fd != PETSC_STDOUT) { 185c6c1daeSBarry Smith if (vascii->fd && vascii->closefile) { 195c6c1daeSBarry Smith err = fclose(vascii->fd); 205c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 215c6c1daeSBarry Smith } 225c6c1daeSBarry Smith if (vascii->storecompressed) { 235c6c1daeSBarry Smith char par[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN]; 245c6c1daeSBarry Smith FILE *fp; 255c6c1daeSBarry Smith ierr = PetscStrcpy(par,"gzip ");CHKERRQ(ierr); 265c6c1daeSBarry Smith ierr = PetscStrcat(par,vascii->filename);CHKERRQ(ierr); 275c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN) 280298fd71SBarry Smith ierr = PetscPOpen(PETSC_COMM_SELF,NULL,par,"r",&fp);CHKERRQ(ierr); 29f23aa3ddSBarry Smith if (fgets(buf,1024,fp)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from compression command %s\n%s",par,buf); 300298fd71SBarry Smith ierr = PetscPClose(PETSC_COMM_SELF,fp,NULL);CHKERRQ(ierr); 315c6c1daeSBarry Smith #else 325c6c1daeSBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine"); 335c6c1daeSBarry Smith #endif 345c6c1daeSBarry Smith } 355c6c1daeSBarry Smith } 365c6c1daeSBarry Smith ierr = PetscFree(vascii->filename);CHKERRQ(ierr); 375c6c1daeSBarry Smith PetscFunctionReturn(0); 385c6c1daeSBarry Smith } 395c6c1daeSBarry Smith 405c6c1daeSBarry Smith /* ----------------------------------------------------------------------*/ 415c6c1daeSBarry Smith #undef __FUNCT__ 425c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII" 435c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII(PetscViewer viewer) 445c6c1daeSBarry Smith { 455c6c1daeSBarry Smith PetscErrorCode ierr; 465c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 475c6c1daeSBarry Smith PetscViewerLink *vlink; 485c6c1daeSBarry Smith PetscBool flg; 495c6c1daeSBarry Smith 505c6c1daeSBarry Smith PetscFunctionBegin; 515c6c1daeSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"ASCII PetscViewer destroyed before restoring singleton or subcomm PetscViewer"); 525c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 535c6c1daeSBarry Smith ierr = PetscFree(vascii);CHKERRQ(ierr); 545c6c1daeSBarry Smith 555c6c1daeSBarry Smith /* remove the viewer from the list in the MPI Communicator */ 565c6c1daeSBarry Smith if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) { 575c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);CHKERRQ(ierr); 585c6c1daeSBarry Smith } 595c6c1daeSBarry Smith 60ce94432eSBarry Smith ierr = MPI_Attr_get(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr); 615c6c1daeSBarry Smith if (flg) { 625c6c1daeSBarry Smith if (vlink && vlink->viewer == viewer) { 63e5840a18SBarry Smith if (vlink->next) { 64ce94432eSBarry Smith ierr = MPI_Attr_put(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr); 65e5840a18SBarry Smith } else { 66e5840a18SBarry Smith ierr = MPI_Attr_delete(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval);CHKERRQ(ierr); 67e5840a18SBarry Smith } 685c6c1daeSBarry Smith ierr = PetscFree(vlink);CHKERRQ(ierr); 695c6c1daeSBarry Smith } else { 705c6c1daeSBarry Smith while (vlink && vlink->next) { 715c6c1daeSBarry Smith if (vlink->next->viewer == viewer) { 725c6c1daeSBarry Smith PetscViewerLink *nv = vlink->next; 735c6c1daeSBarry Smith vlink->next = vlink->next->next; 745c6c1daeSBarry Smith ierr = PetscFree(nv);CHKERRQ(ierr); 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith vlink = vlink->next; 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith } 795c6c1daeSBarry Smith } 805c6c1daeSBarry Smith PetscFunctionReturn(0); 815c6c1daeSBarry Smith } 825c6c1daeSBarry Smith 835c6c1daeSBarry Smith #undef __FUNCT__ 843f08860eSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_SubViewer" 853f08860eSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_SubViewer(PetscViewer viewer) 865c6c1daeSBarry Smith { 875c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 885c6c1daeSBarry Smith PetscErrorCode ierr; 895fd66863SKarl Rupp 905c6c1daeSBarry Smith PetscFunctionBegin; 913f08860eSBarry Smith ierr = PetscViewerRestoreSubViewer(vascii->bviewer,0,&viewer);CHKERRQ(ierr); 925c6c1daeSBarry Smith PetscFunctionReturn(0); 935c6c1daeSBarry Smith } 945c6c1daeSBarry Smith 955c6c1daeSBarry Smith #undef __FUNCT__ 965c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII" 975c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer) 985c6c1daeSBarry Smith { 995c6c1daeSBarry Smith PetscErrorCode ierr; 1005c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 1015c6c1daeSBarry Smith int err; 102*559f443fSBarry Smith MPI_Comm comm; 103*559f443fSBarry Smith PetscMPIInt rank,size; 104*559f443fSBarry Smith FILE *fd = vascii->fd; 1055c6c1daeSBarry Smith 1065c6c1daeSBarry Smith PetscFunctionBegin; 107*559f443fSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 108*559f443fSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 109*559f443fSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 110*559f443fSBarry Smith 111*559f443fSBarry Smith if (!vascii->bviewer && !rank && (vascii->mode != FILE_MODE_READ)) { 1125c6c1daeSBarry Smith err = fflush(vascii->fd); 1135c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed"); 1145c6c1daeSBarry Smith } 1155c6c1daeSBarry Smith 1165c6c1daeSBarry Smith if (vascii->allowsynchronized) { 117*559f443fSBarry Smith PetscMPIInt tag,i,j,n = 0,dummy = 0; 118*559f443fSBarry Smith char *message; 119*559f443fSBarry Smith MPI_Status status; 120*559f443fSBarry Smith 121*559f443fSBarry Smith ierr = PetscCommDuplicate(comm,&comm,&tag);CHKERRQ(ierr); 122*559f443fSBarry Smith 123*559f443fSBarry Smith /* First processor waits for messages from all other processors */ 124*559f443fSBarry Smith if (!rank) { 125*559f443fSBarry Smith /* flush my own messages that I may have queued up */ 126*559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 127*559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 128*559f443fSBarry Smith if (!vascii->bviewer) { 129*559f443fSBarry Smith ierr = PetscFPrintf(comm,fd,"%s",next->string);CHKERRQ(ierr); 130*559f443fSBarry Smith } else { 131*559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(vascii->bviewer,"%s",next->string);CHKERRQ(ierr); 132*559f443fSBarry Smith } 133*559f443fSBarry Smith previous = next; 134*559f443fSBarry Smith next = next->next; 135*559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 136*559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 137*559f443fSBarry Smith } 138*559f443fSBarry Smith vascii->petsc_printfqueue = 0; 139*559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 140*559f443fSBarry Smith for (i=1; i<size; i++) { 141*559f443fSBarry Smith /* to prevent a flood of messages to process zero, request each message separately */ 142*559f443fSBarry Smith ierr = MPI_Send(&dummy,1,MPI_INT,i,tag,comm);CHKERRQ(ierr); 143*559f443fSBarry Smith ierr = MPI_Recv(&n,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr); 144*559f443fSBarry Smith for (j=0; j<n; j++) { 145*559f443fSBarry Smith PetscMPIInt size = 0; 146*559f443fSBarry Smith 147*559f443fSBarry Smith ierr = MPI_Recv(&size,1,MPI_INT,i,tag,comm,&status);CHKERRQ(ierr); 148*559f443fSBarry Smith ierr = PetscMalloc1(size, &message);CHKERRQ(ierr); 149*559f443fSBarry Smith ierr = MPI_Recv(message,size,MPI_CHAR,i,tag,comm,&status);CHKERRQ(ierr); 150*559f443fSBarry Smith if (!vascii->bviewer) { 151*559f443fSBarry Smith ierr = PetscFPrintf(comm,fd,"%s",message);CHKERRQ(ierr); 152*559f443fSBarry Smith } else { 153*559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(vascii->bviewer,"%s",message);CHKERRQ(ierr); 154*559f443fSBarry Smith } 155*559f443fSBarry Smith ierr = PetscFree(message);CHKERRQ(ierr); 156*559f443fSBarry Smith } 157*559f443fSBarry Smith } 158*559f443fSBarry Smith } else { /* other processors send queue to processor 0 */ 159*559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 160*559f443fSBarry Smith 161*559f443fSBarry Smith ierr = MPI_Recv(&dummy,1,MPI_INT,0,tag,comm,&status);CHKERRQ(ierr); 162*559f443fSBarry Smith ierr = MPI_Send(&vascii->petsc_printfqueuelength,1,MPI_INT,0,tag,comm);CHKERRQ(ierr); 163*559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 164*559f443fSBarry Smith ierr = MPI_Send(&next->size,1,MPI_INT,0,tag,comm);CHKERRQ(ierr); 165*559f443fSBarry Smith ierr = MPI_Send(next->string,next->size,MPI_CHAR,0,tag,comm);CHKERRQ(ierr); 166*559f443fSBarry Smith previous = next; 167*559f443fSBarry Smith next = next->next; 168*559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 169*559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 170*559f443fSBarry Smith } 171*559f443fSBarry Smith vascii->petsc_printfqueue = 0; 172*559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 173*559f443fSBarry Smith } 174*559f443fSBarry Smith ierr = PetscCommDestroy(&comm);CHKERRQ(ierr); 1755c6c1daeSBarry Smith } 1765c6c1daeSBarry Smith PetscFunctionReturn(0); 1775c6c1daeSBarry Smith } 1785c6c1daeSBarry Smith 1795c6c1daeSBarry Smith #undef __FUNCT__ 1805c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer" 1815c6c1daeSBarry Smith /*@C 1825c6c1daeSBarry Smith PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer. 1835c6c1daeSBarry Smith 1845c6c1daeSBarry Smith Not Collective 1855c6c1daeSBarry Smith 1865c6c1daeSBarry Smith + viewer - PetscViewer context, obtained from PetscViewerASCIIOpen() 1875c6c1daeSBarry Smith - fd - file pointer 1885c6c1daeSBarry Smith 1895c6c1daeSBarry Smith Level: intermediate 1905c6c1daeSBarry Smith 1915c6c1daeSBarry Smith Fortran Note: 1925c6c1daeSBarry Smith This routine is not supported in Fortran. 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith Concepts: PetscViewer^file pointer 1955c6c1daeSBarry Smith Concepts: file pointer^getting from PetscViewer 1965c6c1daeSBarry Smith 1975c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(), 1985c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush() 1995c6c1daeSBarry Smith @*/ 2005c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd) 2015c6c1daeSBarry Smith { 2025c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 2035c6c1daeSBarry Smith 2045c6c1daeSBarry Smith PetscFunctionBegin; 2055c6c1daeSBarry Smith *fd = vascii->fd; 2065c6c1daeSBarry Smith PetscFunctionReturn(0); 2075c6c1daeSBarry Smith } 2085c6c1daeSBarry Smith 2095c6c1daeSBarry Smith #undef __FUNCT__ 2105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetMode_ASCII" 2115c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode) 2125c6c1daeSBarry Smith { 2135c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 2145c6c1daeSBarry Smith 2155c6c1daeSBarry Smith PetscFunctionBegin; 2165c6c1daeSBarry Smith *mode = vascii->mode; 2175c6c1daeSBarry Smith PetscFunctionReturn(0); 2185c6c1daeSBarry Smith } 2195c6c1daeSBarry Smith 2205c6c1daeSBarry Smith #undef __FUNCT__ 2215c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII" 2225c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode) 2235c6c1daeSBarry Smith { 2245c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith PetscFunctionBegin; 2275c6c1daeSBarry Smith vascii->mode = mode; 2285c6c1daeSBarry Smith PetscFunctionReturn(0); 2295c6c1daeSBarry Smith } 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith /* 2325c6c1daeSBarry Smith If petsc_history is on, then all Petsc*Printf() results are saved 2335c6c1daeSBarry Smith if the appropriate (usually .petschistory) file. 2345c6c1daeSBarry Smith */ 2355c6c1daeSBarry Smith extern FILE *petsc_history; 2365c6c1daeSBarry Smith 2375c6c1daeSBarry Smith #undef __FUNCT__ 2385c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab" 2395c6c1daeSBarry Smith /*@ 2405c6c1daeSBarry Smith PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times 2415c6c1daeSBarry Smith 2425c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 2435c6c1daeSBarry Smith 2445c6c1daeSBarry Smith Input Parameters: 2455c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 2465c6c1daeSBarry Smith - tabs - number of tabs 2475c6c1daeSBarry Smith 2485c6c1daeSBarry Smith Level: developer 2495c6c1daeSBarry Smith 2505c6c1daeSBarry Smith Fortran Note: 2515c6c1daeSBarry Smith This routine is not supported in Fortran. 2525c6c1daeSBarry Smith 2535c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2545c6c1daeSBarry Smith Concepts: tab^setting 2555c6c1daeSBarry Smith 2565c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(), 2575c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2585c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2595c6c1daeSBarry Smith @*/ 2605c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs) 2615c6c1daeSBarry Smith { 2625c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2635c6c1daeSBarry Smith PetscBool iascii; 2645c6c1daeSBarry Smith PetscErrorCode ierr; 2655c6c1daeSBarry Smith 2665c6c1daeSBarry Smith PetscFunctionBegin; 2675c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2685c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 269a297a907SKarl Rupp if (iascii) ascii->tab = tabs; 2705c6c1daeSBarry Smith PetscFunctionReturn(0); 2715c6c1daeSBarry Smith } 2725c6c1daeSBarry Smith 2735c6c1daeSBarry Smith #undef __FUNCT__ 2745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab" 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: 2815c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 2825c6c1daeSBarry Smith Output Parameters: 2835c6c1daeSBarry Smith . tabs - number of tabs 2845c6c1daeSBarry Smith 2855c6c1daeSBarry Smith Level: developer 2865c6c1daeSBarry Smith 2875c6c1daeSBarry Smith Fortran Note: 2885c6c1daeSBarry Smith This routine is not supported in Fortran. 2895c6c1daeSBarry Smith 2905c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2915c6c1daeSBarry Smith Concepts: tab^retrieval 2925c6c1daeSBarry Smith 2935c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(), 2945c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2955c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2965c6c1daeSBarry Smith @*/ 2975c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs) 2985c6c1daeSBarry Smith { 2995c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3005c6c1daeSBarry Smith PetscBool iascii; 3015c6c1daeSBarry Smith PetscErrorCode ierr; 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith PetscFunctionBegin; 3045c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3055c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 306a297a907SKarl Rupp if (iascii && tabs) *tabs = ascii->tab; 3075c6c1daeSBarry Smith PetscFunctionReturn(0); 3085c6c1daeSBarry Smith } 3095c6c1daeSBarry Smith 3105c6c1daeSBarry Smith #undef __FUNCT__ 3115c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab" 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: 3185c6c1daeSBarry Smith + viewer - optained 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 #undef __FUNCT__ 3475c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab" 3485c6c1daeSBarry Smith /*@ 3495c6c1daeSBarry Smith PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3525c6c1daeSBarry Smith 3535c6c1daeSBarry Smith Input Parameters: 3545c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3555c6c1daeSBarry Smith - tabs - number of tabs 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Level: developer 3585c6c1daeSBarry Smith 3595c6c1daeSBarry Smith Fortran Note: 3605c6c1daeSBarry Smith This routine is not supported in Fortran. 3615c6c1daeSBarry Smith 3625c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3635c6c1daeSBarry Smith Concepts: tab^setting 3645c6c1daeSBarry Smith 3655c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3665c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3675c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3685c6c1daeSBarry Smith @*/ 3695c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs) 3705c6c1daeSBarry Smith { 3715c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3725c6c1daeSBarry Smith PetscBool iascii; 3735c6c1daeSBarry Smith PetscErrorCode ierr; 3745c6c1daeSBarry Smith 3755c6c1daeSBarry Smith PetscFunctionBegin; 3765c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3775c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 378a297a907SKarl Rupp if (iascii) ascii->tab -= tabs; 3795c6c1daeSBarry Smith PetscFunctionReturn(0); 3805c6c1daeSBarry Smith } 3815c6c1daeSBarry Smith 3825c6c1daeSBarry Smith #undef __FUNCT__ 3835c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow" 3845c6c1daeSBarry Smith /*@C 3855c6c1daeSBarry Smith PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer 3865c6c1daeSBarry Smith 3875c6c1daeSBarry Smith Collective on PetscViewer 3885c6c1daeSBarry Smith 3895c6c1daeSBarry Smith Input Parameters: 3905c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3915c6c1daeSBarry Smith - allow - PETSC_TRUE to allow the synchronized printing 3925c6c1daeSBarry Smith 3935c6c1daeSBarry Smith Level: intermediate 3945c6c1daeSBarry Smith 3955c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3965c6c1daeSBarry Smith Concepts: tab^setting 3975c6c1daeSBarry Smith 3985c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3995c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4005c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4015c6c1daeSBarry Smith @*/ 4025c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow) 4035c6c1daeSBarry Smith { 4045c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4055c6c1daeSBarry Smith PetscBool iascii; 4065c6c1daeSBarry Smith PetscErrorCode ierr; 4075c6c1daeSBarry Smith 4085c6c1daeSBarry Smith PetscFunctionBegin; 4095c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4105c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 411a297a907SKarl Rupp if (iascii) ascii->allowsynchronized = allow; 4125c6c1daeSBarry Smith PetscFunctionReturn(0); 4135c6c1daeSBarry Smith } 4145c6c1daeSBarry Smith 4155c6c1daeSBarry Smith #undef __FUNCT__ 4165c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab" 4175c6c1daeSBarry Smith /*@ 4185c6c1daeSBarry Smith PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf() 4195c6c1daeSBarry Smith lines are tabbed. 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4225c6c1daeSBarry Smith 4235c6c1daeSBarry Smith Input Parameters: 4245c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 4255c6c1daeSBarry Smith 4265c6c1daeSBarry Smith Level: developer 4275c6c1daeSBarry Smith 4285c6c1daeSBarry Smith Fortran Note: 4295c6c1daeSBarry Smith This routine is not supported in Fortran. 4305c6c1daeSBarry Smith 4315c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4325c6c1daeSBarry Smith Concepts: tab^setting 4335c6c1daeSBarry Smith 4345c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4355c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4365c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4375c6c1daeSBarry Smith @*/ 4385c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPushTab(PetscViewer viewer) 4395c6c1daeSBarry Smith { 4405c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4415c6c1daeSBarry Smith PetscBool iascii; 4425c6c1daeSBarry Smith PetscErrorCode ierr; 4435c6c1daeSBarry Smith 4445c6c1daeSBarry Smith PetscFunctionBegin; 4455c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4465c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 447a297a907SKarl Rupp if (iascii) ascii->tab++; 4485c6c1daeSBarry Smith PetscFunctionReturn(0); 4495c6c1daeSBarry Smith } 4505c6c1daeSBarry Smith 4515c6c1daeSBarry Smith #undef __FUNCT__ 4525c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab" 4535c6c1daeSBarry Smith /*@ 4545c6c1daeSBarry Smith PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf() 4555c6c1daeSBarry Smith lines are tabbed. 4565c6c1daeSBarry Smith 4575c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4585c6c1daeSBarry Smith 4595c6c1daeSBarry Smith Input Parameters: 4605c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 4615c6c1daeSBarry Smith 4625c6c1daeSBarry Smith Level: developer 4635c6c1daeSBarry Smith 4645c6c1daeSBarry Smith Fortran Note: 4655c6c1daeSBarry Smith This routine is not supported in Fortran. 4665c6c1daeSBarry Smith 4675c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4685c6c1daeSBarry Smith Concepts: tab^setting 4695c6c1daeSBarry Smith 4705c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4715c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4725c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4735c6c1daeSBarry Smith @*/ 4745c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPopTab(PetscViewer viewer) 4755c6c1daeSBarry Smith { 4765c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4775c6c1daeSBarry Smith PetscErrorCode ierr; 4785c6c1daeSBarry Smith PetscBool iascii; 4795c6c1daeSBarry Smith 4805c6c1daeSBarry Smith PetscFunctionBegin; 4815c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4825c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4835c6c1daeSBarry Smith if (iascii) { 4845c6c1daeSBarry Smith if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed"); 4855c6c1daeSBarry Smith ascii->tab--; 4865c6c1daeSBarry Smith } 4875c6c1daeSBarry Smith PetscFunctionReturn(0); 4885c6c1daeSBarry Smith } 4895c6c1daeSBarry Smith 4905c6c1daeSBarry Smith #undef __FUNCT__ 4915c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs" 4925c6c1daeSBarry Smith /*@ 4935c6c1daeSBarry Smith PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer 4945c6c1daeSBarry Smith 4955c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith Input Parameters: 4985c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 4995c6c1daeSBarry Smith - flg - PETSC_TRUE or PETSC_FALSE 5005c6c1daeSBarry Smith 5015c6c1daeSBarry Smith Level: developer 5025c6c1daeSBarry Smith 5035c6c1daeSBarry Smith Fortran Note: 5045c6c1daeSBarry Smith This routine is not supported in Fortran. 5055c6c1daeSBarry Smith 5065c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 5075c6c1daeSBarry Smith Concepts: tab^setting 5085c6c1daeSBarry Smith 5095c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 5105c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(), 5115c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 5125c6c1daeSBarry Smith @*/ 5135c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg) 5145c6c1daeSBarry Smith { 5155c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5165c6c1daeSBarry Smith PetscBool iascii; 5175c6c1daeSBarry Smith PetscErrorCode ierr; 5185c6c1daeSBarry Smith 5195c6c1daeSBarry Smith PetscFunctionBegin; 5205c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5215c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5225c6c1daeSBarry Smith if (iascii) { 523a297a907SKarl Rupp if (flg) ascii->tab = ascii->tab_store; 524a297a907SKarl Rupp else { 5255c6c1daeSBarry Smith ascii->tab_store = ascii->tab; 5265c6c1daeSBarry Smith ascii->tab = 0; 5275c6c1daeSBarry Smith } 5285c6c1daeSBarry Smith } 5295c6c1daeSBarry Smith PetscFunctionReturn(0); 5305c6c1daeSBarry Smith } 5315c6c1daeSBarry Smith 5325c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */ 5335c6c1daeSBarry Smith 5345c6c1daeSBarry Smith 5355c6c1daeSBarry Smith #undef __FUNCT__ 5365c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf" 5375c6c1daeSBarry Smith /*@C 5385c6c1daeSBarry Smith PetscViewerASCIIPrintf - Prints to a file, only from the first 5395c6c1daeSBarry Smith processor in the PetscViewer 5405c6c1daeSBarry Smith 5415c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5425c6c1daeSBarry Smith 5435c6c1daeSBarry Smith Input Parameters: 5445c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 5455c6c1daeSBarry Smith - format - the usual printf() format string 5465c6c1daeSBarry Smith 5475c6c1daeSBarry Smith Level: developer 5485c6c1daeSBarry Smith 5495c6c1daeSBarry Smith Fortran Note: 5505c6c1daeSBarry Smith The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran. 5515c6c1daeSBarry Smith That is, you can only pass a single character string from Fortran. 5525c6c1daeSBarry Smith 5535c6c1daeSBarry Smith Concepts: PetscViewerASCII^printing 5545c6c1daeSBarry Smith Concepts: printing^to file 5555c6c1daeSBarry Smith Concepts: printf 5565c6c1daeSBarry Smith 5575c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(), 5585c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), 5595c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow() 5605c6c1daeSBarry Smith @*/ 5615c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...) 5625c6c1daeSBarry Smith { 5635c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5645c6c1daeSBarry Smith PetscMPIInt rank; 565dd2fa690SBarry Smith PetscInt tab,intab = ascii->tab; 5665c6c1daeSBarry Smith PetscErrorCode ierr; 5675c6c1daeSBarry Smith FILE *fd = ascii->fd; 5683f08860eSBarry Smith PetscBool iascii; 5695c6c1daeSBarry Smith int err; 5705c6c1daeSBarry Smith 5715c6c1daeSBarry Smith PetscFunctionBegin; 5725c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5735c6c1daeSBarry Smith PetscValidCharPointer(format,2); 5745c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5755c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 576ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 577*559f443fSBarry Smith if (rank) PetscFunctionReturn(0); 5783f08860eSBarry Smith 5793f08860eSBarry Smith if (ascii->bviewer) { /* pass string up to parent viewer */ 5803f08860eSBarry Smith char *string; 5813f08860eSBarry Smith va_list Argp; 5823f08860eSBarry Smith size_t fullLength; 5833f08860eSBarry Smith 5843f08860eSBarry Smith ierr = PetscCalloc1(QUEUESTRINGSIZE, &string);CHKERRQ(ierr); 5853f08860eSBarry Smith tab = intab; 5863f08860eSBarry Smith tab *= 2; 5873f08860eSBarry Smith while (tab--) { 5883f08860eSBarry Smith *string++ = ' '; 5893f08860eSBarry Smith } 5903f08860eSBarry Smith va_start(Argp,format); 5913f08860eSBarry Smith ierr = PetscVSNPrintf(string,QUEUESTRINGSIZE-2*ascii->tab,format,&fullLength,Argp);CHKERRQ(ierr); 5923f08860eSBarry Smith va_end(Argp); 5933f08860eSBarry Smith 594*559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedPrintf(viewer,"%s",string);CHKERRQ(ierr); 5953f08860eSBarry Smith ierr = PetscFree(string);CHKERRQ(ierr); 5963f08860eSBarry Smith } else { /* write directly to file */ 5975c6c1daeSBarry Smith va_list Argp; 598*559f443fSBarry Smith /* flush my own messages that I may have queued up */ 599*559f443fSBarry Smith PrintfQueue next = ascii->petsc_printfqueuebase,previous; 600*559f443fSBarry Smith PetscInt i; 601*559f443fSBarry Smith for (i=0; i<ascii->petsc_printfqueuelength; i++) { 602*559f443fSBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,fd,"%s",next->string);CHKERRQ(ierr); 603*559f443fSBarry Smith previous = next; 604*559f443fSBarry Smith next = next->next; 605*559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 606*559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 607*559f443fSBarry Smith } 608*559f443fSBarry Smith ascii->petsc_printfqueue = 0; 609*559f443fSBarry Smith ascii->petsc_printfqueuelength = 0; 610dd2fa690SBarry Smith tab = intab; 611a297a907SKarl Rupp while (tab--) { 612a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fd," ");CHKERRQ(ierr); 613a297a907SKarl Rupp } 6145c6c1daeSBarry Smith 6155c6c1daeSBarry Smith va_start(Argp,format); 6165c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr); 6175c6c1daeSBarry Smith err = fflush(fd); 6185c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6195c6c1daeSBarry Smith if (petsc_history) { 6205c6c1daeSBarry Smith va_start(Argp,format); 621dd2fa690SBarry Smith tab = intab; 622a297a907SKarl Rupp while (tab--) { 623706d7a88SBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history," ");CHKERRQ(ierr); 624a297a907SKarl Rupp } 6255c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 6265c6c1daeSBarry Smith err = fflush(petsc_history); 6275c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6285c6c1daeSBarry Smith } 6295c6c1daeSBarry Smith va_end(Argp); 6305c6c1daeSBarry Smith } 6315c6c1daeSBarry Smith PetscFunctionReturn(0); 6325c6c1daeSBarry Smith } 6335c6c1daeSBarry Smith 6345c6c1daeSBarry Smith #undef __FUNCT__ 6355c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName" 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; 6545c6c1daeSBarry Smith 6555c6c1daeSBarry Smith PetscFunctionBegin; 6565c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6575c6c1daeSBarry Smith PetscValidCharPointer(name,2); 6585c6c1daeSBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr); 6595c6c1daeSBarry Smith PetscFunctionReturn(0); 6605c6c1daeSBarry Smith } 6615c6c1daeSBarry Smith 6625c6c1daeSBarry Smith #undef __FUNCT__ 6635c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName" 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); 6865c6c1daeSBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr); 6875c6c1daeSBarry Smith PetscFunctionReturn(0); 6885c6c1daeSBarry Smith } 6895c6c1daeSBarry Smith 6905c6c1daeSBarry Smith #undef __FUNCT__ 6915c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII" 6925c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name) 6935c6c1daeSBarry Smith { 6945c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 6955c6c1daeSBarry Smith 6965c6c1daeSBarry Smith PetscFunctionBegin; 6975c6c1daeSBarry Smith *name = vascii->filename; 6985c6c1daeSBarry Smith PetscFunctionReturn(0); 6995c6c1daeSBarry Smith } 7005c6c1daeSBarry Smith 7015c6c1daeSBarry Smith #undef __FUNCT__ 7025c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII" 7035c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[]) 7045c6c1daeSBarry Smith { 7055c6c1daeSBarry Smith PetscErrorCode ierr; 7065c6c1daeSBarry Smith size_t len; 7075c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN],*gz; 7085c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 7095c6c1daeSBarry Smith PetscBool isstderr,isstdout; 7105c6c1daeSBarry Smith PetscMPIInt rank; 7115c6c1daeSBarry Smith 7125c6c1daeSBarry Smith PetscFunctionBegin; 7135c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 7145c6c1daeSBarry Smith if (!name) PetscFunctionReturn(0); 7155c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr); 7165c6c1daeSBarry Smith 7175c6c1daeSBarry Smith /* Is this file to be compressed */ 7185c6c1daeSBarry Smith vascii->storecompressed = PETSC_FALSE; 719a297a907SKarl Rupp 7205c6c1daeSBarry Smith ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr); 7215c6c1daeSBarry Smith if (gz) { 7225c6c1daeSBarry Smith ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); 7235c6c1daeSBarry Smith if (len == 3) { 7245c6c1daeSBarry Smith *gz = 0; 7255c6c1daeSBarry Smith vascii->storecompressed = PETSC_TRUE; 7265c6c1daeSBarry Smith } 7275c6c1daeSBarry Smith } 728ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 7295c6c1daeSBarry Smith if (!rank) { 7305c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr); 7315c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr); 7325c6c1daeSBarry Smith /* empty filename means stdout */ 7335c6c1daeSBarry Smith if (name[0] == 0) isstdout = PETSC_TRUE; 7345c6c1daeSBarry Smith if (isstderr) vascii->fd = PETSC_STDERR; 7355c6c1daeSBarry Smith else if (isstdout) vascii->fd = PETSC_STDOUT; 7365c6c1daeSBarry Smith else { 7375c6c1daeSBarry Smith 7385c6c1daeSBarry Smith 7395c6c1daeSBarry Smith ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 7405c6c1daeSBarry Smith switch (vascii->mode) { 7415c6c1daeSBarry Smith case FILE_MODE_READ: 7425c6c1daeSBarry Smith vascii->fd = fopen(fname,"r"); 7435c6c1daeSBarry Smith break; 7445c6c1daeSBarry Smith case FILE_MODE_WRITE: 7455c6c1daeSBarry Smith vascii->fd = fopen(fname,"w"); 7465c6c1daeSBarry Smith break; 7475c6c1daeSBarry Smith case FILE_MODE_APPEND: 7485c6c1daeSBarry Smith vascii->fd = fopen(fname,"a"); 7495c6c1daeSBarry Smith break; 7505c6c1daeSBarry Smith case FILE_MODE_UPDATE: 7515c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 752a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 7535c6c1daeSBarry Smith break; 7545c6c1daeSBarry Smith case FILE_MODE_APPEND_UPDATE: 7555c6c1daeSBarry Smith /* I really want a file which is opened at the end for updating, 7565c6c1daeSBarry Smith not a+, which opens at the beginning, but makes writes at the end. 7575c6c1daeSBarry Smith */ 7585c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 759a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 760a297a907SKarl Rupp else { 7615c6c1daeSBarry Smith ierr = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr); 7625c6c1daeSBarry Smith } 7635c6c1daeSBarry Smith break; 7645c6c1daeSBarry Smith default: 7655c6c1daeSBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode); 7665c6c1daeSBarry Smith } 7675c6c1daeSBarry Smith if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname); 7685c6c1daeSBarry Smith } 7695c6c1daeSBarry Smith } 7705c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 7715c6c1daeSBarry Smith PetscLogObjectState((PetscObject)viewer,"File: %s",name); 7725c6c1daeSBarry Smith #endif 7735c6c1daeSBarry Smith PetscFunctionReturn(0); 7745c6c1daeSBarry Smith } 7755c6c1daeSBarry Smith 7765c6c1daeSBarry Smith #undef __FUNCT__ 7773f08860eSBarry Smith #define __FUNCT__ "PetscViewerGetSubViewer_ASCII" 7783f08860eSBarry Smith PetscErrorCode PetscViewerGetSubViewer_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 7795c6c1daeSBarry Smith { 7805c6c1daeSBarry Smith PetscMPIInt rank; 7815c6c1daeSBarry Smith PetscErrorCode ierr; 7825c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii; 7835c6c1daeSBarry Smith 7845c6c1daeSBarry Smith PetscFunctionBegin; 7853f08860eSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer already obtained from PetscViewer and not restored"); 786*559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 7873f08860eSBarry Smith ierr = PetscViewerCreate(subcomm,outviewer);CHKERRQ(ierr); 7885c6c1daeSBarry Smith ierr = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr); 789*559f443fSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(*outviewer,PETSC_TRUE);CHKERRQ(ierr); 7905c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 7915c6c1daeSBarry Smith ovascii->fd = vascii->fd; 7925c6c1daeSBarry Smith ovascii->tab = vascii->tab; 7935c6c1daeSBarry Smith 7945c6c1daeSBarry Smith vascii->sviewer = *outviewer; 7955c6c1daeSBarry Smith 7965c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 7975c6c1daeSBarry Smith 798ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 7995c6c1daeSBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer; 8003f08860eSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_SubViewer; 8015c6c1daeSBarry Smith PetscFunctionReturn(0); 8025c6c1daeSBarry Smith } 8035c6c1daeSBarry Smith 8045c6c1daeSBarry Smith #undef __FUNCT__ 8053f08860eSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubViewer_ASCII" 8063f08860eSBarry Smith PetscErrorCode PetscViewerRestoreSubViewer_ASCII(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 8075c6c1daeSBarry Smith { 8085c6c1daeSBarry Smith PetscErrorCode ierr; 8095c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 8105c6c1daeSBarry Smith 8115c6c1daeSBarry Smith PetscFunctionBegin; 8123f08860eSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"SubViewer PetscViewer never obtained from PetscViewer"); 8133f08860eSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate a SubViewer PetscViewer"); 8145c6c1daeSBarry Smith 8155c6c1daeSBarry Smith ascii->sviewer = 0; 8165c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 8175c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 8185c6c1daeSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8195c6c1daeSBarry Smith PetscFunctionReturn(0); 8205c6c1daeSBarry Smith } 8215c6c1daeSBarry Smith 8225c6c1daeSBarry Smith #undef __FUNCT__ 8232bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII" 8242bf49c77SBarry Smith PetscErrorCode PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer) 8252bf49c77SBarry Smith { 8262bf49c77SBarry Smith PetscErrorCode ierr; 8272bf49c77SBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data; 8282bf49c77SBarry Smith 8292bf49c77SBarry Smith PetscFunctionBegin; 8302bf49c77SBarry Smith if (ascii->filename) { 8312bf49c77SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr); 8322bf49c77SBarry Smith } 8332bf49c77SBarry Smith PetscFunctionReturn(0); 8342bf49c77SBarry Smith } 8352bf49c77SBarry Smith 8365c6c1daeSBarry Smith #undef __FUNCT__ 8375c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII" 8388cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer) 8395c6c1daeSBarry Smith { 8405c6c1daeSBarry Smith PetscViewer_ASCII *vascii; 8415c6c1daeSBarry Smith PetscErrorCode ierr; 8425c6c1daeSBarry Smith 8435c6c1daeSBarry Smith PetscFunctionBegin; 844b00a9115SJed Brown ierr = PetscNewLog(viewer,&vascii);CHKERRQ(ierr); 8455c6c1daeSBarry Smith viewer->data = (void*)vascii; 8465c6c1daeSBarry Smith 8475c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_ASCII; 8485c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_ASCII; 849*559f443fSBarry Smith viewer->ops->getsubviewer = PetscViewerGetSubViewer_ASCII; 850*559f443fSBarry Smith viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_ASCII; 8512bf49c77SBarry Smith viewer->ops->view = PetscViewerView_ASCII; 8521d641e7bSMichael Lange viewer->ops->read = PetscViewerASCIIRead; 8535c6c1daeSBarry Smith 8545c6c1daeSBarry Smith /* defaults to stdout unless set with PetscViewerFileSetName() */ 8555c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 8565c6c1daeSBarry Smith vascii->mode = FILE_MODE_WRITE; 8575c6c1daeSBarry Smith vascii->bviewer = 0; 858dd2fa690SBarry Smith vascii->subviewer = 0; 8595c6c1daeSBarry Smith vascii->sviewer = 0; 8605c6c1daeSBarry Smith vascii->tab = 0; 8615c6c1daeSBarry Smith vascii->tab_store = 0; 8625c6c1daeSBarry Smith vascii->filename = 0; 8635c6c1daeSBarry Smith vascii->closefile = PETSC_TRUE; 8645c6c1daeSBarry Smith 865bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr); 866bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr); 867bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr); 868bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr); 8695c6c1daeSBarry Smith PetscFunctionReturn(0); 8705c6c1daeSBarry Smith } 8715c6c1daeSBarry Smith 8725c6c1daeSBarry Smith #undef __FUNCT__ 8735c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedPrintf" 8745c6c1daeSBarry Smith /*@C 8755c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from 8765c6c1daeSBarry Smith several processors. Output of the first processor is followed by that of the 8775c6c1daeSBarry Smith second, etc. 8785c6c1daeSBarry Smith 8795c6c1daeSBarry Smith Not Collective, must call collective PetscViewerFlush() to get the results out 8805c6c1daeSBarry Smith 8815c6c1daeSBarry Smith Input Parameters: 8825c6c1daeSBarry Smith + viewer - the ASCII PetscViewer 8835c6c1daeSBarry Smith - format - the usual printf() format string 8845c6c1daeSBarry Smith 8855c6c1daeSBarry Smith Level: intermediate 8865c6c1daeSBarry Smith 8875c6c1daeSBarry Smith Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called. 8885c6c1daeSBarry Smith 8895c6c1daeSBarry Smith Fortran Note: 8905c6c1daeSBarry Smith Can only print a single character* string 8915c6c1daeSBarry Smith 8925c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(), 8935c6c1daeSBarry Smith PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(), 8945c6c1daeSBarry Smith PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedAllow() 8955c6c1daeSBarry Smith 8965c6c1daeSBarry Smith @*/ 8975c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...) 8985c6c1daeSBarry Smith { 8995c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 9005c6c1daeSBarry Smith PetscErrorCode ierr; 9013f08860eSBarry Smith PetscMPIInt rank; 9025c6c1daeSBarry Smith PetscInt tab = vascii->tab; 9035c6c1daeSBarry Smith MPI_Comm comm; 9045c6c1daeSBarry Smith FILE *fp; 905*559f443fSBarry Smith PetscBool iascii,hasbviewer = PETSC_FALSE; 9065c6c1daeSBarry Smith int err; 9075c6c1daeSBarry Smith 9085c6c1daeSBarry Smith PetscFunctionBegin; 9095c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 9105c6c1daeSBarry Smith PetscValidCharPointer(format,2); 9115c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9125c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 9133f08860eSBarry Smith if (!vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIISynchronizedAllow() to allow this call"); 9145c6c1daeSBarry Smith 915ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 9165c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 9175c6c1daeSBarry Smith 918*559f443fSBarry Smith if (vascii->bviewer) { 919*559f443fSBarry Smith hasbviewer = PETSC_TRUE; 920*559f443fSBarry Smith if (!rank) { 921*559f443fSBarry Smith vascii = (PetscViewer_ASCII*)vascii->bviewer->data; 922*559f443fSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 923*559f443fSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 924*559f443fSBarry Smith } 925*559f443fSBarry Smith } 9263f08860eSBarry Smith 927*559f443fSBarry Smith fp = vascii->fd; 928*559f443fSBarry Smith 929*559f443fSBarry Smith if (!rank && !hasbviewer) { /* First processor prints immediately to fp */ 9305c6c1daeSBarry Smith va_list Argp; 931*559f443fSBarry Smith /* flush my own messages that I may have queued up */ 932*559f443fSBarry Smith PrintfQueue next = vascii->petsc_printfqueuebase,previous; 933*559f443fSBarry Smith PetscInt i; 934*559f443fSBarry Smith for (i=0; i<vascii->petsc_printfqueuelength; i++) { 935*559f443fSBarry Smith ierr = PetscFPrintf(comm,fp,"%s",next->string);CHKERRQ(ierr); 936*559f443fSBarry Smith previous = next; 937*559f443fSBarry Smith next = next->next; 938*559f443fSBarry Smith ierr = PetscFree(previous->string);CHKERRQ(ierr); 939*559f443fSBarry Smith ierr = PetscFree(previous);CHKERRQ(ierr); 940*559f443fSBarry Smith } 941*559f443fSBarry Smith vascii->petsc_printfqueue = 0; 942*559f443fSBarry Smith vascii->petsc_printfqueuelength = 0; 9435c6c1daeSBarry Smith 944a297a907SKarl Rupp while (tab--) { 945a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fp," ");CHKERRQ(ierr); 946a297a907SKarl Rupp } 9475c6c1daeSBarry Smith 9485c6c1daeSBarry Smith va_start(Argp,format); 9495c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr); 9505c6c1daeSBarry Smith err = fflush(fp); 9515c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9525c6c1daeSBarry Smith if (petsc_history) { 9535c6c1daeSBarry Smith va_start(Argp,format); 9545c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 9555c6c1daeSBarry Smith err = fflush(petsc_history); 9565c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9575c6c1daeSBarry Smith } 9585c6c1daeSBarry Smith va_end(Argp); 959*559f443fSBarry Smith } else { /* other processors add to queue */ 9605c6c1daeSBarry Smith char *string; 9615c6c1daeSBarry Smith va_list Argp; 9625c6c1daeSBarry Smith size_t fullLength; 9635c6c1daeSBarry Smith PrintfQueue next; 9645c6c1daeSBarry Smith 965b00a9115SJed Brown ierr = PetscNew(&next);CHKERRQ(ierr); 966*559f443fSBarry Smith if (vascii->petsc_printfqueue) { 967*559f443fSBarry Smith vascii->petsc_printfqueue->next = next; 968*559f443fSBarry Smith vascii->petsc_printfqueue = next; 969a297a907SKarl Rupp } else { 970*559f443fSBarry Smith vascii->petsc_printfqueuebase = vascii->petsc_printfqueue = next; 971a297a907SKarl Rupp } 972*559f443fSBarry Smith vascii->petsc_printfqueuelength++; 9735c6c1daeSBarry Smith next->size = QUEUESTRINGSIZE; 974785e854fSJed Brown ierr = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr); 9755c6c1daeSBarry Smith ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr); 9765c6c1daeSBarry Smith string = next->string; 9775c6c1daeSBarry Smith tab *= 2; 978a297a907SKarl Rupp while (tab--) { 979a297a907SKarl Rupp *string++ = ' '; 980a297a907SKarl Rupp } 9815c6c1daeSBarry Smith va_start(Argp,format); 98222d28d08SBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr); 9835c6c1daeSBarry Smith va_end(Argp); 9845c6c1daeSBarry Smith } 9855c6c1daeSBarry Smith PetscFunctionReturn(0); 9865c6c1daeSBarry Smith } 9875c6c1daeSBarry Smith 9882655f987SMichael Lange #undef __FUNCT__ 9892655f987SMichael Lange #define __FUNCT__ "PetscViewerASCIIRead" 9902655f987SMichael Lange /*@C 9912655f987SMichael Lange PetscViewerASCIIRead - Reads from am ASCII file 9922655f987SMichael Lange 9932655f987SMichael Lange Collective on MPI_Comm 9942655f987SMichael Lange 9952655f987SMichael Lange Input Parameters: 9962655f987SMichael Lange + viewer - the ascii viewer 9972655f987SMichael Lange . data - location to write the data 998060da220SMatthew G. Knepley . num - number of items of data to read 9992655f987SMichael Lange - datatype - type of data to read 10002655f987SMichael Lange 1001f8e4bde8SMatthew G. Knepley Output Parameters: 1002060da220SMatthew G. Knepley . count - number of items of data actually read, or NULL 1003f8e4bde8SMatthew G. Knepley 10042655f987SMichael Lange Level: beginner 10052655f987SMichael Lange 10062655f987SMichael Lange Concepts: ascii files 10072655f987SMichael Lange 10082655f987SMichael Lange .seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(), 10092655f987SMichael Lange VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), 10102655f987SMichael Lange PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead() 10112655f987SMichael Lange @*/ 1012060da220SMatthew G. Knepley PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt num,PetscInt *count,PetscDataType dtype) 10132655f987SMichael Lange { 10142655f987SMichael Lange PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 10152655f987SMichael Lange FILE *fd = vascii->fd; 10162655f987SMichael Lange PetscInt i; 10173b7fe8c3SMatthew G. Knepley int ret = 0; 10182655f987SMichael Lange 10192655f987SMichael Lange PetscFunctionBegin; 10202655f987SMichael Lange PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 1021060da220SMatthew G. Knepley for (i=0; i<num; i++) { 1022f8e4bde8SMatthew G. Knepley if (dtype == PETSC_CHAR) ret = fscanf(fd, "%c", &(((char*)data)[i])); 1023f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_STRING) ret = fscanf(fd, "%s", &(((char*)data)[i])); 1024b9eae255SMichael Lange #if PETSC_USE_64BIT_INDICES 10250a3e67a1SMichael Lange #if (PETSC_SIZEOF_LONG_LONG == 8) 1026f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_INT) ret = fscanf(fd, "%ld", &(((PetscInt*)data)[i])); 10270a3e67a1SMichael Lange #else 1028f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_INT) ret = fscanf(fd, "%lld", &(((PetscInt*)data)[i])); 10290a3e67a1SMichael Lange #endif 1030b9eae255SMichael Lange #else 1031f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_INT) ret = fscanf(fd, "%d", &(((PetscInt*)data)[i])); 1032b9eae255SMichael Lange #endif 1033f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_ENUM) ret = fscanf(fd, "%d", &(((int*)data)[i])); 1034f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_FLOAT) ret = fscanf(fd, "%f", &(((float*)data)[i])); 1035f8e4bde8SMatthew G. Knepley else if (dtype == PETSC_DOUBLE) ret = fscanf(fd, "%lg", &(((double*)data)[i])); 1036f8e4bde8SMatthew G. Knepley else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type %d not supported", (int) dtype);} 1037f8e4bde8SMatthew G. Knepley if (!ret) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Conversion error for data type %d", (int) dtype); 1038f8e4bde8SMatthew G. Knepley else if (ret < 0) break; /* Proxy for EOF, need to check for it in configure */ 10392655f987SMichael Lange } 1040060da220SMatthew G. Knepley if (count) *count = i; 1041060da220SMatthew G. Knepley else if (ret < 0) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Insufficient data, read only %D < %D items", i, num); 10422655f987SMichael Lange PetscFunctionReturn(0); 10432655f987SMichael Lange } 10445c6c1daeSBarry Smith 1045