1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/ascii/asciiimpl.h> /*I "petscsys.h" I*/ 3*5c6c1daeSBarry Smith 4*5c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/ 5*5c6c1daeSBarry Smith /* 6*5c6c1daeSBarry Smith The variable Petsc_Viewer_Stdout_keyval is used to indicate an MPI attribute that 7*5c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 8*5c6c1daeSBarry Smith */ 9*5c6c1daeSBarry Smith static PetscMPIInt Petsc_Viewer_Stdout_keyval = MPI_KEYVAL_INVALID; 10*5c6c1daeSBarry Smith 11*5c6c1daeSBarry Smith #undef __FUNCT__ 12*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetStdout" 13*5c6c1daeSBarry Smith /*@C 14*5c6c1daeSBarry Smith PetscViewerASCIIGetStdout - Creates a ASCII PetscViewer shared by all processors 15*5c6c1daeSBarry Smith in a communicator. Error returning version of PETSC_VIEWER_STDOUT_() 16*5c6c1daeSBarry Smith 17*5c6c1daeSBarry Smith Collective on MPI_Comm 18*5c6c1daeSBarry Smith 19*5c6c1daeSBarry Smith Input Parameter: 20*5c6c1daeSBarry Smith . comm - the MPI communicator to share the PetscViewer 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith Level: beginner 23*5c6c1daeSBarry Smith 24*5c6c1daeSBarry Smith Notes: 25*5c6c1daeSBarry Smith This should be used in all PETSc source code instead of PETSC_VIEWER_STDOUT_() 26*5c6c1daeSBarry Smith 27*5c6c1daeSBarry Smith .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD, 28*5c6c1daeSBarry Smith PETSC_VIEWER_STDOUT_SELF 29*5c6c1daeSBarry Smith 30*5c6c1daeSBarry Smith @*/ 31*5c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetStdout(MPI_Comm comm,PetscViewer *viewer) 32*5c6c1daeSBarry Smith { 33*5c6c1daeSBarry Smith PetscErrorCode ierr; 34*5c6c1daeSBarry Smith PetscBool flg; 35*5c6c1daeSBarry Smith MPI_Comm ncomm; 36*5c6c1daeSBarry Smith 37*5c6c1daeSBarry Smith PetscFunctionBegin; 38*5c6c1daeSBarry Smith ierr = PetscCommDuplicate(comm,&ncomm,PETSC_NULL);CHKERRQ(ierr); 39*5c6c1daeSBarry Smith if (Petsc_Viewer_Stdout_keyval == MPI_KEYVAL_INVALID) { 40*5c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stdout_keyval,0);CHKERRQ(ierr); 41*5c6c1daeSBarry Smith } 42*5c6c1daeSBarry Smith ierr = MPI_Attr_get(ncomm,Petsc_Viewer_Stdout_keyval,(void **)viewer,(PetscMPIInt*)&flg);CHKERRQ(ierr); 43*5c6c1daeSBarry Smith if (!flg) { /* PetscViewer not yet created */ 44*5c6c1daeSBarry Smith ierr = PetscViewerASCIIOpen(ncomm,"stdout",viewer);CHKERRQ(ierr); 45*5c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)*viewer);CHKERRQ(ierr); 46*5c6c1daeSBarry Smith ierr = MPI_Attr_put(ncomm,Petsc_Viewer_Stdout_keyval,(void*)*viewer);CHKERRQ(ierr); 47*5c6c1daeSBarry Smith } 48*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&ncomm);CHKERRQ(ierr); 49*5c6c1daeSBarry Smith PetscFunctionReturn(0); 50*5c6c1daeSBarry Smith } 51*5c6c1daeSBarry Smith 52*5c6c1daeSBarry Smith #undef __FUNCT__ 53*5c6c1daeSBarry Smith #define __FUNCT__ "PETSC_VIEWER_STDOUT_" 54*5c6c1daeSBarry Smith /*@C 55*5c6c1daeSBarry Smith PETSC_VIEWER_STDOUT_ - Creates a ASCII PetscViewer shared by all processors 56*5c6c1daeSBarry Smith in a communicator. 57*5c6c1daeSBarry Smith 58*5c6c1daeSBarry Smith Collective on MPI_Comm 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith Input Parameter: 61*5c6c1daeSBarry Smith . comm - the MPI communicator to share the PetscViewer 62*5c6c1daeSBarry Smith 63*5c6c1daeSBarry Smith Level: beginner 64*5c6c1daeSBarry Smith 65*5c6c1daeSBarry Smith Notes: 66*5c6c1daeSBarry Smith Unlike almost all other PETSc routines, this does not return 67*5c6c1daeSBarry Smith an error code. Usually used in the form 68*5c6c1daeSBarry Smith $ XXXView(XXX object,PETSC_VIEWER_STDOUT_(comm)); 69*5c6c1daeSBarry Smith 70*5c6c1daeSBarry Smith .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD, 71*5c6c1daeSBarry Smith PETSC_VIEWER_STDOUT_SELF 72*5c6c1daeSBarry Smith 73*5c6c1daeSBarry Smith @*/ 74*5c6c1daeSBarry Smith PetscViewer PETSC_VIEWER_STDOUT_(MPI_Comm comm) 75*5c6c1daeSBarry Smith { 76*5c6c1daeSBarry Smith PetscErrorCode ierr; 77*5c6c1daeSBarry Smith PetscViewer viewer; 78*5c6c1daeSBarry Smith 79*5c6c1daeSBarry Smith PetscFunctionBegin; 80*5c6c1daeSBarry Smith ierr = PetscViewerASCIIGetStdout(comm,&viewer); 81*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); PetscFunctionReturn(0);} 82*5c6c1daeSBarry Smith PetscFunctionReturn(viewer); 83*5c6c1daeSBarry Smith } 84*5c6c1daeSBarry Smith 85*5c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/ 86*5c6c1daeSBarry Smith /* 87*5c6c1daeSBarry Smith The variable Petsc_Viewer_Stderr_keyval is used to indicate an MPI attribute that 88*5c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 89*5c6c1daeSBarry Smith */ 90*5c6c1daeSBarry Smith static PetscMPIInt Petsc_Viewer_Stderr_keyval = MPI_KEYVAL_INVALID; 91*5c6c1daeSBarry Smith 92*5c6c1daeSBarry Smith #undef __FUNCT__ 93*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIGetStderr" 94*5c6c1daeSBarry Smith /*@C 95*5c6c1daeSBarry Smith PetscViewerASCIIGetStderr - Creates a ASCII PetscViewer shared by all processors 96*5c6c1daeSBarry Smith in a communicator. Error returning version of PETSC_VIEWER_STDERR_() 97*5c6c1daeSBarry Smith 98*5c6c1daeSBarry Smith Collective on MPI_Comm 99*5c6c1daeSBarry Smith 100*5c6c1daeSBarry Smith Input Parameter: 101*5c6c1daeSBarry Smith . comm - the MPI communicator to share the PetscViewer 102*5c6c1daeSBarry Smith 103*5c6c1daeSBarry Smith Level: beginner 104*5c6c1daeSBarry Smith 105*5c6c1daeSBarry Smith Notes: 106*5c6c1daeSBarry Smith This should be used in all PETSc source code instead of PETSC_VIEWER_STDERR_() 107*5c6c1daeSBarry Smith 108*5c6c1daeSBarry Smith .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDERR_WORLD, 109*5c6c1daeSBarry Smith PETSC_VIEWER_STDERR_SELF 110*5c6c1daeSBarry Smith 111*5c6c1daeSBarry Smith @*/ 112*5c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIGetStderr(MPI_Comm comm,PetscViewer *viewer) 113*5c6c1daeSBarry Smith { 114*5c6c1daeSBarry Smith PetscErrorCode ierr; 115*5c6c1daeSBarry Smith PetscBool flg; 116*5c6c1daeSBarry Smith MPI_Comm ncomm; 117*5c6c1daeSBarry Smith 118*5c6c1daeSBarry Smith PetscFunctionBegin; 119*5c6c1daeSBarry Smith ierr = PetscCommDuplicate(comm,&ncomm,PETSC_NULL);CHKERRQ(ierr); 120*5c6c1daeSBarry Smith if (Petsc_Viewer_Stderr_keyval == MPI_KEYVAL_INVALID) { 121*5c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stderr_keyval,0);CHKERRQ(ierr); 122*5c6c1daeSBarry Smith } 123*5c6c1daeSBarry Smith ierr = MPI_Attr_get(ncomm,Petsc_Viewer_Stderr_keyval,(void **)viewer,(PetscMPIInt*)&flg);CHKERRQ(ierr); 124*5c6c1daeSBarry Smith if (!flg) { /* PetscViewer not yet created */ 125*5c6c1daeSBarry Smith ierr = PetscViewerASCIIOpen(ncomm,"stderr",viewer);CHKERRQ(ierr); 126*5c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)*viewer);CHKERRQ(ierr); 127*5c6c1daeSBarry Smith ierr = MPI_Attr_put(ncomm,Petsc_Viewer_Stderr_keyval,(void*)*viewer);CHKERRQ(ierr); 128*5c6c1daeSBarry Smith } 129*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&ncomm);CHKERRQ(ierr); 130*5c6c1daeSBarry Smith PetscFunctionReturn(0); 131*5c6c1daeSBarry Smith } 132*5c6c1daeSBarry Smith 133*5c6c1daeSBarry Smith #undef __FUNCT__ 134*5c6c1daeSBarry Smith #define __FUNCT__ "PETSC_VIEWER_STDERR_" 135*5c6c1daeSBarry Smith /*@C 136*5c6c1daeSBarry Smith PETSC_VIEWER_STDERR_ - Creates a ASCII PetscViewer shared by all processors 137*5c6c1daeSBarry Smith in a communicator. 138*5c6c1daeSBarry Smith 139*5c6c1daeSBarry Smith Collective on MPI_Comm 140*5c6c1daeSBarry Smith 141*5c6c1daeSBarry Smith Input Parameter: 142*5c6c1daeSBarry Smith . comm - the MPI communicator to share the PetscViewer 143*5c6c1daeSBarry Smith 144*5c6c1daeSBarry Smith Level: beginner 145*5c6c1daeSBarry Smith 146*5c6c1daeSBarry Smith Note: 147*5c6c1daeSBarry Smith Unlike almost all other PETSc routines, this does not return 148*5c6c1daeSBarry Smith an error code. Usually used in the form 149*5c6c1daeSBarry Smith $ XXXView(XXX object,PETSC_VIEWER_STDERR_(comm)); 150*5c6c1daeSBarry Smith 151*5c6c1daeSBarry Smith .seealso: PETSC_VIEWER_DRAW_, PetscViewerASCIIOpen(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDOUT_WORLD, 152*5c6c1daeSBarry Smith PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDERR_WORLD, PETSC_VIEWER_STDERR_SELF 153*5c6c1daeSBarry Smith @*/ 154*5c6c1daeSBarry Smith PetscViewer PETSC_VIEWER_STDERR_(MPI_Comm comm) 155*5c6c1daeSBarry Smith { 156*5c6c1daeSBarry Smith PetscErrorCode ierr; 157*5c6c1daeSBarry Smith PetscViewer viewer; 158*5c6c1daeSBarry Smith 159*5c6c1daeSBarry Smith PetscFunctionBegin; 160*5c6c1daeSBarry Smith ierr = PetscViewerASCIIGetStderr(comm,&viewer); 161*5c6c1daeSBarry Smith if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); PetscFunctionReturn(0);} 162*5c6c1daeSBarry Smith PetscFunctionReturn(viewer); 163*5c6c1daeSBarry Smith } 164*5c6c1daeSBarry Smith 165*5c6c1daeSBarry Smith 166*5c6c1daeSBarry Smith PetscMPIInt Petsc_Viewer_keyval = MPI_KEYVAL_INVALID; 167*5c6c1daeSBarry Smith EXTERN_C_BEGIN 168*5c6c1daeSBarry Smith #undef __FUNCT__ 169*5c6c1daeSBarry Smith #define __FUNCT__ "Petsc_DelViewer" 170*5c6c1daeSBarry Smith /* 171*5c6c1daeSBarry Smith Called with MPI_Comm_free() is called on a communicator that has a viewer as an attribute. The viewer is not actually destroyed because that is managed by 172*5c6c1daeSBarry Smith PetscObjectDestroyRegisterAll(). PetscViewerASCIIGetStdout() registers the viewer with PetscObjectDestroyRegister() to be destroyed when PetscFinalize() is called. 173*5c6c1daeSBarry Smith 174*5c6c1daeSBarry Smith This is called by MPI, not by users. 175*5c6c1daeSBarry Smith 176*5c6c1daeSBarry Smith */ 177*5c6c1daeSBarry Smith PetscMPIInt MPIAPI Petsc_DelViewer(MPI_Comm comm,PetscMPIInt keyval,void* attr_val,void* extra_state) 178*5c6c1daeSBarry Smith { 179*5c6c1daeSBarry Smith PetscErrorCode ierr; 180*5c6c1daeSBarry Smith 181*5c6c1daeSBarry Smith PetscFunctionBegin; 182*5c6c1daeSBarry Smith ierr = PetscInfo1(0,"Removing viewer data attribute in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr); 183*5c6c1daeSBarry Smith PetscFunctionReturn(MPI_SUCCESS); 184*5c6c1daeSBarry Smith } 185*5c6c1daeSBarry Smith EXTERN_C_END 186*5c6c1daeSBarry Smith 187*5c6c1daeSBarry Smith #undef __FUNCT__ 188*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIOpen" 189*5c6c1daeSBarry Smith /*@C 190*5c6c1daeSBarry Smith PetscViewerASCIIOpen - Opens an ASCII file as a PetscViewer. 191*5c6c1daeSBarry Smith 192*5c6c1daeSBarry Smith Collective on MPI_Comm 193*5c6c1daeSBarry Smith 194*5c6c1daeSBarry Smith Input Parameters: 195*5c6c1daeSBarry Smith + comm - the communicator 196*5c6c1daeSBarry Smith - name - the file name 197*5c6c1daeSBarry Smith 198*5c6c1daeSBarry Smith Output Parameter: 199*5c6c1daeSBarry Smith . lab - the PetscViewer to use with the specified file 200*5c6c1daeSBarry Smith 201*5c6c1daeSBarry Smith Level: beginner 202*5c6c1daeSBarry Smith 203*5c6c1daeSBarry Smith Notes: 204*5c6c1daeSBarry Smith This PetscViewer can be destroyed with PetscViewerDestroy(). 205*5c6c1daeSBarry Smith 206*5c6c1daeSBarry Smith If a multiprocessor communicator is used (such as PETSC_COMM_WORLD), 207*5c6c1daeSBarry Smith then only the first processor in the group opens the file. All other 208*5c6c1daeSBarry Smith processors send their data to the first processor to print. 209*5c6c1daeSBarry Smith 210*5c6c1daeSBarry Smith Each processor can instead write its own independent output by 211*5c6c1daeSBarry Smith specifying the communicator PETSC_COMM_SELF. 212*5c6c1daeSBarry Smith 213*5c6c1daeSBarry Smith As shown below, PetscViewerASCIIOpen() is useful in conjunction with 214*5c6c1daeSBarry Smith MatView() and VecView() 215*5c6c1daeSBarry Smith .vb 216*5c6c1daeSBarry Smith PetscViewerASCIIOpen(PETSC_COMM_WORLD,"mat.output",&viewer); 217*5c6c1daeSBarry Smith MatView(matrix,viewer); 218*5c6c1daeSBarry Smith .ve 219*5c6c1daeSBarry Smith 220*5c6c1daeSBarry Smith Concepts: PetscViewerASCII^creating 221*5c6c1daeSBarry Smith Concepts: printf 222*5c6c1daeSBarry Smith Concepts: printing 223*5c6c1daeSBarry Smith Concepts: accessing remote file 224*5c6c1daeSBarry Smith Concepts: remote file 225*5c6c1daeSBarry Smith 226*5c6c1daeSBarry Smith .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(), 227*5c6c1daeSBarry Smith PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_, 228*5c6c1daeSBarry Smith PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF, 229*5c6c1daeSBarry Smith @*/ 230*5c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIOpen(MPI_Comm comm,const char name[],PetscViewer *lab) 231*5c6c1daeSBarry Smith { 232*5c6c1daeSBarry Smith PetscErrorCode ierr; 233*5c6c1daeSBarry Smith PetscViewerLink *vlink,*nv; 234*5c6c1daeSBarry Smith PetscBool flg,eq; 235*5c6c1daeSBarry Smith size_t len; 236*5c6c1daeSBarry Smith 237*5c6c1daeSBarry Smith PetscFunctionBegin; 238*5c6c1daeSBarry Smith ierr = PetscStrlen(name,&len);CHKERRQ(ierr); 239*5c6c1daeSBarry Smith if (!len) { 240*5c6c1daeSBarry Smith ierr = PetscViewerASCIIGetStdout(comm,lab);CHKERRQ(ierr); 241*5c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)*lab);CHKERRQ(ierr); 242*5c6c1daeSBarry Smith PetscFunctionReturn(0); 243*5c6c1daeSBarry Smith } 244*5c6c1daeSBarry Smith if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) { 245*5c6c1daeSBarry Smith ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);CHKERRQ(ierr); 246*5c6c1daeSBarry Smith } 247*5c6c1daeSBarry Smith /* make sure communicator is a PETSc communicator */ 248*5c6c1daeSBarry Smith ierr = PetscCommDuplicate(comm,&comm,PETSC_NULL);CHKERRQ(ierr); 249*5c6c1daeSBarry Smith /* has file already been opened into a viewer */ 250*5c6c1daeSBarry Smith ierr = MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr); 251*5c6c1daeSBarry Smith if (flg) { 252*5c6c1daeSBarry Smith while (vlink) { 253*5c6c1daeSBarry Smith ierr = PetscStrcmp(name,((PetscViewer_ASCII*)(vlink->viewer->data))->filename,&eq);CHKERRQ(ierr); 254*5c6c1daeSBarry Smith if (eq) { 255*5c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)vlink->viewer);CHKERRQ(ierr); 256*5c6c1daeSBarry Smith *lab = vlink->viewer; 257*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&comm);CHKERRQ(ierr); 258*5c6c1daeSBarry Smith PetscFunctionReturn(0); 259*5c6c1daeSBarry Smith } 260*5c6c1daeSBarry Smith vlink = vlink->next; 261*5c6c1daeSBarry Smith } 262*5c6c1daeSBarry Smith } 263*5c6c1daeSBarry Smith ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr); 264*5c6c1daeSBarry Smith ierr = PetscViewerSetType(*lab,PETSCVIEWERASCII);CHKERRQ(ierr); 265*5c6c1daeSBarry Smith if (name) { 266*5c6c1daeSBarry Smith ierr = PetscViewerFileSetName(*lab,name);CHKERRQ(ierr); 267*5c6c1daeSBarry Smith } 268*5c6c1daeSBarry Smith /* save viewer into communicator if needed later */ 269*5c6c1daeSBarry Smith ierr = PetscNew(PetscViewerLink,&nv);CHKERRQ(ierr); 270*5c6c1daeSBarry Smith nv->viewer = *lab; 271*5c6c1daeSBarry Smith if (!flg) { 272*5c6c1daeSBarry Smith ierr = MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);CHKERRQ(ierr); 273*5c6c1daeSBarry Smith } else { 274*5c6c1daeSBarry Smith ierr = MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);CHKERRQ(ierr); 275*5c6c1daeSBarry Smith if (vlink) { 276*5c6c1daeSBarry Smith while (vlink->next) vlink = vlink->next; 277*5c6c1daeSBarry Smith vlink->next = nv; 278*5c6c1daeSBarry Smith } else { 279*5c6c1daeSBarry Smith ierr = MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);CHKERRQ(ierr); 280*5c6c1daeSBarry Smith } 281*5c6c1daeSBarry Smith } 282*5c6c1daeSBarry Smith ierr = PetscCommDestroy(&comm);CHKERRQ(ierr); 283*5c6c1daeSBarry Smith PetscFunctionReturn(0); 284*5c6c1daeSBarry Smith } 285*5c6c1daeSBarry Smith 286*5c6c1daeSBarry Smith #undef __FUNCT__ 287*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIIOpenWithFILE" 288*5c6c1daeSBarry Smith /*@C 289*5c6c1daeSBarry Smith PetscViewerASCIIOpenWithFILE - Given an open file creates an ASCII viewer that prints to it. 290*5c6c1daeSBarry Smith 291*5c6c1daeSBarry Smith Collective on MPI_Comm 292*5c6c1daeSBarry Smith 293*5c6c1daeSBarry Smith Input Parameters: 294*5c6c1daeSBarry Smith + comm - the communicator 295*5c6c1daeSBarry Smith - fd - the FILE pointer 296*5c6c1daeSBarry Smith 297*5c6c1daeSBarry Smith Output Parameter: 298*5c6c1daeSBarry Smith . lab - the PetscViewer to use with the specified file 299*5c6c1daeSBarry Smith 300*5c6c1daeSBarry Smith Level: beginner 301*5c6c1daeSBarry Smith 302*5c6c1daeSBarry Smith Notes: 303*5c6c1daeSBarry Smith This PetscViewer can be destroyed with PetscViewerDestroy(), but the fd will NOT be closed. 304*5c6c1daeSBarry Smith 305*5c6c1daeSBarry Smith If a multiprocessor communicator is used (such as PETSC_COMM_WORLD), 306*5c6c1daeSBarry Smith then only the first processor in the group uses the file. All other 307*5c6c1daeSBarry Smith processors send their data to the first processor to print. 308*5c6c1daeSBarry Smith 309*5c6c1daeSBarry Smith Concepts: PetscViewerASCII^creating 310*5c6c1daeSBarry Smith Concepts: printf 311*5c6c1daeSBarry Smith Concepts: printing 312*5c6c1daeSBarry Smith Concepts: accessing remote file 313*5c6c1daeSBarry Smith Concepts: remote file 314*5c6c1daeSBarry Smith 315*5c6c1daeSBarry Smith .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(), 316*5c6c1daeSBarry Smith PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_, 317*5c6c1daeSBarry Smith PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF, PetscViewerASCIIOpen() 318*5c6c1daeSBarry Smith @*/ 319*5c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIIOpenWithFILE(MPI_Comm comm,FILE *fd,PetscViewer *lab) 320*5c6c1daeSBarry Smith { 321*5c6c1daeSBarry Smith PetscErrorCode ierr; 322*5c6c1daeSBarry Smith 323*5c6c1daeSBarry Smith PetscFunctionBegin; 324*5c6c1daeSBarry Smith ierr = PetscViewerCreate(comm,lab);CHKERRQ(ierr); 325*5c6c1daeSBarry Smith ierr = PetscViewerSetType(*lab,PETSCVIEWERASCII);CHKERRQ(ierr); 326*5c6c1daeSBarry Smith ierr = PetscViewerASCIISetFILE(*lab,fd);CHKERRQ(ierr); 327*5c6c1daeSBarry Smith PetscFunctionReturn(0); 328*5c6c1daeSBarry Smith } 329*5c6c1daeSBarry Smith 330*5c6c1daeSBarry Smith #undef __FUNCT__ 331*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerASCIISetFILE" 332*5c6c1daeSBarry Smith PetscErrorCode PetscViewerASCIISetFILE(PetscViewer viewer,FILE *fd) 333*5c6c1daeSBarry Smith { 334*5c6c1daeSBarry Smith PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data; 335*5c6c1daeSBarry Smith 336*5c6c1daeSBarry Smith PetscFunctionBegin; 337*5c6c1daeSBarry Smith vascii->fd = fd; 338*5c6c1daeSBarry Smith vascii->closefile = PETSC_FALSE; 339*5c6c1daeSBarry Smith PetscFunctionReturn(0); 340*5c6c1daeSBarry Smith } 341*5c6c1daeSBarry Smith 342*5c6c1daeSBarry Smith 343*5c6c1daeSBarry Smith 344