Actual source code: view.c
petsc-3.8.4 2018-03-24
2: #include <petsc/private/viewerimpl.h>
4: PetscClassId PETSC_VIEWER_CLASSID;
6: static PetscBool PetscViewerPackageInitialized = PETSC_FALSE;
7: /*@C
8: PetscViewerFinalizePackage - This function destroys any global objects created in the Petsc viewers. It is
9: called from PetscFinalize().
11: Level: developer
13: .keywords: Petsc, destroy, package, mathematica
14: .seealso: PetscFinalize()
15: @*/
16: PetscErrorCode PetscViewerFinalizePackage(void)
17: {
21: if (Petsc_Viewer_keyval != MPI_KEYVAL_INVALID) {
22: MPI_Keyval_free(&Petsc_Viewer_keyval);
23: }
24: if (Petsc_Viewer_Stdout_keyval != MPI_KEYVAL_INVALID) {
25: MPI_Keyval_free(&Petsc_Viewer_Stdout_keyval);
26: }
27: if (Petsc_Viewer_Stderr_keyval != MPI_KEYVAL_INVALID) {
28: MPI_Keyval_free(&Petsc_Viewer_Stderr_keyval);
29: }
30: if (Petsc_Viewer_Binary_keyval != MPI_KEYVAL_INVALID) {
31: MPI_Keyval_free(&Petsc_Viewer_Binary_keyval);
32: }
33: if (Petsc_Viewer_Draw_keyval != MPI_KEYVAL_INVALID) {
34: MPI_Keyval_free(&Petsc_Viewer_Draw_keyval);
35: }
36: #if defined(PETSC_HAVE_HDF5)
37: if (Petsc_Viewer_HDF5_keyval != MPI_KEYVAL_INVALID) {
38: MPI_Keyval_free(&Petsc_Viewer_HDF5_keyval);
39: }
40: #endif
41: #if defined(PETSC_USE_SOCKETVIEWER)
42: if (Petsc_Viewer_Socket_keyval != MPI_KEYVAL_INVALID) {
43: MPI_Keyval_free(&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: .keywords: Petsc, initialize, package
58: .seealso: PetscInitialize()
59: @*/
60: PetscErrorCode PetscViewerInitializePackage(void)
61: {
62: char logList[256];
63: char *className;
64: PetscBool opt;
68: if (PetscViewerPackageInitialized) return(0);
69: PetscViewerPackageInitialized = PETSC_TRUE;
70: /* Register Classes */
71: PetscClassIdRegister("Viewer",&PETSC_VIEWER_CLASSID);
73: /* Register Constructors */
74: PetscViewerRegisterAll();
76: /* Process info exclusions */
77: PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);
78: if (opt) {
79: PetscStrstr(logList, "viewer", &className);
80: if (className) {
81: PetscInfoDeactivateClass(0);
82: }
83: }
84: /* Process summary exclusions */
85: PetscOptionsGetString(NULL,NULL, "-log_exclude", logList, 256, &opt);
86: if (opt) {
87: PetscStrstr(logList, "viewer", &className);
88: if (className) {
89: PetscLogEventDeactivateClass(0);
90: }
91: }
92: #if defined(PETSC_HAVE_MATHEMATICA)
93: PetscViewerMathematicaInitializePackage();
94: #endif
95: PetscRegisterFinalize(PetscViewerFinalizePackage);
96: return(0);
97: }
99: /*@
100: PetscViewerDestroy - Destroys a PetscViewer.
102: Collective on PetscViewer
104: Input Parameters:
105: . viewer - the PetscViewer to be destroyed.
107: Level: beginner
109: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen()
111: @*/
112: PetscErrorCode PetscViewerDestroy(PetscViewer *viewer)
113: {
117: if (!*viewer) return(0);
120: PetscViewerFlush(*viewer);
121: if (--((PetscObject)(*viewer))->refct > 0) {*viewer = 0; return(0);}
123: PetscObjectSAWsViewOff((PetscObject)*viewer);
124: if ((*viewer)->ops->destroy) {
125: (*(*viewer)->ops->destroy)(*viewer);
126: }
127: PetscHeaderDestroy(viewer);
128: return(0);
129: }
131: /*@C
132: PetscViewerAndFormatCreate - Creates a PetscViewerAndFormat struct.
134: Collective on PetscViewer
136: Input Parameters:
137: + viewer - the viewer
138: - format - the format
140: Output Parameter:
141: . vf - viewer and format object
143: Notes: This increases the reference count of the viewer so you can destroy the viewer object after this call
144: Level: developer
146: This is used as the context variable for many of the TS, SNES, and KSP monitor functions
148: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatDestroy()
150: @*/
151: PetscErrorCode PetscViewerAndFormatCreate(PetscViewer viewer, PetscViewerFormat format,PetscViewerAndFormat **vf)
152: {
156: PetscObjectReference((PetscObject)viewer);
157: PetscNew(vf);
158: (*vf)->viewer = viewer;
159: (*vf)->format = format;
160: return(0);
161: }
164: /*@C
165: PetscViewerAndFormatDestroy - Destroys a PetscViewerAndFormat struct.
167: Collective on PetscViewer
169: Input Parameters:
170: . viewer - the PetscViewerAndFormat to be destroyed.
172: Level: developer
174: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen(), PetscViewerAndFormatCreate()
176: @*/
177: PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
178: {
182: PetscViewerDestroy(&(*vf)->viewer);
183: PetscFree(*vf);
184: return(0);
185: }
187: /*@C
188: PetscViewerGetType - Returns the type of a PetscViewer.
190: Not Collective
192: Input Parameter:
193: . viewer - the PetscViewer
195: Output Parameter:
196: . type - PetscViewer type (see below)
198: Available Types Include:
199: . PETSCVIEWERSOCKET - Socket PetscViewer
200: . PETSCVIEWERASCII - ASCII PetscViewer
201: . PETSCVIEWERBINARY - binary file PetscViewer
202: . PETSCVIEWERSTRING - string PetscViewer
203: . PETSCVIEWERDRAW - drawing PetscViewer
205: Level: intermediate
207: Note:
208: See include/petscviewer.h for a complete list of PetscViewers.
210: PetscViewerType is actually a string
212: .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType
214: @*/
215: PetscErrorCode PetscViewerGetType(PetscViewer viewer,PetscViewerType *type)
216: {
220: *type = ((PetscObject)viewer)->type_name;
221: return(0);
222: }
224: /*@C
225: PetscViewerSetOptionsPrefix - Sets the prefix used for searching for all
226: PetscViewer options in the database.
228: Logically Collective on PetscViewer
230: Input Parameter:
231: + viewer - the PetscViewer context
232: - prefix - the prefix to prepend to all option names
234: Notes:
235: A hyphen (-) must NOT be given at the beginning of the prefix name.
236: The first character of all runtime options is AUTOMATICALLY the hyphen.
238: Level: advanced
240: .keywords: PetscViewer, set, options, prefix, database
242: .seealso: PetscViewerSetFromOptions()
243: @*/
244: PetscErrorCode PetscViewerSetOptionsPrefix(PetscViewer viewer,const char prefix[])
245: {
250: PetscObjectSetOptionsPrefix((PetscObject)viewer,prefix);
251: return(0);
252: }
254: /*@C
255: PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for all
256: PetscViewer options in the database.
258: Logically Collective on PetscViewer
260: Input Parameters:
261: + viewer - the PetscViewer context
262: - prefix - the prefix to prepend to all option names
264: Notes:
265: A hyphen (-) must NOT be given at the beginning of the prefix name.
266: The first character of all runtime options is AUTOMATICALLY the hyphen.
268: Level: advanced
270: .keywords: PetscViewer, append, options, prefix, database
272: .seealso: PetscViewerGetOptionsPrefix()
273: @*/
274: PetscErrorCode PetscViewerAppendOptionsPrefix(PetscViewer viewer,const char prefix[])
275: {
280: PetscObjectAppendOptionsPrefix((PetscObject)viewer,prefix);
281: return(0);
282: }
284: /*@C
285: PetscViewerGetOptionsPrefix - Sets the prefix used for searching for all
286: PetscViewer options in the database.
288: Not Collective
290: Input Parameter:
291: . viewer - the PetscViewer context
293: Output Parameter:
294: . prefix - pointer to the prefix string used
296: Notes: On the fortran side, the user should pass in a string 'prefix' of
297: sufficient length to hold the prefix.
299: Level: advanced
301: .keywords: PetscViewer, get, options, prefix, database
303: .seealso: PetscViewerAppendOptionsPrefix()
304: @*/
305: PetscErrorCode PetscViewerGetOptionsPrefix(PetscViewer viewer,const char *prefix[])
306: {
311: PetscObjectGetOptionsPrefix((PetscObject)viewer,prefix);
312: return(0);
313: }
315: /*@
316: PetscViewerSetUp - Sets up the internal viewer data structures for the later use.
318: Collective on PetscViewer
320: Input Parameters:
321: . viewer - the PetscViewer context
323: Notes:
324: For basic use of the PetscViewer classes the user need not explicitly call
325: PetscViewerSetUp(), since these actions will happen automatically.
327: Level: advanced
329: .keywords: PetscViewer, setup
331: .seealso: PetscViewerCreate(), PetscViewerDestroy()
332: @*/
333: PetscErrorCode PetscViewerSetUp(PetscViewer viewer)
334: {
339: if (viewer->setupcalled) return(0);
340: if (viewer->ops->setup) {
341: (*viewer->ops->setup)(viewer);
342: }
343: viewer->setupcalled = PETSC_TRUE;
344: return(0);
345: }
347: /*@C
348: PetscViewerView - Visualizes a viewer object.
350: Collective on PetscViewer
352: Input Parameters:
353: + v - the viewer
354: - viewer - visualization context
356: Notes:
357: The available visualization contexts include
358: + PETSC_VIEWER_STDOUT_SELF - standard output (default)
359: . PETSC_VIEWER_STDOUT_WORLD - synchronized standard
360: output where only the first processor opens
361: the file. All other processors send their
362: data to the first processor to print.
363: - PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure
365: Level: beginner
367: .seealso: PetscViewerPushFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(),
368: PetscViewerSocketOpen(), PetscViewerBinaryOpen(), PetscViewerLoad()
369: @*/
370: PetscErrorCode PetscViewerView(PetscViewer v,PetscViewer viewer)
371: {
372: PetscErrorCode ierr;
373: PetscBool iascii;
374: PetscViewerFormat format;
375: #if defined(PETSC_HAVE_SAWS)
376: PetscBool issaws;
377: #endif
382: if (!viewer) {
383: PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v),&viewer);
384: }
388: PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);
389: #if defined(PETSC_HAVE_SAWS)
390: PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);
391: #endif
392: if (iascii) {
393: PetscViewerGetFormat(viewer,&format);
394: PetscObjectPrintClassNamePrefixType((PetscObject)v,viewer);
395: if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
396: if (v->format) {
397: PetscViewerASCIIPrintf(viewer," Viewer format = %s\n",PetscViewerFormats[v->format]);
398: }
399: PetscViewerASCIIPushTab(viewer);
400: if (v->ops->view) {
401: (*v->ops->view)(v,viewer);
402: }
403: PetscViewerASCIIPopTab(viewer);
404: }
405: #if defined(PETSC_HAVE_SAWS)
406: } else if (issaws) {
407: if (!((PetscObject)v)->amsmem) {
408: PetscObjectViewSAWs((PetscObject)v,viewer);
409: if (v->ops->view) {
410: (*v->ops->view)(v,viewer);
411: }
412: }
413: #endif
414: }
415: return(0);
416: }
418: /*@C
419: PetscViewerRead - Reads data from a PetscViewer
421: Collective on MPI_Comm
423: Input Parameters:
424: + viewer - The viewer
425: . data - Location to write the data
426: . num - Number of items of data to read
427: - datatype - Type of data to read
429: Output Parameters:
430: . count - number of items of data actually read, or NULL
432: Notes:
433: If datatype is PETSC_STRING and num is negative, reads until a newline character is found,
434: until a maximum of (-num - 1) chars.
436: Level: beginner
438: Concepts: binary files, ascii files
440: .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
441: VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
442: PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer
443: @*/
444: PetscErrorCode PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
445: {
450: if (dtype == PETSC_STRING) {
451: PetscInt c, i = 0, cnt;
452: char *s = (char *)data;
453: if (num >= 0) {
454: for (c = 0; c < num; c++) {
455: /* Skip leading whitespaces */
456: do {(*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR); if (count && !cnt) break;}
457: while (s[i]=='\n' || s[i]=='\t' || s[i]==' ' || s[i]=='\0' || s[i]=='\v' || s[i]=='\f' || s[i]=='\r');
458: i++;
459: /* Read strings one char at a time */
460: do {(*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR); if (count && !cnt) break;}
461: 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');
462: /* Terminate final string */
463: if (c == num-1) s[i-1] = '\0';
464: }
465: } else {
466: /* Read until a \n is encountered (-num is the max size allowed) */
467: do {(*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR); if (i == -num && !cnt) break;}
468: while (s[i-1]!='\n');
469: /* Terminate final string */
470: s[i-1] = '\0';
471: c = i;
472: }
473: if (count) *count = c;
474: else if (c < num) SETERRQ2(PetscObjectComm((PetscObject) viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %D < %D strings", c, num);
475: } else {
476: (*viewer->ops->read)(viewer, data, num, count, dtype);
477: }
478: return(0);
479: }