Actual source code: drawreg.c


  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 = NULL;

 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: .seealso: PCView(), PetscViewerASCIIOpen()
 41: @*/
 42: PetscErrorCode  PetscDrawView(PetscDraw indraw,PetscViewer viewer)
 43: {
 44:   PetscBool      isdraw;
 45: #if defined(PETSC_HAVE_SAWS)
 46:   PetscBool      issaws;
 47: #endif

 50:   if (!viewer) {
 51:     PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);
 52:   }

 56:   PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);
 57:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);
 58: #if defined(PETSC_HAVE_SAWS)
 59:   PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);
 60: #endif
 61:   if (isdraw) {
 62:     PetscDraw draw;
 63:     char      str[36];
 64:     PetscReal x,y,bottom,h;

 66:     PetscViewerDrawGetDraw(viewer,0,&draw);
 67:     PetscDrawGetCurrentPoint(draw,&x,&y);
 68:     PetscStrncpy(str,"PetscDraw: ",sizeof(str));
 69:     PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str));
 70:     PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);
 71:     bottom = y - h;
 72:     PetscDrawPushCurrentPoint(draw,x,bottom);
 73: #if defined(PETSC_HAVE_SAWS)
 74:   } else if (issaws) {
 75:     PetscMPIInt rank;

 77:     PetscObjectName((PetscObject)indraw);
 78:     MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
 79:     if (!((PetscObject)indraw)->amsmem && rank == 0) {
 80:       PetscObjectViewSAWs((PetscObject)indraw,viewer);
 81:     }
 82: #endif
 83:   } else if (indraw->ops->view) {
 84:     (*indraw->ops->view)(indraw,viewer);
 85:   }
 86:   return 0;
 87: }

 89: /*@C
 90:    PetscDrawViewFromOptions - View from Options

 92:    Collective on PetscDraw

 94:    Input Parameters:
 95: +  A - the PetscDraw context
 96: .  obj - Optional object
 97: -  name - command line option

 99:    Level: intermediate
100: .seealso:  PetscDraw, PetscDrawView, PetscObjectViewFromOptions(), PetscDrawCreate()
101: @*/
102: PetscErrorCode  PetscDrawViewFromOptions(PetscDraw A,PetscObject obj,const char name[])
103: {
105:   PetscObjectViewFromOptions((PetscObject)A,obj,name);
106:   return 0;
107: }

109: /*@C
110:    PetscDrawCreate - Creates a graphics context.

112:    Collective

114:    Input Parameters:
115: +  comm - MPI communicator
116: .  display - X display when using X Windows
117: .  title - optional title added to top of window
118: .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
119: -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
120:           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE

122:    Output Parameter:
123: .  draw - location to put the PetscDraw context

125:    Level: beginner

127: .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
128:           PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
129:           PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
130:           PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
131:           PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
132:           PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
133:           PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
134:           PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
135:           PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
136:           PetscDrawZoom(), PetscDrawGetBoundingBox()

138: @*/
139: PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
140: {
141:   PetscDraw      draw;
142:   PetscReal      dpause = 0.0;
143:   PetscBool      flag;

145:   PetscDrawInitializePackage();
146:   *indraw = NULL;
147:   PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);

149:   draw->data    = NULL;
150:   PetscStrallocpy(display,&draw->display);
151:   PetscStrallocpy(title,&draw->title);
152:   draw->x       = x;
153:   draw->y       = y;
154:   draw->w       = w;
155:   draw->h       = h;
156:   draw->pause   = 0.0;
157:   draw->coor_xl = 0.0;
158:   draw->coor_xr = 1.0;
159:   draw->coor_yl = 0.0;
160:   draw->coor_yr = 1.0;
161:   draw->port_xl = 0.0;
162:   draw->port_xr = 1.0;
163:   draw->port_yl = 0.0;
164:   draw->port_yr = 1.0;
165:   draw->popup   = NULL;

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

170:   draw->savefilename   = NULL;
171:   draw->saveimageext   = NULL;
172:   draw->savemovieext   = NULL;
173:   draw->savefilecount  = 0;
174:   draw->savesinglefile = PETSC_FALSE;
175:   draw->savemoviefps   = PETSC_DECIDE;

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

