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