xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 0076e027f26c384cf046efff3031f23e18ac395e)
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