xref: /petsc/src/sys/classes/viewer/interface/view.c (revision fe01d9937f6624d8eb2c8112467d2f6b524f0085)
1 
2 #include <petsc/private/viewerimpl.h>  /*I "petscviewer.h" I*/
3 
4 PetscClassId PETSC_VIEWER_CLASSID;
5 
6 static PetscBool PetscViewerPackageInitialized = PETSC_FALSE;
7 #undef __FUNCT__
8 #define __FUNCT__ "PetscViewerFinalizePackage"
9 /*@C
10   PetscViewerFinalizePackage - This function destroys everything in the Petsc interface to Mathematica. It is
11   called from PetscFinalize().
12 
13   Level: developer
14 
15 .keywords: Petsc, destroy, package, mathematica
16 .seealso: PetscFinalize()
17 @*/
18 PetscErrorCode  PetscViewerFinalizePackage(void)
19 {
20   PetscErrorCode ierr;
21 
22   PetscFunctionBegin;
23   ierr = PetscFunctionListDestroy(&PetscViewerList);CHKERRQ(ierr);
24   PetscViewerPackageInitialized = PETSC_FALSE;
25   PetscViewerRegisterAllCalled  = PETSC_FALSE;
26   PetscFunctionReturn(0);
27 }
28 
29 #undef __FUNCT__
30 #define __FUNCT__ "PetscViewerInitializePackage"
31 /*@C
32   PetscViewerInitializePackage - This function initializes everything in the main PetscViewer package.
33 
34   Level: developer
35 
36 .keywords: Petsc, initialize, package
37 .seealso: PetscInitialize()
38 @*/
39 PetscErrorCode  PetscViewerInitializePackage(void)
40 {
41   char           logList[256];
42   char           *className;
43   PetscBool      opt;
44   PetscErrorCode ierr;
45 
46   PetscFunctionBegin;
47   if (PetscViewerPackageInitialized) PetscFunctionReturn(0);
48   PetscViewerPackageInitialized = PETSC_TRUE;
49   /* Register Classes */
50   ierr = PetscClassIdRegister("Viewer",&PETSC_VIEWER_CLASSID);CHKERRQ(ierr);
51 
52   /* Register Constructors */
53   ierr = PetscViewerRegisterAll();CHKERRQ(ierr);
54 
55   /* Process info exclusions */
56   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
57   if (opt) {
58     ierr = PetscStrstr(logList, "viewer", &className);CHKERRQ(ierr);
59     if (className) {
60       ierr = PetscInfoDeactivateClass(0);CHKERRQ(ierr);
61     }
62   }
63   /* Process summary exclusions */
64   ierr = PetscOptionsGetString(NULL,NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
65   if (opt) {
66     ierr = PetscStrstr(logList, "viewer", &className);CHKERRQ(ierr);
67     if (className) {
68       ierr = PetscLogEventDeactivateClass(0);CHKERRQ(ierr);
69     }
70   }
71 #if defined(PETSC_HAVE_MATHEMATICA)
72   ierr = PetscViewerMathematicaInitializePackage();CHKERRQ(ierr);
73 #endif
74   ierr = PetscRegisterFinalize(PetscViewerFinalizePackage);CHKERRQ(ierr);
75   PetscFunctionReturn(0);
76 }
77 
78 #undef __FUNCT__
79 #define __FUNCT__ "PetscViewerDestroy"
80 /*@
81    PetscViewerDestroy - Destroys a PetscViewer.
82 
83    Collective on PetscViewer
84 
85    Input Parameters:
86 .  viewer - the PetscViewer to be destroyed.
87 
88    Level: beginner
89 
90 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen()
91 
92 @*/
93 PetscErrorCode  PetscViewerDestroy(PetscViewer *viewer)
94 {
95   PetscErrorCode ierr;
96 
97   PetscFunctionBegin;
98   if (!*viewer) PetscFunctionReturn(0);
99   PetscValidHeaderSpecific(*viewer,PETSC_VIEWER_CLASSID,1);
100 
101   ierr = PetscViewerFlush(*viewer);CHKERRQ(ierr);
102   if (--((PetscObject)(*viewer))->refct > 0) {*viewer = 0; PetscFunctionReturn(0);}
103 
104   ierr = PetscObjectSAWsViewOff((PetscObject)*viewer);CHKERRQ(ierr);
105   if ((*viewer)->ops->destroy) {
106     ierr = (*(*viewer)->ops->destroy)(*viewer);CHKERRQ(ierr);
107   }
108   ierr = PetscHeaderDestroy(viewer);CHKERRQ(ierr);
109   PetscFunctionReturn(0);
110 }
111 
112 #undef __FUNCT__
113 #define __FUNCT__ "PetscViewerAndFormatDestroy"
114 /*@C
115    PetscViewerAndFormatDestroy - Destroys a PetscViewerAndFormat struct.
116 
117    Collective on PetscViewer
118 
119    Input Parameters:
120 .  viewer - the PetscViewerAndFormat to be destroyed.
121 
122    Level: beginner
123 
124 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen()
125 
126 @*/
127 PetscErrorCode  PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf)
128 {
129   PetscErrorCode ierr;
130 
131   PetscFunctionBegin;
132   ierr = PetscViewerDestroy(&(*vf)->viewer);CHKERRQ(ierr);
133   ierr = PetscFree(*vf);CHKERRQ(ierr);
134   PetscFunctionReturn(0);
135 }
136 
137 #undef __FUNCT__
138 #define __FUNCT__ "PetscViewerGetType"
139 /*@C
140    PetscViewerGetType - Returns the type of a PetscViewer.
141 
142    Not Collective
143 
144    Input Parameter:
145 .   viewer - the PetscViewer
146 
147    Output Parameter:
148 .  type - PetscViewer type (see below)
149 
150    Available Types Include:
151 .  PETSCVIEWERSOCKET - Socket PetscViewer
152 .  PETSCVIEWERASCII - ASCII PetscViewer
153 .  PETSCVIEWERBINARY - binary file PetscViewer
154 .  PETSCVIEWERSTRING - string PetscViewer
155 .  PETSCVIEWERDRAW - drawing PetscViewer
156 
157    Level: intermediate
158 
159    Note:
160    See include/petscviewer.h for a complete list of PetscViewers.
161 
162    PetscViewerType is actually a string
163 
164 .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType
165 
166 @*/
167 PetscErrorCode  PetscViewerGetType(PetscViewer viewer,PetscViewerType *type)
168 {
169   PetscFunctionBegin;
170   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
171   PetscValidPointer(type,2);
172   *type = ((PetscObject)viewer)->type_name;
173   PetscFunctionReturn(0);
174 }
175 
176 #undef __FUNCT__
177 #define __FUNCT__ "PetscViewerSetOptionsPrefix"
178 /*@C
179    PetscViewerSetOptionsPrefix - Sets the prefix used for searching for all
180    PetscViewer options in the database.
181 
182    Logically Collective on PetscViewer
183 
184    Input Parameter:
185 +  viewer - the PetscViewer context
186 -  prefix - the prefix to prepend to all option names
187 
188    Notes:
189    A hyphen (-) must NOT be given at the beginning of the prefix name.
190    The first character of all runtime options is AUTOMATICALLY the hyphen.
191 
192    Level: advanced
193 
194 .keywords: PetscViewer, set, options, prefix, database
195 
196 .seealso: PetscViewerSetFromOptions()
197 @*/
198 PetscErrorCode  PetscViewerSetOptionsPrefix(PetscViewer viewer,const char prefix[])
199 {
200   PetscErrorCode ierr;
201 
202   PetscFunctionBegin;
203   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
204   ierr = PetscObjectSetOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr);
205   PetscFunctionReturn(0);
206 }
207 
208 #undef __FUNCT__
209 #define __FUNCT__ "PetscViewerAppendOptionsPrefix"
210 /*@C
211    PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for all
212    PetscViewer options in the database.
213 
214    Logically Collective on PetscViewer
215 
216    Input Parameters:
217 +  viewer - the PetscViewer context
218 -  prefix - the prefix to prepend to all option names
219 
220    Notes:
221    A hyphen (-) must NOT be given at the beginning of the prefix name.
222    The first character of all runtime options is AUTOMATICALLY the hyphen.
223 
224    Level: advanced
225 
226 .keywords: PetscViewer, append, options, prefix, database
227 
228 .seealso: PetscViewerGetOptionsPrefix()
229 @*/
230 PetscErrorCode  PetscViewerAppendOptionsPrefix(PetscViewer viewer,const char prefix[])
231 {
232   PetscErrorCode ierr;
233 
234   PetscFunctionBegin;
235   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
236   ierr = PetscObjectAppendOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr);
237   PetscFunctionReturn(0);
238 }
239 
240 #undef __FUNCT__
241 #define __FUNCT__ "PetscViewerGetOptionsPrefix"
242 /*@C
243    PetscViewerGetOptionsPrefix - Sets the prefix used for searching for all
244    PetscViewer options in the database.
245 
246    Not Collective
247 
248    Input Parameter:
249 .  viewer - the PetscViewer context
250 
251    Output Parameter:
252 .  prefix - pointer to the prefix string used
253 
254    Notes: On the fortran side, the user should pass in a string 'prefix' of
255    sufficient length to hold the prefix.
256 
257    Level: advanced
258 
259 .keywords: PetscViewer, get, options, prefix, database
260 
261 .seealso: PetscViewerAppendOptionsPrefix()
262 @*/
263 PetscErrorCode  PetscViewerGetOptionsPrefix(PetscViewer viewer,const char *prefix[])
264 {
265   PetscErrorCode ierr;
266 
267   PetscFunctionBegin;
268   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
269   ierr = PetscObjectGetOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr);
270   PetscFunctionReturn(0);
271 }
272 
273 #undef __FUNCT__
274 #define __FUNCT__ "PetscViewerSetUp"
275 /*@
276    PetscViewerSetUp - Sets up the internal viewer data structures for the later use.
277 
278    Collective on PetscViewer
279 
280    Input Parameters:
281 .  viewer - the PetscViewer context
282 
283    Notes:
284    For basic use of the PetscViewer classes the user need not explicitly call
285    PetscViewerSetUp(), since these actions will happen automatically.
286 
287    Level: advanced
288 
289 .keywords: PetscViewer, setup
290 
291 .seealso: PetscViewerCreate(), PetscViewerDestroy()
292 @*/
293 PetscErrorCode  PetscViewerSetUp(PetscViewer viewer)
294 {
295   PetscErrorCode ierr;
296 
297   PetscFunctionBegin;
298   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
299   if (viewer->setupcalled) PetscFunctionReturn(0);
300   if (viewer->ops->setup) {
301     ierr = (*viewer->ops->setup)(viewer);CHKERRQ(ierr);
302   }
303   viewer->setupcalled = PETSC_TRUE;
304   PetscFunctionReturn(0);
305 }
306 
307 #undef __FUNCT__
308 #define __FUNCT__ "PetscViewerView"
309 /*@C
310    PetscViewerView - Visualizes a viewer object.
311 
312    Collective on PetscViewer
313 
314    Input Parameters:
315 +  v - the viewer
316 -  viewer - visualization context
317 
318   Notes:
319   The available visualization contexts include
320 +    PETSC_VIEWER_STDOUT_SELF - standard output (default)
321 .    PETSC_VIEWER_STDOUT_WORLD - synchronized standard
322         output where only the first processor opens
323         the file.  All other processors send their
324         data to the first processor to print.
325 -     PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure
326 
327    Level: beginner
328 
329 .seealso: PetscViewerPushFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(),
330           PetscViewerSocketOpen(), PetscViewerBinaryOpen(), PetscViewerLoad()
331 @*/
332 PetscErrorCode  PetscViewerView(PetscViewer v,PetscViewer viewer)
333 {
334   PetscErrorCode    ierr;
335   PetscBool         iascii;
336   PetscViewerFormat format;
337 #if defined(PETSC_HAVE_SAWS)
338   PetscBool         issaws;
339 #endif
340 
341   PetscFunctionBegin;
342   PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1);
343   PetscValidType(v,1);
344   if (!viewer) {
345     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v),&viewer);CHKERRQ(ierr);
346   }
347   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
348   PetscCheckSameComm(v,1,viewer,2);
349 
350   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
351 #if defined(PETSC_HAVE_SAWS)
352   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr);
353 #endif
354   if (iascii) {
355     ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
356     ierr = PetscObjectPrintClassNamePrefixType((PetscObject)v,viewer);CHKERRQ(ierr);
357     if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
358       if (v->format) {
359         ierr = PetscViewerASCIIPrintf(viewer,"  Viewer format = %s\n",PetscViewerFormats[v->format]);CHKERRQ(ierr);
360       }
361       ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr);
362       if (v->ops->view) {
363         ierr = (*v->ops->view)(v,viewer);CHKERRQ(ierr);
364       }
365       ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr);
366     }
367 #if defined(PETSC_HAVE_SAWS)
368   } else if (issaws) {
369     if (!((PetscObject)v)->amsmem) {
370       ierr = PetscObjectViewSAWs((PetscObject)v,viewer);CHKERRQ(ierr);
371       if (v->ops->view) {
372         ierr = (*v->ops->view)(v,viewer);CHKERRQ(ierr);
373       }
374     }
375 #endif
376   }
377   PetscFunctionReturn(0);
378 }
379 
380 #undef __FUNCT__
381 #define __FUNCT__ "PetscViewerRead"
382 /*@C
383    PetscViewerRead - Reads data from a PetscViewer
384 
385    Collective on MPI_Comm
386 
387    Input Parameters:
388 +  viewer   - The viewer
389 .  data     - Location to write the data
390 .  num      - Number of items of data to read
391 -  datatype - Type of data to read
392 
393    Output Parameters:
394 .  count - number of items of data actually read, or NULL
395 
396    Level: beginner
397 
398    Concepts: binary files, ascii files
399 
400 .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(),
401           VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(),
402           PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer
403 @*/
404 PetscErrorCode  PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype)
405 {
406   PetscErrorCode ierr;
407 
408   PetscFunctionBegin;
409   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
410   if (dtype == PETSC_STRING) {
411     PetscInt c, i = 0, cnt;
412     char *s = (char *)data;
413     for (c = 0; c < num; c++) {
414       /* Skip leading whitespaces */
415       do {ierr = (*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (count && !cnt) break;}
416       while (s[i]=='\n' || s[i]=='\t' || s[i]==' ' || s[i]=='\0' || s[i]=='\v' || s[i]=='\f' || s[i]=='\r');
417       i++;
418       /* Read strings one char at a time */
419       do {ierr = (*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (count && !cnt) break;}
420       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');
421       /* Terminate final string */
422       if (c == num-1) s[i-1] = '\0';
423     }
424     if (count) *count = c;
425     else if (c < num) SETERRQ2(PetscObjectComm((PetscObject) viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %D < %D strings", c, num);
426   } else {
427     ierr = (*viewer->ops->read)(viewer, data, num, count, dtype);CHKERRQ(ierr);
428   }
429   PetscFunctionReturn(0);
430 }
431