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