Actual source code: view.c


  2: #include <petsc/private/viewerimpl.h>
  3: #include <petscdraw.h>

  5: PetscClassId PETSC_VIEWER_CLASSID;

  7: static PetscBool PetscViewerPackageInitialized = PETSC_FALSE;
  8: /*@C
  9:   PetscViewerFinalizePackage - This function destroys any global objects created in the Petsc viewers. It is
 10:   called from PetscFinalize().

 12:   Level: developer

 14: .seealso: PetscFinalize()
 15: @*/
 16: PetscErrorCode  PetscViewerFinalizePackage(void)
 17: {

 21:   if (Petsc_Viewer_keyval != MPI_KEYVAL_INVALID) {
 22:     MPI_Comm_free_keyval(&Petsc_Viewer_keyval);
 23:   }
 24:   if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) {
 25:     MPI_Comm_free_keyval(&Petsc_Viewer_Stdout_keyval);
 26:   }
 27:   if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) {
 28:     MPI_Comm_free_keyval(&Petsc_Viewer_Stderr_keyval);
 29:   }
 30:   if (Petsc_Viewer_Binary_keyval != MPI_KEYVAL_INVALID) {
 31:     MPI_Comm_free_keyval(&Petsc_Viewer_Binary_keyval);
 32:   }
 33:   if (Petsc_Viewer_Draw_keyval != MPI_KEYVAL_INVALID) {
 34:     MPI_Comm_free_keyval(&Petsc_Viewer_Draw_keyval);
 35:   }
 36: #if defined(PETSC_HAVE_HDF5)
 37:   if (Petsc_Viewer_HDF5_keyval != MPI_KEYVAL_INVALID) {
 38:     MPI_Comm_free_keyval(&Petsc_Viewer_HDF5_keyval);
 39:   }
 40: #endif
 41: #if defined(PETSC_USE_SOCKETVIEWER)
 42:   if (Petsc_Viewer_Socket_keyval != MPI_KEYVAL_INVALID) {
 43:     MPI_Comm_free_keyval(&Petsc_Viewer_Socket_keyval);
 44:   }
 45: #endif
 46:   PetscFunctionListDestroy(&PetscViewerList);
 47:   PetscViewerPackageInitialized = PETSC_FALSE;
 48:   PetscViewerRegisterAllCalled  = PETSC_FALSE;
 49:   return(0);
 50: }

 52: /*@C
 53:   PetscViewerInitializePackage - This function initializes everything in the main PetscViewer package.

 55:   Level: developer

 57: .seealso: PetscInitialize()
 58: @*/
 59: PetscErrorCode  PetscViewerInitializePackage(void)
 60: {
 61:   char           logList[256];
 62:   PetscBool      opt,pkg;

 66:   if (PetscViewerPackageInitialized) return(0);
 67:   PetscViewerPackageInitialized = PETSC_TRUE;
 68:   /* Register Classes */
 69:   PetscClassIdRegister("Viewer",&PETSC_VIEWER_CLASSID);
 70:   /* Register Constructors */
 71:   PetscViewerRegisterAll();
 72:   /* Process Info */
 73:   {
 74:     PetscClassId  classids[1];

 76:     classids[0] = PETSC_VIEWER_CLASSID;
 77:     PetscInfoProcessClass("viewer", 1, classids);
 78:   }
 79:   /* Process summary exclusions */
 80:   PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);
 81:   if (opt) {
 82:     PetscStrInList("viewer",logList,',',&pkg);
 83:     if (pkg) {PetscLogEventExcludeClass(PETSC_VIEWER_CLASSID);}
 84:   }
 85: #if defined(PETSC_HAVE_MATHEMATICA)
 86:   PetscViewerMathematicaInitializePackage();
 87: #endif
 88:   /* Register package finalizer */
 89:   PetscRegisterFinalize(PetscViewerFinalizePackage);
 90:   return(0);
 91: }

 93: /*@
 94:    PetscViewerDestroy - Destroys a PetscViewer.

 96:    Collective on PetscViewer

 98:    Input Parameters:
 99: .  viewer - the PetscViewer to be destroyed.

101:    Level: beginner

103: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen()

105: @*/
106: PetscErrorCode  PetscViewerDestroy(PetscViewer *viewer)
107: {

111:   if (!*viewer) return(0);

114:   PetscViewerFlush(*viewer);
115:   if (--((PetscObject)(*viewer))->refct > 0) {*viewer = NULL; return(0);}

117:   PetscObjectSAWsViewOff((PetscObject)*viewer);
118:   if ((*viewer)->ops->destroy) {
119:     (*(*viewer)->ops->destroy)(*viewer);
120:   }
121:   PetscHeaderDestroy(viewer);
122:   return(0);
123: }

