Actual source code: vcreatea.c

petsc-3.3-p7 2013-05-11
  2: #include <../src/sys/viewer/impls/ascii/asciiimpl.h>  /*I     "petscsys.h"   I*/

  4: /* ---------------------------------------------------------------------*/
  5: /*
  6:     The variable Petsc_Viewer_Stdout_keyval is used to indicate an MPI attribute that
  7:   is attached to a communicator, in this case the attribute is a PetscViewer.
  8: */
  9: static PetscMPIInt Petsc_Viewer_Stdout_keyval = MPI_KEYVAL_INVALID;

 13: /*@C
 14:    PetscViewerASCIIGetStdout - Creates a ASCII PetscViewer shared by all processors 
 15:                     in a communicator. Error returning version of PETSC_VIEWER_STDOUT_()

 17:    Collective on MPI_Comm

 19:    Input Parameter:
 20: .  comm - the MPI communicator to share the PetscViewer

 22:    Level: beginner

 24:    Notes: 
 25:      This should be used in all PETSc source code instead of PETSC_VIEWER_STDOUT_()

 27: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD,
 28:           PETSC_VIEWER_STDOUT_SELF

 30: @*/
 31: PetscErrorCode  PetscViewerASCIIGetStdout(MPI_Comm comm,PetscViewer *viewer)
 32: {
 34:   PetscBool      flg;
 35:   MPI_Comm       ncomm;

 38:   PetscCommDuplicate(comm,&ncomm,PETSC_NULL);
 39:   if (Petsc_Viewer_Stdout_keyval == MPI_KEYVAL_INVALID) {
 40:     MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stdout_keyval,0);
 41:   }
 42:   MPI_Attr_get(ncomm,Petsc_Viewer_Stdout_keyval,(void **)viewer,(PetscMPIInt*)&flg);
 43:   if (!flg) { /* PetscViewer not yet created */
 44:     PetscViewerASCIIOpen(ncomm,"stdout",viewer);
 45:     PetscObjectRegisterDestroy((PetscObject)*viewer);
 46:     MPI_Attr_put(ncomm,Petsc_Viewer_Stdout_keyval,(void*)*viewer);
 47:   }
 48:   PetscCommDestroy(&ncomm);
 49:   return(0);
 50: }

 54: /*@C
 55:    PETSC_VIEWER_STDOUT_ - Creates a ASCII PetscViewer shared by all processors 
 56:                     in a communicator.

 58:    Collective on MPI_Comm

 60:    Input Parameter:
 61: .  comm - the MPI communicator to share the PetscViewer

 63:    Level: beginner

 65:    Notes: 
 66:    Unlike almost all other PETSc routines, this does not return 
 67:    an error code. Usually used in the form
 68: $      XXXView(XXX object,PETSC_VIEWER_STDOUT_(comm));

 70: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDOUT_WORLD,
 71:           PETSC_VIEWER_STDOUT_SELF

 73: @*/
 74: PetscViewer  PETSC_VIEWER_STDOUT_(MPI_Comm comm)
 75: {
 77:   PetscViewer    viewer;

 80:   PetscViewerASCIIGetStdout(comm,&viewer);
 81:   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_STDOUT_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); return(0);}
 82:   PetscFunctionReturn(viewer);
 83: }

 85: /* ---------------------------------------------------------------------*/
 86: /*
 87:     The variable Petsc_Viewer_Stderr_keyval is used to indicate an MPI attribute that
 88:   is attached to a communicator, in this case the attribute is a PetscViewer.
 89: */
 90: static PetscMPIInt Petsc_Viewer_Stderr_keyval = MPI_KEYVAL_INVALID;

 94: /*@C
 95:    PetscViewerASCIIGetStderr - Creates a ASCII PetscViewer shared by all processors 
 96:                     in a communicator. Error returning version of PETSC_VIEWER_STDERR_()

 98:    Collective on MPI_Comm

100:    Input Parameter:
101: .  comm - the MPI communicator to share the PetscViewer

103:    Level: beginner

105:    Notes: 
106:      This should be used in all PETSc source code instead of PETSC_VIEWER_STDERR_()

108: .seealso: PETSC_VIEWER_DRAW_(), PetscViewerASCIIOpen(), PETSC_VIEWER_STDERR_, PETSC_VIEWER_STDERR_WORLD,
109:           PETSC_VIEWER_STDERR_SELF

111: @*/
112: PetscErrorCode  PetscViewerASCIIGetStderr(MPI_Comm comm,PetscViewer *viewer)
113: {
115:   PetscBool      flg;
116:   MPI_Comm       ncomm;

119:   PetscCommDuplicate(comm,&ncomm,PETSC_NULL);
120:   if (Petsc_Viewer_Stderr_keyval == MPI_KEYVAL_INVALID) {
121:     MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Stderr_keyval,0);
122:   }
123:   MPI_Attr_get(ncomm,Petsc_Viewer_Stderr_keyval,(void **)viewer,(PetscMPIInt*)&flg);
124:   if (!flg) { /* PetscViewer not yet created */
125:     PetscViewerASCIIOpen(ncomm,"stderr",viewer);
126:     PetscObjectRegisterDestroy((PetscObject)*viewer);
127:     MPI_Attr_put(ncomm,Petsc_Viewer_Stderr_keyval,(void*)*viewer);
128:   }
129:   PetscCommDestroy(&ncomm);
130:   return(0);
131: }

