Actual source code: draw.c
petsc-3.14.6 2021-03-30
2: /*
3: Provides the calling sequences for all the basic PetscDraw routines.
4: */
5: #include <petsc/private/drawimpl.h>
6: #include <petscviewer.h>
8: PetscClassId PETSC_DRAW_CLASSID;
10: static PetscBool PetscDrawPackageInitialized = PETSC_FALSE;
11: /*@C
12: PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is
13: called from PetscFinalize().
15: Level: developer
17: .seealso: PetscFinalize()
18: @*/
19: PetscErrorCode PetscDrawFinalizePackage(void)
20: {
24: PetscFunctionListDestroy(&PetscDrawList);
25: PetscDrawPackageInitialized = PETSC_FALSE;
26: PetscDrawRegisterAllCalled = PETSC_FALSE;
27: return(0);
28: }
30: /*@C
31: PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
32: from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to PetscInitialize()
33: when using shared or static libraries.
35: Level: developer
37: .seealso: PetscInitialize()
38: @*/
39: PetscErrorCode PetscDrawInitializePackage(void)
40: {
41: char logList[256];
42: PetscBool opt,pkg;
46: if (PetscDrawPackageInitialized) return(0);
47: PetscDrawPackageInitialized = PETSC_TRUE;
48: /* Register Classes */
49: PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID);
50: PetscClassIdRegister("Draw Axis",&PETSC_DRAWAXIS_CLASSID);
51: PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID);
52: PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID);
53: PetscClassIdRegister("Bar Graph",&PETSC_DRAWBAR_CLASSID);
54: PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID);
55: /* Register Constructors */
56: PetscDrawRegisterAll();
57: /* Process Info */
58: {
59: PetscClassId classids[6];
61: classids[0] = PETSC_DRAW_CLASSID;
62: classids[1] = PETSC_DRAWAXIS_CLASSID;
63: classids[2] = PETSC_DRAWLG_CLASSID;
64: classids[3] = PETSC_DRAWHG_CLASSID;
65: classids[4] = PETSC_DRAWBAR_CLASSID;
66: classids[5] = PETSC_DRAWSP_CLASSID;
67: PetscInfoProcessClass("draw", 6, classids);
68: }
69: /* Process summary exclusions */
70: PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt);
71: if (opt) {
72: PetscStrInList("draw",logList,',',&pkg);
73: if (pkg) {
74: PetscLogEventExcludeClass(PETSC_DRAW_CLASSID);
75: PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID);
76: PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID);
77: PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID);
78: PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID);
79: PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID);
80: }
81: }
82: /* Register package finalizer */
83: PetscRegisterFinalize(PetscDrawFinalizePackage);
84: return(0);
85: }
87: /*@
88: PetscDrawResizeWindow - Allows one to resize a window from a program.
90: Collective on PetscDraw
92: Input Parameter:
93: + draw - the window
94: - w,h - the new width and height of the window
96: Level: intermediate
98: .seealso: PetscDrawCheckResizedWindow()
99: @*/
100: PetscErrorCode PetscDrawResizeWindow(PetscDraw draw,int w,int h)
101: {
108: if (draw->ops->resizewindow) {
109: (*draw->ops->resizewindow)(draw,w,h);
110: }
111: return(0);
112: }
114: /*@
115: PetscDrawGetWindowSize - Gets the size of the window.
117: Not collective
119: Input Parameter:
120: . draw - the window
122: Output Parameters:
123: . w,h - the window width and height
125: Level: intermediate
127: .seealso: PetscDrawResizeWindow(), PetscDrawCheckResizedWindow()
128: @*/
129: PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h)
130: {
135: if (w) *w = draw->w;
136: if (h) *h = draw->h;
137: return(0);
138: }
140: /*@
141: PetscDrawCheckResizedWindow - Checks if the user has resized the window.
143: Collective on PetscDraw
145: Input Parameter:
146: . draw - the window
148: Level: advanced
150: .seealso: PetscDrawResizeWindow()
152: @*/
153: PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw)
154: {
159: if (draw->ops->checkresizedwindow) {
160: (*draw->ops->checkresizedwindow)(draw);
161: }
162: return(0);
163: }
165: /*@C
166: PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
168: Not collective
170: Input Parameter:
171: . draw - the graphics context
173: Output Parameter:
174: . title - the title
176: Level: intermediate
178: .seealso: PetscDrawSetTitle()
179: @*/
180: PetscErrorCode PetscDrawGetTitle(PetscDraw draw,const char *title[])
181: {
185: *title = draw->title;
186: return(0);
187: }
189: /*@C
190: PetscDrawSetTitle - Sets the title of a PetscDraw context.
192: Collective on PetscDraw
194: Input Parameters:
195: + draw - the graphics context
196: - title - the title
198: Level: intermediate
200: Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
201: in the image.
203: A copy of the string is made, so you may destroy the
204: title string after calling this routine.
206: You can use PetscDrawAxisSetLabels() to indicate a title within the window
208: .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle()
209: @*/
210: PetscErrorCode PetscDrawSetTitle(PetscDraw draw,const char title[])
211: {
217: PetscFree(draw->title);
218: PetscStrallocpy(title,&draw->title);
219: if (draw->ops->settitle) {
220: (*draw->ops->settitle)(draw,draw->title);
221: }
222: return(0);
223: }
225: /*@C
226: PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
228: Collective on PetscDraw
230: Input Parameters:
231: + draw - the graphics context
232: - title - the title
234: Note:
235: A copy of the string is made, so you may destroy the
236: title string after calling this routine.
238: Level: advanced
240: .seealso: PetscDrawSetTitle(), PetscDrawGetTitle()
241: @*/
242: PetscErrorCode PetscDrawAppendTitle(PetscDraw draw,const char title[])
243: {
249: if (!title || !title[0]) return(0);
251: if (draw->title) {
252: size_t len1,len2;
253: char *newtitle;
254: PetscStrlen(title,&len1);
255: PetscStrlen(draw->title,&len2);
256: PetscMalloc1(len1 + len2 + 1,&newtitle);
257: PetscStrcpy(newtitle,draw->title);
258: PetscStrcat(newtitle,title);
259: PetscFree(draw->title);
260: draw->title = newtitle;
261: } else {
262: PetscStrallocpy(title,&draw->title);
263: }
264: if (draw->ops->settitle) {
265: (*draw->ops->settitle)(draw,draw->title);
266: }
267: return(0);
268: }
270: static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
271: {
275: if (!draw->ops->save && !draw->ops->getimage) return(0);
276: PetscDrawSaveMovie(draw);
277: if (draw->savefinalfilename) {
278: draw->savesinglefile = PETSC_TRUE;
279: PetscDrawSetSave(draw,draw->savefinalfilename);
280: PetscDrawSave(draw);
281: }
282: PetscBarrier((PetscObject)draw);
283: return(0);
284: }
286: /*@
287: PetscDrawDestroy - Deletes a draw context.
289: Collective on PetscDraw
291: Input Parameters:
292: . draw - the drawing context
294: Level: beginner
296: .seealso: PetscDrawCreate()
298: @*/
299: PetscErrorCode PetscDrawDestroy(PetscDraw *draw)
300: {
304: if (!*draw) return(0);
306: if (--((PetscObject)(*draw))->refct > 0) return(0);
308: if ((*draw)->pause == -2) {
309: (*draw)->pause = -1;
310: PetscDrawPause(*draw);
311: }
313: /* if memory was published then destroy it */
314: PetscObjectSAWsViewOff((PetscObject)*draw);
316: PetscDrawDestroy_Private(*draw);
318: if ((*draw)->ops->destroy) {
319: (*(*draw)->ops->destroy)(*draw);
320: }
321: PetscDrawDestroy(&(*draw)->popup);
322: PetscFree((*draw)->title);
323: PetscFree((*draw)->display);
324: PetscFree((*draw)->savefilename);
325: PetscFree((*draw)->saveimageext);
326: PetscFree((*draw)->savemovieext);
327: PetscFree((*draw)->savefinalfilename);
328: PetscHeaderDestroy(draw);
329: return(0);
330: }
332: /*@
333: PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
335: Collective on PetscDraw
337: Input Parameter:
338: . draw - the original window
340: Output Parameter:
341: . popup - the new popup window
343: Level: advanced
345: .seealso: PetscDrawScalePopup(), PetscDrawCreate()
347: @*/
348: PetscErrorCode PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
349: {
356: if (draw->popup) *popup = draw->popup;
357: else if (draw->ops->getpopup) {
358: (*draw->ops->getpopup)(draw,popup);
359: if (*popup) {
360: PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");
361: (*popup)->pause = 0.0;
362: PetscDrawSetFromOptions(*popup);
363: }
364: } else *popup = NULL;
365: return(0);
366: }
368: /*@C
369: PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
371: Input Parameter:
372: + draw - the drawing context
373: - display - the X windows display
375: Level: advanced
377: .seealso: PetscDrawCreate()
379: @*/
380: PetscErrorCode PetscDrawSetDisplay(PetscDraw draw,const char display[])
381: {
385: PetscFree(draw->display);
386: PetscStrallocpy(display,&draw->display);
387: return(0);
388: }
391: /*@
392: PetscDrawSetDoubleBuffer - Sets a window to be double buffered.
394: Logically Collective on PetscDraw
396: Input Parameter:
397: . draw - the drawing context
399: Level: intermediate
401: @*/
402: PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw)
403: {
408: if (draw->ops->setdoublebuffer) {
409: (*draw->ops->setdoublebuffer)(draw);
410: }
411: return(0);
412: }
414: /*@C
415: PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
416: by the one process.
418: Collective on PetscDraw
420: Input Parameter:
421: . draw - the original window
423: Output Parameter:
424: . sdraw - the singleton window
426: Level: advanced
428: .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
430: @*/
431: PetscErrorCode PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
432: {
434: PetscMPIInt size;
440: MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);
441: if (size == 1) {
442: PetscObjectReference((PetscObject)draw);
443: *sdraw = draw;
444: } else {
445: if (draw->ops->getsingleton) {
446: (*draw->ops->getsingleton)(draw,sdraw);
447: } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
448: }
449: return(0);
450: }
452: /*@C
453: PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
454: by the one process.
456: Collective on PetscDraw
458: Input Parameters:
459: + draw - the original window
460: - sdraw - the singleton window
462: Level: advanced
464: .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
466: @*/
467: PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
468: {
470: PetscMPIInt size;
477: MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);
478: if (size == 1) {
479: if (draw == *sdraw) {
480: PetscObjectDereference((PetscObject)draw);
481: *sdraw = NULL;
482: } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw");
483: } else {
484: if (draw->ops->restoresingleton) {
485: (*draw->ops->restoresingleton)(draw,sdraw);
486: } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name);
487: }
488: return(0);
489: }