15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/ascii/asciiimpl.h> /*I "petscsys.h" I*/ 35c6c1daeSBarry Smith #include <stdarg.h> 45c6c1daeSBarry Smith 55c6c1daeSBarry Smith #define QUEUESTRINGSIZE 8192 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith #undef __FUNCT__ 85c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileClose_ASCII" 95c6c1daeSBarry Smith static PetscErrorCode PetscViewerFileClose_ASCII(PetscViewer viewer) 105c6c1daeSBarry Smith { 115c6c1daeSBarry Smith PetscErrorCode ierr; 125c6c1daeSBarry Smith PetscMPIInt rank; 135c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 145c6c1daeSBarry Smith int err; 155c6c1daeSBarry Smith 165c6c1daeSBarry Smith PetscFunctionBegin; 175c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 185c6c1daeSBarry Smith if (!rank && vascii->fd != stderr && vascii->fd != PETSC_STDOUT) { 195c6c1daeSBarry Smith if (vascii->fd && vascii->closefile) { 205c6c1daeSBarry Smith err = fclose(vascii->fd); 215c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fclose() failed on file"); 225c6c1daeSBarry Smith } 235c6c1daeSBarry Smith if (vascii->storecompressed) { 245c6c1daeSBarry Smith char par[PETSC_MAX_PATH_LEN],buf[PETSC_MAX_PATH_LEN]; 255c6c1daeSBarry Smith FILE *fp; 265c6c1daeSBarry Smith ierr = PetscStrcpy(par,"gzip ");CHKERRQ(ierr); 275c6c1daeSBarry Smith ierr = PetscStrcat(par,vascii->filename);CHKERRQ(ierr); 285c6c1daeSBarry Smith #if defined(PETSC_HAVE_POPEN) 295c6c1daeSBarry Smith ierr = PetscPOpen(PETSC_COMM_SELF,PETSC_NULL,par,"r",&fp);CHKERRQ(ierr); 305c6c1daeSBarry Smith if (fgets(buf,1024,fp)) { 315c6c1daeSBarry Smith SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_LIB,"Error from compression command %s\n%s",par,buf); 325c6c1daeSBarry Smith } 335c6c1daeSBarry Smith ierr = PetscPClose(PETSC_COMM_SELF,fp,PETSC_NULL);CHKERRQ(ierr); 345c6c1daeSBarry Smith #else 355c6c1daeSBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP_SYS,"Cannot run external programs on this machine"); 365c6c1daeSBarry Smith #endif 375c6c1daeSBarry Smith } 385c6c1daeSBarry Smith } 395c6c1daeSBarry Smith ierr = PetscFree(vascii->filename);CHKERRQ(ierr); 405c6c1daeSBarry Smith PetscFunctionReturn(0); 415c6c1daeSBarry Smith } 425c6c1daeSBarry Smith 435c6c1daeSBarry Smith /* ----------------------------------------------------------------------*/ 445c6c1daeSBarry Smith #undef __FUNCT__ 455c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII" 465c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII(PetscViewer viewer) 475c6c1daeSBarry Smith { 485c6c1daeSBarry Smith PetscErrorCode ierr; 495c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 505c6c1daeSBarry Smith PetscViewerLink *vlink; 515c6c1daeSBarry Smith PetscBool flg; 525c6c1daeSBarry Smith 535c6c1daeSBarry Smith PetscFunctionBegin; 545c6c1daeSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"ASCII PetscViewer destroyed before restoring singleton or subcomm PetscViewer"); 555c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 565c6c1daeSBarry Smith ierr = PetscFree(vascii);CHKERRQ(ierr); 575c6c1daeSBarry Smith 585c6c1daeSBarry Smith /* remove the viewer from the list in the MPI Communicator */ 595c6c1daeSBarry Smith if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) { 605c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);CHKERRQ(ierr); 615c6c1daeSBarry Smith } 625c6c1daeSBarry Smith 635c6c1daeSBarry Smith ierr = MPI_Attr_get(((PetscObject)viewer)->comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr); 645c6c1daeSBarry Smith if (flg) { 655c6c1daeSBarry Smith if (vlink && vlink->viewer == viewer) { 665c6c1daeSBarry Smith ierr = MPI_Attr_put(((PetscObject)viewer)->comm,Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr); 675c6c1daeSBarry Smith ierr = PetscFree(vlink);CHKERRQ(ierr); 685c6c1daeSBarry Smith } else { 695c6c1daeSBarry Smith while (vlink && vlink->next) { 705c6c1daeSBarry Smith if (vlink->next->viewer == viewer) { 715c6c1daeSBarry Smith PetscViewerLink *nv = vlink->next; 725c6c1daeSBarry Smith vlink->next = vlink->next->next; 735c6c1daeSBarry Smith ierr = PetscFree(nv);CHKERRQ(ierr); 745c6c1daeSBarry Smith } 755c6c1daeSBarry Smith vlink = vlink->next; 765c6c1daeSBarry Smith } 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith } 795c6c1daeSBarry Smith PetscFunctionReturn(0); 805c6c1daeSBarry Smith } 815c6c1daeSBarry Smith 825c6c1daeSBarry Smith #undef __FUNCT__ 835c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Singleton" 845c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Singleton(PetscViewer viewer) 855c6c1daeSBarry Smith { 865c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 875c6c1daeSBarry Smith PetscErrorCode ierr; 885c6c1daeSBarry Smith PetscFunctionBegin; 895c6c1daeSBarry Smith ierr = PetscViewerRestoreSingleton(vascii->bviewer,&viewer);CHKERRQ(ierr); 905c6c1daeSBarry Smith PetscFunctionReturn(0); 915c6c1daeSBarry Smith } 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith #undef __FUNCT__ 945c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Subcomm" 955c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Subcomm(PetscViewer viewer) 965c6c1daeSBarry Smith { 975c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 985c6c1daeSBarry Smith PetscErrorCode ierr; 995c6c1daeSBarry Smith PetscFunctionBegin; 1005c6c1daeSBarry Smith ierr = PetscViewerRestoreSubcomm(vascii->bviewer,((PetscObject)viewer)->comm,&viewer);CHKERRQ(ierr); 1015c6c1daeSBarry Smith PetscFunctionReturn(0); 1025c6c1daeSBarry Smith } 1035c6c1daeSBarry Smith 1045c6c1daeSBarry Smith #undef __FUNCT__ 1055c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII_Singleton_0" 1065c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII_Singleton_0(PetscViewer viewer) 1075c6c1daeSBarry Smith { 1085c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1095c6c1daeSBarry Smith int err; 1105c6c1daeSBarry Smith 1115c6c1daeSBarry Smith PetscFunctionBegin; 1125c6c1daeSBarry Smith err = fflush(vascii->fd); 1135c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 1145c6c1daeSBarry Smith PetscFunctionReturn(0); 1155c6c1daeSBarry Smith } 1165c6c1daeSBarry Smith 1175c6c1daeSBarry Smith #undef __FUNCT__ 1185c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII" 1195c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer) 1205c6c1daeSBarry Smith { 1215c6c1daeSBarry Smith PetscMPIInt rank; 1225c6c1daeSBarry Smith PetscErrorCode ierr; 1235c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1245c6c1daeSBarry Smith int err; 1255c6c1daeSBarry Smith 1265c6c1daeSBarry Smith PetscFunctionBegin; 1275c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 1285c6c1daeSBarry Smith /* fflush() fails on OSX for read-only descriptors */ 1295c6c1daeSBarry Smith if (!rank && (vascii->mode != FILE_MODE_READ)) { 1305c6c1daeSBarry Smith err = fflush(vascii->fd); 1315c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed"); 1325c6c1daeSBarry Smith } 1335c6c1daeSBarry Smith 1345c6c1daeSBarry Smith if (vascii->allowsynchronized) { 1355c6c1daeSBarry Smith /* Also flush anything printed with PetscViewerASCIISynchronizedPrintf() */ 1365c6c1daeSBarry Smith ierr = PetscSynchronizedFlush(((PetscObject)viewer)->comm);CHKERRQ(ierr); 1375c6c1daeSBarry Smith } 1385c6c1daeSBarry Smith PetscFunctionReturn(0); 1395c6c1daeSBarry Smith } 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith #undef __FUNCT__ 1425c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer" 1435c6c1daeSBarry Smith /*@C 1445c6c1daeSBarry Smith PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer. 1455c6c1daeSBarry Smith 1465c6c1daeSBarry Smith Not Collective 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith + viewer - PetscViewer context, obtained from PetscViewerASCIIOpen() 1495c6c1daeSBarry Smith - fd - file pointer 1505c6c1daeSBarry Smith 1515c6c1daeSBarry Smith Level: intermediate 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith Fortran Note: 1545c6c1daeSBarry Smith This routine is not supported in Fortran. 1555c6c1daeSBarry Smith 1565c6c1daeSBarry Smith Concepts: PetscViewer^file pointer 1575c6c1daeSBarry Smith Concepts: file pointer^getting from PetscViewer 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(), 1605c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush() 1615c6c1daeSBarry Smith @*/ 1625c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd) 1635c6c1daeSBarry Smith { 1645c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1655c6c1daeSBarry Smith 1665c6c1daeSBarry Smith PetscFunctionBegin; 1675c6c1daeSBarry Smith *fd = vascii->fd; 1685c6c1daeSBarry Smith PetscFunctionReturn(0); 1695c6c1daeSBarry Smith } 1705c6c1daeSBarry Smith 1715c6c1daeSBarry Smith EXTERN_C_BEGIN 1725c6c1daeSBarry Smith #undef __FUNCT__ 1735c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetMode_ASCII" 1745c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetMode_ASCII(PetscViewer viewer, PetscFileMode *mode) 1755c6c1daeSBarry Smith { 1765c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith PetscFunctionBegin; 1795c6c1daeSBarry Smith *mode = vascii->mode; 1805c6c1daeSBarry Smith PetscFunctionReturn(0); 1815c6c1daeSBarry Smith } 1825c6c1daeSBarry Smith EXTERN_C_END 1835c6c1daeSBarry Smith 1845c6c1daeSBarry Smith /*@C 1855c6c1daeSBarry Smith PetscViewerFileSetMode - Sets the mode in which to open the file. 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith Not Collective 1885c6c1daeSBarry Smith 1895c6c1daeSBarry Smith + viewer - viewer context, obtained from PetscViewerCreate() 1905c6c1daeSBarry Smith - mode - The file mode 1915c6c1daeSBarry Smith 1925c6c1daeSBarry Smith Level: intermediate 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith Fortran Note: 1955c6c1daeSBarry Smith This routine is not supported in Fortran. 1965c6c1daeSBarry Smith 1975c6c1daeSBarry Smith .keywords: Viewer, file, get, pointer 1985c6c1daeSBarry Smith 1995c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerBinaryOpen() 2005c6c1daeSBarry Smith @*/ 2015c6c1daeSBarry Smith 2025c6c1daeSBarry Smith EXTERN_C_BEGIN 2035c6c1daeSBarry Smith #undef __FUNCT__ 2045c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII" 2055c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode) 2065c6c1daeSBarry Smith { 2075c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 2085c6c1daeSBarry Smith 2095c6c1daeSBarry Smith PetscFunctionBegin; 2105c6c1daeSBarry Smith vascii->mode = mode; 2115c6c1daeSBarry Smith PetscFunctionReturn(0); 2125c6c1daeSBarry Smith } 2135c6c1daeSBarry Smith EXTERN_C_END 2145c6c1daeSBarry Smith 2155c6c1daeSBarry Smith /* 2165c6c1daeSBarry Smith If petsc_history is on, then all Petsc*Printf() results are saved 2175c6c1daeSBarry Smith if the appropriate (usually .petschistory) file. 2185c6c1daeSBarry Smith */ 2195c6c1daeSBarry Smith extern FILE *petsc_history; 2205c6c1daeSBarry Smith 2215c6c1daeSBarry Smith #undef __FUNCT__ 2225c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab" 2235c6c1daeSBarry Smith /*@ 2245c6c1daeSBarry Smith PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 2275c6c1daeSBarry Smith 2285c6c1daeSBarry Smith Input Parameters: 2295c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 2305c6c1daeSBarry Smith - tabs - number of tabs 2315c6c1daeSBarry Smith 2325c6c1daeSBarry Smith Level: developer 2335c6c1daeSBarry Smith 2345c6c1daeSBarry Smith Fortran Note: 2355c6c1daeSBarry Smith This routine is not supported in Fortran. 2365c6c1daeSBarry Smith 2375c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2385c6c1daeSBarry Smith Concepts: tab^setting 2395c6c1daeSBarry Smith 2405c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(), 2415c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2425c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2435c6c1daeSBarry Smith @*/ 2445c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs) 2455c6c1daeSBarry Smith { 2465c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2475c6c1daeSBarry Smith PetscBool iascii; 2485c6c1daeSBarry Smith PetscErrorCode ierr; 2495c6c1daeSBarry Smith 2505c6c1daeSBarry Smith PetscFunctionBegin; 2515c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2525c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 2535c6c1daeSBarry Smith if (iascii) { 2545c6c1daeSBarry Smith ascii->tab = tabs; 2555c6c1daeSBarry Smith } 2565c6c1daeSBarry Smith PetscFunctionReturn(0); 2575c6c1daeSBarry Smith } 2585c6c1daeSBarry Smith 2595c6c1daeSBarry Smith #undef __FUNCT__ 2605c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab" 2615c6c1daeSBarry Smith /*@ 2625c6c1daeSBarry Smith PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer. 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith Not Collective, meaningful on first processor only. 2655c6c1daeSBarry Smith 2665c6c1daeSBarry Smith Input Parameters: 2675c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 2685c6c1daeSBarry Smith Output Parameters: 2695c6c1daeSBarry Smith . tabs - number of tabs 2705c6c1daeSBarry Smith 2715c6c1daeSBarry Smith Level: developer 2725c6c1daeSBarry Smith 2735c6c1daeSBarry Smith Fortran Note: 2745c6c1daeSBarry Smith This routine is not supported in Fortran. 2755c6c1daeSBarry Smith 2765c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2775c6c1daeSBarry Smith Concepts: tab^retrieval 2785c6c1daeSBarry Smith 2795c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(), 2805c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2815c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2825c6c1daeSBarry Smith @*/ 2835c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetTab(PetscViewer viewer,PetscInt *tabs) 2845c6c1daeSBarry Smith { 2855c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2865c6c1daeSBarry Smith PetscBool iascii; 2875c6c1daeSBarry Smith PetscErrorCode ierr; 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith PetscFunctionBegin; 2905c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2915c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 2925c6c1daeSBarry Smith if (iascii && tabs) { 2935c6c1daeSBarry Smith *tabs = ascii->tab; 2945c6c1daeSBarry Smith } 2955c6c1daeSBarry Smith PetscFunctionReturn(0); 2965c6c1daeSBarry Smith } 2975c6c1daeSBarry Smith 2985c6c1daeSBarry Smith #undef __FUNCT__ 2995c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab" 3005c6c1daeSBarry Smith /*@ 3015c6c1daeSBarry Smith PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3045c6c1daeSBarry Smith 3055c6c1daeSBarry Smith Input Parameters: 3065c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3075c6c1daeSBarry Smith - tabs - number of tabs 3085c6c1daeSBarry Smith 3095c6c1daeSBarry Smith Level: developer 3105c6c1daeSBarry Smith 3115c6c1daeSBarry Smith Fortran Note: 3125c6c1daeSBarry Smith This routine is not supported in Fortran. 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3155c6c1daeSBarry Smith Concepts: tab^setting 3165c6c1daeSBarry Smith 3175c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3185c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3195c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3205c6c1daeSBarry Smith @*/ 3215c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs) 3225c6c1daeSBarry Smith { 3235c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3245c6c1daeSBarry Smith PetscBool iascii; 3255c6c1daeSBarry Smith PetscErrorCode ierr; 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith PetscFunctionBegin; 3285c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3295c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 3305c6c1daeSBarry Smith if (iascii) { 3315c6c1daeSBarry Smith ascii->tab += tabs; 3325c6c1daeSBarry Smith } 3335c6c1daeSBarry Smith PetscFunctionReturn(0); 3345c6c1daeSBarry Smith } 3355c6c1daeSBarry Smith 3365c6c1daeSBarry Smith #undef __FUNCT__ 3375c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab" 3385c6c1daeSBarry Smith /*@ 3395c6c1daeSBarry Smith PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing 3405c6c1daeSBarry Smith 3415c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3425c6c1daeSBarry Smith 3435c6c1daeSBarry Smith Input Parameters: 3445c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3455c6c1daeSBarry Smith - tabs - number of tabs 3465c6c1daeSBarry Smith 3475c6c1daeSBarry Smith Level: developer 3485c6c1daeSBarry Smith 3495c6c1daeSBarry Smith Fortran Note: 3505c6c1daeSBarry Smith This routine is not supported in Fortran. 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3535c6c1daeSBarry Smith Concepts: tab^setting 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3565c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3575c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3585c6c1daeSBarry Smith @*/ 3595c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs) 3605c6c1daeSBarry Smith { 3615c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3625c6c1daeSBarry Smith PetscBool iascii; 3635c6c1daeSBarry Smith PetscErrorCode ierr; 3645c6c1daeSBarry Smith 3655c6c1daeSBarry Smith PetscFunctionBegin; 3665c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3675c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 3685c6c1daeSBarry Smith if (iascii) { 3695c6c1daeSBarry Smith ascii->tab -= tabs; 3705c6c1daeSBarry Smith } 3715c6c1daeSBarry Smith PetscFunctionReturn(0); 3725c6c1daeSBarry Smith } 3735c6c1daeSBarry Smith 3745c6c1daeSBarry Smith #undef __FUNCT__ 3755c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow" 3765c6c1daeSBarry Smith /*@C 3775c6c1daeSBarry Smith PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer 3785c6c1daeSBarry Smith 3795c6c1daeSBarry Smith Collective on PetscViewer 3805c6c1daeSBarry Smith 3815c6c1daeSBarry Smith Input Parameters: 3825c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3835c6c1daeSBarry Smith - allow - PETSC_TRUE to allow the synchronized printing 3845c6c1daeSBarry Smith 3855c6c1daeSBarry Smith Level: intermediate 3865c6c1daeSBarry Smith 3875c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3885c6c1daeSBarry Smith Concepts: tab^setting 3895c6c1daeSBarry Smith 3905c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3915c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3925c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 3935c6c1daeSBarry Smith @*/ 3945c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow) 3955c6c1daeSBarry Smith { 3965c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3975c6c1daeSBarry Smith PetscBool iascii; 3985c6c1daeSBarry Smith PetscErrorCode ierr; 3995c6c1daeSBarry Smith 4005c6c1daeSBarry Smith PetscFunctionBegin; 4015c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4025c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4035c6c1daeSBarry Smith if (iascii) { 4045c6c1daeSBarry Smith ascii->allowsynchronized = allow; 4055c6c1daeSBarry Smith } 4065c6c1daeSBarry Smith PetscFunctionReturn(0); 4075c6c1daeSBarry Smith } 4085c6c1daeSBarry Smith 4095c6c1daeSBarry Smith #undef __FUNCT__ 4105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab" 4115c6c1daeSBarry Smith /*@ 4125c6c1daeSBarry Smith PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf() 4135c6c1daeSBarry Smith lines are tabbed. 4145c6c1daeSBarry Smith 4155c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4165c6c1daeSBarry Smith 4175c6c1daeSBarry Smith Input Parameters: 4185c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 4195c6c1daeSBarry Smith 4205c6c1daeSBarry Smith Level: developer 4215c6c1daeSBarry Smith 4225c6c1daeSBarry Smith Fortran Note: 4235c6c1daeSBarry Smith This routine is not supported in Fortran. 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4265c6c1daeSBarry Smith Concepts: tab^setting 4275c6c1daeSBarry Smith 4285c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4295c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4305c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4315c6c1daeSBarry Smith @*/ 4325c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPushTab(PetscViewer viewer) 4335c6c1daeSBarry Smith { 4345c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4355c6c1daeSBarry Smith PetscBool iascii; 4365c6c1daeSBarry Smith PetscErrorCode ierr; 4375c6c1daeSBarry Smith 4385c6c1daeSBarry Smith PetscFunctionBegin; 4395c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4405c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4415c6c1daeSBarry Smith if (iascii) { 4425c6c1daeSBarry Smith ascii->tab++; 4435c6c1daeSBarry Smith } 4445c6c1daeSBarry Smith PetscFunctionReturn(0); 4455c6c1daeSBarry Smith } 4465c6c1daeSBarry Smith 4475c6c1daeSBarry Smith #undef __FUNCT__ 4485c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab" 4495c6c1daeSBarry Smith /*@ 4505c6c1daeSBarry Smith PetscViewerASCIIPopTab - Removes one tab from 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: 4565c6c1daeSBarry Smith . viewer - optained 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 PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4685c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4695c6c1daeSBarry Smith @*/ 4705c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPopTab(PetscViewer viewer) 4715c6c1daeSBarry Smith { 4725c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4735c6c1daeSBarry Smith PetscErrorCode ierr; 4745c6c1daeSBarry Smith PetscBool iascii; 4755c6c1daeSBarry Smith 4765c6c1daeSBarry Smith PetscFunctionBegin; 4775c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4785c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4795c6c1daeSBarry Smith if (iascii) { 4805c6c1daeSBarry Smith if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed"); 4815c6c1daeSBarry Smith ascii->tab--; 4825c6c1daeSBarry Smith } 4835c6c1daeSBarry Smith PetscFunctionReturn(0); 4845c6c1daeSBarry Smith } 4855c6c1daeSBarry Smith 4865c6c1daeSBarry Smith #undef __FUNCT__ 4875c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs" 4885c6c1daeSBarry Smith /*@ 4895c6c1daeSBarry Smith PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer 4905c6c1daeSBarry Smith 4915c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4925c6c1daeSBarry Smith 4935c6c1daeSBarry Smith Input Parameters: 4945c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 4955c6c1daeSBarry Smith - flg - PETSC_TRUE or PETSC_FALSE 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith Level: developer 4985c6c1daeSBarry Smith 4995c6c1daeSBarry Smith Fortran Note: 5005c6c1daeSBarry Smith This routine is not supported in Fortran. 5015c6c1daeSBarry Smith 5025c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 5035c6c1daeSBarry Smith Concepts: tab^setting 5045c6c1daeSBarry Smith 5055c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 5065c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(), 5075c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 5085c6c1daeSBarry Smith @*/ 5095c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg) 5105c6c1daeSBarry Smith { 5115c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5125c6c1daeSBarry Smith PetscBool iascii; 5135c6c1daeSBarry Smith PetscErrorCode ierr; 5145c6c1daeSBarry Smith 5155c6c1daeSBarry Smith PetscFunctionBegin; 5165c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5175c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5185c6c1daeSBarry Smith if (iascii) { 5195c6c1daeSBarry Smith if (flg) { 5205c6c1daeSBarry Smith ascii->tab = ascii->tab_store; 5215c6c1daeSBarry Smith } else { 5225c6c1daeSBarry Smith ascii->tab_store = ascii->tab; 5235c6c1daeSBarry Smith ascii->tab = 0; 5245c6c1daeSBarry Smith } 5255c6c1daeSBarry Smith } 5265c6c1daeSBarry Smith PetscFunctionReturn(0); 5275c6c1daeSBarry Smith } 5285c6c1daeSBarry Smith 5295c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */ 5305c6c1daeSBarry Smith 5315c6c1daeSBarry Smith #include <../src/sys/fileio/mprint.h> /* defines the queue datastructures and variables */ 5325c6c1daeSBarry Smith 5335c6c1daeSBarry Smith #undef __FUNCT__ 5345c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf" 5355c6c1daeSBarry Smith /*@C 5365c6c1daeSBarry Smith PetscViewerASCIIPrintf - Prints to a file, only from the first 5375c6c1daeSBarry Smith processor in the PetscViewer 5385c6c1daeSBarry Smith 5395c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5405c6c1daeSBarry Smith 5415c6c1daeSBarry Smith Input Parameters: 5425c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 5435c6c1daeSBarry Smith - format - the usual printf() format string 5445c6c1daeSBarry Smith 5455c6c1daeSBarry Smith Level: developer 5465c6c1daeSBarry Smith 5475c6c1daeSBarry Smith Fortran Note: 5485c6c1daeSBarry Smith The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran. 5495c6c1daeSBarry Smith That is, you can only pass a single character string from Fortran. 5505c6c1daeSBarry Smith 5515c6c1daeSBarry Smith Concepts: PetscViewerASCII^printing 5525c6c1daeSBarry Smith Concepts: printing^to file 5535c6c1daeSBarry Smith Concepts: printf 5545c6c1daeSBarry Smith 5555c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(), 5565c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), 5575c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow() 5585c6c1daeSBarry Smith @*/ 5595c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...) 5605c6c1daeSBarry Smith { 5615c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5625c6c1daeSBarry Smith PetscMPIInt rank; 5635c6c1daeSBarry Smith PetscInt tab; 5645c6c1daeSBarry Smith PetscErrorCode ierr; 5655c6c1daeSBarry Smith FILE *fd = ascii->fd; 5665c6c1daeSBarry Smith PetscBool iascii; 5675c6c1daeSBarry Smith int err; 5685c6c1daeSBarry Smith 5695c6c1daeSBarry Smith PetscFunctionBegin; 5705c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5715c6c1daeSBarry Smith PetscValidCharPointer(format,2); 5725c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5735c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 5745c6c1daeSBarry Smith 5755c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 5765c6c1daeSBarry Smith if (!rank) { 5775c6c1daeSBarry Smith va_list Argp; 5785c6c1daeSBarry Smith if (ascii->bviewer) { 5795c6c1daeSBarry Smith petsc_printfqueuefile = fd; 5805c6c1daeSBarry Smith } 5815c6c1daeSBarry Smith 5825c6c1daeSBarry Smith tab = ascii->tab; 5835c6c1daeSBarry Smith while (tab--) {ierr = PetscFPrintf(PETSC_COMM_SELF,fd," ");CHKERRQ(ierr);} 5845c6c1daeSBarry Smith 5855c6c1daeSBarry Smith va_start(Argp,format); 5865c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr); 5875c6c1daeSBarry Smith err = fflush(fd); 5885c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 5895c6c1daeSBarry Smith if (petsc_history) { 5905c6c1daeSBarry Smith va_start(Argp,format); 5915c6c1daeSBarry Smith tab = ascii->tab; 5925c6c1daeSBarry Smith while (tab--) {ierr = PetscFPrintf(PETSC_COMM_SELF,fd," ");CHKERRQ(ierr);} 5935c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 5945c6c1daeSBarry Smith err = fflush(petsc_history); 5955c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 5965c6c1daeSBarry Smith } 5975c6c1daeSBarry Smith va_end(Argp); 5985c6c1daeSBarry Smith } 5995c6c1daeSBarry Smith PetscFunctionReturn(0); 6005c6c1daeSBarry Smith } 6015c6c1daeSBarry Smith 6025c6c1daeSBarry Smith #undef __FUNCT__ 6035c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName" 6045c6c1daeSBarry Smith /*@C 6055c6c1daeSBarry Smith PetscViewerFileSetName - Sets the name of the file the PetscViewer uses. 6065c6c1daeSBarry Smith 6075c6c1daeSBarry Smith Collective on PetscViewer 6085c6c1daeSBarry Smith 6095c6c1daeSBarry Smith Input Parameters: 6105c6c1daeSBarry Smith + viewer - the PetscViewer; either ASCII or binary 6115c6c1daeSBarry Smith - name - the name of the file it should use 6125c6c1daeSBarry Smith 6135c6c1daeSBarry Smith Level: advanced 6145c6c1daeSBarry Smith 6155c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(), 6165c6c1daeSBarry Smith PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf() 6175c6c1daeSBarry Smith 6185c6c1daeSBarry Smith @*/ 6195c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName(PetscViewer viewer,const char name[]) 6205c6c1daeSBarry Smith { 6215c6c1daeSBarry Smith PetscErrorCode ierr; 6225c6c1daeSBarry Smith 6235c6c1daeSBarry Smith PetscFunctionBegin; 6245c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6255c6c1daeSBarry Smith PetscValidCharPointer(name,2); 6265c6c1daeSBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr); 6275c6c1daeSBarry Smith PetscFunctionReturn(0); 6285c6c1daeSBarry Smith } 6295c6c1daeSBarry Smith 6305c6c1daeSBarry Smith #undef __FUNCT__ 6315c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName" 6325c6c1daeSBarry Smith /*@C 6335c6c1daeSBarry Smith PetscViewerFileGetName - Gets the name of the file the PetscViewer uses. 6345c6c1daeSBarry Smith 6355c6c1daeSBarry Smith Not Collective 6365c6c1daeSBarry Smith 6375c6c1daeSBarry Smith Input Parameter: 6385c6c1daeSBarry Smith . viewer - the PetscViewer; either ASCII or binary 6395c6c1daeSBarry Smith 6405c6c1daeSBarry Smith Output Parameter: 6415c6c1daeSBarry Smith . name - the name of the file it is using 6425c6c1daeSBarry Smith 6435c6c1daeSBarry Smith Level: advanced 6445c6c1daeSBarry Smith 6455c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName() 6465c6c1daeSBarry Smith 6475c6c1daeSBarry Smith @*/ 6485c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName(PetscViewer viewer,const char **name) 6495c6c1daeSBarry Smith { 6505c6c1daeSBarry Smith PetscErrorCode ierr; 6515c6c1daeSBarry Smith 6525c6c1daeSBarry Smith PetscFunctionBegin; 6535c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6545c6c1daeSBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char **),(viewer,name));CHKERRQ(ierr); 6555c6c1daeSBarry Smith PetscFunctionReturn(0); 6565c6c1daeSBarry Smith } 6575c6c1daeSBarry Smith 6585c6c1daeSBarry Smith EXTERN_C_BEGIN 6595c6c1daeSBarry Smith #undef __FUNCT__ 6605c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII" 6615c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name) 6625c6c1daeSBarry Smith { 6635c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 6645c6c1daeSBarry Smith 6655c6c1daeSBarry Smith PetscFunctionBegin; 6665c6c1daeSBarry Smith *name = vascii->filename; 6675c6c1daeSBarry Smith PetscFunctionReturn(0); 6685c6c1daeSBarry Smith } 6695c6c1daeSBarry Smith EXTERN_C_END 6705c6c1daeSBarry Smith 6715c6c1daeSBarry Smith 6725c6c1daeSBarry Smith EXTERN_C_BEGIN 6735c6c1daeSBarry Smith #undef __FUNCT__ 6745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII" 6755c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[]) 6765c6c1daeSBarry Smith { 6775c6c1daeSBarry Smith PetscErrorCode ierr; 6785c6c1daeSBarry Smith size_t len; 6795c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN],*gz; 6805c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 6815c6c1daeSBarry Smith PetscBool isstderr,isstdout; 6825c6c1daeSBarry Smith PetscMPIInt rank; 6835c6c1daeSBarry Smith 6845c6c1daeSBarry Smith PetscFunctionBegin; 6855c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 6865c6c1daeSBarry Smith if (!name) PetscFunctionReturn(0); 6875c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr); 6885c6c1daeSBarry Smith 6895c6c1daeSBarry Smith /* Is this file to be compressed */ 6905c6c1daeSBarry Smith vascii->storecompressed = PETSC_FALSE; 6915c6c1daeSBarry Smith ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr); 6925c6c1daeSBarry Smith if (gz) { 6935c6c1daeSBarry Smith ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); 6945c6c1daeSBarry Smith if (len == 3) { 6955c6c1daeSBarry Smith *gz = 0; 6965c6c1daeSBarry Smith vascii->storecompressed = PETSC_TRUE; 6975c6c1daeSBarry Smith } 6985c6c1daeSBarry Smith } 6995c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 7005c6c1daeSBarry Smith if (!rank) { 7015c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr); 7025c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr); 7035c6c1daeSBarry Smith /* empty filename means stdout */ 7045c6c1daeSBarry Smith if (name[0] == 0) isstdout = PETSC_TRUE; 7055c6c1daeSBarry Smith if (isstderr) vascii->fd = PETSC_STDERR; 7065c6c1daeSBarry Smith else if (isstdout) vascii->fd = PETSC_STDOUT; 7075c6c1daeSBarry Smith else { 7085c6c1daeSBarry Smith 7095c6c1daeSBarry Smith 7105c6c1daeSBarry Smith ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 7115c6c1daeSBarry Smith switch(vascii->mode) { 7125c6c1daeSBarry Smith case FILE_MODE_READ: 7135c6c1daeSBarry Smith vascii->fd = fopen(fname,"r"); 7145c6c1daeSBarry Smith break; 7155c6c1daeSBarry Smith case FILE_MODE_WRITE: 7165c6c1daeSBarry Smith vascii->fd = fopen(fname,"w"); 7175c6c1daeSBarry Smith break; 7185c6c1daeSBarry Smith case FILE_MODE_APPEND: 7195c6c1daeSBarry Smith vascii->fd = fopen(fname,"a"); 7205c6c1daeSBarry Smith break; 7215c6c1daeSBarry Smith case FILE_MODE_UPDATE: 7225c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 7235c6c1daeSBarry Smith if (!vascii->fd) { 7245c6c1daeSBarry Smith vascii->fd = fopen(fname,"w+"); 7255c6c1daeSBarry Smith } 7265c6c1daeSBarry Smith break; 7275c6c1daeSBarry Smith case FILE_MODE_APPEND_UPDATE: 7285c6c1daeSBarry Smith /* I really want a file which is opened at the end for updating, 7295c6c1daeSBarry Smith not a+, which opens at the beginning, but makes writes at the end. 7305c6c1daeSBarry Smith */ 7315c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 7325c6c1daeSBarry Smith if (!vascii->fd) { 7335c6c1daeSBarry Smith vascii->fd = fopen(fname,"w+"); 7345c6c1daeSBarry Smith } else { 7355c6c1daeSBarry Smith ierr = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr); 7365c6c1daeSBarry Smith } 7375c6c1daeSBarry Smith break; 7385c6c1daeSBarry Smith default: 7395c6c1daeSBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode); 7405c6c1daeSBarry Smith } 7415c6c1daeSBarry Smith if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname); 7425c6c1daeSBarry Smith } 7435c6c1daeSBarry Smith } 7445c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 7455c6c1daeSBarry Smith PetscLogObjectState((PetscObject)viewer,"File: %s",name); 7465c6c1daeSBarry Smith #endif 7475c6c1daeSBarry Smith PetscFunctionReturn(0); 7485c6c1daeSBarry Smith } 7495c6c1daeSBarry Smith EXTERN_C_END 7505c6c1daeSBarry Smith 7515c6c1daeSBarry Smith #undef __FUNCT__ 7525c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_ASCII" 7535c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer) 7545c6c1daeSBarry Smith { 7555c6c1daeSBarry Smith PetscMPIInt rank; 7565c6c1daeSBarry Smith PetscErrorCode ierr; 7575c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data,*ovascii; 7585c6c1daeSBarry Smith const char *name; 7595c6c1daeSBarry Smith 7605c6c1daeSBarry Smith PetscFunctionBegin; 7615c6c1daeSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton already obtained from PetscViewer and not restored"); 7625c6c1daeSBarry Smith ierr = PetscViewerCreate(PETSC_COMM_SELF,outviewer);CHKERRQ(ierr); 7635c6c1daeSBarry Smith ierr = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr); 7645c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 7655c6c1daeSBarry Smith ovascii->fd = vascii->fd; 7665c6c1daeSBarry Smith ovascii->tab = vascii->tab; 7675c6c1daeSBarry Smith 7685c6c1daeSBarry Smith vascii->sviewer = *outviewer; 7695c6c1daeSBarry Smith 7705c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 7715c6c1daeSBarry Smith (*outviewer)->iformat = viewer->iformat; 7725c6c1daeSBarry Smith 7735c6c1daeSBarry Smith ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr); 7745c6c1daeSBarry Smith ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr); 7755c6c1daeSBarry Smith 7765c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr); 7775c6c1daeSBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer; 7785c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Singleton; 7795c6c1daeSBarry Smith if (rank) { 7805c6c1daeSBarry Smith (*outviewer)->ops->flush = 0; 7815c6c1daeSBarry Smith } else { 7825c6c1daeSBarry Smith (*outviewer)->ops->flush = PetscViewerFlush_ASCII_Singleton_0; 7835c6c1daeSBarry Smith } 7845c6c1daeSBarry Smith PetscFunctionReturn(0); 7855c6c1daeSBarry Smith } 7865c6c1daeSBarry Smith 7875c6c1daeSBarry Smith #undef __FUNCT__ 7885c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_ASCII" 7895c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer) 7905c6c1daeSBarry Smith { 7915c6c1daeSBarry Smith PetscErrorCode ierr; 7925c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)(*outviewer)->data; 7935c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 7945c6c1daeSBarry Smith 7955c6c1daeSBarry Smith PetscFunctionBegin; 7965c6c1daeSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton never obtained from PetscViewer"); 7975c6c1daeSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate singleton"); 7985c6c1daeSBarry Smith 7995c6c1daeSBarry Smith ascii->sviewer = 0; 8005c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 8015c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 8025c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 8035c6c1daeSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8045c6c1daeSBarry Smith PetscFunctionReturn(0); 8055c6c1daeSBarry Smith } 8065c6c1daeSBarry Smith 8075c6c1daeSBarry Smith #undef __FUNCT__ 8085c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm_ASCII" 8095c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 8105c6c1daeSBarry Smith { 8115c6c1daeSBarry Smith PetscErrorCode ierr; 8125c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data,*ovascii; 8135c6c1daeSBarry Smith const char *name; 8145c6c1daeSBarry Smith 8155c6c1daeSBarry Smith PetscFunctionBegin; 8165c6c1daeSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm viewer already obtained from PetscViewer and not restored"); 8175c6c1daeSBarry Smith /* Note that we need to open vascii->filename for the subcomm: 8185c6c1daeSBarry Smith we can't count on reusing viewer's fd since the root in comm and subcomm may differ. 8195c6c1daeSBarry Smith Further, if the subcomm happens to be the same as comm, PetscViewerASCIIOpen() will 8205c6c1daeSBarry Smith will return the current viewer, having increfed it. 8215c6c1daeSBarry Smith */ 8225c6c1daeSBarry Smith ierr = PetscViewerASCIIOpen(subcomm,vascii->filename, outviewer);CHKERRQ(ierr); 8235c6c1daeSBarry Smith if (*outviewer == viewer) PetscFunctionReturn(0); 8245c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 8255c6c1daeSBarry Smith 8265c6c1daeSBarry Smith ovascii->tab = vascii->tab; 8275c6c1daeSBarry Smith vascii->sviewer = *outviewer; 8285c6c1daeSBarry Smith 8295c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 8305c6c1daeSBarry Smith (*outviewer)->iformat = viewer->iformat; 8315c6c1daeSBarry Smith 8325c6c1daeSBarry Smith ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr); 8335c6c1daeSBarry Smith ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr); 8345c6c1daeSBarry Smith 8355c6c1daeSBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer; 8365c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Subcomm; 8375c6c1daeSBarry Smith PetscFunctionReturn(0); 8385c6c1daeSBarry Smith } 8395c6c1daeSBarry Smith 8405c6c1daeSBarry Smith #undef __FUNCT__ 8415c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm_ASCII" 8425c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 8435c6c1daeSBarry Smith { 8445c6c1daeSBarry Smith PetscErrorCode ierr; 8455c6c1daeSBarry Smith PetscViewer_ASCII *oascii = (PetscViewer_ASCII *)(*outviewer)->data; 8465c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)viewer->data; 8475c6c1daeSBarry Smith 8485c6c1daeSBarry Smith PetscFunctionBegin; 8495c6c1daeSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm never obtained from PetscViewer"); 8505c6c1daeSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"The given PetscViewer did not generate this subcomm viewer"); 8515c6c1daeSBarry Smith 8525c6c1daeSBarry Smith ascii->sviewer = 0; 8535c6c1daeSBarry Smith oascii->fd = PETSC_STDOUT; 8545c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 8555c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 8565c6c1daeSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8575c6c1daeSBarry Smith PetscFunctionReturn(0); 8585c6c1daeSBarry Smith } 8595c6c1daeSBarry Smith 860*2bf49c77SBarry Smith #undef __FUNCT__ 861*2bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII" 862*2bf49c77SBarry Smith PetscErrorCode PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer) 863*2bf49c77SBarry Smith { 864*2bf49c77SBarry Smith PetscErrorCode ierr; 865*2bf49c77SBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII *)v->data; 866*2bf49c77SBarry Smith 867*2bf49c77SBarry Smith PetscFunctionBegin; 868*2bf49c77SBarry Smith if (ascii->filename) { 869*2bf49c77SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr); 870*2bf49c77SBarry Smith } 871*2bf49c77SBarry Smith PetscFunctionReturn(0); 872*2bf49c77SBarry Smith } 873*2bf49c77SBarry Smith 8745c6c1daeSBarry Smith EXTERN_C_BEGIN 8755c6c1daeSBarry Smith #undef __FUNCT__ 8765c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII" 8775c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer) 8785c6c1daeSBarry Smith { 8795c6c1daeSBarry Smith PetscViewer_ASCII *vascii; 8805c6c1daeSBarry Smith PetscErrorCode ierr; 8815c6c1daeSBarry Smith 8825c6c1daeSBarry Smith PetscFunctionBegin; 8835c6c1daeSBarry Smith ierr = PetscNewLog(viewer,PetscViewer_ASCII,&vascii);CHKERRQ(ierr); 8845c6c1daeSBarry Smith viewer->data = (void*)vascii; 8855c6c1daeSBarry Smith 8865c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_ASCII; 8875c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_ASCII; 8885c6c1daeSBarry Smith viewer->ops->getsingleton = PetscViewerGetSingleton_ASCII; 8895c6c1daeSBarry Smith viewer->ops->restoresingleton = PetscViewerRestoreSingleton_ASCII; 8905c6c1daeSBarry Smith viewer->ops->getsubcomm = PetscViewerGetSubcomm_ASCII; 8915c6c1daeSBarry Smith viewer->ops->restoresubcomm = PetscViewerRestoreSubcomm_ASCII; 892*2bf49c77SBarry Smith viewer->ops->view = PetscViewerView_ASCII; 8935c6c1daeSBarry Smith 8945c6c1daeSBarry Smith /* defaults to stdout unless set with PetscViewerFileSetName() */ 8955c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 8965c6c1daeSBarry Smith vascii->mode = FILE_MODE_WRITE; 8975c6c1daeSBarry Smith vascii->bviewer = 0; 8985c6c1daeSBarry Smith vascii->sviewer = 0; 8995c6c1daeSBarry Smith viewer->format = PETSC_VIEWER_DEFAULT; 9005c6c1daeSBarry Smith viewer->iformat = 0; 9015c6c1daeSBarry Smith vascii->tab = 0; 9025c6c1daeSBarry Smith vascii->tab_store = 0; 9035c6c1daeSBarry Smith vascii->filename = 0; 9045c6c1daeSBarry Smith vascii->closefile = PETSC_TRUE; 9055c6c1daeSBarry Smith 9065c6c1daeSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileSetName_C","PetscViewerFileSetName_ASCII", 9075c6c1daeSBarry Smith PetscViewerFileSetName_ASCII);CHKERRQ(ierr); 9085c6c1daeSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileGetName_C","PetscViewerFileGetName_ASCII", 9095c6c1daeSBarry Smith PetscViewerFileGetName_ASCII);CHKERRQ(ierr); 9105c6c1daeSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileGetMode_C","PetscViewerFileGetMode_ASCII", 9115c6c1daeSBarry Smith PetscViewerFileGetMode_ASCII);CHKERRQ(ierr); 9125c6c1daeSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)viewer,"PetscViewerFileSetMode_C","PetscViewerFileSetMode_ASCII", 9135c6c1daeSBarry Smith PetscViewerFileSetMode_ASCII);CHKERRQ(ierr); 9145c6c1daeSBarry Smith 9155c6c1daeSBarry Smith PetscFunctionReturn(0); 9165c6c1daeSBarry Smith } 9175c6c1daeSBarry Smith EXTERN_C_END 9185c6c1daeSBarry Smith 9195c6c1daeSBarry Smith 9205c6c1daeSBarry Smith #undef __FUNCT__ 9215c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedPrintf" 9225c6c1daeSBarry Smith /*@C 9235c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from 9245c6c1daeSBarry Smith several processors. Output of the first processor is followed by that of the 9255c6c1daeSBarry Smith second, etc. 9265c6c1daeSBarry Smith 9275c6c1daeSBarry Smith Not Collective, must call collective PetscViewerFlush() to get the results out 9285c6c1daeSBarry Smith 9295c6c1daeSBarry Smith Input Parameters: 9305c6c1daeSBarry Smith + viewer - the ASCII PetscViewer 9315c6c1daeSBarry Smith - format - the usual printf() format string 9325c6c1daeSBarry Smith 9335c6c1daeSBarry Smith Level: intermediate 9345c6c1daeSBarry Smith 9355c6c1daeSBarry Smith Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called. 9365c6c1daeSBarry Smith 9375c6c1daeSBarry Smith Fortran Note: 9385c6c1daeSBarry Smith Can only print a single character* string 9395c6c1daeSBarry Smith 9405c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(), 9415c6c1daeSBarry Smith PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(), 9425c6c1daeSBarry Smith PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedAllow() 9435c6c1daeSBarry Smith 9445c6c1daeSBarry Smith @*/ 9455c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...) 9465c6c1daeSBarry Smith { 9475c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII *)viewer->data; 9485c6c1daeSBarry Smith PetscErrorCode ierr; 9495c6c1daeSBarry Smith PetscMPIInt rank,size; 9505c6c1daeSBarry Smith PetscInt tab = vascii->tab; 9515c6c1daeSBarry Smith MPI_Comm comm; 9525c6c1daeSBarry Smith FILE *fp; 9535c6c1daeSBarry Smith PetscBool iascii; 9545c6c1daeSBarry Smith int err; 9555c6c1daeSBarry Smith 9565c6c1daeSBarry Smith PetscFunctionBegin; 9575c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 9585c6c1daeSBarry Smith PetscValidCharPointer(format,2); 9595c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9605c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 9615c6c1daeSBarry Smith ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr); 9625c6c1daeSBarry Smith if (size > 1 && !vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIISynchronizedAllow() to allow this call"); 9635c6c1daeSBarry Smith if (!viewer->ops->flush) PetscFunctionReturn(0); /* This viewer obtained via PetscViewerGetSubcomm_ASCII(), should not participate. */ 9645c6c1daeSBarry Smith 9655c6c1daeSBarry Smith comm = ((PetscObject)viewer)->comm; 9665c6c1daeSBarry Smith fp = vascii->fd; 9675c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 9685c6c1daeSBarry Smith 9695c6c1daeSBarry Smith /* First processor prints immediately to fp */ 9705c6c1daeSBarry Smith if (!rank) { 9715c6c1daeSBarry Smith va_list Argp; 9725c6c1daeSBarry Smith 9735c6c1daeSBarry Smith while (tab--) {ierr = PetscFPrintf(PETSC_COMM_SELF,fp," ");CHKERRQ(ierr);} 9745c6c1daeSBarry Smith 9755c6c1daeSBarry Smith va_start(Argp,format); 9765c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr); 9775c6c1daeSBarry Smith err = fflush(fp); 9785c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9795c6c1daeSBarry Smith petsc_printfqueuefile = fp; 9805c6c1daeSBarry Smith if (petsc_history) { 9815c6c1daeSBarry Smith va_start(Argp,format); 9825c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 9835c6c1daeSBarry Smith err = fflush(petsc_history); 9845c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9855c6c1daeSBarry Smith } 9865c6c1daeSBarry Smith va_end(Argp); 9875c6c1daeSBarry Smith } else { /* other processors add to local queue */ 9885c6c1daeSBarry Smith char *string; 9895c6c1daeSBarry Smith va_list Argp; 9905c6c1daeSBarry Smith size_t fullLength; 9915c6c1daeSBarry Smith PrintfQueue next; 9925c6c1daeSBarry Smith 9935c6c1daeSBarry Smith ierr = PetscNew(struct _PrintfQueue,&next);CHKERRQ(ierr); 9945c6c1daeSBarry Smith if (petsc_printfqueue) {petsc_printfqueue->next = next; petsc_printfqueue = next;} 9955c6c1daeSBarry Smith else {petsc_printfqueuebase = petsc_printfqueue = next;} 9965c6c1daeSBarry Smith petsc_printfqueuelength++; 9975c6c1daeSBarry Smith next->size = QUEUESTRINGSIZE; 9985c6c1daeSBarry Smith ierr = PetscMalloc(next->size*sizeof(char), &next->string);CHKERRQ(ierr); 9995c6c1daeSBarry Smith ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr); 10005c6c1daeSBarry Smith string = next->string; 10015c6c1daeSBarry Smith tab *= 2; 10025c6c1daeSBarry Smith while (tab--) {*string++ = ' ';} 10035c6c1daeSBarry Smith va_start(Argp,format); 10045c6c1daeSBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp); 10055c6c1daeSBarry Smith va_end(Argp); 10065c6c1daeSBarry Smith } 10075c6c1daeSBarry Smith PetscFunctionReturn(0); 10085c6c1daeSBarry Smith } 10095c6c1daeSBarry Smith 10105c6c1daeSBarry Smith 1011