xref: /petsc/src/sys/classes/draw/interface/draw.c (revision 8f69470a7058bcc0cf21d9492705f60bbdfc5aa4)
1 
2 /*
3        Provides the calling sequences for all the basic PetscDraw routines.
4 */
5 #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
6 #include <petscviewer.h>
7 
8 PetscClassId PETSC_DRAW_CLASSID;
9 
10 static PetscBool PetscDrawPackageInitialized = PETSC_FALSE;
11 #undef __FUNCT__
12 #define __FUNCT__ "PetscDrawFinalizePackage"
13 /*@C
14   PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is
15   called from PetscFinalize().
16 
17   Level: developer
18 
19 .keywords: Petsc, destroy, package, mathematica
20 .seealso: PetscFinalize()
21 @*/
22 PetscErrorCode  PetscDrawFinalizePackage(void)
23 {
24   PetscErrorCode ierr;
25 
26   PetscFunctionBegin;
27   ierr = PetscFunctionListDestroy(&PetscDrawList);CHKERRQ(ierr);
28   PetscDrawPackageInitialized = PETSC_FALSE;
29   PetscDrawRegisterAllCalled  = PETSC_FALSE;
30   PetscFunctionReturn(0);
31 }
32 
33 #undef __FUNCT__
34 #define __FUNCT__ "PetscDrawInitializePackage"
35 /*@C
36   PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called
37   from PetscDLLibraryRegister() when using dynamic libraries, and on the call to PetscInitialize()
38   when using static libraries.
39 
40   Level: developer
41 
42 .keywords: Petsc, initialize, package
43 .seealso: PetscInitialize()
44 @*/
45 PetscErrorCode  PetscDrawInitializePackage(void)
46 {
47   char           logList[256];
48   char           *className;
49   PetscBool      opt;
50   PetscErrorCode ierr;
51 
52   PetscFunctionBegin;
53   if (PetscDrawPackageInitialized) PetscFunctionReturn(0);
54   PetscDrawPackageInitialized = PETSC_TRUE;
55   /* Register Classes */
56   ierr = PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID);CHKERRQ(ierr);
57   ierr = PetscClassIdRegister("Axis",&PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr);
58   ierr = PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID);CHKERRQ(ierr);
59   ierr = PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID);CHKERRQ(ierr);
60   ierr = PetscClassIdRegister("Bar Grap",&PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr);
61   ierr = PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID);CHKERRQ(ierr);
62   /* Register Constructors */
63   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
64   /* Process info exclusions */
65   ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr);
66   if (opt) {
67     ierr = PetscStrstr(logList, "draw", &className);CHKERRQ(ierr);
68     if (className) {
69       ierr = PetscInfoDeactivateClass(0);CHKERRQ(ierr);
70     }
71   }
72   /* Process summary exclusions */
73   ierr = PetscOptionsGetString(NULL,NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr);
74   if (opt) {
75     ierr = PetscStrstr(logList, "draw", &className);CHKERRQ(ierr);
76     if (className) {
77       ierr = PetscLogEventDeactivateClass(0);CHKERRQ(ierr);
78     }
79   }
80   ierr = PetscRegisterFinalize(PetscDrawFinalizePackage);CHKERRQ(ierr);
81   PetscFunctionReturn(0);
82 }
83 
84 #undef __FUNCT__
85 #define __FUNCT__ "PetscDrawResizeWindow"
86 /*@
87    PetscDrawResizeWindow - Allows one to resize a window from a program.
88 
89    Collective on PetscDraw
90 
91    Input Parameter:
92 +  draw - the window
93 -  w,h - the new width and height of the window
94 
95    Level: intermediate
96 
97 .seealso: PetscDrawCheckResizedWindow()
98 @*/
99 PetscErrorCode  PetscDrawResizeWindow(PetscDraw draw,int w,int h)
100 {
101   PetscErrorCode ierr;
102 
103   PetscFunctionBegin;
104   if (draw->ops->resizewindow) {
105     ierr = (*draw->ops->resizewindow)(draw,w,h);CHKERRQ(ierr);
106   }
107   PetscFunctionReturn(0);
108 }
109 
110 #undef __FUNCT__
111 #define __FUNCT__ "PetscDrawCheckResizedWindow"
112 /*@
113    PetscDrawCheckResizedWindow - Checks if the user has resized the window.
114 
115    Collective on PetscDraw
116 
117    Input Parameter:
118 .  draw - the window
119 
120    Level: advanced
121 
122 .seealso: PetscDrawResizeWindow()
123 
124 @*/
125 PetscErrorCode  PetscDrawCheckResizedWindow(PetscDraw draw)
126 {
127   PetscErrorCode ierr;
128 
129   PetscFunctionBegin;
130   if (draw->ops->checkresizedwindow) {
131     ierr = (*draw->ops->checkresizedwindow)(draw);CHKERRQ(ierr);
132   }
133   PetscFunctionReturn(0);
134 }
135 
136 #undef __FUNCT__
137 #define __FUNCT__ "PetscDrawGetTitle"
138 /*@C
139    PetscDrawGetTitle - Gets pointer to title of a PetscDraw context.
140 
141    Not collective
142 
143    Input Parameter:
144 .  draw - the graphics context
145 
146    Output Parameter:
147 .  title - the title
148 
149    Level: intermediate
150 
151 .seealso: PetscDrawSetTitle()
152 @*/
153 PetscErrorCode  PetscDrawGetTitle(PetscDraw draw,char **title)
154 {
155   PetscFunctionBegin;
156   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
157   PetscValidPointer(title,2);
158   *title = draw->title;
159   PetscFunctionReturn(0);
160 }
161 
162 #undef __FUNCT__
163 #define __FUNCT__ "PetscDrawSetTitle"
164 /*@C
165    PetscDrawSetTitle - Sets the title of a PetscDraw context.
166 
167    Not collective (any processor or all may call this)
168 
169    Input Parameters:
170 +  draw - the graphics context
171 -  title - the title
172 
173    Level: intermediate
174 
175    Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save
176    in the image.
177 
178    A copy of the string is made, so you may destroy the
179    title string after calling this routine.
180 
181    You can use PetscDrawAxisSetLabels() to indicate a title within the window
182 
183 .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle()
184 @*/
185 PetscErrorCode  PetscDrawSetTitle(PetscDraw draw,const char title[])
186 {
187   PetscErrorCode ierr;
188 
189   PetscFunctionBegin;
190   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
191   PetscValidCharPointer(title,2);
192   ierr = PetscFree(draw->title);CHKERRQ(ierr);
193   ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
194   if (draw->ops->settitle) {
195     ierr = (*draw->ops->settitle)(draw,title);CHKERRQ(ierr);
196   }
197   PetscFunctionReturn(0);
198 }
199 
200 #undef __FUNCT__
201 #define __FUNCT__ "PetscDrawAppendTitle"
202 /*@C
203    PetscDrawAppendTitle - Appends to the title of a PetscDraw context.
204 
205    Not collective (any processor or all can call this)
206 
207    Input Parameters:
208 +  draw - the graphics context
209 -  title - the title
210 
211    Note:
212    A copy of the string is made, so you may destroy the
213    title string after calling this routine.
214 
215    Level: advanced
216 
217 .seealso: PetscDrawSetTitle(), PetscDrawGetTitle()
218 @*/
219 PetscErrorCode  PetscDrawAppendTitle(PetscDraw draw,const char title[])
220 {
221   PetscErrorCode ierr;
222   size_t         len1,len2,len;
223   char           *newtitle;
224 
225   PetscFunctionBegin;
226   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
227   if (!title) PetscFunctionReturn(0);
228 
229   if (draw->title) {
230     ierr = PetscStrlen(title,&len1);CHKERRQ(ierr);
231     ierr = PetscStrlen(draw->title,&len2);CHKERRQ(ierr);
232     len  = len1 + len2;
233     ierr = PetscMalloc1(len + 1,&newtitle);CHKERRQ(ierr);
234     ierr = PetscStrcpy(newtitle,draw->title);CHKERRQ(ierr);
235     ierr = PetscStrcat(newtitle,title);CHKERRQ(ierr);
236     ierr = PetscFree(draw->title);CHKERRQ(ierr);
237     draw->title = newtitle;
238   } else {
239     ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
240   }
241   if (draw->ops->settitle) {
242     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
243   }
244   PetscFunctionReturn(0);
245 }
246 
247 #undef __FUNCT__
248 #define __FUNCT__ "PetscDrawDestroy_Private"
249 static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
250 {
251   PetscBool      match;
252   PetscErrorCode ierr;
253 
254   PetscFunctionBegin;
255   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_X,&match);CHKERRQ(ierr);
256   if (match) {
257 #if defined(PETSC_HAVE_POPEN)
258     PetscMPIInt rank;
259     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
260     if (!rank && draw->savefilename && draw->savefilemovie) {
261       char       command[PETSC_MAX_PATH_LEN];
262       const char *fname = draw->savefilename;
263       const char *ext   = draw->savefilenameext;
264       FILE       *fd;
265       ierr = PetscSNPrintf(command,PETSC_MAX_PATH_LEN,"ffmpeg  -i %s/%s_%%d%s %s.m4v",fname,fname,ext,fname);CHKERRQ(ierr);
266       ierr = PetscPOpen(PETSC_COMM_SELF,NULL,command,"r",&fd);CHKERRQ(ierr);
267       ierr = PetscPClose(PETSC_COMM_SELF,fd,NULL);CHKERRQ(ierr);
268     }
269     ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr);
270 #endif
271     if (draw->savefinalfilename) {
272       ierr = PetscDrawSetSave(draw,draw->savefinalfilename,PETSC_FALSE);CHKERRQ(ierr);
273       draw->savefilecount = 0;
274       ierr = PetscDrawSave(draw);CHKERRQ(ierr);
275     }
276     ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr);
277   }
278   PetscFunctionReturn(0);
279 
280 }
281 
282 #undef __FUNCT__
283 #define __FUNCT__ "PetscDrawDestroy"
284 /*@
285    PetscDrawDestroy - Deletes a draw context.
286 
287    Collective on PetscDraw
288 
289    Input Parameters:
290 .  draw - the drawing context
291 
292    Level: beginner
293 
294 .seealso: PetscDrawCreate()
295 
296 @*/
297 PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
298 {
299   PetscErrorCode ierr;
300 
301   PetscFunctionBegin;
302   if (!*draw) PetscFunctionReturn(0);
303   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
304   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
305 
306   if ((*draw)->pause == -2) {
307     (*draw)->pause = -1;
308     ierr = PetscDrawPause(*draw);CHKERRQ(ierr);
309   }
310 
311   /* if memory was published then destroy it */
312   ierr = PetscObjectSAWsViewOff((PetscObject)*draw);CHKERRQ(ierr);
313 
314   ierr = PetscDrawDestroy_Private(*draw);CHKERRQ(ierr);
315 
316   if ((*draw)->ops->destroy) {
317     ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr);
318   }
319   ierr = PetscDrawDestroy(&(*draw)->popup);CHKERRQ(ierr);
320   ierr = PetscFree((*draw)->title);CHKERRQ(ierr);
321   ierr = PetscFree((*draw)->display);CHKERRQ(ierr);
322   ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr);
323   ierr = PetscFree((*draw)->savefilenameext);CHKERRQ(ierr);
324   ierr = PetscFree((*draw)->savefinalfilename);CHKERRQ(ierr);
325   ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr);
326   PetscFunctionReturn(0);
327 }
328 
329 #undef __FUNCT__
330 #define __FUNCT__ "PetscDrawGetPopup"
331 /*@
332    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
333 
334    Collective on PetscDraw
335 
336    Input Parameter:
337 .  draw - the original window
338 
339    Output Parameter:
340 .  popup - the new popup window
341 
342    Level: advanced
343 
344 @*/
345 PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
346 {
347   PetscErrorCode ierr;
348 
349   PetscFunctionBegin;
350   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
351   PetscValidPointer(popup,2);
352 
353   if (draw->popup) *popup = draw->popup;
354   else if (draw->ops->getpopup) {
355     ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr);
356     if (*popup) {
357       ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr);
358       (*popup)->pause = 0.0;
359       ierr = PetscDrawSetFromOptions(*popup);CHKERRQ(ierr);
360     }
361   } else *popup = NULL;
362   PetscFunctionReturn(0);
363 }
364 
365 #undef __FUNCT__
366 #define __FUNCT__ "PetscDrawDestroy_Null"
367 PetscErrorCode PetscDrawDestroy_Null(PetscDraw draw)
368 {
369   PetscFunctionBegin;
370   PetscFunctionReturn(0);
371 }
372 
373 #undef __FUNCT__
374 #define __FUNCT__ "PetscDrawOpenNull"
375 /*
376   PetscDrawOpenNull - Opens a null drawing context. All draw commands to
377   it are ignored.
378 
379   Output Parameter:
380 . win - the drawing context
381 
382    Level: advanced
383 
384 */
385 PetscErrorCode  PetscDrawOpenNull(MPI_Comm comm,PetscDraw *win)
386 {
387   PetscErrorCode ierr;
388 
389   PetscFunctionBegin;
390   ierr = PetscDrawCreate(comm,NULL,NULL,0,0,1,1,win);CHKERRQ(ierr);
391   ierr = PetscDrawSetType(*win,PETSC_DRAW_NULL);CHKERRQ(ierr);
392   PetscFunctionReturn(0);
393 }
394 
395 #undef __FUNCT__
396 #define __FUNCT__ "PetscDrawSetDisplay"
397 /*@
398   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
399 
400   Input Parameter:
401 + draw - the drawing context
402 - display - the X windows display
403 
404   Level: advanced
405 
406 @*/
407 PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
408 {
409   PetscErrorCode ierr;
410 
411   PetscFunctionBegin;
412   ierr = PetscFree(draw->display);CHKERRQ(ierr);
413   ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
414   PetscFunctionReturn(0);
415 }
416 
417 #undef __FUNCT__
418 #define __FUNCT__ "PetscDrawCreate_Null"
419 /*
420   PetscDrawCreate_Null - Opens a null drawing context. All draw commands to
421   it are ignored.
422 
423   Input Parameter:
424 . win - the drawing context
425 */
426 PETSC_EXTERN PetscErrorCode PetscDrawCreate_Null(PetscDraw draw)
427 {
428   PetscErrorCode ierr;
429 
430   PetscFunctionBegin;
431   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
432   draw->data         = NULL;
433   draw->ops->destroy = PetscDrawDestroy_Null;
434   draw->ops->view    = NULL;
435 
436   draw->pause        = 0.0;
437   draw->coor_xl      = 0.0;  draw->coor_xr = 1.0;
438   draw->coor_yl      = 0.0;  draw->coor_yr = 1.0;
439   draw->port_xl      = 0.0;  draw->port_xr = 1.0;
440   draw->port_yl      = 0.0;  draw->port_yr = 1.0;
441   draw->popup        = NULL;
442   PetscFunctionReturn(0);
443 }
444 
445 #undef __FUNCT__
446 #define __FUNCT__ "PetscDrawGetSingleton"
447 /*@C
448    PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned
449         by the one process.
450 
451    Collective on PetscDraw
452 
453    Input Parameter:
454 .  draw - the original window
455 
456    Output Parameter:
457 .  sdraw - the singleton window
458 
459    Level: advanced
460 
461 .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
462 
463 @*/
464 PetscErrorCode  PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw)
465 {
466   PetscErrorCode ierr;
467   PetscMPIInt    size;
468 
469   PetscFunctionBegin;
470   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
471   PetscValidPointer(sdraw,2);
472 
473   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
474   if (size == 1) *sdraw = draw;
475   else {
476     if (draw->ops->getsingleton) {
477       ierr = (*draw->ops->getsingleton)(draw,sdraw);CHKERRQ(ierr);
478     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name);
479   }
480   PetscFunctionReturn(0);
481 }
482 
483 #undef __FUNCT__
484 #define __FUNCT__ "PetscDrawRestoreSingleton"
485 /*@C
486    PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned
487         by the one process.
488 
489    Collective on PetscDraw
490 
491    Input Parameters:
492 +  draw - the original window
493 -  sdraw - the singleton window
494 
495    Level: advanced
496 
497 .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton()
498 
499 @*/
500 PetscErrorCode  PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw)
501 {
502   PetscErrorCode ierr;
503   PetscMPIInt    size;
504 
505   PetscFunctionBegin;
506   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
507   PetscValidPointer(sdraw,2);
508   PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2);
509 
510   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
511   if (size != 1) {
512     if (draw->ops->restoresingleton) {
513       ierr = (*draw->ops->restoresingleton)(draw,sdraw);CHKERRQ(ierr);
514     } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name);
515   }
516   PetscFunctionReturn(0);
517 }
518