Actual source code: drawreg.c

petsc-3.7.7 2017-09-25
Report Typos and Errors
  2: /*
  3:        Provides the registration process for PETSc PetscDraw routines
  4: */
  5: #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
  6: #include <petscviewer.h>             /*I "petscviewer.h" I*/
  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;

 18: /*@C
 19:    PetscDrawView - Prints the PetscDraw data structure.

 21:    Collective on PetscDraw

 23:    Input Parameters:
 24: +  indraw - the PetscDraw context
 25: -  viewer - visualization context

 27:    See PetscDrawSetFromOptions() for options database keys

 29:    Note:
 30:    The available visualization contexts include
 31: +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
 32: -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
 33:          output where only the first processor opens
 34:          the file.  All other processors send their
 35:          data to the first processor to print.

 37:    The user can open an alternative visualization context with
 38:    PetscViewerASCIIOpen() - output to a specified file.

 40:    Level: beginner

 42: .keywords: PetscDraw, view

 44: .seealso: PCView(), PetscViewerASCIIOpen()
 45: @*/
 46: PetscErrorCode  PetscDrawView(PetscDraw indraw,PetscViewer viewer)
 47: {
 49:   PetscBool      isdraw;
 50: #if defined(PETSC_HAVE_SAWS)
 51:   PetscBool      issaws;
 52: #endif

 56:   if (!viewer) {
 57:     PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);
 58:   }

 62:   PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);
 63:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);
 64: #if defined(PETSC_HAVE_SAWS)
 65:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);
 66: #endif
 67:   if (isdraw) {
 68:     PetscDraw draw;
 69:     char      str[36];
 70:     PetscReal x,y,bottom,h;

 72:     PetscViewerDrawGetDraw(viewer,0,&draw);
 73:     PetscDrawGetCurrentPoint(draw,&x,&y);
 74:     PetscStrcpy(str,"PetscDraw: ");
 75:     PetscStrcat(str,((PetscObject)indraw)->type_name);
 76:     PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);
 77:     bottom = y - h;
 78:     PetscDrawPushCurrentPoint(draw,x,bottom);
 79: #if defined(PETSC_HAVE_SAWS)
 80:   } else if (issaws) {
 81:     PetscMPIInt rank;

 83:     PetscObjectName((PetscObject)indraw);
 84:     MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 85:     if (!((PetscObject)indraw)->amsmem && !rank) {
 86:       PetscObjectViewSAWs((PetscObject)indraw,viewer);
 87:     }
 88: #endif
 89:   } else if (indraw->ops->view) {
 90:     (*indraw->ops->view)(indraw,viewer);
 91:   }
 92:   return(0);
 93: }

 97: /*@C
 98:    PetscDrawCreate - Creates a graphics context.

100:    Collective on MPI_Comm

102:    Input Parameter:
103: +  comm - MPI communicator
104: .  display - X display when using X windows
105: .  title - optional title added to top of window
106: .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
107: -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
108:           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE

110:    Output Parameter:
111: .  draw - location to put the PetscDraw context

113:    Level: beginner

115:    Concepts: graphics^creating context
116:    Concepts: drawing^creating context

118: .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType()
119: @*/
120: PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
121: {
122:   PetscDraw      draw;
124:   PetscReal      dpause = 0.0;
125:   PetscBool      flag;

128:   PetscDrawInitializePackage();
129:   *indraw = 0;
130:   PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);

132:   draw->data    = NULL;
133:   PetscStrallocpy(display,&draw->display);
134:   PetscStrallocpy(title,&draw->title);
135:   draw->x       = x;
136:   draw->y       = y;
137:   draw->w       = w;
138:   draw->h       = h;
139:   draw->pause   = 0.0;
140:   draw->coor_xl = 0.0;
141:   draw->coor_xr = 1.0;
142:   draw->coor_yl = 0.0;
143:   draw->coor_yr = 1.0;
144:   draw->port_xl = 0.0;
145:   draw->port_xr = 1.0;
146:   draw->port_yl = 0.0;
147:   draw->port_yr = 1.0;
148:   draw->popup   = NULL;