135: /*@C
136:    PETSC_VIEWER_STDERR_ - Creates a ASCII PetscViewer shared by all processors 
137:                     in a communicator.

139:    Collective on MPI_Comm

141:    Input Parameter:
142: .  comm - the MPI communicator to share the PetscViewer

144:    Level: beginner

146:    Note: 
147:    Unlike almost all other PETSc routines, this does not return 
148:    an error code. Usually used in the form
149: $      XXXView(XXX object,PETSC_VIEWER_STDERR_(comm));

151: .seealso: PETSC_VIEWER_DRAW_, PetscViewerASCIIOpen(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDOUT_WORLD,
152:           PETSC_VIEWER_STDOUT_SELF, PETSC_VIEWER_STDERR_WORLD, PETSC_VIEWER_STDERR_SELF
153: @*/
154: PetscViewer  PETSC_VIEWER_STDERR_(MPI_Comm comm)
155: {
157:   PetscViewer    viewer;

160:   PetscViewerASCIIGetStderr(comm,&viewer);
161:   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_STDERR_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," "); return(0);}
162:   PetscFunctionReturn(viewer);
163: }


166: PetscMPIInt Petsc_Viewer_keyval = MPI_KEYVAL_INVALID;
167: EXTERN_C_BEGIN
170: /*
171:    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:    PetscObjectDestroyRegisterAll(). PetscViewerASCIIGetStdout() registers the viewer with PetscObjectDestroyRegister() to be destroyed when PetscFinalize() is called.

174:   This is called by MPI, not by users.

176: */
177: PetscMPIInt  MPIAPI Petsc_DelViewer(MPI_Comm comm,PetscMPIInt keyval,void* attr_val,void* extra_state)
178: {

182:   PetscInfo1(0,"Removing viewer data attribute in an MPI_Comm %ld\n",(long)comm);if (ierr) PetscFunctionReturn((PetscMPIInt)ierr);
183:   PetscFunctionReturn(MPI_SUCCESS);
184: }
185: EXTERN_C_END

