Actual source code: view.c

petsc-3.7.7 2017-09-25
Report Typos and Errors
  2: #include <petsc/private/viewerimpl.h>  /*I "petscviewer.h" I*/

  4: PetscClassId PETSC_VIEWER_CLASSID;

  6: static PetscBool PetscViewerPackageInitialized = PETSC_FALSE;
  9: /*@C
 10:   PetscViewerFinalizePackage - This function destroys everything in the Petsc interface to Mathematica. It is
 11:   called from PetscFinalize().

 13:   Level: developer

 15: .keywords: Petsc, destroy, package, mathematica
 16: .seealso: PetscFinalize()
 17: @*/
 18: PetscErrorCode  PetscViewerFinalizePackage(void)
 19: {

 23:   PetscFunctionListDestroy(&PetscViewerList);
 24:   PetscViewerPackageInitialized = PETSC_FALSE;
 25:   PetscViewerRegisterAllCalled  = PETSC_FALSE;
 26:   return(0);
 27: }

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

 34:   Level: developer

 36: .keywords: Petsc, initialize, package
 37: .seealso: PetscInitialize()
 38: @*/
 39: PetscErrorCode  PetscViewerInitializePackage(void)
 40: {
 41:   char           logList[256];
 42:   char           *className;
 43:   PetscBool      opt;

 47:   if (PetscViewerPackageInitialized) return(0);
 48:   PetscViewerPackageInitialized = PETSC_TRUE;
 49:   /* Register Classes */
 50:   PetscClassIdRegister("Viewer",&PETSC_VIEWER_CLASSID);

 52:   /* Register Constructors */
 53:   PetscViewerRegisterAll();

 55:   /* Process info exclusions */
 56:   PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);
 57:   if (opt) {
 58:     PetscStrstr(logList, "viewer", &className);
 59:     if (className) {
 60:       PetscInfoDeactivateClass(0);
 61:     }
 62:   }
 63:   /* Process summary exclusions */
 64:   PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);
 65:   if (opt) {
 66:     PetscStrstr(logList, "viewer", &className);
 67:     if (className) {
 68:       PetscLogEventDeactivateClass(0);
 69:     }
 70:   }
 71: #if defined(PETSC_HAVE_MATHEMATICA)
 72:   PetscViewerMathematicaInitializePackage();
 73: #endif
 74:   PetscRegisterFinalize(PetscViewerFinalizePackage);
 75:   return(0);
 76: }

 80: /*@
 81:    PetscViewerDestroy - Destroys a PetscViewer.

 83:    Collective on PetscViewer

 85:    Input Parameters:
 86: .  viewer - the PetscViewer to be destroyed.

 88:    Level: beginner

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

 92: @*/
 93: PetscErrorCode  PetscViewerDestroy(PetscViewer *viewer)
 94: {

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

101:   PetscViewerFlush(*viewer);
102:   if (--((PetscObject)(*viewer))->refct > 0) {*viewer = 0; return(0);}

104:   PetscObjectSAWsViewOff((PetscObject)*viewer);
105:   if ((*viewer)->ops->destroy) {
106:     (*(*viewer)->ops->destroy)(*viewer);
107:   }
108:   PetscHeaderDestroy(viewer);
109:   return(0);
110: }

114: /*@C
115:    PetscViewerAndFormatCreate - Creates a PetscViewerAndFormat struct.

117:    Collective on PetscViewer

119:    Input Parameters:
120: +  viewer - the viewer
121: -  format - the format 

123:    Output Parameter:
124: .   vf - viewer and format object

126:    Notes: This increases the reference count of the viewer so you can destroy the viewer object after this call
127:    Level: developer

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

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

133: @*/
134: PetscErrorCode  PetscViewerAndFormatCreate(PetscViewer viewer, PetscViewerFormat format,PetscViewerAndFormat **vf)
135: {

139:   PetscObjectReference((PetscObject)viewer);
140:   PetscNew(vf);
141:   (*vf)->viewer = viewer;
142:   (*vf)->format = format;
143:   return(0);
144: }


149: /*@C
150:    PetscViewerAndFormatDestroy - Destroys a PetscViewerAndFormat struct.

152:    Collective on PetscViewer

154:    Input Parameters:
155: .  viewer - the PetscViewerAndFormat to be destroyed.

157:    Level: developer

159: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatCreate()

161: @*/
162: PetscErrorCode  PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
163: {

167:   PetscViewerDestroy(&(*vf)->viewer);
168:   PetscFree(*vf);
169:   return(0);
170: }

174: /*@C
175:    PetscViewerGetType - Returns the type of a PetscViewer.

177:    Not Collective

179:    Input Parameter:
180: .   viewer - the PetscViewer

182:    Output Parameter:
183: .  type - PetscViewer type (see below)

185:    Available Types Include:
186: .  PETSCVIEWERSOCKET - Socket PetscViewer
187: .  PETSCVIEWERASCII - ASCII PetscViewer
188: .  PETSCVIEWERBINARY - binary file PetscViewer
189: .  PETSCVIEWERSTRING - string PetscViewer
190: .  PETSCVIEWERDRAW - drawing PetscViewer

192:    Level: intermediate

194:    Note:
195:    See include/petscviewer.h for a complete list of PetscViewers.

197:    PetscViewerType is actually a string

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

201: @*/
202: PetscErrorCode  PetscViewerGetType(PetscViewer viewer,PetscViewerType *type)
203: {
207:   *type = ((PetscObject)viewer)->type_name;
208:   return(0);
209: }