125: /*@C
126:    PetscViewerAndFormatCreate - Creates a PetscViewerAndFormat struct.

128:    Collective on PetscViewer

130:    Input Parameters:
131: +  viewer - the viewer
132: -  format - the format

134:    Output Parameter:
135: .   vf - viewer and format object

137:    Notes:
138:     This increases the reference count of the viewer so you can destroy the viewer object after this call
139:    Level: developer

141:    This is used as the context variable for many of the TS, SNES, and KSP monitor functions

143: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatDestroy()

145: @*/
146: PetscErrorCode PetscViewerAndFormatCreate(PetscViewer viewer, PetscViewerFormat format, PetscViewerAndFormat **vf)
147: {

151:   PetscObjectReference((PetscObject)viewer);
152:   PetscNew(vf);
153:   (*vf)->viewer = viewer;
154:   (*vf)->format = format;
155:   (*vf)->lg     = NULL;
156:   (*vf)->data   = NULL;
157:   return(0);
158: }

160: /*@C
161:    PetscViewerAndFormatDestroy - Destroys a PetscViewerAndFormat struct.

163:    Collective on PetscViewer

165:    Input Parameters:
166: .  vf - the PetscViewerAndFormat to be destroyed.

168:    Level: developer

170: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatCreate()
171: @*/
172: PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
173: {

177:   PetscViewerDestroy(&(*vf)->viewer);
178:   PetscDrawLGDestroy(&(*vf)->lg);
179:   PetscFree(*vf);
180:   return(0);
181: }

183: /*@C
184:    PetscViewerGetType - Returns the type of a PetscViewer.

186:    Not Collective

188:    Input Parameter:
189: .   viewer - the PetscViewer

191:    Output Parameter:
192: .  type - PetscViewer type (see below)

194:    Available Types Include:
195: +  PETSCVIEWERSOCKET - Socket PetscViewer
196: .  PETSCVIEWERASCII - ASCII PetscViewer
197: .  PETSCVIEWERBINARY - binary file PetscViewer
198: .  PETSCVIEWERSTRING - string PetscViewer
199: -  PETSCVIEWERDRAW - drawing PetscViewer

201:    Level: intermediate

203:    Note:
204:    See include/petscviewer.h for a complete list of PetscViewers.

206:    PetscViewerType is actually a string

208: .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType

210: @*/
211: PetscErrorCode  PetscViewerGetType(PetscViewer viewer,PetscViewerType *type)
212: {
216:   *type = ((PetscObject)viewer)->type_name;
217:   return(0);
218: }

220: /*@C
221:    PetscViewerSetOptionsPrefix - Sets the prefix used for searching for all
222:    PetscViewer options in the database.

224:    Logically Collective on PetscViewer

226:    Input Parameter:
227: +  viewer - the PetscViewer context
228: -  prefix - the prefix to prepend to all option names

230:    Notes:
231:    A hyphen (-) must NOT be given at the beginning of the prefix name.
232:    The first character of all runtime options is AUTOMATICALLY the hyphen.

234:    Level: advanced

236: .seealso: PetscViewerSetFromOptions()
237: @*/
238: PetscErrorCode  PetscViewerSetOptionsPrefix(PetscViewer viewer,const char prefix[])
239: {

244:   PetscObjectSetOptionsPrefix((PetscObject)viewer,prefix);
245:   return(0);
246: }

