xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision dae5874858be690a1464f3073a9d679bfd0ed673) !
1 
2 /*
3        Provides the registration process for PETSc PetscDraw routines
4 */
5 #include <petsc-private/drawimpl.h>  /*I "petscdraw.h" I*/
6 
7 /*
8    Contains the list of registered PetscDraw routines
9 */
10 PetscFunctionList PetscDrawList = 0;
11 
12 #undef __FUNCT__
13 #define __FUNCT__ "PetscDrawCreate"
14 /*@C
15    PetscDrawCreate - Creates a graphics context.
16 
17    Collective on MPI_Comm
18 
19    Input Parameter:
20 +  comm - MPI communicator
21 .  display - X display when using X windows
22 .  title - optional title added to top of window
23 .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
24 -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
25           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
26 
27    Output Parameter:
28 .  draw - location to put the PetscDraw context
29 
30    Level: beginner
31 
32    Concepts: graphics^creating context
33    Concepts: drawing^creating context
34 
35 .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType()
36 @*/
37 PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
38 {
39   PetscDraw      draw;
40   PetscErrorCode ierr;
41   PetscReal      dpause;
42   PetscBool      flag;
43 
44   PetscFunctionBegin;
45 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
46   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
47 #endif
48   *indraw = 0;
49   ierr = PetscHeaderCreate(draw,_p_PetscDraw,struct _PetscDrawOps,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,0);CHKERRQ(ierr);
50 
51   draw->data    = 0;
52   ierr          = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
53   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
54   draw->x       = x;
55   draw->y       = y;
56   draw->w       = w;
57   draw->h       = h;
58   draw->pause   = 0.0;
59   draw->coor_xl = 0.0;
60   draw->coor_xr = 1.0;
61   draw->coor_yl = 0.0;
62   draw->coor_yr = 1.0;
63   draw->port_xl = 0.0;
64   draw->port_xr = 1.0;
65   draw->port_yl = 0.0;
66   draw->port_yr = 1.0;
67   draw->popup   = 0;
68 
69   ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr);
70   if (flag) draw->pause = dpause;
71   draw->savefilename  = NULL;
72   draw->savefilemovie = PETSC_FALSE;
73   draw->savefilecount = -1;
74 
75   ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr);
76 
77   draw->boundbox_xl  = .5;
78   draw->boundbox_xr  = .5;
79   draw->boundbox_yl  = .9;
80   draw->boundbox_yr  = .9;
81 
82   *indraw = draw;
83   PetscFunctionReturn(0);
84 }
85 
86 #undef __FUNCT__
87 #define __FUNCT__ "PetscDrawSetType"
88 /*@C
89    PetscDrawSetType - Builds graphics object for a particular implementation
90 
91    Collective on PetscDraw
92 
93    Input Parameter:
94 +  draw      - the graphics context
95 -  type      - for example, PETSC_DRAW_X
96 
97    Options Database Command:
98 .  -draw_type  <type> - Sets the type; use -help for a list
99     of available methods (for instance, x)
100 
101    Level: intermediate
102 
103    Notes:
104    See "petsc/include/petscdraw.h" for available methods (for instance,
105    PETSC_DRAW_X)
106 
107    Concepts: drawing^X windows
108    Concepts: X windows^graphics
109    Concepts: drawing^Microsoft Windows
110 
111 .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
112 @*/
113 PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
114 {
115   PetscErrorCode ierr,(*r)(PetscDraw);
116   PetscBool      match;
117   PetscBool      flg=PETSC_FALSE;
118 
119   PetscFunctionBegin;
120   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
121   PetscValidCharPointer(type,2);
122 
123   ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr);
124   if (match) PetscFunctionReturn(0);
125 
126   /*  User requests no graphics */
127   ierr = PetscOptionsHasName(NULL,"-nox",&flg);CHKERRQ(ierr);
128 
129   /*
130      This is not ideal, but it allows codes to continue to run if X graphics
131    was requested but is not installed on this machine. Mostly this is for
132    testing.
133    */
134 #if !defined(PETSC_HAVE_X)
135   if (!flg) {
136     ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr);
137     if (match) {
138       PetscBool dontwarn = PETSC_TRUE;
139       flg  = PETSC_TRUE;
140       ierr = PetscOptionsHasName(NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr);
141       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
142     }
143   }
144 #endif
145   if (flg) type = PETSC_DRAW_NULL;
146 
147   if (draw->data) {
148     /* destroy the old private PetscDraw context */
149     ierr               = (*draw->ops->destroy)(draw);CHKERRQ(ierr);
150     draw->ops->destroy = NULL;
151     draw->data         = 0;
152   }
153 
154   ierr =  PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr);
155   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
156   ierr       = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr);
157   draw->data = 0;
158   ierr       = (*r)(draw);CHKERRQ(ierr);
159   PetscFunctionReturn(0);
160 }
161 
162 #undef __FUNCT__
163 #define __FUNCT__ "PetscDrawGetType"
164 /*@C
165    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
166 
167    Not Collective
168 
169    Input Parameter:
170 .  draw - Krylov context
171 
172    Output Parameters:
173 .  name - name of PetscDraw method
174 
175    Level: advanced
176 
177 @*/
178 PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
179 {
180   PetscFunctionBegin;
181   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
182   PetscValidPointer(type,2);
183   *type = ((PetscObject)draw)->type_name;
184   PetscFunctionReturn(0);
185 }
186 
187 #undef __FUNCT__
188 #define __FUNCT__ "PetscDrawRegister"
189 /*@C
190    PetscDrawRegister - Adds a method to the graphics package.
191 
192    Not Collective
193 
194    Input Parameters:
195 +  name_solver - name of a new user-defined solver
196 -  routine_create - routine to create method context
197 
198    Level: developer
199 
200    Notes:
201    PetscDrawRegister() may be called multiple times to add several user-defined solvers.
202 
203    Sample usage:
204 .vb
205    PetscDrawRegister("my_draw_type", MyDrawCreate);
206 .ve
207 
208    Then, your solver can be chosen with the procedural interface via
209 $     PetscDrawSetType(ksp,"my_draw_type")
210    or at runtime via the option
211 $     -draw_type my_draw_type
212 
213    Concepts: graphics^registering new draw classes
214    Concepts: PetscDraw^registering new draw classes
215 
216 .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy()
217 @*/
218 PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
219 {
220   PetscErrorCode ierr;
221 
222   PetscFunctionBegin;
223   ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr);
224   PetscFunctionReturn(0);
225 }
226 
227 #undef __FUNCT__
228 #define __FUNCT__ "PetscDrawSetFromOptions"
229 /*@
230    PetscDrawSetFromOptions - Sets the graphics type from the options database.
231       Defaults to a PETSc X windows graphics.
232 
233    Collective on PetscDraw
234 
235    Input Parameter:
236 .     draw - the graphics context
237 
238    Options Database Keys:
239 +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
240 .   -nox_warning - when X windows support is not installed this prevents the warning message
241                    from being printed
242 .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
243 .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
244 .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
245 -   -draw_save_on_flush - saves an image on each flush in addition to each clear
246 
247    Level: intermediate
248 
249    Notes:
250     Must be called after PetscDrawCreate() before the PetscDrawtor is used.
251 
252     Concepts: drawing^setting options
253     Concepts: graphics^setting options
254 
255 .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave()
256 
257 @*/
258 PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
259 {
260   PetscErrorCode ierr;
261   PetscBool      flg,nox;
262   char           vtype[256];
263   const char     *def;
264   PetscReal      dpause;
265 #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
266   PetscBool      warn;
267 #endif
268 
269   PetscFunctionBegin;
270   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
271 
272   if (!PetscDrawList) {
273     ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
274   }
275 
276   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
277   else {
278     ierr = PetscOptionsHasName(NULL,"-nox",&nox);CHKERRQ(ierr);
279     def  = PETSC_DRAW_NULL;
280 #if defined(PETSC_USE_WINDOWS_GRAPHICS)
281     if (!nox) def = PETSC_DRAW_WIN32;
282 #elif defined(PETSC_HAVE_X)
283     if (!nox) def = PETSC_DRAW_X;
284 #elif defined(PETSC_HAVE_GLUT)
285     if (!nox) def = PETSC_DRAW_GLUT;
286 #elif defined(PETSC_HAVE_OPENGLES)
287     if (!nox) def = PETSC_DRAW_OPENGLES;
288 #else
289     ierr = PetscOptionsHasName(NULL,"-nox_warning",&warn);CHKERRQ(ierr);
290     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
291 #endif
292   }
293   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
294   ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
295   if (flg) {
296     ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
297   } else if (!((PetscObject)draw)->type_name) {
298     ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
299   }
300   ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
301 #if defined(PETSC_HAVE_X)
302   {
303     char      filename[PETSC_MAX_PATH_LEN];
304     PetscBool save,movie = PETSC_FALSE;
305     ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,NULL);CHKERRQ(ierr);
306     ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr);
307     if (save) {
308       ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr);
309     }
310     ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file (X Windows only) on each flush","PetscDrawSetSave",draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr);
311   }
312 #endif
313   ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flg);CHKERRQ(ierr);
314   if (flg) draw->pause = dpause;
315 
316   /* process any options handlers added with PetscObjectAddOptionsHandler() */
317   ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr);
318   ierr = PetscOptionsEnd();CHKERRQ(ierr);
319   PetscFunctionReturn(0);
320 }
321 
322 #undef __FUNCT__
323 #define __FUNCT__ "PetscDrawSetSave"
324 /*@C
325    PetscDrawSetSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage
326 
327    Collective on PetscDraw
328 
329    Input Parameter:
330 +  draw      - the graphics context
331 .  filename  - name of the file, if NULL uses name of draw object
332 -  movie - produce a movie of all the images
333 
334    Options Database Command:
335 +  -draw_save  <filename>
336 -  -draw_save_movie
337 
338    Level: intermediate
339 
340    Concepts: X windows^graphics
341 
342    Notes: You should call this BEFORE calling PetscDrawClear() and creating your image.
343 
344    Requires that PETSc be configured with the option --with-afterimage to save the images and ffmpeg must be in your path to make the movie
345 
346    If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the
347    ./configure flags --x-includes=/pathtoXincludes --x-libraries=/pathtoXlibraries   For example under Mac OS X Mountain Lion --x-includes=/opt/X11/include -x-libraries=/opt/X11/lib
348 
349 
350 .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
351 @*/
352 PetscErrorCode  PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie)
353 {
354   PetscErrorCode ierr;
355 
356   PetscFunctionBegin;
357   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
358   ierr = PetscFree(draw->savefilename);CHKERRQ(ierr);
359 
360   draw->savefilemovie = movie;
361   if (filename && filename[0]) {
362     ierr = PetscStrallocpy(filename,&draw->savefilename);CHKERRQ(ierr);
363   } else {
364     const char *name;
365     ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr);
366     ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr);
367   }
368   if (draw->ops->setsave) {
369     ierr = (*draw->ops->setsave)(draw,filename);CHKERRQ(ierr);
370   }
371   PetscFunctionReturn(0);
372 }
373