213: /*@C
214:    PetscViewerSetOptionsPrefix - Sets the prefix used for searching for all
215:    PetscViewer options in the database.

217:    Logically Collective on PetscViewer

219:    Input Parameter:
220: +  viewer - the PetscViewer context
221: -  prefix - the prefix to prepend to all option names

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

227:    Level: advanced

229: .keywords: PetscViewer, set, options, prefix, database

231: .seealso: PetscViewerSetFromOptions()
232: @*/
233: PetscErrorCode  PetscViewerSetOptionsPrefix(PetscViewer viewer,const char prefix[])
234: {

239:   PetscObjectSetOptionsPrefix((PetscObject)viewer,prefix);
240:   return(0);
241: }

245: /*@C
246:    PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for all
247:    PetscViewer options in the database.

249:    Logically Collective on PetscViewer

251:    Input Parameters:
252: +  viewer - the PetscViewer context
253: -  prefix - the prefix to prepend to all option names

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

259:    Level: advanced

261: .keywords: PetscViewer, append, options, prefix, database

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

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

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

281:    Not Collective

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

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

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

292:    Level: advanced

294: .keywords: PetscViewer, get, options, prefix, database

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

304:   PetscObjectGetOptionsPrefix((PetscObject)viewer,prefix);
305:   return(0);
306: }

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

313:    Collective on PetscViewer

315:    Input Parameters:
316: .  viewer - the PetscViewer context

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

322:    Level: advanced

324: .keywords: PetscViewer, setup

326: .seealso: PetscViewerCreate(), PetscViewerDestroy()
327: @*/
328: PetscErrorCode  PetscViewerSetUp(PetscViewer viewer)
329: {

334:   if (viewer->setupcalled) return(0);
335:   if (viewer->ops->setup) {
336:     (*viewer->ops->setup)(viewer);
337:   }
338:   viewer->setupcalled = PETSC_TRUE;
339:   return(0);
340: }

344: /*@C
345:    PetscViewerView - Visualizes a viewer object.

347:    Collective on PetscViewer

349:    Input Parameters:
350: +  v - the viewer
351: -  viewer - visualization context

353:   Notes:
354:   The available visualization contexts include
355: +    PETSC_VIEWER_STDOUT_SELF - standard output (default)
356: .    PETSC_VIEWER_STDOUT_WORLD - synchronized standard
357:         output where only the first processor opens
358:         the file.  All other processors send their
359:         data to the first processor to print.
360: -     PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure

362:    Level: beginner

364: .seealso: PetscViewerPushFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(),
365:           PetscViewerSocketOpen(), PetscViewerBinaryOpen(), PetscViewerLoad()
366: @*/
367: PetscErrorCode  PetscViewerView(PetscViewer v,PetscViewer viewer)
368: {
369:   PetscErrorCode    ierr;
370:   PetscBool         iascii;
371:   PetscViewerFormat format;
372: #if defined(PETSC_HAVE_SAWS)
373:   PetscBool         issaws;
374: #endif

379:   if (!viewer) {
380:     PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v),&viewer);
381:   }

385:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
386: #if defined(PETSC_HAVE_SAWS)
387:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);
388: #endif
389:   if (iascii) {
390:     PetscViewerGetFormat(viewer,&format);
391:     PetscObjectPrintClassNamePrefixType((PetscObject)v,viewer);
392:     if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
393:       if (v->format) {
394:         PetscViewerASCIIPrintf(viewer,"  Viewer format = %s\n",PetscViewerFormats[v->format]);
395:       }
396:       PetscViewerASCIIPushTab(viewer);
397:       if (v->ops->view) {
398:         (*v->ops->view)(v,viewer);
399:       }
400:       PetscViewerASCIIPopTab(viewer);
401:     }
402: #if defined(PETSC_HAVE_SAWS)
403:   } else if (issaws) {
404:     if (!((PetscObject)v)->amsmem) {
405:       PetscObjectViewSAWs((PetscObject)v,viewer);
406:       if (v->ops->view) {
407:         (*v->ops->view)(v,viewer);
408:       }
409:     }
410: #endif
411:   }
412:   return(0);
413: }

417: /*@C
418:    PetscViewerRead - Reads data from a PetscViewer

420:    Collective on MPI_Comm

422:    Input Parameters:
423: +  viewer   - The viewer
424: .  data     - Location to write the data
425: .  num      - Number of items of data to read
426: -  datatype - Type of data to read

428:    Output Parameters:
429: .  count - number of items of data actually read, or NULL

431:    Level: beginner

433:    Concepts: binary files, ascii files

435: .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
436:           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
437:           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer
438: @*/
439: PetscErrorCode  PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
440: {

445:   if (dtype == PETSC_STRING) {
446:     PetscInt c, i = 0, cnt;
447:     char *s = (char *)data;
448:     for (c = 0; c < num; c++) {
449:       /* Skip leading whitespaces */
450:       do {(*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR); if (count && !cnt) break;}
451:       while (s[i]=='\n' || s[i]=='\t' || s[i]==' ' || s[i]=='\0' || s[i]=='\v' || s[i]=='\f' || s[i]=='\r');
452:       i++;
453:       /* Read strings one char at a time */
454:       do {(*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR); if (count && !cnt) break;}
455:       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');
456:       /* Terminate final string */
457:       if (c == num-1) s[i-1] = '\0';
458:     }
459:     if (count) *count = c;
460:     else if (c < num) SETERRQ2(PetscObjectComm((PetscObject) viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %D < %D strings", c, num);
461:   } else {
462:     (*viewer->ops->read)(viewer, data, num, count, dtype);
463:   }
464:   return(0);
465: }