15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the registration process for PETSc PetscDraw routines 45c6c1daeSBarry Smith */ 55c6c1daeSBarry Smith #include <petsc-private/drawimpl.h> /*I "petscdraw.h" I*/ 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith /* 85c6c1daeSBarry Smith Contains the list of registered PetscDraw routines 95c6c1daeSBarry Smith */ 10140e18c1SBarry Smith PetscFunctionList PetscDrawList = 0; 115c6c1daeSBarry Smith 12*0076e027SBarry Smith #if defined(PETSC_HAVE_AMS) 13*0076e027SBarry Smith #include <petscviewerams.h> 14*0076e027SBarry Smith #endif 15*0076e027SBarry Smith 16*0076e027SBarry Smith #undef __FUNCT__ 17*0076e027SBarry Smith #define __FUNCT__ "PetscDrawView" 18*0076e027SBarry Smith /*@C 19*0076e027SBarry Smith PetscDrawView - Prints the PetscDraw data structure. 20*0076e027SBarry Smith 21*0076e027SBarry Smith Collective on PetscDraw 22*0076e027SBarry Smith 23*0076e027SBarry Smith Input Parameters: 24*0076e027SBarry Smith + indraw - the PetscDraw context 25*0076e027SBarry Smith - viewer - visualization context 26*0076e027SBarry Smith 27*0076e027SBarry Smith Options Database Keys: 28*0076e027SBarry Smith . -draw_view - print the ksp data structure at the end of a PetscDrawSetFromOptions() call 29*0076e027SBarry Smith 30*0076e027SBarry Smith Note: 31*0076e027SBarry Smith The available visualization contexts include 32*0076e027SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 33*0076e027SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 34*0076e027SBarry Smith output where only the first processor opens 35*0076e027SBarry Smith the file. All other processors send their 36*0076e027SBarry Smith data to the first processor to print. 37*0076e027SBarry Smith 38*0076e027SBarry Smith The user can open an alternative visualization context with 39*0076e027SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 40*0076e027SBarry Smith 41*0076e027SBarry Smith Level: beginner 42*0076e027SBarry Smith 43*0076e027SBarry Smith .keywords: PetscDraw, view 44*0076e027SBarry Smith 45*0076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen() 46*0076e027SBarry Smith @*/ 47*0076e027SBarry Smith PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer) 48*0076e027SBarry Smith { 49*0076e027SBarry Smith PetscErrorCode ierr; 50*0076e027SBarry Smith PetscBool isdraw; 51*0076e027SBarry Smith #if defined(PETSC_HAVE_AMS) 52*0076e027SBarry Smith PetscBool isams; 53*0076e027SBarry Smith #endif 54*0076e027SBarry Smith 55*0076e027SBarry Smith PetscFunctionBegin; 56*0076e027SBarry Smith PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1); 57*0076e027SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)indraw)); 58*0076e027SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 59*0076e027SBarry Smith PetscCheckSameComm(indraw,1,viewer,2); 60*0076e027SBarry Smith 61*0076e027SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 62*0076e027SBarry Smith #if defined(PETSC_HAVE_AMS) 63*0076e027SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERAMS,&isams);CHKERRQ(ierr); 64*0076e027SBarry Smith #endif 65*0076e027SBarry Smith if (isdraw) { 66*0076e027SBarry Smith PetscDraw draw; 67*0076e027SBarry Smith char str[36]; 68*0076e027SBarry Smith PetscReal x,y,bottom,h; 69*0076e027SBarry Smith 70*0076e027SBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 71*0076e027SBarry Smith ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr); 72*0076e027SBarry Smith ierr = PetscStrcpy(str,"PetscDraw: ");CHKERRQ(ierr); 73*0076e027SBarry Smith ierr = PetscStrcat(str,((PetscObject)indraw)->type_name);CHKERRQ(ierr); 74*0076e027SBarry Smith ierr = PetscDrawBoxedString(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr); 75*0076e027SBarry Smith bottom = y - h; 76*0076e027SBarry Smith ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr); 77*0076e027SBarry Smith #if defined(PETSC_HAVE_AMS) 78*0076e027SBarry Smith } else if (isams) { 79*0076e027SBarry Smith if (!((PetscObject)indraw)->amsmem) { 80*0076e027SBarry Smith ierr = PetscObjectViewAMS((PetscObject)indraw,viewer);CHKERRQ(ierr); 81*0076e027SBarry Smith } 82*0076e027SBarry Smith #endif 83*0076e027SBarry Smith } else if (indraw->ops->view) { 84*0076e027SBarry Smith ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr); 85*0076e027SBarry Smith } 86*0076e027SBarry Smith PetscFunctionReturn(0); 87*0076e027SBarry Smith } 88*0076e027SBarry Smith 895c6c1daeSBarry Smith #undef __FUNCT__ 905c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCreate" 915c6c1daeSBarry Smith /*@C 925c6c1daeSBarry Smith PetscDrawCreate - Creates a graphics context. 935c6c1daeSBarry Smith 945c6c1daeSBarry Smith Collective on MPI_Comm 955c6c1daeSBarry Smith 965c6c1daeSBarry Smith Input Parameter: 975c6c1daeSBarry Smith + comm - MPI communicator 985c6c1daeSBarry Smith . display - X display when using X windows 995c6c1daeSBarry Smith . title - optional title added to top of window 1005c6c1daeSBarry Smith . x,y - coordinates of lower left corner of window or PETSC_DECIDE 1015c6c1daeSBarry Smith - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 1025c6c1daeSBarry Smith or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 1035c6c1daeSBarry Smith 1045c6c1daeSBarry Smith Output Parameter: 1055c6c1daeSBarry Smith . draw - location to put the PetscDraw context 1065c6c1daeSBarry Smith 1075c6c1daeSBarry Smith Level: beginner 1085c6c1daeSBarry Smith 1095c6c1daeSBarry Smith Concepts: graphics^creating context 1105c6c1daeSBarry Smith Concepts: drawing^creating context 1115c6c1daeSBarry Smith 1125c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType() 1135c6c1daeSBarry Smith @*/ 1145c6c1daeSBarry Smith PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw) 1155c6c1daeSBarry Smith { 1165c6c1daeSBarry Smith PetscDraw draw; 1175c6c1daeSBarry Smith PetscErrorCode ierr; 1185c6c1daeSBarry Smith PetscReal dpause; 1195c6c1daeSBarry Smith PetscBool flag; 1205c6c1daeSBarry Smith 1215c6c1daeSBarry Smith PetscFunctionBegin; 122519f805aSKarl Rupp #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 123607a6623SBarry Smith ierr = PetscDrawInitializePackage();CHKERRQ(ierr); 1245c6c1daeSBarry Smith #endif 1255c6c1daeSBarry Smith *indraw = 0; 126*0076e027SBarry Smith ierr = PetscHeaderCreate(draw,_p_PetscDraw,struct _PetscDrawOps,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr); 127a297a907SKarl Rupp 1285c6c1daeSBarry Smith draw->data = 0; 1295c6c1daeSBarry Smith ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 1305c6c1daeSBarry Smith ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 1315c6c1daeSBarry Smith draw->x = x; 1325c6c1daeSBarry Smith draw->y = y; 1335c6c1daeSBarry Smith draw->w = w; 1345c6c1daeSBarry Smith draw->h = h; 1355c6c1daeSBarry Smith draw->pause = 0.0; 1365c6c1daeSBarry Smith draw->coor_xl = 0.0; 1375c6c1daeSBarry Smith draw->coor_xr = 1.0; 1385c6c1daeSBarry Smith draw->coor_yl = 0.0; 1395c6c1daeSBarry Smith draw->coor_yr = 1.0; 1405c6c1daeSBarry Smith draw->port_xl = 0.0; 1415c6c1daeSBarry Smith draw->port_xr = 1.0; 1425c6c1daeSBarry Smith draw->port_yl = 0.0; 1435c6c1daeSBarry Smith draw->port_yr = 1.0; 1445c6c1daeSBarry Smith draw->popup = 0; 145a297a907SKarl Rupp 1460298fd71SBarry Smith ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr); 1475c6c1daeSBarry Smith if (flag) draw->pause = dpause; 1480298fd71SBarry Smith draw->savefilename = NULL; 1495c6c1daeSBarry Smith draw->savefilemovie = PETSC_FALSE; 1505c6c1daeSBarry Smith draw->savefilecount = -1; 151a297a907SKarl Rupp 1525c6c1daeSBarry Smith ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr); 153a297a907SKarl Rupp 1545c6c1daeSBarry Smith draw->boundbox_xl = .5; 1555c6c1daeSBarry Smith draw->boundbox_xr = .5; 1565c6c1daeSBarry Smith draw->boundbox_yl = .9; 1575c6c1daeSBarry Smith draw->boundbox_yr = .9; 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith *indraw = draw; 1605c6c1daeSBarry Smith PetscFunctionReturn(0); 1615c6c1daeSBarry Smith } 1625c6c1daeSBarry Smith 1635c6c1daeSBarry Smith #undef __FUNCT__ 1645c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetType" 1655c6c1daeSBarry Smith /*@C 1665c6c1daeSBarry Smith PetscDrawSetType - Builds graphics object for a particular implementation 1675c6c1daeSBarry Smith 1685c6c1daeSBarry Smith Collective on PetscDraw 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith Input Parameter: 1715c6c1daeSBarry Smith + draw - the graphics context 1725c6c1daeSBarry Smith - type - for example, PETSC_DRAW_X 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith Options Database Command: 1755c6c1daeSBarry Smith . -draw_type <type> - Sets the type; use -help for a list 1765c6c1daeSBarry Smith of available methods (for instance, x) 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith Level: intermediate 1795c6c1daeSBarry Smith 1805c6c1daeSBarry Smith Notes: 1815c6c1daeSBarry Smith See "petsc/include/petscdraw.h" for available methods (for instance, 1825c6c1daeSBarry Smith PETSC_DRAW_X) 1835c6c1daeSBarry Smith 1845c6c1daeSBarry Smith Concepts: drawing^X windows 1855c6c1daeSBarry Smith Concepts: X windows^graphics 1865c6c1daeSBarry Smith Concepts: drawing^Microsoft Windows 1875c6c1daeSBarry Smith 1885c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 1895c6c1daeSBarry Smith @*/ 1905c6c1daeSBarry Smith PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type) 1915c6c1daeSBarry Smith { 1925c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscDraw); 1935c6c1daeSBarry Smith PetscBool match; 1945c6c1daeSBarry Smith PetscBool flg=PETSC_FALSE; 1955c6c1daeSBarry Smith 1965c6c1daeSBarry Smith PetscFunctionBegin; 1975c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1985c6c1daeSBarry Smith PetscValidCharPointer(type,2); 1995c6c1daeSBarry Smith 2005c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr); 2015c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2025c6c1daeSBarry Smith 2035c6c1daeSBarry Smith /* User requests no graphics */ 2040298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox",&flg);CHKERRQ(ierr); 2055c6c1daeSBarry Smith 2065c6c1daeSBarry Smith /* 2075c6c1daeSBarry Smith This is not ideal, but it allows codes to continue to run if X graphics 2085c6c1daeSBarry Smith was requested but is not installed on this machine. Mostly this is for 2095c6c1daeSBarry Smith testing. 2105c6c1daeSBarry Smith */ 2115c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X) 2125c6c1daeSBarry Smith if (!flg) { 2135c6c1daeSBarry Smith ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr); 2145c6c1daeSBarry Smith if (match) { 2155c6c1daeSBarry Smith PetscBool dontwarn = PETSC_TRUE; 2165c6c1daeSBarry Smith flg = PETSC_TRUE; 2170298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr); 218a297a907SKarl Rupp if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n"); 2195c6c1daeSBarry Smith } 2205c6c1daeSBarry Smith } 2215c6c1daeSBarry Smith #endif 222a297a907SKarl Rupp if (flg) type = PETSC_DRAW_NULL; 2235c6c1daeSBarry Smith 2245c6c1daeSBarry Smith if (draw->data) { 2255c6c1daeSBarry Smith /* destroy the old private PetscDraw context */ 2265c6c1daeSBarry Smith ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr); 2270298fd71SBarry Smith draw->ops->destroy = NULL; 2285c6c1daeSBarry Smith draw->data = 0; 2295c6c1daeSBarry Smith } 2305c6c1daeSBarry Smith 2311c9cd337SJed Brown ierr = PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr); 2325c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type); 2335c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr); 2345c6c1daeSBarry Smith draw->data = 0; 2355c6c1daeSBarry Smith ierr = (*r)(draw);CHKERRQ(ierr); 2365c6c1daeSBarry Smith PetscFunctionReturn(0); 2375c6c1daeSBarry Smith } 2385c6c1daeSBarry Smith 2395c6c1daeSBarry Smith #undef __FUNCT__ 2405c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetType" 2415c6c1daeSBarry Smith /*@C 2425c6c1daeSBarry Smith PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 2435c6c1daeSBarry Smith 2445c6c1daeSBarry Smith Not Collective 2455c6c1daeSBarry Smith 2465c6c1daeSBarry Smith Input Parameter: 2475c6c1daeSBarry Smith . draw - Krylov context 2485c6c1daeSBarry Smith 2495c6c1daeSBarry Smith Output Parameters: 2505c6c1daeSBarry Smith . name - name of PetscDraw method 2515c6c1daeSBarry Smith 2525c6c1daeSBarry Smith Level: advanced 2535c6c1daeSBarry Smith 2545c6c1daeSBarry Smith @*/ 2555c6c1daeSBarry Smith PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type) 2565c6c1daeSBarry Smith { 2575c6c1daeSBarry Smith PetscFunctionBegin; 2585c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2595c6c1daeSBarry Smith PetscValidPointer(type,2); 2605c6c1daeSBarry Smith *type = ((PetscObject)draw)->type_name; 2615c6c1daeSBarry Smith PetscFunctionReturn(0); 2625c6c1daeSBarry Smith } 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith #undef __FUNCT__ 2655c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRegister" 266607a6623SBarry Smith /*@C 2671c84c290SBarry Smith PetscDrawRegister - Adds a method to the graphics package. 2681c84c290SBarry Smith 2691c84c290SBarry Smith Not Collective 2701c84c290SBarry Smith 2711c84c290SBarry Smith Input Parameters: 272*0076e027SBarry Smith + name_solver - name of a new user-defined graphics class 2731c84c290SBarry Smith - routine_create - routine to create method context 2741c84c290SBarry Smith 2751c84c290SBarry Smith Level: developer 2761c84c290SBarry Smith 2771c84c290SBarry Smith Notes: 278*0076e027SBarry Smith PetscDrawRegister() may be called multiple times to add several user-defined graphics classes 2791c84c290SBarry Smith 2801c84c290SBarry Smith Sample usage: 2811c84c290SBarry Smith .vb 282bdf89e91SBarry Smith PetscDrawRegister("my_draw_type", MyDrawCreate); 2831c84c290SBarry Smith .ve 2841c84c290SBarry Smith 285*0076e027SBarry Smith Then, your specific graphics package can be chosen with the procedural interface via 2861c84c290SBarry Smith $ PetscDrawSetType(ksp,"my_draw_type") 2871c84c290SBarry Smith or at runtime via the option 2881c84c290SBarry Smith $ -draw_type my_draw_type 2891c84c290SBarry Smith 2901c84c290SBarry Smith Concepts: graphics^registering new draw classes 2911c84c290SBarry Smith Concepts: PetscDraw^registering new draw classes 2921c84c290SBarry Smith 2931c84c290SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy() 2941c84c290SBarry Smith @*/ 295bdf89e91SBarry Smith PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw)) 2965c6c1daeSBarry Smith { 2975c6c1daeSBarry Smith PetscErrorCode ierr; 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith PetscFunctionBegin; 300a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr); 3015c6c1daeSBarry Smith PetscFunctionReturn(0); 3025c6c1daeSBarry Smith } 3035c6c1daeSBarry Smith 3045c6c1daeSBarry Smith #undef __FUNCT__ 3055c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetFromOptions" 3065c6c1daeSBarry Smith /*@ 3075c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 3085c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 3095c6c1daeSBarry Smith 3105c6c1daeSBarry Smith Collective on PetscDraw 3115c6c1daeSBarry Smith 3125c6c1daeSBarry Smith Input Parameter: 3135c6c1daeSBarry Smith . draw - the graphics context 3145c6c1daeSBarry Smith 3155c6c1daeSBarry Smith Options Database Keys: 3165c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 3175c6c1daeSBarry Smith . -nox_warning - when X windows support is not installed this prevents the warning message 3185c6c1daeSBarry Smith from being printed 3197450148dSBarry Smith . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 3205c6c1daeSBarry Smith . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file 321a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 3228b7fcac6SBarry Smith . -draw_save_on_flush - saves an image on each flush in addition to each clear 3238b7fcac6SBarry Smith - -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with filename_%d 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith Level: intermediate 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith Notes: 3285c6c1daeSBarry Smith Must be called after PetscDrawCreate() before the PetscDrawtor is used. 3295c6c1daeSBarry Smith 3305c6c1daeSBarry Smith Concepts: drawing^setting options 3315c6c1daeSBarry Smith Concepts: graphics^setting options 3325c6c1daeSBarry Smith 3335c6c1daeSBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave() 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith @*/ 3365c6c1daeSBarry Smith PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 3375c6c1daeSBarry Smith { 3385c6c1daeSBarry Smith PetscErrorCode ierr; 3395c6c1daeSBarry Smith PetscBool flg,nox; 3405c6c1daeSBarry Smith char vtype[256]; 3415c6c1daeSBarry Smith const char *def; 3427450148dSBarry Smith PetscReal dpause; 3435c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3445c6c1daeSBarry Smith PetscBool warn; 3455c6c1daeSBarry Smith #endif 346*0076e027SBarry Smith PetscViewer v2; 347*0076e027SBarry Smith PetscViewerFormat format; 3485c6c1daeSBarry Smith 3495c6c1daeSBarry Smith PetscFunctionBegin; 3505c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith if (!PetscDrawList) { 353607a6623SBarry Smith ierr = PetscDrawRegisterAll();CHKERRQ(ierr); 3545c6c1daeSBarry Smith } 3555c6c1daeSBarry Smith 356a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 357a297a907SKarl Rupp else { 3580298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox",&nox);CHKERRQ(ierr); 3595c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3605c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3615c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3625c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3635c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 3645c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT) 3655c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_GLUT; 3665c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES) 3675c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_OPENGLES; 3685c6c1daeSBarry Smith #else 3690298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox_warning",&warn);CHKERRQ(ierr); 370a297a907SKarl Rupp if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n"); 3715c6c1daeSBarry Smith #endif 3725c6c1daeSBarry Smith } 3735c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); 3745c6c1daeSBarry Smith ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); 3755c6c1daeSBarry Smith if (flg) { 3765c6c1daeSBarry Smith ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); 3775c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 3785c6c1daeSBarry Smith ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); 3795c6c1daeSBarry Smith } 3805c6c1daeSBarry Smith ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); 3815c6c1daeSBarry Smith #if defined(PETSC_HAVE_X) 3825c6c1daeSBarry Smith { 3835c6c1daeSBarry Smith char filename[PETSC_MAX_PATH_LEN]; 3845c6c1daeSBarry Smith PetscBool save,movie = PETSC_FALSE; 3850298fd71SBarry Smith ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,NULL);CHKERRQ(ierr); 3868b7fcac6SBarry Smith ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file","PetscDrawSetSave",draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr); 3875c6c1daeSBarry Smith ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); 3885c6c1daeSBarry Smith if (save) { 3895c6c1daeSBarry Smith ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr); 3905c6c1daeSBarry Smith } 391a4494fc1SBarry Smith ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file (X Windows only) on each flush","PetscDrawSetSave",draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr); 3925c6c1daeSBarry Smith } 3935c6c1daeSBarry Smith #endif 3947450148dSBarry Smith ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flg);CHKERRQ(ierr); 3957450148dSBarry Smith if (flg) draw->pause = dpause; 3965c6c1daeSBarry Smith 3975c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 3985c6c1daeSBarry Smith ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr); 399*0076e027SBarry Smith ierr = PetscOptionsViewer("-draw_view","Display Draw with the viewer","PetscDrawView",&v2,&format,&flg);CHKERRQ(ierr); 400*0076e027SBarry Smith if (flg) { 401*0076e027SBarry Smith ierr = PetscViewerPushFormat(v2,format);CHKERRQ(ierr); 402*0076e027SBarry Smith ierr = PetscDrawView(draw,v2);CHKERRQ(ierr); 403*0076e027SBarry Smith ierr = PetscViewerPopFormat(v2);CHKERRQ(ierr); 404*0076e027SBarry Smith } 4055c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 4065c6c1daeSBarry Smith PetscFunctionReturn(0); 4075c6c1daeSBarry Smith } 4085c6c1daeSBarry Smith 4095c6c1daeSBarry Smith #undef __FUNCT__ 4105c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetSave" 4115c6c1daeSBarry Smith /*@C 41299bbeb84SJed Brown PetscDrawSetSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith Collective on PetscDraw 4155c6c1daeSBarry Smith 4165c6c1daeSBarry Smith Input Parameter: 4175c6c1daeSBarry Smith + draw - the graphics context 4180298fd71SBarry Smith . filename - name of the file, if NULL uses name of draw object 4195c6c1daeSBarry Smith - movie - produce a movie of all the images 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith Options Database Command: 4225c6c1daeSBarry Smith + -draw_save <filename> 4235c6c1daeSBarry Smith - -draw_save_movie 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Level: intermediate 4265c6c1daeSBarry Smith 4275c6c1daeSBarry Smith Concepts: X windows^graphics 4285c6c1daeSBarry Smith 4295c6c1daeSBarry Smith Notes: You should call this BEFORE calling PetscDrawClear() and creating your image. 4305c6c1daeSBarry Smith 4315c6c1daeSBarry 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 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the 4345c6c1daeSBarry 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 4355c6c1daeSBarry Smith 4365c6c1daeSBarry Smith 43799bbeb84SJed Brown .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 4385c6c1daeSBarry Smith @*/ 4395c6c1daeSBarry Smith PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie) 4405c6c1daeSBarry Smith { 4415c6c1daeSBarry Smith PetscErrorCode ierr; 4425c6c1daeSBarry Smith 4435c6c1daeSBarry Smith PetscFunctionBegin; 4445c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4455c6c1daeSBarry Smith ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); 446a297a907SKarl Rupp 4475c6c1daeSBarry Smith draw->savefilemovie = movie; 4485c6c1daeSBarry Smith if (filename && filename[0]) { 4495c6c1daeSBarry Smith ierr = PetscStrallocpy(filename,&draw->savefilename);CHKERRQ(ierr); 4505c6c1daeSBarry Smith } else { 4515c6c1daeSBarry Smith const char *name; 4525c6c1daeSBarry Smith ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr); 4535c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr); 4545c6c1daeSBarry Smith } 4555c6c1daeSBarry Smith if (draw->ops->setsave) { 4565c6c1daeSBarry Smith ierr = (*draw->ops->setsave)(draw,filename);CHKERRQ(ierr); 4575c6c1daeSBarry Smith } 4585c6c1daeSBarry Smith PetscFunctionReturn(0); 4595c6c1daeSBarry Smith } 460