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) { 63ce94432eSBarry Smith ierr = MPI_Attr_put(PetscObjectComm((PetscObject)viewer),Petsc_Viewer_keyval,vlink->next);CHKERRQ(ierr); 645c6c1daeSBarry Smith ierr = PetscFree(vlink);CHKERRQ(ierr); 655c6c1daeSBarry Smith } else { 665c6c1daeSBarry Smith while (vlink && vlink->next) { 675c6c1daeSBarry Smith if (vlink->next->viewer == viewer) { 685c6c1daeSBarry Smith PetscViewerLink *nv = vlink->next; 695c6c1daeSBarry Smith vlink->next = vlink->next->next; 705c6c1daeSBarry Smith ierr = PetscFree(nv);CHKERRQ(ierr); 715c6c1daeSBarry Smith } 725c6c1daeSBarry Smith vlink = vlink->next; 735c6c1daeSBarry Smith } 745c6c1daeSBarry Smith } 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith PetscFunctionReturn(0); 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith 795c6c1daeSBarry Smith #undef __FUNCT__ 805c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Singleton" 815c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Singleton(PetscViewer viewer) 825c6c1daeSBarry Smith { 835c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 845c6c1daeSBarry Smith PetscErrorCode ierr; 855fd66863SKarl Rupp 865c6c1daeSBarry Smith PetscFunctionBegin; 875c6c1daeSBarry Smith ierr = PetscViewerRestoreSingleton(vascii->bviewer,&viewer);CHKERRQ(ierr); 88dd2fa690SBarry Smith vascii->bviewer = NULL; 895c6c1daeSBarry Smith PetscFunctionReturn(0); 905c6c1daeSBarry Smith } 915c6c1daeSBarry Smith 925c6c1daeSBarry Smith #undef __FUNCT__ 935c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_ASCII_Subcomm" 945c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_ASCII_Subcomm(PetscViewer viewer) 955c6c1daeSBarry Smith { 965c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 975c6c1daeSBarry Smith PetscErrorCode ierr; 985fd66863SKarl Rupp 995c6c1daeSBarry Smith PetscFunctionBegin; 100dd2fa690SBarry Smith ierr = PetscViewerRestoreSubcomm(vascii->subviewer,PetscObjectComm((PetscObject)viewer),&viewer);CHKERRQ(ierr); 101dd2fa690SBarry Smith vascii->subviewer = NULL; 1025c6c1daeSBarry Smith PetscFunctionReturn(0); 1035c6c1daeSBarry Smith } 1045c6c1daeSBarry Smith 1055c6c1daeSBarry Smith #undef __FUNCT__ 1065c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII_Singleton_0" 1075c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII_Singleton_0(PetscViewer viewer) 1085c6c1daeSBarry Smith { 1095c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 1105c6c1daeSBarry Smith int err; 1115c6c1daeSBarry Smith 1125c6c1daeSBarry Smith PetscFunctionBegin; 1135c6c1daeSBarry Smith err = fflush(vascii->fd); 1145c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 1155c6c1daeSBarry Smith PetscFunctionReturn(0); 1165c6c1daeSBarry Smith } 1175c6c1daeSBarry Smith 1185c6c1daeSBarry Smith #undef __FUNCT__ 1195c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_ASCII" 1205c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_ASCII(PetscViewer viewer) 1215c6c1daeSBarry Smith { 1225c6c1daeSBarry Smith PetscMPIInt rank; 1235c6c1daeSBarry Smith PetscErrorCode ierr; 1245c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 1255c6c1daeSBarry Smith int err; 1265c6c1daeSBarry Smith 1275c6c1daeSBarry Smith PetscFunctionBegin; 128ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 1295c6c1daeSBarry Smith /* fflush() fails on OSX for read-only descriptors */ 1305c6c1daeSBarry Smith if (!rank && (vascii->mode != FILE_MODE_READ)) { 1315c6c1daeSBarry Smith err = fflush(vascii->fd); 1325c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() call failed"); 1335c6c1daeSBarry Smith } 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith if (vascii->allowsynchronized) { 1365c6c1daeSBarry Smith /* Also flush anything printed with PetscViewerASCIISynchronizedPrintf() */ 1370ec8b6e3SBarry Smith ierr = PetscSynchronizedFlush(PetscObjectComm((PetscObject)viewer),vascii->fd);CHKERRQ(ierr); 1385c6c1daeSBarry Smith } 1395c6c1daeSBarry Smith PetscFunctionReturn(0); 1405c6c1daeSBarry Smith } 1415c6c1daeSBarry Smith 1425c6c1daeSBarry Smith #undef __FUNCT__ 1435c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetPointer" 1445c6c1daeSBarry Smith /*@C 1455c6c1daeSBarry Smith PetscViewerASCIIGetPointer - Extracts the file pointer from an ASCII PetscViewer. 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith Not Collective 1485c6c1daeSBarry Smith 1495c6c1daeSBarry Smith + viewer - PetscViewer context, obtained from PetscViewerASCIIOpen() 1505c6c1daeSBarry Smith - fd - file pointer 1515c6c1daeSBarry Smith 1525c6c1daeSBarry Smith Level: intermediate 1535c6c1daeSBarry Smith 1545c6c1daeSBarry Smith Fortran Note: 1555c6c1daeSBarry Smith This routine is not supported in Fortran. 1565c6c1daeSBarry Smith 1575c6c1daeSBarry Smith Concepts: PetscViewer^file pointer 1585c6c1daeSBarry Smith Concepts: file pointer^getting from PetscViewer 1595c6c1daeSBarry Smith 1605c6c1daeSBarry Smith .seealso: PetscViewerASCIIOpen(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerCreate(), PetscViewerASCIIPrintf(), 1615c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf(), PetscViewerFlush() 1625c6c1daeSBarry Smith @*/ 1635c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetPointer(PetscViewer viewer,FILE **fd) 1645c6c1daeSBarry Smith { 1655c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 1665c6c1daeSBarry Smith 1675c6c1daeSBarry Smith PetscFunctionBegin; 1685c6c1daeSBarry Smith *fd = vascii->fd; 1695c6c1daeSBarry Smith PetscFunctionReturn(0); 1705c6c1daeSBarry Smith } 1715c6c1daeSBarry Smith 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 1835c6c1daeSBarry Smith #undef __FUNCT__ 1845c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetMode_ASCII" 1855c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetMode_ASCII(PetscViewer viewer, PetscFileMode mode) 1865c6c1daeSBarry Smith { 1875c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 1885c6c1daeSBarry Smith 1895c6c1daeSBarry Smith PetscFunctionBegin; 1905c6c1daeSBarry Smith vascii->mode = mode; 1915c6c1daeSBarry Smith PetscFunctionReturn(0); 1925c6c1daeSBarry Smith } 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith /* 1955c6c1daeSBarry Smith If petsc_history is on, then all Petsc*Printf() results are saved 1965c6c1daeSBarry Smith if the appropriate (usually .petschistory) file. 1975c6c1daeSBarry Smith */ 1985c6c1daeSBarry Smith extern FILE *petsc_history; 1995c6c1daeSBarry Smith 2005c6c1daeSBarry Smith #undef __FUNCT__ 2015c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetTab" 2025c6c1daeSBarry Smith /*@ 2035c6c1daeSBarry Smith PetscViewerASCIISetTab - Causes PetscViewer to tab in a number of times 2045c6c1daeSBarry Smith 2055c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 2065c6c1daeSBarry Smith 2075c6c1daeSBarry Smith Input Parameters: 2085c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 2095c6c1daeSBarry Smith - tabs - number of tabs 2105c6c1daeSBarry Smith 2115c6c1daeSBarry Smith Level: developer 2125c6c1daeSBarry Smith 2135c6c1daeSBarry Smith Fortran Note: 2145c6c1daeSBarry Smith This routine is not supported in Fortran. 2155c6c1daeSBarry Smith 2165c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2175c6c1daeSBarry Smith Concepts: tab^setting 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIIGetTab(), 2205c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2215c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2225c6c1daeSBarry Smith @*/ 2235c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISetTab(PetscViewer viewer,PetscInt tabs) 2245c6c1daeSBarry Smith { 2255c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2265c6c1daeSBarry Smith PetscBool iascii; 2275c6c1daeSBarry Smith PetscErrorCode ierr; 2285c6c1daeSBarry Smith 2295c6c1daeSBarry Smith PetscFunctionBegin; 2305c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2315c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 232a297a907SKarl Rupp if (iascii) ascii->tab = tabs; 2335c6c1daeSBarry Smith PetscFunctionReturn(0); 2345c6c1daeSBarry Smith } 2355c6c1daeSBarry Smith 2365c6c1daeSBarry Smith #undef __FUNCT__ 2375c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetTab" 2385c6c1daeSBarry Smith /*@ 2395c6c1daeSBarry Smith PetscViewerASCIIGetTab - Return the number of tabs used by PetscViewer. 2405c6c1daeSBarry Smith 2415c6c1daeSBarry Smith Not Collective, meaningful on first processor only. 2425c6c1daeSBarry Smith 2435c6c1daeSBarry Smith Input Parameters: 2445c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 2455c6c1daeSBarry Smith Output Parameters: 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^retrieval 2555c6c1daeSBarry Smith 2565c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), PetscViewerASCIISetTab(), 2575c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2585c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2595c6c1daeSBarry Smith @*/ 2605c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetTab(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 && tabs) *tabs = ascii->tab; 2705c6c1daeSBarry Smith PetscFunctionReturn(0); 2715c6c1daeSBarry Smith } 2725c6c1daeSBarry Smith 2735c6c1daeSBarry Smith #undef __FUNCT__ 2745c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIAddTab" 2755c6c1daeSBarry Smith /*@ 2765c6c1daeSBarry Smith PetscViewerASCIIAddTab - Add to the number of times an ASCII viewer tabs before printing 2775c6c1daeSBarry Smith 2785c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 2795c6c1daeSBarry Smith 2805c6c1daeSBarry Smith Input Parameters: 2815c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 2825c6c1daeSBarry Smith - tabs - number of tabs 2835c6c1daeSBarry Smith 2845c6c1daeSBarry Smith Level: developer 2855c6c1daeSBarry Smith 2865c6c1daeSBarry Smith Fortran Note: 2875c6c1daeSBarry Smith This routine is not supported in Fortran. 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 2905c6c1daeSBarry Smith Concepts: tab^setting 2915c6c1daeSBarry Smith 2925c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 2935c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 2945c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 2955c6c1daeSBarry Smith @*/ 2965c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIAddTab(PetscViewer viewer,PetscInt tabs) 2975c6c1daeSBarry Smith { 2985c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 2995c6c1daeSBarry Smith PetscBool iascii; 3005c6c1daeSBarry Smith PetscErrorCode ierr; 3015c6c1daeSBarry Smith 3025c6c1daeSBarry Smith PetscFunctionBegin; 3035c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3045c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 305a297a907SKarl Rupp if (iascii) ascii->tab += tabs; 3065c6c1daeSBarry Smith PetscFunctionReturn(0); 3075c6c1daeSBarry Smith } 3085c6c1daeSBarry Smith 3095c6c1daeSBarry Smith #undef __FUNCT__ 3105c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISubtractTab" 3115c6c1daeSBarry Smith /*@ 3125c6c1daeSBarry Smith PetscViewerASCIISubtractTab - Subtracts from the number of times an ASCII viewer tabs before printing 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3155c6c1daeSBarry Smith 3165c6c1daeSBarry Smith Input Parameters: 3175c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3185c6c1daeSBarry Smith - tabs - number of tabs 3195c6c1daeSBarry Smith 3205c6c1daeSBarry Smith Level: developer 3215c6c1daeSBarry Smith 3225c6c1daeSBarry Smith Fortran Note: 3235c6c1daeSBarry Smith This routine is not supported in Fortran. 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3265c6c1daeSBarry Smith Concepts: tab^setting 3275c6c1daeSBarry Smith 3285c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3295c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3305c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIIPushTab() 3315c6c1daeSBarry Smith @*/ 3325c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISubtractTab(PetscViewer viewer,PetscInt tabs) 3335c6c1daeSBarry Smith { 3345c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3355c6c1daeSBarry Smith PetscBool iascii; 3365c6c1daeSBarry Smith PetscErrorCode ierr; 3375c6c1daeSBarry Smith 3385c6c1daeSBarry Smith PetscFunctionBegin; 3395c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3405c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 341a297a907SKarl Rupp if (iascii) ascii->tab -= tabs; 3425c6c1daeSBarry Smith PetscFunctionReturn(0); 3435c6c1daeSBarry Smith } 3445c6c1daeSBarry Smith 3455c6c1daeSBarry Smith #undef __FUNCT__ 3465c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedAllow" 3475c6c1daeSBarry Smith /*@C 3485c6c1daeSBarry Smith PetscViewerASCIISynchronizedAllow - Allows calls to PetscViewerASCIISynchronizedPrintf() for this viewer 3495c6c1daeSBarry Smith 3505c6c1daeSBarry Smith Collective on PetscViewer 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith Input Parameters: 3535c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 3545c6c1daeSBarry Smith - allow - PETSC_TRUE to allow the synchronized printing 3555c6c1daeSBarry Smith 3565c6c1daeSBarry Smith Level: intermediate 3575c6c1daeSBarry Smith 3585c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3595c6c1daeSBarry Smith Concepts: tab^setting 3605c6c1daeSBarry Smith 3615c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3625c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3635c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 3645c6c1daeSBarry Smith @*/ 3655c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedAllow(PetscViewer viewer,PetscBool allow) 3665c6c1daeSBarry Smith { 3675c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 3685c6c1daeSBarry Smith PetscBool iascii; 3695c6c1daeSBarry Smith PetscErrorCode ierr; 3705c6c1daeSBarry Smith 3715c6c1daeSBarry Smith PetscFunctionBegin; 3725c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 3735c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 374a297a907SKarl Rupp if (iascii) ascii->allowsynchronized = allow; 3755c6c1daeSBarry Smith PetscFunctionReturn(0); 3765c6c1daeSBarry Smith } 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith #undef __FUNCT__ 3795c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPushTab" 3805c6c1daeSBarry Smith /*@ 3815c6c1daeSBarry Smith PetscViewerASCIIPushTab - Adds one more tab to the amount that PetscViewerASCIIPrintf() 3825c6c1daeSBarry Smith lines are tabbed. 3835c6c1daeSBarry Smith 3845c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 3855c6c1daeSBarry Smith 3865c6c1daeSBarry Smith Input Parameters: 3875c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 3885c6c1daeSBarry Smith 3895c6c1daeSBarry Smith Level: developer 3905c6c1daeSBarry Smith 3915c6c1daeSBarry Smith Fortran Note: 3925c6c1daeSBarry Smith This routine is not supported in Fortran. 3935c6c1daeSBarry Smith 3945c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 3955c6c1daeSBarry Smith Concepts: tab^setting 3965c6c1daeSBarry Smith 3975c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 3985c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 3995c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4005c6c1daeSBarry Smith @*/ 4015c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPushTab(PetscViewer viewer) 4025c6c1daeSBarry Smith { 4035c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4045c6c1daeSBarry Smith PetscBool iascii; 4055c6c1daeSBarry Smith PetscErrorCode ierr; 4065c6c1daeSBarry Smith 4075c6c1daeSBarry Smith PetscFunctionBegin; 4085c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4095c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 410a297a907SKarl Rupp if (iascii) ascii->tab++; 4115c6c1daeSBarry Smith PetscFunctionReturn(0); 4125c6c1daeSBarry Smith } 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith #undef __FUNCT__ 4155c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPopTab" 4165c6c1daeSBarry Smith /*@ 4175c6c1daeSBarry Smith PetscViewerASCIIPopTab - Removes one tab from the amount that PetscViewerASCIIPrintf() 4185c6c1daeSBarry Smith lines are tabbed. 4195c6c1daeSBarry Smith 4205c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4215c6c1daeSBarry Smith 4225c6c1daeSBarry Smith Input Parameters: 4235c6c1daeSBarry Smith . viewer - optained with PetscViewerASCIIOpen() 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Level: developer 4265c6c1daeSBarry Smith 4275c6c1daeSBarry Smith Fortran Note: 4285c6c1daeSBarry Smith This routine is not supported in Fortran. 4295c6c1daeSBarry Smith 4305c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4315c6c1daeSBarry Smith Concepts: tab^setting 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4345c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIOpen(), 4355c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4365c6c1daeSBarry Smith @*/ 4375c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPopTab(PetscViewer viewer) 4385c6c1daeSBarry Smith { 4395c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4405c6c1daeSBarry Smith PetscErrorCode ierr; 4415c6c1daeSBarry Smith PetscBool iascii; 4425c6c1daeSBarry Smith 4435c6c1daeSBarry Smith PetscFunctionBegin; 4445c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4455c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4465c6c1daeSBarry Smith if (iascii) { 4475c6c1daeSBarry Smith if (ascii->tab <= 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"More tabs popped than pushed"); 4485c6c1daeSBarry Smith ascii->tab--; 4495c6c1daeSBarry Smith } 4505c6c1daeSBarry Smith PetscFunctionReturn(0); 4515c6c1daeSBarry Smith } 4525c6c1daeSBarry Smith 4535c6c1daeSBarry Smith #undef __FUNCT__ 4545c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIUseTabs" 4555c6c1daeSBarry Smith /*@ 4565c6c1daeSBarry Smith PetscViewerASCIIUseTabs - Turns on or off the use of tabs with the ASCII PetscViewer 4575c6c1daeSBarry Smith 4585c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 4595c6c1daeSBarry Smith 4605c6c1daeSBarry Smith Input Parameters: 4615c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 4625c6c1daeSBarry Smith - flg - PETSC_TRUE or PETSC_FALSE 4635c6c1daeSBarry Smith 4645c6c1daeSBarry Smith Level: developer 4655c6c1daeSBarry Smith 4665c6c1daeSBarry Smith Fortran Note: 4675c6c1daeSBarry Smith This routine is not supported in Fortran. 4685c6c1daeSBarry Smith 4695c6c1daeSBarry Smith Concepts: PetscViewerASCII^formating 4705c6c1daeSBarry Smith Concepts: tab^setting 4715c6c1daeSBarry Smith 4725c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIPrintf(), 4735c6c1daeSBarry Smith PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), PetscViewerASCIIPushTab(), PetscViewerASCIIOpen(), 4745c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer() 4755c6c1daeSBarry Smith @*/ 4765c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIUseTabs(PetscViewer viewer,PetscBool flg) 4775c6c1daeSBarry Smith { 4785c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 4795c6c1daeSBarry Smith PetscBool iascii; 4805c6c1daeSBarry Smith PetscErrorCode ierr; 4815c6c1daeSBarry Smith 4825c6c1daeSBarry Smith PetscFunctionBegin; 4835c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 4845c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 4855c6c1daeSBarry Smith if (iascii) { 486a297a907SKarl Rupp if (flg) ascii->tab = ascii->tab_store; 487a297a907SKarl Rupp else { 4885c6c1daeSBarry Smith ascii->tab_store = ascii->tab; 4895c6c1daeSBarry Smith ascii->tab = 0; 4905c6c1daeSBarry Smith } 4915c6c1daeSBarry Smith } 4925c6c1daeSBarry Smith PetscFunctionReturn(0); 4935c6c1daeSBarry Smith } 4945c6c1daeSBarry Smith 4955c6c1daeSBarry Smith /* ----------------------------------------------------------------------- */ 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith #include <../src/sys/fileio/mprint.h> /* defines the queue datastructures and variables */ 4985c6c1daeSBarry Smith 4995c6c1daeSBarry Smith #undef __FUNCT__ 5005c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIPrintf" 5015c6c1daeSBarry Smith /*@C 5025c6c1daeSBarry Smith PetscViewerASCIIPrintf - Prints to a file, only from the first 5035c6c1daeSBarry Smith processor in the PetscViewer 5045c6c1daeSBarry Smith 5055c6c1daeSBarry Smith Not Collective, but only first processor in set has any effect 5065c6c1daeSBarry Smith 5075c6c1daeSBarry Smith Input Parameters: 5085c6c1daeSBarry Smith + viewer - optained with PetscViewerASCIIOpen() 5095c6c1daeSBarry Smith - format - the usual printf() format string 5105c6c1daeSBarry Smith 5115c6c1daeSBarry Smith Level: developer 5125c6c1daeSBarry Smith 5135c6c1daeSBarry Smith Fortran Note: 5145c6c1daeSBarry Smith The call sequence is PetscViewerASCIIPrintf(PetscViewer, character(*), int ierr) from Fortran. 5155c6c1daeSBarry Smith That is, you can only pass a single character string from Fortran. 5165c6c1daeSBarry Smith 5175c6c1daeSBarry Smith Concepts: PetscViewerASCII^printing 5185c6c1daeSBarry Smith Concepts: printing^to file 5195c6c1daeSBarry Smith Concepts: printf 5205c6c1daeSBarry Smith 5215c6c1daeSBarry Smith .seealso: PetscPrintf(), PetscSynchronizedPrintf(), PetscViewerASCIIOpen(), 5225c6c1daeSBarry Smith PetscViewerASCIIPushTab(), PetscViewerASCIIPopTab(), PetscViewerASCIISynchronizedPrintf(), 5235c6c1daeSBarry Smith PetscViewerCreate(), PetscViewerDestroy(), PetscViewerSetType(), PetscViewerASCIIGetPointer(), PetscViewerASCIISynchronizedAllow() 5245c6c1daeSBarry Smith @*/ 5255c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIPrintf(PetscViewer viewer,const char format[],...) 5265c6c1daeSBarry Smith { 5275c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 5285c6c1daeSBarry Smith PetscMPIInt rank; 529dd2fa690SBarry Smith PetscInt tab,intab = ascii->tab; 5305c6c1daeSBarry Smith PetscErrorCode ierr; 5315c6c1daeSBarry Smith FILE *fd = ascii->fd; 532dd2fa690SBarry Smith PetscBool iascii,issingleton = PETSC_FALSE; 5335c6c1daeSBarry Smith int err; 5345c6c1daeSBarry Smith 5355c6c1daeSBarry Smith PetscFunctionBegin; 5365c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 5375c6c1daeSBarry Smith PetscValidCharPointer(format,2); 5385c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 5395c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 540dd2fa690SBarry Smith if (ascii->bviewer) { 541dd2fa690SBarry Smith viewer = ascii->bviewer; 542dd2fa690SBarry Smith ascii = (PetscViewer_ASCII*)viewer->data; 543dd2fa690SBarry Smith fd = ascii->fd; 544dd2fa690SBarry Smith issingleton = PETSC_TRUE; 545dd2fa690SBarry Smith } 5465c6c1daeSBarry Smith 547ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 5485c6c1daeSBarry Smith if (!rank) { 5495c6c1daeSBarry Smith va_list Argp; 550dd2fa690SBarry Smith tab = intab; 551a297a907SKarl Rupp while (tab--) { 552a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fd," ");CHKERRQ(ierr); 553a297a907SKarl Rupp } 5545c6c1daeSBarry Smith 5555c6c1daeSBarry Smith va_start(Argp,format); 5565c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fd,format,Argp);CHKERRQ(ierr); 5575c6c1daeSBarry Smith err = fflush(fd); 5585c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 5595c6c1daeSBarry Smith if (petsc_history) { 5605c6c1daeSBarry Smith va_start(Argp,format); 561dd2fa690SBarry Smith tab = intab; 562a297a907SKarl Rupp while (tab--) { 563706d7a88SBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,petsc_history," ");CHKERRQ(ierr); 564a297a907SKarl Rupp } 5655c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 5665c6c1daeSBarry Smith err = fflush(petsc_history); 5675c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 5685c6c1daeSBarry Smith } 5695c6c1daeSBarry Smith va_end(Argp); 570dd2fa690SBarry Smith } else if (issingleton) { 571dd2fa690SBarry Smith char *string; 572dd2fa690SBarry Smith va_list Argp; 573dd2fa690SBarry Smith size_t fullLength; 574dd2fa690SBarry Smith PrintfQueue next; 575dd2fa690SBarry Smith 5761cfcd2c5SJed Brown ierr = PetscNew(&next);CHKERRQ(ierr); 577dd2fa690SBarry Smith if (petsc_printfqueue) { 578dd2fa690SBarry Smith petsc_printfqueue->next = next; 579dd2fa690SBarry Smith petsc_printfqueue = next; 580dd2fa690SBarry Smith } else { 581dd2fa690SBarry Smith petsc_printfqueuebase = petsc_printfqueue = next; 582dd2fa690SBarry Smith } 583dd2fa690SBarry Smith petsc_printfqueuelength++; 584dd2fa690SBarry Smith next->size = QUEUESTRINGSIZE; 585dd2fa690SBarry Smith ierr = PetscMalloc(next->size*sizeof(char), &next->string);CHKERRQ(ierr); 586dd2fa690SBarry Smith ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr); 587dd2fa690SBarry Smith string = next->string; 588dd2fa690SBarry Smith tab = intab; 589dd2fa690SBarry Smith tab *= 2; 590dd2fa690SBarry Smith while (tab--) { 591dd2fa690SBarry Smith *string++ = ' '; 592dd2fa690SBarry Smith } 593dd2fa690SBarry Smith va_start(Argp,format); 594dd2fa690SBarry Smith ierr = PetscVSNPrintf(string,next->size-2*ascii->tab,format,&fullLength,Argp);CHKERRQ(ierr); 595dd2fa690SBarry Smith va_end(Argp); 5965c6c1daeSBarry Smith } 5975c6c1daeSBarry Smith PetscFunctionReturn(0); 5985c6c1daeSBarry Smith } 5995c6c1daeSBarry Smith 6005c6c1daeSBarry Smith #undef __FUNCT__ 6015c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName" 6025c6c1daeSBarry Smith /*@C 6035c6c1daeSBarry Smith PetscViewerFileSetName - Sets the name of the file the PetscViewer uses. 6045c6c1daeSBarry Smith 6055c6c1daeSBarry Smith Collective on PetscViewer 6065c6c1daeSBarry Smith 6075c6c1daeSBarry Smith Input Parameters: 6085c6c1daeSBarry Smith + viewer - the PetscViewer; either ASCII or binary 6095c6c1daeSBarry Smith - name - the name of the file it should use 6105c6c1daeSBarry Smith 6115c6c1daeSBarry Smith Level: advanced 6125c6c1daeSBarry Smith 6135c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerDestroy(), 6145c6c1daeSBarry Smith PetscViewerASCIIGetPointer(), PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedPrintf() 6155c6c1daeSBarry Smith 6165c6c1daeSBarry Smith @*/ 6175c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName(PetscViewer viewer,const char name[]) 6185c6c1daeSBarry Smith { 6195c6c1daeSBarry Smith PetscErrorCode ierr; 6205c6c1daeSBarry Smith 6215c6c1daeSBarry Smith PetscFunctionBegin; 6225c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6235c6c1daeSBarry Smith PetscValidCharPointer(name,2); 6245c6c1daeSBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileSetName_C",(PetscViewer,const char[]),(viewer,name));CHKERRQ(ierr); 6255c6c1daeSBarry Smith PetscFunctionReturn(0); 6265c6c1daeSBarry Smith } 6275c6c1daeSBarry Smith 6285c6c1daeSBarry Smith #undef __FUNCT__ 6295c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName" 6305c6c1daeSBarry Smith /*@C 6315c6c1daeSBarry Smith PetscViewerFileGetName - Gets the name of the file the PetscViewer uses. 6325c6c1daeSBarry Smith 6335c6c1daeSBarry Smith Not Collective 6345c6c1daeSBarry Smith 6355c6c1daeSBarry Smith Input Parameter: 6365c6c1daeSBarry Smith . viewer - the PetscViewer; either ASCII or binary 6375c6c1daeSBarry Smith 6385c6c1daeSBarry Smith Output Parameter: 6395c6c1daeSBarry Smith . name - the name of the file it is using 6405c6c1daeSBarry Smith 6415c6c1daeSBarry Smith Level: advanced 6425c6c1daeSBarry Smith 6435c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerASCIIOpen(), PetscViewerBinaryOpen(), PetscViewerFileSetName() 6445c6c1daeSBarry Smith 6455c6c1daeSBarry Smith @*/ 6465c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName(PetscViewer viewer,const char **name) 6475c6c1daeSBarry Smith { 6485c6c1daeSBarry Smith PetscErrorCode ierr; 6495c6c1daeSBarry Smith 6505c6c1daeSBarry Smith PetscFunctionBegin; 6515c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 6525c6c1daeSBarry Smith ierr = PetscTryMethod(viewer,"PetscViewerFileGetName_C",(PetscViewer,const char**),(viewer,name));CHKERRQ(ierr); 6535c6c1daeSBarry Smith PetscFunctionReturn(0); 6545c6c1daeSBarry Smith } 6555c6c1daeSBarry Smith 6565c6c1daeSBarry Smith #undef __FUNCT__ 6575c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileGetName_ASCII" 6585c6c1daeSBarry Smith PetscErrorCode PetscViewerFileGetName_ASCII(PetscViewer viewer,const char **name) 6595c6c1daeSBarry Smith { 6605c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 6615c6c1daeSBarry Smith 6625c6c1daeSBarry Smith PetscFunctionBegin; 6635c6c1daeSBarry Smith *name = vascii->filename; 6645c6c1daeSBarry Smith PetscFunctionReturn(0); 6655c6c1daeSBarry Smith } 6665c6c1daeSBarry Smith 6675c6c1daeSBarry Smith #undef __FUNCT__ 6685c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFileSetName_ASCII" 6695c6c1daeSBarry Smith PetscErrorCode PetscViewerFileSetName_ASCII(PetscViewer viewer,const char name[]) 6705c6c1daeSBarry Smith { 6715c6c1daeSBarry Smith PetscErrorCode ierr; 6725c6c1daeSBarry Smith size_t len; 6735c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN],*gz; 6745c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 6755c6c1daeSBarry Smith PetscBool isstderr,isstdout; 6765c6c1daeSBarry Smith PetscMPIInt rank; 6775c6c1daeSBarry Smith 6785c6c1daeSBarry Smith PetscFunctionBegin; 6795c6c1daeSBarry Smith ierr = PetscViewerFileClose_ASCII(viewer);CHKERRQ(ierr); 6805c6c1daeSBarry Smith if (!name) PetscFunctionReturn(0); 6815c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&vascii->filename);CHKERRQ(ierr); 6825c6c1daeSBarry Smith 6835c6c1daeSBarry Smith /* Is this file to be compressed */ 6845c6c1daeSBarry Smith vascii->storecompressed = PETSC_FALSE; 685a297a907SKarl Rupp 6865c6c1daeSBarry Smith ierr = PetscStrstr(vascii->filename,".gz",&gz);CHKERRQ(ierr); 6875c6c1daeSBarry Smith if (gz) { 6885c6c1daeSBarry Smith ierr = PetscStrlen(gz,&len);CHKERRQ(ierr); 6895c6c1daeSBarry Smith if (len == 3) { 6905c6c1daeSBarry Smith *gz = 0; 6915c6c1daeSBarry Smith vascii->storecompressed = PETSC_TRUE; 6925c6c1daeSBarry Smith } 6935c6c1daeSBarry Smith } 694ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 6955c6c1daeSBarry Smith if (!rank) { 6965c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stderr",&isstderr);CHKERRQ(ierr); 6975c6c1daeSBarry Smith ierr = PetscStrcmp(name,"stdout",&isstdout);CHKERRQ(ierr); 6985c6c1daeSBarry Smith /* empty filename means stdout */ 6995c6c1daeSBarry Smith if (name[0] == 0) isstdout = PETSC_TRUE; 7005c6c1daeSBarry Smith if (isstderr) vascii->fd = PETSC_STDERR; 7015c6c1daeSBarry Smith else if (isstdout) vascii->fd = PETSC_STDOUT; 7025c6c1daeSBarry Smith else { 7035c6c1daeSBarry Smith 7045c6c1daeSBarry Smith 7055c6c1daeSBarry Smith ierr = PetscFixFilename(name,fname);CHKERRQ(ierr); 7065c6c1daeSBarry Smith switch (vascii->mode) { 7075c6c1daeSBarry Smith case FILE_MODE_READ: 7085c6c1daeSBarry Smith vascii->fd = fopen(fname,"r"); 7095c6c1daeSBarry Smith break; 7105c6c1daeSBarry Smith case FILE_MODE_WRITE: 7115c6c1daeSBarry Smith vascii->fd = fopen(fname,"w"); 7125c6c1daeSBarry Smith break; 7135c6c1daeSBarry Smith case FILE_MODE_APPEND: 7145c6c1daeSBarry Smith vascii->fd = fopen(fname,"a"); 7155c6c1daeSBarry Smith break; 7165c6c1daeSBarry Smith case FILE_MODE_UPDATE: 7175c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 718a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 7195c6c1daeSBarry Smith break; 7205c6c1daeSBarry Smith case FILE_MODE_APPEND_UPDATE: 7215c6c1daeSBarry Smith /* I really want a file which is opened at the end for updating, 7225c6c1daeSBarry Smith not a+, which opens at the beginning, but makes writes at the end. 7235c6c1daeSBarry Smith */ 7245c6c1daeSBarry Smith vascii->fd = fopen(fname,"r+"); 725a297a907SKarl Rupp if (!vascii->fd) vascii->fd = fopen(fname,"w+"); 726a297a907SKarl Rupp else { 7275c6c1daeSBarry Smith ierr = fseek(vascii->fd, 0, SEEK_END);CHKERRQ(ierr); 7285c6c1daeSBarry Smith } 7295c6c1daeSBarry Smith break; 7305c6c1daeSBarry Smith default: 7315c6c1daeSBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG, "Invalid file mode %d", vascii->mode); 7325c6c1daeSBarry Smith } 7335c6c1daeSBarry Smith if (!vascii->fd) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN,"Cannot open PetscViewer file: %s",fname); 7345c6c1daeSBarry Smith } 7355c6c1daeSBarry Smith } 7365c6c1daeSBarry Smith #if defined(PETSC_USE_LOG) 7375c6c1daeSBarry Smith PetscLogObjectState((PetscObject)viewer,"File: %s",name); 7385c6c1daeSBarry Smith #endif 7395c6c1daeSBarry Smith PetscFunctionReturn(0); 7405c6c1daeSBarry Smith } 7415c6c1daeSBarry Smith 7425c6c1daeSBarry Smith #undef __FUNCT__ 7435c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_ASCII" 7445c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer) 7455c6c1daeSBarry Smith { 7465c6c1daeSBarry Smith PetscMPIInt rank; 7475c6c1daeSBarry Smith PetscErrorCode ierr; 7485c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii; 7495c6c1daeSBarry Smith const char *name; 7505c6c1daeSBarry Smith 7515c6c1daeSBarry Smith PetscFunctionBegin; 7525c6c1daeSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton already obtained from PetscViewer and not restored"); 7535c6c1daeSBarry Smith ierr = PetscViewerCreate(PETSC_COMM_SELF,outviewer);CHKERRQ(ierr); 7545c6c1daeSBarry Smith ierr = PetscViewerSetType(*outviewer,PETSCVIEWERASCII);CHKERRQ(ierr); 7555c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 7565c6c1daeSBarry Smith ovascii->fd = vascii->fd; 7575c6c1daeSBarry Smith ovascii->tab = vascii->tab; 7585c6c1daeSBarry Smith 7595c6c1daeSBarry Smith vascii->sviewer = *outviewer; 7605c6c1daeSBarry Smith 7615c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 7625c6c1daeSBarry Smith 7635c6c1daeSBarry Smith ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr); 7645c6c1daeSBarry Smith ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr); 7655c6c1daeSBarry Smith 766ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)viewer),&rank);CHKERRQ(ierr); 7675c6c1daeSBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->bviewer = viewer; 7685c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Singleton; 769a297a907SKarl Rupp if (rank) (*outviewer)->ops->flush = 0; 770a297a907SKarl Rupp else (*outviewer)->ops->flush = PetscViewerFlush_ASCII_Singleton_0; 7715c6c1daeSBarry Smith PetscFunctionReturn(0); 7725c6c1daeSBarry Smith } 7735c6c1daeSBarry Smith 7745c6c1daeSBarry Smith #undef __FUNCT__ 7755c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_ASCII" 7765c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_ASCII(PetscViewer viewer,PetscViewer *outviewer) 7775c6c1daeSBarry Smith { 7785c6c1daeSBarry Smith PetscErrorCode ierr; 7795c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)(*outviewer)->data; 7805c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 7815c6c1daeSBarry Smith 7825c6c1daeSBarry Smith PetscFunctionBegin; 7835c6c1daeSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Singleton never obtained from PetscViewer"); 7845c6c1daeSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"This PetscViewer did not generate singleton"); 7855c6c1daeSBarry Smith 7865c6c1daeSBarry Smith ascii->sviewer = 0; 7875c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 7885c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 7895c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 7905c6c1daeSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 7915c6c1daeSBarry Smith PetscFunctionReturn(0); 7925c6c1daeSBarry Smith } 7935c6c1daeSBarry Smith 7945c6c1daeSBarry Smith #undef __FUNCT__ 7955c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm_ASCII" 7965c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 7975c6c1daeSBarry Smith { 7985c6c1daeSBarry Smith PetscErrorCode ierr; 7995c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data,*ovascii; 8005c6c1daeSBarry Smith const char *name; 8015c6c1daeSBarry Smith 8025c6c1daeSBarry Smith PetscFunctionBegin; 8035c6c1daeSBarry Smith if (vascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm viewer already obtained from PetscViewer and not restored"); 8045c6c1daeSBarry Smith /* Note that we need to open vascii->filename for the subcomm: 8055c6c1daeSBarry Smith we can't count on reusing viewer's fd since the root in comm and subcomm may differ. 8065c6c1daeSBarry Smith Further, if the subcomm happens to be the same as comm, PetscViewerASCIIOpen() will 8075c6c1daeSBarry Smith will return the current viewer, having increfed it. 8085c6c1daeSBarry Smith */ 8095c6c1daeSBarry Smith ierr = PetscViewerASCIIOpen(subcomm,vascii->filename, outviewer);CHKERRQ(ierr); 8105c6c1daeSBarry Smith if (*outviewer == viewer) PetscFunctionReturn(0); 8115c6c1daeSBarry Smith ovascii = (PetscViewer_ASCII*)(*outviewer)->data; 8125c6c1daeSBarry Smith 8135c6c1daeSBarry Smith ovascii->tab = vascii->tab; 8145c6c1daeSBarry Smith vascii->sviewer = *outviewer; 8155c6c1daeSBarry Smith 8165c6c1daeSBarry Smith (*outviewer)->format = viewer->format; 8175c6c1daeSBarry Smith 8185c6c1daeSBarry Smith ierr = PetscObjectGetName((PetscObject)viewer,&name);CHKERRQ(ierr); 8195c6c1daeSBarry Smith ierr = PetscObjectSetName((PetscObject)(*outviewer),name);CHKERRQ(ierr); 8205c6c1daeSBarry Smith 821dd2fa690SBarry Smith ((PetscViewer_ASCII*)((*outviewer)->data))->subviewer = viewer; 822a297a907SKarl Rupp 8235c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII_Subcomm; 8245c6c1daeSBarry Smith PetscFunctionReturn(0); 8255c6c1daeSBarry Smith } 8265c6c1daeSBarry Smith 8275c6c1daeSBarry Smith #undef __FUNCT__ 8285c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm_ASCII" 8295c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm_ASCII(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 8305c6c1daeSBarry Smith { 8315c6c1daeSBarry Smith PetscErrorCode ierr; 8325c6c1daeSBarry Smith PetscViewer_ASCII *oascii = (PetscViewer_ASCII*)(*outviewer)->data; 8335c6c1daeSBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)viewer->data; 8345c6c1daeSBarry Smith 8355c6c1daeSBarry Smith PetscFunctionBegin; 8365c6c1daeSBarry Smith if (!ascii->sviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Subcomm never obtained from PetscViewer"); 8375c6c1daeSBarry Smith if (ascii->sviewer != *outviewer) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"The given PetscViewer did not generate this subcomm viewer"); 8385c6c1daeSBarry Smith 8395c6c1daeSBarry Smith ascii->sviewer = 0; 8405c6c1daeSBarry Smith oascii->fd = PETSC_STDOUT; 8415c6c1daeSBarry Smith (*outviewer)->ops->destroy = PetscViewerDestroy_ASCII; 842a297a907SKarl Rupp 8435c6c1daeSBarry Smith ierr = PetscViewerDestroy(outviewer);CHKERRQ(ierr); 8445c6c1daeSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8455c6c1daeSBarry Smith PetscFunctionReturn(0); 8465c6c1daeSBarry Smith } 8475c6c1daeSBarry Smith 8482bf49c77SBarry Smith #undef __FUNCT__ 8492bf49c77SBarry Smith #define __FUNCT__ "PetscViewerView_ASCII" 8502bf49c77SBarry Smith PetscErrorCode PetscViewerView_ASCII(PetscViewer v,PetscViewer viewer) 8512bf49c77SBarry Smith { 8522bf49c77SBarry Smith PetscErrorCode ierr; 8532bf49c77SBarry Smith PetscViewer_ASCII *ascii = (PetscViewer_ASCII*)v->data; 8542bf49c77SBarry Smith 8552bf49c77SBarry Smith PetscFunctionBegin; 8562bf49c77SBarry Smith if (ascii->filename) { 8572bf49c77SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Filename: %s\n",ascii->filename);CHKERRQ(ierr); 8582bf49c77SBarry Smith } 8592bf49c77SBarry Smith PetscFunctionReturn(0); 8602bf49c77SBarry Smith } 8612bf49c77SBarry Smith 8625c6c1daeSBarry Smith #undef __FUNCT__ 8635c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_ASCII" 8648cc058d9SJed Brown PETSC_EXTERN PetscErrorCode PetscViewerCreate_ASCII(PetscViewer viewer) 8655c6c1daeSBarry Smith { 8665c6c1daeSBarry Smith PetscViewer_ASCII *vascii; 8675c6c1daeSBarry Smith PetscErrorCode ierr; 8685c6c1daeSBarry Smith 8695c6c1daeSBarry Smith PetscFunctionBegin; 870b00a9115SJed Brown ierr = PetscNewLog(viewer,&vascii);CHKERRQ(ierr); 8715c6c1daeSBarry Smith viewer->data = (void*)vascii; 8725c6c1daeSBarry Smith 8735c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_ASCII; 8745c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_ASCII; 8755c6c1daeSBarry Smith viewer->ops->getsingleton = PetscViewerGetSingleton_ASCII; 8765c6c1daeSBarry Smith viewer->ops->restoresingleton = PetscViewerRestoreSingleton_ASCII; 8775c6c1daeSBarry Smith viewer->ops->getsubcomm = PetscViewerGetSubcomm_ASCII; 8785c6c1daeSBarry Smith viewer->ops->restoresubcomm = PetscViewerRestoreSubcomm_ASCII; 8792bf49c77SBarry Smith viewer->ops->view = PetscViewerView_ASCII; 8801d641e7bSMichael Lange viewer->ops->read = PetscViewerASCIIRead; 8815c6c1daeSBarry Smith 8825c6c1daeSBarry Smith /* defaults to stdout unless set with PetscViewerFileSetName() */ 8835c6c1daeSBarry Smith vascii->fd = PETSC_STDOUT; 8845c6c1daeSBarry Smith vascii->mode = FILE_MODE_WRITE; 8855c6c1daeSBarry Smith vascii->bviewer = 0; 886dd2fa690SBarry Smith vascii->subviewer = 0; 8875c6c1daeSBarry Smith vascii->sviewer = 0; 8885c6c1daeSBarry Smith vascii->tab = 0; 8895c6c1daeSBarry Smith vascii->tab_store = 0; 8905c6c1daeSBarry Smith vascii->filename = 0; 8915c6c1daeSBarry Smith vascii->closefile = PETSC_TRUE; 8925c6c1daeSBarry Smith 893bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetName_C",PetscViewerFileSetName_ASCII);CHKERRQ(ierr); 894bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetName_C",PetscViewerFileGetName_ASCII);CHKERRQ(ierr); 895bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileGetMode_C",PetscViewerFileGetMode_ASCII);CHKERRQ(ierr); 896bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)viewer,"PetscViewerFileSetMode_C",PetscViewerFileSetMode_ASCII);CHKERRQ(ierr); 8975c6c1daeSBarry Smith PetscFunctionReturn(0); 8985c6c1daeSBarry Smith } 8995c6c1daeSBarry Smith 9005c6c1daeSBarry Smith 9015c6c1daeSBarry Smith #undef __FUNCT__ 9025c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISynchronizedPrintf" 9035c6c1daeSBarry Smith /*@C 9045c6c1daeSBarry Smith PetscViewerASCIISynchronizedPrintf - Prints synchronized output to the specified file from 9055c6c1daeSBarry Smith several processors. Output of the first processor is followed by that of the 9065c6c1daeSBarry Smith second, etc. 9075c6c1daeSBarry Smith 9085c6c1daeSBarry Smith Not Collective, must call collective PetscViewerFlush() to get the results out 9095c6c1daeSBarry Smith 9105c6c1daeSBarry Smith Input Parameters: 9115c6c1daeSBarry Smith + viewer - the ASCII PetscViewer 9125c6c1daeSBarry Smith - format - the usual printf() format string 9135c6c1daeSBarry Smith 9145c6c1daeSBarry Smith Level: intermediate 9155c6c1daeSBarry Smith 9165c6c1daeSBarry Smith Notes: You must have previously called PetscViewerASCIISynchronizeAllow() to allow this routine to be called. 9175c6c1daeSBarry Smith 9185c6c1daeSBarry Smith Fortran Note: 9195c6c1daeSBarry Smith Can only print a single character* string 9205c6c1daeSBarry Smith 9215c6c1daeSBarry Smith .seealso: PetscSynchronizedPrintf(), PetscSynchronizedFlush(), PetscFPrintf(), 9225c6c1daeSBarry Smith PetscFOpen(), PetscViewerFlush(), PetscViewerASCIIGetPointer(), PetscViewerDestroy(), PetscViewerASCIIOpen(), 9235c6c1daeSBarry Smith PetscViewerASCIIPrintf(), PetscViewerASCIISynchronizedAllow() 9245c6c1daeSBarry Smith 9255c6c1daeSBarry Smith @*/ 9265c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISynchronizedPrintf(PetscViewer viewer,const char format[],...) 9275c6c1daeSBarry Smith { 9285c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 9295c6c1daeSBarry Smith PetscErrorCode ierr; 9305c6c1daeSBarry Smith PetscMPIInt rank,size; 9315c6c1daeSBarry Smith PetscInt tab = vascii->tab; 9325c6c1daeSBarry Smith MPI_Comm comm; 9335c6c1daeSBarry Smith FILE *fp; 9345c6c1daeSBarry Smith PetscBool iascii; 9355c6c1daeSBarry Smith int err; 9365c6c1daeSBarry Smith 9375c6c1daeSBarry Smith PetscFunctionBegin; 9385c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 9395c6c1daeSBarry Smith PetscValidCharPointer(format,2); 9405c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 9415c6c1daeSBarry Smith if (!iascii) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Not ASCII PetscViewer"); 942ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 9435c6c1daeSBarry Smith if (size > 1 && !vascii->allowsynchronized) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"First call PetscViewerASCIISynchronizedAllow() to allow this call"); 9445c6c1daeSBarry Smith if (!viewer->ops->flush) PetscFunctionReturn(0); /* This viewer obtained via PetscViewerGetSubcomm_ASCII(), should not participate. */ 9455c6c1daeSBarry Smith 946ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 9475c6c1daeSBarry Smith fp = vascii->fd; 9485c6c1daeSBarry Smith ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 9495c6c1daeSBarry Smith 9505c6c1daeSBarry Smith /* First processor prints immediately to fp */ 9515c6c1daeSBarry Smith if (!rank) { 9525c6c1daeSBarry Smith va_list Argp; 9535c6c1daeSBarry Smith 954a297a907SKarl Rupp while (tab--) { 955a297a907SKarl Rupp ierr = PetscFPrintf(PETSC_COMM_SELF,fp," ");CHKERRQ(ierr); 956a297a907SKarl Rupp } 9575c6c1daeSBarry Smith 9585c6c1daeSBarry Smith va_start(Argp,format); 9595c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(fp,format,Argp);CHKERRQ(ierr); 9605c6c1daeSBarry Smith err = fflush(fp); 9615c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9625c6c1daeSBarry Smith if (petsc_history) { 9635c6c1daeSBarry Smith va_start(Argp,format); 9645c6c1daeSBarry Smith ierr = (*PetscVFPrintf)(petsc_history,format,Argp);CHKERRQ(ierr); 9655c6c1daeSBarry Smith err = fflush(petsc_history); 9665c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 9675c6c1daeSBarry Smith } 9685c6c1daeSBarry Smith va_end(Argp); 9695c6c1daeSBarry Smith } else { /* other processors add to local queue */ 9705c6c1daeSBarry Smith char *string; 9715c6c1daeSBarry Smith va_list Argp; 9725c6c1daeSBarry Smith size_t fullLength; 9735c6c1daeSBarry Smith PrintfQueue next; 9745c6c1daeSBarry Smith 975b00a9115SJed Brown ierr = PetscNew(&next);CHKERRQ(ierr); 976a297a907SKarl Rupp if (petsc_printfqueue) { 977a297a907SKarl Rupp petsc_printfqueue->next = next; 978a297a907SKarl Rupp petsc_printfqueue = next; 979a297a907SKarl Rupp } else { 980a297a907SKarl Rupp petsc_printfqueuebase = petsc_printfqueue = next; 981a297a907SKarl Rupp } 9825c6c1daeSBarry Smith petsc_printfqueuelength++; 9835c6c1daeSBarry Smith next->size = QUEUESTRINGSIZE; 984785e854fSJed Brown ierr = PetscMalloc1(next->size, &next->string);CHKERRQ(ierr); 9855c6c1daeSBarry Smith ierr = PetscMemzero(next->string,next->size);CHKERRQ(ierr); 9865c6c1daeSBarry Smith string = next->string; 9875c6c1daeSBarry Smith tab *= 2; 988a297a907SKarl Rupp while (tab--) { 989a297a907SKarl Rupp *string++ = ' '; 990a297a907SKarl Rupp } 9915c6c1daeSBarry Smith va_start(Argp,format); 99222d28d08SBarry Smith ierr = PetscVSNPrintf(string,next->size-2*vascii->tab,format,&fullLength,Argp);CHKERRQ(ierr); 9935c6c1daeSBarry Smith va_end(Argp); 9945c6c1daeSBarry Smith } 9955c6c1daeSBarry Smith PetscFunctionReturn(0); 9965c6c1daeSBarry Smith } 9975c6c1daeSBarry Smith 9982655f987SMichael Lange #undef __FUNCT__ 9992655f987SMichael Lange #define __FUNCT__ "PetscViewerASCIIRead" 10002655f987SMichael Lange /*@C 10012655f987SMichael Lange PetscViewerASCIIRead - Reads from am ASCII file 10022655f987SMichael Lange 10032655f987SMichael Lange Collective on MPI_Comm 10042655f987SMichael Lange 10052655f987SMichael Lange Input Parameters: 10062655f987SMichael Lange + viewer - the ascii viewer 10072655f987SMichael Lange . data - location to write the data 10082655f987SMichael Lange . count - number of items of data to read 10092655f987SMichael Lange - datatype - type of data to read 10102655f987SMichael Lange 10112655f987SMichael Lange Level: beginner 10122655f987SMichael Lange 10132655f987SMichael Lange Concepts: ascii files 10142655f987SMichael Lange 10152655f987SMichael Lange .seealso: PetscViewerASCIIOpen(), PetscViewerSetFormat(), PetscViewerDestroy(), 10162655f987SMichael Lange VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), 10172655f987SMichael Lange PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer, PetscBinaryViewerRead() 10182655f987SMichael Lange @*/ 10192655f987SMichael Lange PetscErrorCode PetscViewerASCIIRead(PetscViewer viewer,void *data,PetscInt count,PetscDataType dtype) 10202655f987SMichael Lange { 10212655f987SMichael Lange PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 10222655f987SMichael Lange FILE *fd = vascii->fd; 10232655f987SMichael Lange PetscInt i; 10242655f987SMichael Lange 10252655f987SMichael Lange PetscFunctionBegin; 10262655f987SMichael Lange PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 10272655f987SMichael Lange for (i=0; i<count; i++) { 10282655f987SMichael Lange if (dtype == PETSC_CHAR) fscanf(fd, "%c", &(((char*)data)[i])); 10292655f987SMichael Lange else if (dtype == PETSC_STRING) fscanf(fd, "%s", &(((char*)data)[i])); 1030b9eae255SMichael Lange #if PETSC_USE_64BIT_INDICES 1031*0a3e67a1SMichael Lange #if (PETSC_SIZEOF_LONG_LONG == 8) 1032*0a3e67a1SMichael Lange else if (dtype == PETSC_INT) fscanf(fd, "%ld", &(((PetscInt*)data)[i])); 1033*0a3e67a1SMichael Lange #else 1034ddd66a62SMichael Lange else if (dtype == PETSC_INT) fscanf(fd, "%lld", &(((PetscInt*)data)[i])); 1035*0a3e67a1SMichael Lange #endif 1036b9eae255SMichael Lange #else 10372655f987SMichael Lange else if (dtype == PETSC_INT) fscanf(fd, "%d", &(((PetscInt*)data)[i])); 1038b9eae255SMichael Lange #endif 1039b9eae255SMichael Lange else if (dtype == PETSC_ENUM) fscanf(fd, "%d", &(((int*)data)[i])); 10402655f987SMichael Lange else if (dtype == PETSC_FLOAT) fscanf(fd, "%f", &(((float*)data)[i])); 10412655f987SMichael Lange else if (dtype == PETSC_DOUBLE) fscanf(fd, "%lg", &(((double*)data)[i])); 10422655f987SMichael Lange else {SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Data type not supported in PetscViewerASCIIRead()", dtype);} 10432655f987SMichael Lange } 10442655f987SMichael Lange PetscFunctionReturn(0); 10452655f987SMichael Lange } 10465c6c1daeSBarry Smith 1047