xref: /petsc/src/sys/classes/draw/interface/draw.c (revision c094ef4021e955ef5f85f7d8a1bbc6ed64ba7621)
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 
238     draw->title = newtitle;
239   } else {
240     ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
241   }
242   if (draw->ops->settitle) {
243     ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr);
244   }
245   PetscFunctionReturn(0);
246 }
247 
248 #undef __FUNCT__
249 #define __FUNCT__ "PetscDrawDestroy_Private"
250 static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw)
251 {
252   PetscBool      match;
253   PetscErrorCode ierr;
254 
255   PetscFunctionBegin;
256   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_X,&match);CHKERRQ(ierr);
257   if (match) {
258 #if defined(PETSC_HAVE_POPEN)
259     PetscMPIInt rank;
260     ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
261     if (!rank && draw->savefilename && draw->savefilemovie) {
262       char       command[PETSC_MAX_PATH_LEN];
263       const char *fname = draw->savefilename;
264       const char *ext   = draw->savefilenameext;
265       FILE       *fd;
266       ierr = PetscSNPrintf(command,PETSC_MAX_PATH_LEN,"ffmpeg  -i %s/%s_%%d%s %s.m4v",fname,fname,ext,fname);CHKERRQ(ierr);
267       ierr = PetscPOpen(PETSC_COMM_SELF,NULL,command,"r",&fd);CHKERRQ(ierr);
268       ierr = PetscPClose(PETSC_COMM_SELF,fd,NULL);CHKERRQ(ierr);
269     }
270     ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr);
271 #endif
272     if (draw->savefinalfilename) {
273       ierr = PetscDrawSetSave(draw,draw->savefinalfilename,PETSC_FALSE);CHKERRQ(ierr);
274       draw->savefilecount = 0;
275       ierr = PetscDrawSave(draw);CHKERRQ(ierr);
276     }
277     ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr);
278   }
279   PetscFunctionReturn(0);
280 
281 }
282 
283 #undef __FUNCT__
284 #define __FUNCT__ "PetscDrawDestroy"
285 /*@
286    PetscDrawDestroy - Deletes a draw context.
287 
288    Collective on PetscDraw
289 
290    Input Parameters:
291 .  draw - the drawing context
292 
293    Level: beginner
294 
295 .seealso: PetscDrawCreate()
296 
297 @*/
298 PetscErrorCode  PetscDrawDestroy(PetscDraw *draw)
299 {
300   PetscErrorCode ierr;
301 
302   PetscFunctionBegin;
303   if (!*draw) PetscFunctionReturn(0);
304   PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1);
305   if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0);
306 
307   if ((*draw)->pause == -2) {
308     (*draw)->pause = -1;
309     ierr = PetscDrawPause(*draw);CHKERRQ(ierr);
310   }
311 
312   /* if memory was published then destroy it */
313   ierr = PetscObjectSAWsViewOff((PetscObject)*draw);CHKERRQ(ierr);
314 
315   ierr = PetscDrawDestroy_Private(*draw);CHKERRQ(ierr);
316 
317   if ((*draw)->ops->destroy) {
318     ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr);
319   }
320   ierr = PetscDrawDestroy(&(*draw)->popup);CHKERRQ(ierr);
321   ierr = PetscFree((*draw)->title);CHKERRQ(ierr);
322   ierr = PetscFree((*draw)->display);CHKERRQ(ierr);
323   ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr);
324   ierr = PetscFree((*draw)->savefilenameext);CHKERRQ(ierr);
325   ierr = PetscFree((*draw)->savefinalfilename);CHKERRQ(ierr);
326   ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr);
327   PetscFunctionReturn(0);
328 }
329 
330 #undef __FUNCT__
331 #define __FUNCT__ "PetscDrawGetPopup"
332 /*@
333    PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window.
334 
335    Collective on PetscDraw
336 
337    Input Parameter:
338 .  draw - the original window
339 
340    Output Parameter:
341 .  popup - the new popup window
342 
343    Level: advanced
344 
345 @*/
346 PetscErrorCode  PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup)
347 {
348   PetscErrorCode ierr;
349 
350   PetscFunctionBegin;
351   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
352   PetscValidPointer(popup,2);
353 
354   if (draw->popup) *popup = draw->popup;
355   else if (draw->ops->getpopup) {
356     ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr);
357     if (*popup) {
358       ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr);
359       (*popup)->pause = 0.0;
360       ierr = PetscDrawSetFromOptions(*popup);CHKERRQ(ierr);
361     }
362   } else *popup = NULL;
363   PetscFunctionReturn(0);
364 }
365 
366 #undef __FUNCT__
367 #define __FUNCT__ "PetscDrawDestroy_Null"
368 PetscErrorCode PetscDrawDestroy_Null(PetscDraw draw)
369 {
370   PetscFunctionBegin;
371   PetscFunctionReturn(0);
372 }
373 
374 #undef __FUNCT__
375 #define __FUNCT__ "PetscDrawOpenNull"
376 /*
377   PetscDrawOpenNull - Opens a null drawing context. All draw commands to
378   it are ignored.
379 
380   Output Parameter:
381 . win - the drawing context
382 
383    Level: advanced
384 
385 */
386 PetscErrorCode  PetscDrawOpenNull(MPI_Comm comm,PetscDraw *win)
387 {
388   PetscErrorCode ierr;
389 
390   PetscFunctionBegin;
391   ierr = PetscDrawCreate(comm,NULL,NULL,0,0,1,1,win);CHKERRQ(ierr);
392   ierr = PetscDrawSetType(*win,PETSC_DRAW_NULL);CHKERRQ(ierr);
393   PetscFunctionReturn(0);
394 }
395 
396 #undef __FUNCT__
397 #define __FUNCT__ "PetscDrawSetDisplay"
398 /*@
399   PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed
400 
401   Input Parameter:
402 + draw - the drawing context
403 - display - the X windows display
404 
405   Level: advanced
406 
407 @*/
408 PetscErrorCode  PetscDrawSetDisplay(PetscDraw draw,const char display[])
409 {
410   PetscErrorCode ierr;
411 
412   PetscFunctionBegin;
413   ierr = PetscFree(draw->display);CHKERRQ(ierr);
414   ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
415   PetscFunctionReturn(0);
416 }
417 
418 #undef __FUNCT__
419 #define __FUNCT__ "PetscDrawCreate_Null"
420 /*
421   PetscDrawCreate_Null - Opens a null drawing context. All draw commands to
422   it are ignored.
423 
424   Input Parameter:
425 . win - the drawing context
426 */
427 PETSC_EXTERN PetscErrorCode PetscDrawCreate_Null(PetscDraw draw)
428 {
429   PetscErrorCode ierr;
430 
431   PetscFunctionBegin;
432   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
433 
434   draw->ops->destroy = PetscDrawDestroy_Null;
435   draw->ops->view    = 0;
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        = 0;
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 
519 
520 
521 
522 
523 
524 
525