248: /*@C
249:    PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for all
250:    PetscViewer options in the database.

252:    Logically Collective on PetscViewer

254:    Input Parameters:
255: +  viewer - the PetscViewer context
256: -  prefix - the prefix to prepend to all option names

258:    Notes:
259:    A hyphen (-) must NOT be given at the beginning of the prefix name.
260:    The first character of all runtime options is AUTOMATICALLY the hyphen.

262:    Level: advanced

264: .seealso: PetscViewerGetOptionsPrefix()
265: @*/
266: PetscErrorCode  PetscViewerAppendOptionsPrefix(PetscViewer viewer,const char prefix[])
267: {

272:   PetscObjectAppendOptionsPrefix((PetscObject)viewer,prefix);
273:   return(0);
274: }

276: /*@C
277:    PetscViewerGetOptionsPrefix - Sets the prefix used for searching for all
278:    PetscViewer options in the database.

280:    Not Collective

282:    Input Parameter:
283: .  viewer - the PetscViewer context

285:    Output Parameter:
286: .  prefix - pointer to the prefix string used

288:    Notes:
289:     On the fortran side, the user should pass in a string 'prefix' of
290:    sufficient length to hold the prefix.

292:    Level: advanced

294: .seealso: PetscViewerAppendOptionsPrefix()
295: @*/
296: PetscErrorCode  PetscViewerGetOptionsPrefix(PetscViewer viewer,const char *prefix[])
297: {

302:   PetscObjectGetOptionsPrefix((PetscObject)viewer,prefix);
303:   return(0);
304: }

306: /*@
307:    PetscViewerSetUp - Sets up the internal viewer data structures for the later use.

309:    Collective on PetscViewer

311:    Input Parameters:
312: .  viewer - the PetscViewer context

314:    Notes:
315:    For basic use of the PetscViewer classes the user need not explicitly call
316:    PetscViewerSetUp(), since these actions will happen automatically.

318:    Level: advanced

320: .seealso: PetscViewerCreate(), PetscViewerDestroy()
321: @*/
322: PetscErrorCode  PetscViewerSetUp(PetscViewer viewer)
323: {

328:   if (viewer->setupcalled) return(0);
329:   if (viewer->ops->setup) {
330:     (*viewer->ops->setup)(viewer);
331:   }
332:   viewer->setupcalled = PETSC_TRUE;
333:   return(0);
334: }

336: /*@C
337:    PetscViewerViewFromOptions - View from Options

339:    Collective on PetscViewer

341:    Input Parameters:
342: +  A - the PetscViewer context
343: .  obj - Optional object
344: -  name - command line option

346:    Level: intermediate
347: .seealso:  PetscViewer, PetscViewerView, PetscObjectViewFromOptions(), PetscViewerCreate()
348: @*/
349: PetscErrorCode  PetscViewerViewFromOptions(PetscViewer A,PetscObject obj,const char name[])
350: {

355:   PetscObjectViewFromOptions((PetscObject)A,obj,name);
356:   return(0);
357: }

359: /*@C
360:    PetscViewerView - Visualizes a viewer object.

362:    Collective on PetscViewer

364:    Input Parameters:
365: +  v - the viewer to be viewed
366: -  viewer - visualization context

368:   Notes:
369:   The available visualization contexts include
370: +    PETSC_VIEWER_STDOUT_SELF - standard output (default)
371: .    PETSC_VIEWER_STDOUT_WORLD - synchronized standard
372:         output where only the first processor opens
373:         the file.  All other processors send their
374:         data to the first processor to print.
375: -     PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure

377:    Level: beginner

379: .seealso: PetscViewerPushFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(),
380:           PetscViewerSocketOpen(), PetscViewerBinaryOpen(), PetscViewerLoad()
381: @*/
382: PetscErrorCode  PetscViewerView(PetscViewer v,PetscViewer viewer)
383: {
384:   PetscErrorCode    ierr;
385:   PetscBool         iascii;
386:   PetscViewerFormat format;
387: #if defined(PETSC_HAVE_SAWS)
388:   PetscBool         issaws;
389: #endif

394:   if (!viewer) {
395:     PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v),&viewer);
396:   }

400:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
401: #if defined(PETSC_HAVE_SAWS)
402:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);
403: #endif
404:   if (iascii) {
405:     PetscViewerGetFormat(viewer,&format);
406:     PetscObjectPrintClassNamePrefixType((PetscObject)v,viewer);
407:     if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
408:       if (v->format) {
409:         PetscViewerASCIIPrintf(viewer,"  Viewer format = %s\n",PetscViewerFormats[v->format]);
410:       }
411:       PetscViewerASCIIPushTab(viewer);
412:       if (v->ops->view) {
413:         (*v->ops->view)(v,viewer);
414:       }
415:       PetscViewerASCIIPopTab(viewer);
416:     }
417: #if defined(PETSC_HAVE_SAWS)
418:   } else if (issaws) {
419:     if (!((PetscObject)v)->amsmem) {
420:       PetscObjectViewSAWs((PetscObject)v,viewer);
421:       if (v->ops->view) {
422:         (*v->ops->view)(v,viewer);
423:       }
424:     }
425: #endif
426:   }
427:   return(0);
428: }

430: /*@C
431:    PetscViewerRead - Reads data from a PetscViewer

433:    Collective

435:    Input Parameters:
436: +  viewer   - The viewer
437: .  data     - Location to write the data
438: .  num      - Number of items of data to read
439: -  datatype - Type of data to read

441:    Output Parameters:
442: .  count - number of items of data actually read, or NULL

444:    Notes:
445:    If datatype is PETSC_STRING and num is negative, reads until a newline character is found,
446:    until a maximum of (-num - 1) chars.

448:    Level: beginner

450: .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
451:           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
452:           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer
453: @*/
454: PetscErrorCode  PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
455: {

460:   if (dtype == PETSC_STRING) {
461:     PetscInt c, i = 0, cnt;
462:     char *s = (char *)data;
463:     if (num >= 0) {
464:       for (c = 0; c < num; c++) {
465:         /* Skip leading whitespaces */
466:         do {(*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR); if (!cnt) break;}
467:         while (s[i]=='\n' || s[i]=='\t' || s[i]==' ' || s[i]=='\0' || s[i]=='\v' || s[i]=='\f' || s[i]=='\r');
468:         i++;
469:         /* Read strings one char at a time */
470:         do {(*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR); if (!cnt) break;}
471:         while (s[i-1]!='\n' && s[i-1]!='\t' && s[i-1]!=' ' && s[i-1]!='\0' && s[i-1]!='\v' && s[i-1]!='\f' && s[i-1]!='\r');
472:         /* Terminate final string */
473:         if (c == num-1) s[i-1] = '\0';
474:       }
475:     } else {
476:       /* Read until a \n is encountered (-num is the max size allowed) */
477:       do {(*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR); if (i == -num || !cnt) break;}
478:       while (s[i-1]!='\n');
479:       /* Terminate final string */
480:       s[i-1] = '\0';
481:       c      = i;
482:     }
483:     if (count) *count = c;
484:     else if (c < num) SETERRQ2(PetscObjectComm((PetscObject) viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %D < %D strings", c, num);
485:   } else {
486:     (*viewer->ops->read)(viewer, data, num, count, dtype);
487:   }
488:   return(0);
489: }

491: /*@
492:    PetscViewerReadable - Return a flag whether the viewer can be read from

494:    Not Collective

496:    Input Parameters:
497: .  viewer - the PetscViewer context

499:    Output Parameters:
500: .  flg - PETSC_TRUE if the viewer is readable, PETSC_FALSE otherwise

502:    Notes:
503:    PETSC_TRUE means that viewer's PetscViewerType supports reading (this holds e.g. for PETSCVIEWERBINARY)
504:    and viewer is in a mode allowing reading, i.e. PetscViewerFileGetMode()
505:    returns one of FILE_MODE_READ, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE.

507:    Level: intermediate

509: .seealso: PetscViewerWritable(), PetscViewerCheckReadable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType()
510: @*/
511: PetscErrorCode  PetscViewerReadable(PetscViewer viewer, PetscBool *flg)
512: {
513:   PetscErrorCode    ierr;
514:   PetscFileMode     mode;
515:   PetscErrorCode    (*f)(PetscViewer,PetscFileMode*) = NULL;

520:   PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f);
521:   *flg = PETSC_FALSE;
522:   if (!f) return(0);
523:   (*f)(viewer, &mode);
524:   switch (mode) {
525:     case FILE_MODE_READ:
526:     case FILE_MODE_UPDATE:
527:     case FILE_MODE_APPEND_UPDATE:
528:       *flg = PETSC_TRUE;
529:     default: break;
530:   }
531:   return(0);
532: }

534: /*@
535:    PetscViewerWritable - Return a flag whether the viewer can be written to

537:    Not Collective

539:    Input Parameters:
540: .  viewer - the PetscViewer context

542:    Output Parameters:
543: .  flg - PETSC_TRUE if the viewer is writable, PETSC_FALSE otherwise

545:    Notes:
546:    PETSC_TRUE means viewer is in a mode allowing writing, i.e. PetscViewerFileGetMode()
547:    returns one of FILE_MODE_WRITE, FILE_MODE_APPEND, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE.

549:    Level: intermediate

551: .seealso: PetscViewerReadable(), PetscViewerCheckWritable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType()
552: @*/
553: PetscErrorCode  PetscViewerWritable(PetscViewer viewer, PetscBool *flg)
554: {
555:   PetscErrorCode    ierr;
556:   PetscFileMode     mode;
557:   PetscErrorCode    (*f)(PetscViewer,PetscFileMode*) = NULL;

562:   PetscObjectQueryFunction((PetscObject)viewer, "PetscViewerFileGetMode_C", &f);
563:   *flg = PETSC_TRUE;
564:   if (!f) return(0);
565:   (*f)(viewer, &mode);
566:   if (mode == FILE_MODE_READ) *flg = PETSC_FALSE;
567:   return(0);
568: }

570: /*@
571:    PetscViewerCheckReadable - Check whether the viewer can be read from

573:    Collective

575:    Input Parameters:
576: .  viewer - the PetscViewer context

578:    Level: intermediate

580: .seealso: PetscViewerReadable(), PetscViewerCheckWritable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType()
581: @*/
582: PetscErrorCode  PetscViewerCheckReadable(PetscViewer viewer)
583: {
584:   PetscBool         flg;
585:   PetscErrorCode    ierr;

589:   PetscViewerReadable(viewer, &flg);
590:   if (!flg) SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support reading, or is not in reading mode (FILE_MODE_READ, FILE_MODE_UPDATE, FILE_MODE_APPEND_UPDATE)");
591:   return(0);
592: }

594: /*@
595:    PetscViewerCheckWritable - Check whether the viewer can be written to

597:    Collective

599:    Input Parameters:
600: .  viewer - the PetscViewer context

602:    Level: intermediate

604: .seealso: PetscViewerWritable(), PetscViewerCheckReadable(), PetscViewerCreate(), PetscViewerFileSetMode(), PetscViewerFileSetType()
605: @*/
606: PetscErrorCode  PetscViewerCheckWritable(PetscViewer viewer)
607: {
608:   PetscBool         flg;
609:   PetscErrorCode    ierr;

613:   PetscViewerWritable(viewer, &flg);
614:   if (!flg) SETERRQ(PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer doesn't support writing, or is in FILE_MODE_READ mode");
615:   return(0);
616: }