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