179:   draw->boundbox_xl  = .5;
180:   draw->boundbox_xr  = .5;
181:   draw->boundbox_yl  = .9;
182:   draw->boundbox_yr  = .9;

184:   *indraw = draw;
185:   return 0;
186: }

188: /*@C
189:    PetscDrawSetType - Builds graphics object for a particular implementation

191:    Collective on PetscDraw

193:    Input Parameters:
194: +  draw      - the graphics context
195: -  type      - for example, PETSC_DRAW_X

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

200:    See PetscDrawSetFromOptions() for additional options database keys

202:    Level: intermediate

204:    Notes:
205:    See "petsc/include/petscdraw.h" for available methods (for instance,
206:    PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)

208: .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
209: @*/
210: PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
211: {
212:   PetscBool      match;
213:   PetscBool      flg=PETSC_FALSE;
214:   PetscErrorCode (*r)(PetscDraw);


219:   PetscObjectTypeCompare((PetscObject)draw,type,&match);
220:   if (match) return 0;

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

225:   /*
226:      This is not ideal, but it allows codes to continue to run if X graphics
227:    was requested but is not installed on this machine. Mostly this is for
228:    testing.
229:    */
230: #if !defined(PETSC_HAVE_X)
231:   if (!flg) {
232:     PetscStrcmp(type,PETSC_DRAW_X,&match);
233:     if (match) {
234:       PetscBool dontwarn = PETSC_TRUE;
235:       flg  = PETSC_TRUE;
236:       PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);
237:       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n");
238:     }
239:   }
240: #endif
241:   if (flg) {
242:     PetscStrcmp(type,"tikz",&flg);
243:     if (!flg) type = PETSC_DRAW_NULL;
244:   }

246:   PetscStrcmp(type,PETSC_DRAW_NULL,&match);
247:   if (match) {
248:     PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL);
249:     PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL);
250:     PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL);
251:     PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL);
252:     PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL);
253:   }

255:   PetscFunctionListFind(PetscDrawList,type,&r);
257:   if (draw->ops->destroy) (*draw->ops->destroy)(draw);
258:   PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));
259:   PetscObjectChangeTypeName((PetscObject)draw,type);
260:   (*r)(draw);
261:   return 0;
262: }

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

267:    Not Collective

269:    Input Parameter:
270: .  draw - Krylov context

272:    Output Parameters:
273: .  name - name of PetscDraw method

275:    Level: advanced

277: .seealso: PetscDrawSetType(), PetscDrawType

279: @*/
280: PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
281: {
284:   *type = ((PetscObject)draw)->type_name;
285:   return 0;
286: }

288: /*@C
289:    PetscDrawRegister - Adds a method to the graphics package.

291:    Not Collective

293:    Input Parameters:
294: +  name_solver - name of a new user-defined graphics class
295: -  routine_create - routine to create method context

297:    Level: developer

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

302:    Sample usage:
303: .vb
304:    PetscDrawRegister("my_draw_type", MyDrawCreate);
305: .ve

307:    Then, your specific graphics package can be chosen with the procedural interface via
308: $     PetscDrawSetType(ksp,"my_draw_type")
309:    or at runtime via the option
310: $     -draw_type my_draw_type

312: .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
313: @*/
314: PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
315: {
316:   PetscDrawInitializePackage();
317:   PetscFunctionListAdd(&PetscDrawList,sname,function);
318:   return 0;
319: }

321: /*@C
322:    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
323:    PetscDraw options in the database.

325:    Logically Collective on PetscDraw

327:    Input Parameters:
328: +  draw - the draw context
329: -  prefix - the prefix to prepend to all option names

331:    Level: advanced

333: .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
334: @*/
335: PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
336: {
338:   PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);
339:   return 0;
340: }

342: /*@
343:    PetscDrawSetFromOptions - Sets the graphics type from the options database.
344:       Defaults to a PETSc X Windows graphics.

346:    Collective on PetscDraw

348:    Input Parameter:
349: .     draw - the graphics context

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

363:    Level: intermediate

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

368: .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()

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


383:   PetscDrawRegisterAll();

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

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

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