189: /*@C
190:    PetscViewerASCIIOpen - Opens an ASCII file as a PetscViewer.

192:    Collective on MPI_Comm

194:    Input Parameters:
195: +  comm - the communicator
196: -  name - the file name

198:    Output Parameter:
199: .  lab - the PetscViewer to use with the specified file

201:    Level: beginner

203:    Notes:
204:    This PetscViewer can be destroyed with PetscViewerDestroy().

206:    If a multiprocessor communicator is used (such as PETSC_COMM_WORLD), 
207:    then only the first processor in the group opens the file.  All other 
208:    processors send their data to the first processor to print. 

210:    Each processor can instead write its own independent output by
211:    specifying the communicator PETSC_COMM_SELF.

213:    As shown below, PetscViewerASCIIOpen() is useful in conjunction with 
214:    MatView() and VecView()
215: .vb
216:      PetscViewerASCIIOpen(PETSC_COMM_WORLD,"mat.output",&viewer);
217:      MatView(matrix,viewer);
218: .ve

220:   Concepts: PetscViewerASCII^creating
221:   Concepts: printf
222:   Concepts: printing
223:   Concepts: accessing remote file
224:   Concepts: remote file

226: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
227:           PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
228:           PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF, 
229: @*/
230: PetscErrorCode  PetscViewerASCIIOpen(MPI_Comm comm,const char name[],PetscViewer *lab)
231: {
232:   PetscErrorCode    ierr;
233:   PetscViewerLink   *vlink,*nv;
234:   PetscBool         flg,eq;
235:   size_t            len;

238:   PetscStrlen(name,&len);
239:   if (!len) {
240:     PetscViewerASCIIGetStdout(comm,lab);
241:     PetscObjectReference((PetscObject)*lab);
242:     return(0);
243:   }
244:   if (Petsc_Viewer_keyval == MPI_KEYVAL_INVALID) {
245:     MPI_Keyval_create(MPI_NULL_COPY_FN,Petsc_DelViewer,&Petsc_Viewer_keyval,(void*)0);
246:   }
247:   /* make sure communicator is a PETSc communicator */
248:   PetscCommDuplicate(comm,&comm,PETSC_NULL);
249:   /* has file already been opened into a viewer */
250:   MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);
251:   if (flg) {
252:     while (vlink) {
253:       PetscStrcmp(name,((PetscViewer_ASCII*)(vlink->viewer->data))->filename,&eq);
254:       if (eq) {
255:         PetscObjectReference((PetscObject)vlink->viewer);
256:         *lab = vlink->viewer;
257:         PetscCommDestroy(&comm);
258:         return(0);
259:       }
260:       vlink = vlink->next;
261:     }
262:   }
263:   PetscViewerCreate(comm,lab);
264:   PetscViewerSetType(*lab,PETSCVIEWERASCII);
265:   if (name) {
266:     PetscViewerFileSetName(*lab,name);
267:   }
268:   /* save viewer into communicator if needed later */
269:   PetscNew(PetscViewerLink,&nv);
270:   nv->viewer = *lab;
271:   if (!flg) {
272:     MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);
273:   } else {
274:     MPI_Attr_get(comm,Petsc_Viewer_keyval,(void**)&vlink,(PetscMPIInt*)&flg);
275:     if (vlink) {
276:       while (vlink->next) vlink = vlink->next;
277:       vlink->next = nv;
278:     } else {
279:       MPI_Attr_put(comm,Petsc_Viewer_keyval,nv);
280:     }
281:   }
282:   PetscCommDestroy(&comm);
283:   return(0);
284: }

288: /*@C
289:    PetscViewerASCIIOpenWithFILE - Given an open file creates an ASCII viewer that prints to it.

291:    Collective on MPI_Comm

293:    Input Parameters:
294: +  comm - the communicator
295: -  fd - the FILE pointer

297:    Output Parameter:
298: .  lab - the PetscViewer to use with the specified file

300:    Level: beginner

302:    Notes:
303:    This PetscViewer can be destroyed with PetscViewerDestroy(), but the fd will NOT be closed.

305:    If a multiprocessor communicator is used (such as PETSC_COMM_WORLD), 
306:    then only the first processor in the group uses the file.  All other 
307:    processors send their data to the first processor to print. 

309:   Concepts: PetscViewerASCII^creating
310:   Concepts: printf
311:   Concepts: printing
312:   Concepts: accessing remote file
313:   Concepts: remote file

315: .seealso: MatView(), VecView(), PetscViewerDestroy(), PetscViewerBinaryOpen(),
316:           PetscViewerASCIIGetPointer(), PetscViewerSetFormat(), PETSC_VIEWER_STDOUT_, PETSC_VIEWER_STDERR_,
317:           PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_STDOUT_SELF, PetscViewerASCIIOpen()
318: @*/
319: PetscErrorCode  PetscViewerASCIIOpenWithFILE(MPI_Comm comm,FILE *fd,PetscViewer *lab)
320: {
321:   PetscErrorCode    ierr;

324:   PetscViewerCreate(comm,lab);
325:   PetscViewerSetType(*lab,PETSCVIEWERASCII);
326:   PetscViewerASCIISetFILE(*lab,fd);
327:   return(0);
328: }

332: PetscErrorCode  PetscViewerASCIISetFILE(PetscViewer viewer,FILE *fd)
333: {
334:   PetscViewer_ASCII *vascii = (PetscViewer_ASCII*)viewer->data;

337:   vascii->fd        = fd;
338:   vascii->closefile = PETSC_FALSE;
339:   return(0);
340: }