xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 9c8bf5420c6f7064591f60b3ab9f6265d71985cc)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the registration process for PETSc PetscDraw routines
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/drawimpl.h>  /*I "petscdraw.h" I*/
6111ee811SBarry Smith #include <petscviewer.h>             /*I "petscviewer.h" I*/
7111ee811SBarry Smith #if defined(PETSC_HAVE_SAWS)
8111ee811SBarry Smith #include <petscviewersaws.h>
9111ee811SBarry Smith #endif
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith /*
125c6c1daeSBarry Smith    Contains the list of registered PetscDraw routines
135c6c1daeSBarry Smith */
14140e18c1SBarry Smith PetscFunctionList PetscDrawList = 0;
155c6c1daeSBarry Smith 
160076e027SBarry Smith /*@C
170076e027SBarry Smith    PetscDrawView - Prints the PetscDraw data structure.
180076e027SBarry Smith 
190076e027SBarry Smith    Collective on PetscDraw
200076e027SBarry Smith 
210076e027SBarry Smith    Input Parameters:
220076e027SBarry Smith +  indraw - the PetscDraw context
230076e027SBarry Smith -  viewer - visualization context
240076e027SBarry Smith 
25236f5a4dSBarry Smith    See PetscDrawSetFromOptions() for options database keys
260076e027SBarry Smith 
270076e027SBarry Smith    Note:
280076e027SBarry Smith    The available visualization contexts include
290076e027SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
300076e027SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
310076e027SBarry Smith          output where only the first processor opens
320076e027SBarry Smith          the file.  All other processors send their
330076e027SBarry Smith          data to the first processor to print.
340076e027SBarry Smith 
350076e027SBarry Smith    The user can open an alternative visualization context with
360076e027SBarry Smith    PetscViewerASCIIOpen() - output to a specified file.
370076e027SBarry Smith 
380076e027SBarry Smith    Level: beginner
390076e027SBarry Smith 
400076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen()
410076e027SBarry Smith @*/
420076e027SBarry Smith PetscErrorCode  PetscDrawView(PetscDraw indraw,PetscViewer viewer)
430076e027SBarry Smith {
440076e027SBarry Smith   PetscErrorCode ierr;
450076e027SBarry Smith   PetscBool      isdraw;
46e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
47536b137fSBarry Smith   PetscBool      issaws;
480076e027SBarry Smith #endif
490076e027SBarry Smith 
500076e027SBarry Smith   PetscFunctionBegin;
510076e027SBarry Smith   PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1);
52f55353a2SBarry Smith   if (!viewer) {
53f55353a2SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);CHKERRQ(ierr);
54f55353a2SBarry Smith   }
550076e027SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
560076e027SBarry Smith   PetscCheckSameComm(indraw,1,viewer,2);
570076e027SBarry Smith 
5898c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr);
590076e027SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
60e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
61536b137fSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr);
620076e027SBarry Smith #endif
630076e027SBarry Smith   if (isdraw) {
640076e027SBarry Smith     PetscDraw draw;
650076e027SBarry Smith     char      str[36];
660076e027SBarry Smith     PetscReal x,y,bottom,h;
670076e027SBarry Smith 
680076e027SBarry Smith     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
690076e027SBarry Smith     ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr);
70a126751eSBarry Smith     ierr   = PetscStrncpy(str,"PetscDraw: ",sizeof(str));CHKERRQ(ierr);
71a126751eSBarry Smith     ierr   = PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str));CHKERRQ(ierr);
7251fa3d41SBarry Smith     ierr   = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr);
730076e027SBarry Smith     bottom = y - h;
740076e027SBarry Smith     ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr);
75e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
76536b137fSBarry Smith   } else if (issaws) {
77d45a07a7SBarry Smith     PetscMPIInt rank;
78d45a07a7SBarry Smith 
79d45a07a7SBarry Smith     ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr);
80d45a07a7SBarry Smith     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
81d45a07a7SBarry Smith     if (!((PetscObject)indraw)->amsmem && !rank) {
82e04113cfSBarry Smith       ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr);
830076e027SBarry Smith     }
840076e027SBarry Smith #endif
850076e027SBarry Smith   } else if (indraw->ops->view) {
860076e027SBarry Smith     ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr);
870076e027SBarry Smith   }
880076e027SBarry Smith   PetscFunctionReturn(0);
890076e027SBarry Smith }
900076e027SBarry Smith 
915c6c1daeSBarry Smith /*@C
925c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
935c6c1daeSBarry Smith 
94d083f849SBarry Smith    Collective
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 
110ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
111ba1e01c4SBarry Smith           PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
112ba1e01c4SBarry Smith           PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
113ba1e01c4SBarry Smith           PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
114ba1e01c4SBarry Smith           PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
115ba1e01c4SBarry Smith           PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
11621fcc2ddSBarry Smith           PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
117ba1e01c4SBarry Smith           PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
118ba1e01c4SBarry Smith           PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
119ba1e01c4SBarry Smith           PetscDrawZoom(), PetscDrawGetBoundingBox()
120ba1e01c4SBarry Smith 
1215c6c1daeSBarry Smith @*/
1225c6c1daeSBarry Smith PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
1235c6c1daeSBarry Smith {
1245c6c1daeSBarry Smith   PetscDraw      draw;
1255c6c1daeSBarry Smith   PetscErrorCode ierr;
126e118a51fSLisandro Dalcin   PetscReal      dpause = 0.0;
1275c6c1daeSBarry Smith   PetscBool      flag;
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith   PetscFunctionBegin;
130607a6623SBarry Smith   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
1315c6c1daeSBarry Smith   *indraw = 0;
13273107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr);
133a297a907SKarl Rupp 
1348f69470aSLisandro Dalcin   draw->data    = NULL;
1355c6c1daeSBarry Smith   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
136815f00f0SLisandro Dalcin   ierr          = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
1375c6c1daeSBarry Smith   draw->x       = x;
1385c6c1daeSBarry Smith   draw->y       = y;
1395c6c1daeSBarry Smith   draw->w       = w;
1405c6c1daeSBarry Smith   draw->h       = h;
1415c6c1daeSBarry Smith   draw->pause   = 0.0;
1425c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1435c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1445c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1455c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1465c6c1daeSBarry Smith   draw->port_xl = 0.0;
1475c6c1daeSBarry Smith   draw->port_xr = 1.0;
1485c6c1daeSBarry Smith   draw->port_yl = 0.0;
1495c6c1daeSBarry Smith   draw->port_yr = 1.0;
150e118a51fSLisandro Dalcin   draw->popup   = NULL;
151a297a907SKarl Rupp 
152c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr);
1535c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1548067a7d5SLisandro Dalcin 
1550298fd71SBarry Smith   draw->savefilename   = NULL;
1568067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1578067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1585b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1598067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1603d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
161a297a907SKarl Rupp 
1625c6c1daeSBarry Smith   ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr);
163a297a907SKarl Rupp 
1645c6c1daeSBarry Smith   draw->boundbox_xl  = .5;
1655c6c1daeSBarry Smith   draw->boundbox_xr  = .5;
1665c6c1daeSBarry Smith   draw->boundbox_yl  = .9;
1675c6c1daeSBarry Smith   draw->boundbox_yr  = .9;
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith   *indraw = draw;
1705c6c1daeSBarry Smith   PetscFunctionReturn(0);
1715c6c1daeSBarry Smith }
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith /*@C
1745c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
1755c6c1daeSBarry Smith 
1765c6c1daeSBarry Smith    Collective on PetscDraw
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith    Input Parameter:
1795c6c1daeSBarry Smith +  draw      - the graphics context
1805c6c1daeSBarry Smith -  type      - for example, PETSC_DRAW_X
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith    Options Database Command:
183236f5a4dSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
184236f5a4dSBarry Smith 
185ba1e01c4SBarry Smith    See PetscDrawSetFromOptions() for additional options database keys
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith    Level: intermediate
1885c6c1daeSBarry Smith 
1895c6c1daeSBarry Smith    Notes:
1905c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
191ba1e01c4SBarry Smith    PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)
1925c6c1daeSBarry Smith 
193ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
1945c6c1daeSBarry Smith @*/
1955c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
1965c6c1daeSBarry Smith {
1975c6c1daeSBarry Smith   PetscErrorCode ierr,(*r)(PetscDraw);
1985c6c1daeSBarry Smith   PetscBool      match;
1995c6c1daeSBarry Smith   PetscBool      flg=PETSC_FALSE;
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith   PetscFunctionBegin;
2025c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2035c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr);
2065c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith   /*  User requests no graphics */
209c5929fdfSBarry Smith   ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);CHKERRQ(ierr);
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith   /*
2125c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2135c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2145c6c1daeSBarry Smith    testing.
2155c6c1daeSBarry Smith    */
2165c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2175c6c1daeSBarry Smith   if (!flg) {
2185c6c1daeSBarry Smith     ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr);
2195c6c1daeSBarry Smith     if (match) {
2205c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2215c6c1daeSBarry Smith       flg  = PETSC_TRUE;
22276a34f28SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr);
223a297a907SKarl Rupp       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
2245c6c1daeSBarry Smith     }
2255c6c1daeSBarry Smith   }
2265c6c1daeSBarry Smith #endif
2270b50c7b2SBarry Smith   if (flg) {
228*9c8bf542SScott Kruger     ierr = PetscStrcmp(type,"tikz",&flg);CHKERRQ(ierr);
229*9c8bf542SScott Kruger     if (!flg) type = PETSC_DRAW_NULL;
230*9c8bf542SScott Kruger   }
231*9c8bf542SScott Kruger 
232*9c8bf542SScott Kruger   ierr = PetscStrcmp(type,PETSC_DRAW_NULL,&match);CHKERRQ(ierr);
233*9c8bf542SScott Kruger   if (match) {
234abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL);CHKERRQ(ierr);
235abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL);CHKERRQ(ierr);
236abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL);CHKERRQ(ierr);
237abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL);CHKERRQ(ierr);
238a82f89fdSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL);CHKERRQ(ierr);
2390b50c7b2SBarry Smith   }
2405c6c1daeSBarry Smith 
2411c9cd337SJed Brown   ierr =  PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr);
2425c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
243618c1b54SLisandro Dalcin   if (draw->ops->destroy) {ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr);}
244618c1b54SLisandro Dalcin   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
2455c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr);
2465c6c1daeSBarry Smith   ierr = (*r)(draw);CHKERRQ(ierr);
2475c6c1daeSBarry Smith   PetscFunctionReturn(0);
2485c6c1daeSBarry Smith }
2495c6c1daeSBarry Smith 
2505c6c1daeSBarry Smith /*@C
2515c6c1daeSBarry Smith    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith    Not Collective
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith    Input Parameter:
2565c6c1daeSBarry Smith .  draw - Krylov context
2575c6c1daeSBarry Smith 
2585c6c1daeSBarry Smith    Output Parameters:
2595c6c1daeSBarry Smith .  name - name of PetscDraw method
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith    Level: advanced
2625c6c1daeSBarry Smith 
263ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawType
264ba1e01c4SBarry Smith 
2655c6c1daeSBarry Smith @*/
2665c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
2675c6c1daeSBarry Smith {
2685c6c1daeSBarry Smith   PetscFunctionBegin;
2695c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2705c6c1daeSBarry Smith   PetscValidPointer(type,2);
2715c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2725c6c1daeSBarry Smith   PetscFunctionReturn(0);
2735c6c1daeSBarry Smith }
2745c6c1daeSBarry Smith 
275607a6623SBarry Smith /*@C
2761c84c290SBarry Smith    PetscDrawRegister - Adds a method to the graphics package.
2771c84c290SBarry Smith 
2781c84c290SBarry Smith    Not Collective
2791c84c290SBarry Smith 
2801c84c290SBarry Smith    Input Parameters:
2810076e027SBarry Smith +  name_solver - name of a new user-defined graphics class
2821c84c290SBarry Smith -  routine_create - routine to create method context
2831c84c290SBarry Smith 
2841c84c290SBarry Smith    Level: developer
2851c84c290SBarry Smith 
2861c84c290SBarry Smith    Notes:
2870076e027SBarry Smith    PetscDrawRegister() may be called multiple times to add several user-defined graphics classes
2881c84c290SBarry Smith 
2891c84c290SBarry Smith    Sample usage:
2901c84c290SBarry Smith .vb
291bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
2921c84c290SBarry Smith .ve
2931c84c290SBarry Smith 
2940076e027SBarry Smith    Then, your specific graphics package can be chosen with the procedural interface via
2951c84c290SBarry Smith $     PetscDrawSetType(ksp,"my_draw_type")
2961c84c290SBarry Smith    or at runtime via the option
2971c84c290SBarry Smith $     -draw_type my_draw_type
2981c84c290SBarry Smith 
2991c84c290SBarry Smith 
300ba1e01c4SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
3011c84c290SBarry Smith @*/
302bdf89e91SBarry Smith PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
3035c6c1daeSBarry Smith {
3045c6c1daeSBarry Smith   PetscErrorCode ierr;
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith   PetscFunctionBegin;
3071d36bdfdSBarry Smith   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
308a240a19fSJed Brown   ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr);
3095c6c1daeSBarry Smith   PetscFunctionReturn(0);
3105c6c1daeSBarry Smith }
3115c6c1daeSBarry Smith 
3127faeec8aSLisandro Dalcin /*@C
3137faeec8aSLisandro Dalcin    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
3147faeec8aSLisandro Dalcin    PetscDraw options in the database.
3157faeec8aSLisandro Dalcin 
3167faeec8aSLisandro Dalcin    Logically Collective on PetscDraw
3177faeec8aSLisandro Dalcin 
3187faeec8aSLisandro Dalcin    Input Parameter:
3197faeec8aSLisandro Dalcin +  draw - the draw context
3207faeec8aSLisandro Dalcin -  prefix - the prefix to prepend to all option names
3217faeec8aSLisandro Dalcin 
3227faeec8aSLisandro Dalcin    Level: advanced
3237faeec8aSLisandro Dalcin 
324ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
3257faeec8aSLisandro Dalcin @*/
3267faeec8aSLisandro Dalcin PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
3277faeec8aSLisandro Dalcin {
3287faeec8aSLisandro Dalcin   PetscErrorCode ierr;
3297faeec8aSLisandro Dalcin 
3307faeec8aSLisandro Dalcin   PetscFunctionBegin;
3317faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3327faeec8aSLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);CHKERRQ(ierr);
3337faeec8aSLisandro Dalcin   PetscFunctionReturn(0);
3347faeec8aSLisandro Dalcin }
3357faeec8aSLisandro Dalcin 
3365c6c1daeSBarry Smith /*@
3375c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
3385c6c1daeSBarry Smith       Defaults to a PETSc X windows graphics.
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith    Collective on PetscDraw
3415c6c1daeSBarry Smith 
3425c6c1daeSBarry Smith    Input Parameter:
3435c6c1daeSBarry Smith .     draw - the graphics context
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith    Options Database Keys:
3465c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
3471cda70a7SBarry Smith .   -nox_warning - when X windows support is not installed this prevents the warning message from being printed
3487450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
34973f7a4c5SBarry Smith .   -draw_marker_type - <x,point>
3505c6c1daeSBarry Smith .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
351287de1a7SBarry Smith .   -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window
352a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
353df8d4941SLisandro Dalcin .   -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'
354df8d4941SLisandro Dalcin .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
355df8d4941SLisandro Dalcin -   -draw_save_on_flush - saves an image on each flush, mainly for debugging
3565c6c1daeSBarry Smith 
3575c6c1daeSBarry Smith    Level: intermediate
3585c6c1daeSBarry Smith 
35995452b02SPatrick Sanan    Notes:
36095452b02SPatrick Sanan     Must be called after PetscDrawCreate() before the PetscDraw is used.
3615c6c1daeSBarry Smith 
3625c6c1daeSBarry Smith 
363ba1e01c4SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith @*/
3665c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
3675c6c1daeSBarry Smith {
3685c6c1daeSBarry Smith   PetscErrorCode    ierr;
3695c6c1daeSBarry Smith   PetscBool         flg,nox;
3705c6c1daeSBarry Smith   char              vtype[256];
3715c6c1daeSBarry Smith   const char        *def;
3725c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3735c6c1daeSBarry Smith   PetscBool         warn;
3745c6c1daeSBarry Smith #endif
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith   PetscFunctionBegin;
3775c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3785c6c1daeSBarry Smith 
379607a6623SBarry Smith   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
3805c6c1daeSBarry Smith 
381a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
382a297a907SKarl Rupp   else {
383c5929fdfSBarry Smith     ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);CHKERRQ(ierr);
3845c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
3855c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3865c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3875c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
3885c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
3895c6c1daeSBarry Smith #else
39076a34f28SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);CHKERRQ(ierr);
391494c9c5dSStefano Zampini     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows or Microsoft Graphics on this machine\nproceeding without graphics\n");
3925c6c1daeSBarry Smith #endif
3935c6c1daeSBarry Smith   }
3945c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
395a264d7a6SBarry Smith   ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
3965c6c1daeSBarry Smith   if (flg) {
3975c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
3985c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
3995c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
4005c6c1daeSBarry Smith   }
4015c6c1daeSBarry Smith   ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
4025c6c1daeSBarry Smith   {
40349c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
40449c04938SLisandro Dalcin     char      movieext[32];
40549c04938SLisandro Dalcin     PetscBool image,movie;
40649c04938SLisandro Dalcin     ierr = PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");CHKERRQ(ierr);
40749c04938SLisandro Dalcin     ierr = PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");CHKERRQ(ierr);
4084f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
4094f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);CHKERRQ(ierr);
410fbfcfee5SBarry Smith     ierr = PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL);CHKERRQ(ierr);
411fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",PETSC_FUNCTION_NAME,draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr);
41249c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSave(draw,filename);CHKERRQ(ierr);}
41349c04938SLisandro Dalcin     if (movie) {ierr = PetscDrawSetSaveMovie(draw,movieext);CHKERRQ(ierr);}
4144f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
41549c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr);}
416fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL);CHKERRQ(ierr);
417fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr);
4185c6c1daeSBarry Smith   }
419e118a51fSLisandro Dalcin   ierr = PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);CHKERRQ(ierr);
42073f7a4c5SBarry Smith   ierr = PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);CHKERRQ(ierr);
42173f7a4c5SBarry Smith 
4225c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
4230633abcbSJed Brown   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);CHKERRQ(ierr);
424ce1779c8SBarry Smith 
425ce1779c8SBarry Smith   ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr);
4265c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4275c6c1daeSBarry Smith   PetscFunctionReturn(0);
4285c6c1daeSBarry Smith }
429