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