150:   PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);
151:   if (flag) draw->pause = dpause;

153:   draw->savefilename   = NULL;
154:   draw->saveimageext   = NULL;
155:   draw->savemovieext   = NULL;
156:   draw->savefilecount  = 0;
157:   draw->savesinglefile = PETSC_FALSE;
158:   draw->savemoviefps   = PETSC_DECIDE;

160:   PetscDrawSetCurrentPoint(draw,.5,.9);

162:   draw->boundbox_xl  = .5;
163:   draw->boundbox_xr  = .5;
164:   draw->boundbox_yl  = .9;
165:   draw->boundbox_yr  = .9;

167:   *indraw = draw;
168:   return(0);
169: }

173: /*@C
174:    PetscDrawSetType - Builds graphics object for a particular implementation

176:    Collective on PetscDraw

178:    Input Parameter:
179: +  draw      - the graphics context
180: -  type      - for example, PETSC_DRAW_X

182:    Options Database Command:
183: .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)

185:    See PetscDrawSetFromOptions for additional options database keys

187:    Level: intermediate

189:    Notes:
190:    See "petsc/include/petscdraw.h" for available methods (for instance,
191:    PETSC_DRAW_X)

193:    Concepts: drawing^X windows
194:    Concepts: X windows^graphics
195:    Concepts: drawing^Microsoft Windows

197: .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
198: @*/
199: PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
200: {
201:   PetscErrorCode ierr,(*r)(PetscDraw);
202:   PetscBool      match;
203:   PetscBool      flg=PETSC_FALSE;


209:   PetscObjectTypeCompare((PetscObject)draw,type,&match);
210:   if (match) return(0);

212:   /*  User requests no graphics */
213:   PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);

215:   /*
216:      This is not ideal, but it allows codes to continue to run if X graphics
217:    was requested but is not installed on this machine. Mostly this is for
218:    testing.
219:    */
220: #if !defined(PETSC_HAVE_X)
221:   if (!flg) {
222:     PetscStrcmp(type,PETSC_DRAW_X,&match);
223:     if (match) {
224:       PetscBool dontwarn = PETSC_TRUE;
225:       flg  = PETSC_TRUE;
226:       PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);
227:       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
228:     }
229:   }
230: #endif
231:   if (flg) type = PETSC_DRAW_NULL;

233:    PetscFunctionListFind(PetscDrawList,type,&r);
234:   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
235:   if (draw->ops->destroy) {(*draw->ops->destroy)(draw);}
236:   PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));
237:   PetscObjectChangeTypeName((PetscObject)draw,type);
238:   (*r)(draw);
239:   return(0);
240: }

244: /*@C
245:    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.

247:    Not Collective

249:    Input Parameter:
250: .  draw - Krylov context

252:    Output Parameters:
253: .  name - name of PetscDraw method

255:    Level: advanced

257: @*/
258: PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
259: {
263:   *type = ((PetscObject)draw)->type_name;
264:   return(0);
265: }

269: /*@C
270:    PetscDrawRegister - Adds a method to the graphics package.

272:    Not Collective

274:    Input Parameters:
275: +  name_solver - name of a new user-defined graphics class
276: -  routine_create - routine to create method context

278:    Level: developer

280:    Notes:
281:    PetscDrawRegister() may be called multiple times to add several user-defined graphics classes

283:    Sample usage:
284: .vb
285:    PetscDrawRegister("my_draw_type", MyDrawCreate);
286: .ve

288:    Then, your specific graphics package can be chosen with the procedural interface via
289: $     PetscDrawSetType(ksp,"my_draw_type")
290:    or at runtime via the option
291: $     -draw_type my_draw_type

293:    Concepts: graphics^registering new draw classes
294:    Concepts: PetscDraw^registering new draw classes

296: .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy()
297: @*/
298: PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
299: {

303:   PetscFunctionListAdd(&PetscDrawList,sname,function);
304:   return(0);
305: }

