Actual source code: drawreg.c
petsc-3.10.5 2019-03-28
2: /*
3: Provides the registration process for PETSc PetscDraw routines
4: */
5: #include <petsc/private/drawimpl.h>
6: #include <petscviewer.h>
7: #if defined(PETSC_HAVE_SAWS)
8: #include <petscviewersaws.h>
9: #endif
11: /*
12: Contains the list of registered PetscDraw routines
13: */
14: PetscFunctionList PetscDrawList = 0;
16: /*@C
17: PetscDrawView - Prints the PetscDraw data structure.
19: Collective on PetscDraw
21: Input Parameters:
22: + indraw - the PetscDraw context
23: - viewer - visualization context
25: See PetscDrawSetFromOptions() for options database keys
27: Note:
28: The available visualization contexts include
29: + PETSC_VIEWER_STDOUT_SELF - standard output (default)
30: - PETSC_VIEWER_STDOUT_WORLD - synchronized standard
31: output where only the first processor opens
32: the file. All other processors send their
33: data to the first processor to print.
35: The user can open an alternative visualization context with
36: PetscViewerASCIIOpen() - output to a specified file.
38: Level: beginner
40: .keywords: PetscDraw, view
42: .seealso: PCView(), PetscViewerASCIIOpen()
43: @*/
44: PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer)
45: {
47: PetscBool isdraw;
48: #if defined(PETSC_HAVE_SAWS)
49: PetscBool issaws;
50: #endif
54: if (!viewer) {
55: PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);
56: }
60: PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);
61: PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);
62: #if defined(PETSC_HAVE_SAWS)
63: PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);
64: #endif
65: if (isdraw) {
66: PetscDraw draw;
67: char str[36];
68: PetscReal x,y,bottom,h;
70: PetscViewerDrawGetDraw(viewer,0,&draw);
71: PetscDrawGetCurrentPoint(draw,&x,&y);
72: PetscStrncpy(str,"PetscDraw: ",sizeof(str));
73: PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str));
74: PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);
75: bottom = y - h;
76: PetscDrawPushCurrentPoint(draw,x,bottom);
77: #if defined(PETSC_HAVE_SAWS)
78: } else if (issaws) {
79: PetscMPIInt rank;
81: PetscObjectName((PetscObject)indraw);
82: MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
83: if (!((PetscObject)indraw)->amsmem && !rank) {
84: PetscObjectViewSAWs((PetscObject)indraw,viewer);
85: }
86: #endif
87: } else if (indraw->ops->view) {
88: (*indraw->ops->view)(indraw,viewer);
89: }
90: return(0);
91: }
93: /*@C
94: PetscDrawCreate - Creates a graphics context.
96: Collective on MPI_Comm
98: Input Parameter:
99: + comm - MPI communicator
100: . display - X display when using X windows
101: . title - optional title added to top of window
102: . x,y - coordinates of lower left corner of window or PETSC_DECIDE
103: - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
104: or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
106: Output Parameter:
107: . draw - location to put the PetscDraw context
109: Level: beginner
111: Concepts: graphics^creating context
112: Concepts: drawing^creating context
114: .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
115: PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
116: PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
117: PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
118: PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
119: PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
120: PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
121: PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
122: PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
123: PetscDrawZoom(), PetscDrawGetBoundingBox()
125: @*/
126: PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
127: {
128: PetscDraw draw;
130: PetscReal dpause = 0.0;
131: PetscBool flag;
134: PetscDrawInitializePackage();
135: *indraw = 0;
136: PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);
138: draw->data = NULL;
139: PetscStrallocpy(display,&draw->display);
140: PetscStrallocpy(title,&draw->title);
141: draw->x = x;
142: draw->y = y;
143: draw->w = w;
144: draw->h = h;
145: draw->pause = 0.0;
146: draw->coor_xl = 0.0;
147: draw->coor_xr = 1.0;
148: draw->coor_yl = 0.0;
149: draw->coor_yr = 1.0;
150: draw->port_xl = 0.0;
151: draw->port_xr = 1.0;
152: draw->port_yl = 0.0;
153: draw->port_yr = 1.0;
154: draw->popup = NULL;
156: PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);
157: if (flag) draw->pause = dpause;
159: draw->savefilename = NULL;
160: draw->saveimageext = NULL;
161: draw->savemovieext = NULL;
162: draw->savefilecount = 0;
163: draw->savesinglefile = PETSC_FALSE;
164: draw->savemoviefps = PETSC_DECIDE;
166: PetscDrawSetCurrentPoint(draw,.5,.9);
168: draw->boundbox_xl = .5;
169: draw->boundbox_xr = .5;
170: draw->boundbox_yl = .9;
171: draw->boundbox_yr = .9;
173: *indraw = draw;
174: return(0);
175: }
177: /*@C
178: PetscDrawSetType - Builds graphics object for a particular implementation
180: Collective on PetscDraw
182: Input Parameter:
183: + draw - the graphics context
184: - type - for example, PETSC_DRAW_X
186: Options Database Command:
187: . -draw_type <type> - Sets the type; use -help for a list of available methods (for instance, x)
189: See PetscDrawSetFromOptions() for additional options database keys
191: Level: intermediate
193: Notes:
194: See "petsc/include/petscdraw.h" for available methods (for instance,
195: PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)
197: Concepts: drawing^X windows
198: Concepts: X windows^graphics
199: Concepts: drawing^Microsoft Windows
201: .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
202: @*/
203: PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type)
204: {
205: PetscErrorCode ierr,(*r)(PetscDraw);
206: PetscBool match;
207: PetscBool flg=PETSC_FALSE;
213: PetscObjectTypeCompare((PetscObject)draw,type,&match);
214: if (match) return(0);
216: /* User requests no graphics */
217: PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);
219: /*
220: This is not ideal, but it allows codes to continue to run if X graphics
221: was requested but is not installed on this machine. Mostly this is for
222: testing.
223: */
224: #if !defined(PETSC_HAVE_X)
225: if (!flg) {
226: PetscStrcmp(type,PETSC_DRAW_X,&match);
227: if (match) {
228: PetscBool dontwarn = PETSC_TRUE;
229: flg = PETSC_TRUE;
230: PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);
231: if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
232: }
233: }
234: #endif
235: if (flg) {
236: PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL);
237: PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL);
238: PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL);
239: PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL);
240: PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL);
241: PetscStrcmp(type,"tikz",&flg);
242: if (!flg) type = PETSC_DRAW_NULL;
243: }
245: PetscFunctionListFind(PetscDrawList,type,&r);
246: if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
247: if (draw->ops->destroy) {(*draw->ops->destroy)(draw);}
248: PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));
249: PetscObjectChangeTypeName((PetscObject)draw,type);
250: (*r)(draw);
251: return(0);
252: }
254: /*@C
255: PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
257: Not Collective
259: Input Parameter:
260: . draw - Krylov context
262: Output Parameters:
263: . name - name of PetscDraw method
265: Level: advanced
267: .seealso: PetscDrawSetType(), PetscDrawType
269: @*/
270: PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
271: {
275: *type = ((PetscObject)draw)->type_name;
276: return(0);
277: }
279: /*@C
280: PetscDrawRegister - Adds a method to the graphics package.
282: Not Collective
284: Input Parameters:
285: + name_solver - name of a new user-defined graphics class
286: - routine_create - routine to create method context
288: Level: developer
290: Notes:
291: PetscDrawRegister() may be called multiple times to add several user-defined graphics classes
293: Sample usage:
294: .vb
295: PetscDrawRegister("my_draw_type", MyDrawCreate);
296: .ve
298: Then, your specific graphics package can be chosen with the procedural interface via
299: $ PetscDrawSetType(ksp,"my_draw_type")
300: or at runtime via the option
301: $ -draw_type my_draw_type
303: Concepts: graphics^registering new draw classes
304: Concepts: PetscDraw^registering new draw classes
306: .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
307: @*/
308: PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
309: {
313: PetscDrawInitializePackage();
314: PetscFunctionListAdd(&PetscDrawList,sname,function);
315: return(0);
316: }
318: /*@C
319: PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
320: PetscDraw options in the database.
322: Logically Collective on PetscDraw
324: Input Parameter:
325: + draw - the draw context
326: - prefix - the prefix to prepend to all option names
328: Level: advanced
330: .keywords: PetscDraw, set, options, prefix, database
332: .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
333: @*/
334: PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
335: {
340: PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);
341: return(0);
342: }
344: /*@
345: PetscDrawSetFromOptions - Sets the graphics type from the options database.
346: Defaults to a PETSc X windows graphics.
348: Collective on PetscDraw
350: Input Parameter:
351: . draw - the graphics context
353: Options Database Keys:
354: + -nox - do not use X graphics (ignore graphics calls, but run program correctly)
355: . -nox_warning - when X windows support is not installed this prevents the warning message from being printed
356: . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
357: . -draw_marker_type - <x,point>
358: . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
359: . -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window
360: . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave()
361: . -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with 'filename/filename_%d.ext'
362: . -draw_save_on_clear - saves an image on each clear, mainly for debugging
363: - -draw_save_on_flush - saves an image on each flush, mainly for debugging
365: Level: intermediate
367: Notes:
368: Must be called after PetscDrawCreate() before the PetscDraw is used.
370: Concepts: drawing^setting options
371: Concepts: graphics^setting options
373: .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()
375: @*/
376: PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw)
377: {
378: PetscErrorCode ierr;
379: PetscBool flg,nox;
380: char vtype[256];
381: const char *def;
382: #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
383: PetscBool warn;
384: #endif
389: PetscDrawRegisterAll();
391: if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
392: else {
393: PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);
394: def = PETSC_DRAW_NULL;
395: #if defined(PETSC_USE_WINDOWS_GRAPHICS)
396: if (!nox) def = PETSC_DRAW_WIN32;
397: #elif defined(PETSC_HAVE_X)
398: if (!nox) def = PETSC_DRAW_X;
399: #elif defined(PETSC_HAVE_GLUT)
400: if (!nox) def = PETSC_DRAW_GLUT;
401: #elif defined(PETSC_HAVE_OPENGLES)
402: if (!nox) def = PETSC_DRAW_OPENGLES;
403: #else
404: PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);
405: if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
406: #endif
407: }
408: PetscObjectOptionsBegin((PetscObject)draw);
409: PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);
410: if (flg) {
411: PetscDrawSetType(draw,vtype);
412: } else if (!((PetscObject)draw)->type_name) {
413: PetscDrawSetType(draw,def);
414: }
415: PetscOptionsName("-nox","Run without graphics","None",&nox);
416: {
417: char filename[PETSC_MAX_PATH_LEN];
418: char movieext[32];
419: PetscBool image,movie;
420: PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");
421: PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");
422: PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);
423: PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);
424: PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL);
425: PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",PETSC_FUNCTION_NAME,draw->savesinglefile,&draw->savesinglefile,NULL);
426: if (image) {PetscDrawSetSave(draw,filename);}
427: if (movie) {PetscDrawSetSaveMovie(draw,movieext);}
428: PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);
429: if (image) {PetscDrawSetSaveFinalImage(draw,filename);}
430: PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL);
431: PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL);
432: }
433: PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);
434: PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);
436: /* process any options handlers added with PetscObjectAddOptionsHandler() */
437: PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);
439: PetscDrawViewFromOptions(draw,NULL,"-draw_view");
440: PetscOptionsEnd();
441: return(0);
442: }