309: /*@C
310:    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
311:    PetscDraw options in the database.

313:    Logically Collective on PetscDraw

315:    Input Parameter:
316: +  draw - the draw context
317: -  prefix - the prefix to prepend to all option names

319:    Level: advanced

321: .keywords: PetscDraw, set, options, prefix, database

323: .seealso: PetscDrawSetFromOptions()
324: @*/
325: PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
326: {

331:   PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);
332:   return(0);
333: }

337: /*@
338:    PetscDrawSetFromOptions - Sets the graphics type from the options database.
339:       Defaults to a PETSc X windows graphics.

341:    Collective on PetscDraw

343:    Input Parameter:
344: .     draw - the graphics context

346:    Options Database Keys:
347: +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
348: .   -nox_warning - when X windows support is not installed this prevents the warning message from being printed
349: .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
350: .   -draw_marker_type - <x,point>
351: .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
352: .   -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window
353: .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
354: .   -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'
355: .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
356: -   -draw_save_on_flush - saves an image on each flush, mainly for debugging

358:    Level: intermediate

360:    Notes: Must be called after PetscDrawCreate() before the PetscDraw is used.

362:    Concepts: drawing^setting options
363:    Concepts: graphics^setting options

365: .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage()

367: @*/
368: PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
369: {
370:   PetscErrorCode    ierr;
371:   PetscBool         flg,nox;
372:   char              vtype[256];
373:   const char        *def;
374: #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
375:   PetscBool         warn;
376: #endif


381:   PetscDrawRegisterAll();

383:   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
384:   else {
385:     PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);
386:     def  = PETSC_DRAW_NULL;
387: #if defined(PETSC_USE_WINDOWS_GRAPHICS)
388:     if (!nox) def = PETSC_DRAW_WIN32;
389: #elif defined(PETSC_HAVE_X)
390:     if (!nox) def = PETSC_DRAW_X;
391: #elif defined(PETSC_HAVE_GLUT)
392:     if (!nox) def = PETSC_DRAW_GLUT;
393: #elif defined(PETSC_HAVE_OPENGLES)
394:     if (!nox) def = PETSC_DRAW_OPENGLES;
395: #else
396:     PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);
397:     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
398: #endif
399:   }
400:   PetscObjectOptionsBegin((PetscObject)draw);
401:   PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);
402:   if (flg) {
403:     PetscDrawSetType(draw,vtype);
404:   } else if (!((PetscObject)draw)->type_name) {
405:     PetscDrawSetType(draw,def);
406:   }
407:   PetscOptionsName("-nox","Run without graphics","None",&nox);
408:   {
409:     char      filename[PETSC_MAX_PATH_LEN];
410:     char      movieext[32];
411:     PetscBool image,movie;
412:     PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");
413:     PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");
414:     PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);
415:     PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);
416:     PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",__FUNCT__,draw->savemoviefps,&draw->savemoviefps,NULL);
417:     PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",__FUNCT__,draw->savesinglefile,&draw->savesinglefile,NULL);
418:     if (image) {PetscDrawSetSave(draw,filename);}
419:     if (movie) {PetscDrawSetSaveMovie(draw,movieext);}
420:     PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);
421:     if (image) {PetscDrawSetSaveFinalImage(draw,filename);}
422:     PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",__FUNCT__,draw->saveonclear,&draw->saveonclear,NULL);
423:     PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",__FUNCT__,draw->saveonflush,&draw->saveonflush,NULL);
424:   }
425:   PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);
426:   PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);

428:   /* process any options handlers added with PetscObjectAddOptionsHandler() */
429:   PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);

431:   PetscDrawViewFromOptions(draw,NULL,"-draw_view");
432:   PetscOptionsEnd();
433:   return(0);
434: }