xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision ba1e01c44f2f740c97c9026fe63e360558b7709b)
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 #undef __FUNCT__
170076e027SBarry Smith #define __FUNCT__ "PetscDrawView"
180076e027SBarry Smith /*@C
190076e027SBarry Smith    PetscDrawView - Prints the PetscDraw data structure.
200076e027SBarry Smith 
210076e027SBarry Smith    Collective on PetscDraw
220076e027SBarry Smith 
230076e027SBarry Smith    Input Parameters:
240076e027SBarry Smith +  indraw - the PetscDraw context
250076e027SBarry Smith -  viewer - visualization context
260076e027SBarry Smith 
27236f5a4dSBarry Smith    See PetscDrawSetFromOptions() for options database keys
280076e027SBarry Smith 
290076e027SBarry Smith    Note:
300076e027SBarry Smith    The available visualization contexts include
310076e027SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
320076e027SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
330076e027SBarry Smith          output where only the first processor opens
340076e027SBarry Smith          the file.  All other processors send their
350076e027SBarry Smith          data to the first processor to print.
360076e027SBarry Smith 
370076e027SBarry Smith    The user can open an alternative visualization context with
380076e027SBarry Smith    PetscViewerASCIIOpen() - output to a specified file.
390076e027SBarry Smith 
400076e027SBarry Smith    Level: beginner
410076e027SBarry Smith 
420076e027SBarry Smith .keywords: PetscDraw, view
430076e027SBarry Smith 
440076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen()
450076e027SBarry Smith @*/
460076e027SBarry Smith PetscErrorCode  PetscDrawView(PetscDraw indraw,PetscViewer viewer)
470076e027SBarry Smith {
480076e027SBarry Smith   PetscErrorCode ierr;
490076e027SBarry Smith   PetscBool      isdraw;
50e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
51536b137fSBarry Smith   PetscBool      issaws;
520076e027SBarry Smith #endif
530076e027SBarry Smith 
540076e027SBarry Smith   PetscFunctionBegin;
550076e027SBarry Smith   PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1);
56f55353a2SBarry Smith   if (!viewer) {
57f55353a2SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);CHKERRQ(ierr);
58f55353a2SBarry Smith   }
590076e027SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
600076e027SBarry Smith   PetscCheckSameComm(indraw,1,viewer,2);
610076e027SBarry Smith 
6298c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr);
630076e027SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
64e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
65536b137fSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr);
660076e027SBarry Smith #endif
670076e027SBarry Smith   if (isdraw) {
680076e027SBarry Smith     PetscDraw draw;
690076e027SBarry Smith     char      str[36];
700076e027SBarry Smith     PetscReal x,y,bottom,h;
710076e027SBarry Smith 
720076e027SBarry Smith     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
730076e027SBarry Smith     ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr);
740076e027SBarry Smith     ierr   = PetscStrcpy(str,"PetscDraw: ");CHKERRQ(ierr);
750076e027SBarry Smith     ierr   = PetscStrcat(str,((PetscObject)indraw)->type_name);CHKERRQ(ierr);
7651fa3d41SBarry Smith     ierr   = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr);
770076e027SBarry Smith     bottom = y - h;
780076e027SBarry Smith     ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr);
79e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
80536b137fSBarry Smith   } else if (issaws) {
81d45a07a7SBarry Smith     PetscMPIInt rank;
82d45a07a7SBarry Smith 
83d45a07a7SBarry Smith     ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr);
84d45a07a7SBarry Smith     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
85d45a07a7SBarry Smith     if (!((PetscObject)indraw)->amsmem && !rank) {
86e04113cfSBarry Smith       ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr);
870076e027SBarry Smith     }
880076e027SBarry Smith #endif
890076e027SBarry Smith   } else if (indraw->ops->view) {
900076e027SBarry Smith     ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr);
910076e027SBarry Smith   }
920076e027SBarry Smith   PetscFunctionReturn(0);
930076e027SBarry Smith }
940076e027SBarry Smith 
955c6c1daeSBarry Smith #undef __FUNCT__
965c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCreate"
975c6c1daeSBarry Smith /*@C
985c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
995c6c1daeSBarry Smith 
1005c6c1daeSBarry Smith    Collective on MPI_Comm
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith    Input Parameter:
1035c6c1daeSBarry Smith +  comm - MPI communicator
1045c6c1daeSBarry Smith .  display - X display when using X windows
1055c6c1daeSBarry Smith .  title - optional title added to top of window
1065c6c1daeSBarry Smith .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
1075c6c1daeSBarry Smith -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
1085c6c1daeSBarry Smith           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
1095c6c1daeSBarry Smith 
1105c6c1daeSBarry Smith    Output Parameter:
1115c6c1daeSBarry Smith .  draw - location to put the PetscDraw context
1125c6c1daeSBarry Smith 
1135c6c1daeSBarry Smith    Level: beginner
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith    Concepts: graphics^creating context
1165c6c1daeSBarry Smith    Concepts: drawing^creating context
1175c6c1daeSBarry Smith 
118*ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
119*ba1e01c4SBarry Smith           PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
120*ba1e01c4SBarry Smith           PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
121*ba1e01c4SBarry Smith           PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
122*ba1e01c4SBarry Smith           PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
123*ba1e01c4SBarry Smith           PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
124*ba1e01c4SBarry Smith           PetscDrawStringBoxed(), PetscDrawStringBoxedSize(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
125*ba1e01c4SBarry Smith           PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
126*ba1e01c4SBarry Smith           PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
127*ba1e01c4SBarry Smith           PetscDrawZoom(), PetscDrawGetBoundingBox()
128*ba1e01c4SBarry Smith 
1295c6c1daeSBarry Smith @*/
1305c6c1daeSBarry Smith PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
1315c6c1daeSBarry Smith {
1325c6c1daeSBarry Smith   PetscDraw      draw;
1335c6c1daeSBarry Smith   PetscErrorCode ierr;
134e118a51fSLisandro Dalcin   PetscReal      dpause = 0.0;
1355c6c1daeSBarry Smith   PetscBool      flag;
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith   PetscFunctionBegin;
138607a6623SBarry Smith   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
1395c6c1daeSBarry Smith   *indraw = 0;
14073107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr);
141a297a907SKarl Rupp 
1428f69470aSLisandro Dalcin   draw->data    = NULL;
1435c6c1daeSBarry Smith   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
144815f00f0SLisandro Dalcin   ierr          = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
1455c6c1daeSBarry Smith   draw->x       = x;
1465c6c1daeSBarry Smith   draw->y       = y;
1475c6c1daeSBarry Smith   draw->w       = w;
1485c6c1daeSBarry Smith   draw->h       = h;
1495c6c1daeSBarry Smith   draw->pause   = 0.0;
1505c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1515c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1525c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1535c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1545c6c1daeSBarry Smith   draw->port_xl = 0.0;
1555c6c1daeSBarry Smith   draw->port_xr = 1.0;
1565c6c1daeSBarry Smith   draw->port_yl = 0.0;
1575c6c1daeSBarry Smith   draw->port_yr = 1.0;
158e118a51fSLisandro Dalcin   draw->popup   = NULL;
159a297a907SKarl Rupp 
160c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr);
1615c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1628067a7d5SLisandro Dalcin 
1630298fd71SBarry Smith   draw->savefilename   = NULL;
1648067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1658067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1665b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1678067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1683d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
169a297a907SKarl Rupp 
1705c6c1daeSBarry Smith   ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr);
171a297a907SKarl Rupp 
1725c6c1daeSBarry Smith   draw->boundbox_xl  = .5;
1735c6c1daeSBarry Smith   draw->boundbox_xr  = .5;
1745c6c1daeSBarry Smith   draw->boundbox_yl  = .9;
1755c6c1daeSBarry Smith   draw->boundbox_yr  = .9;
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith   *indraw = draw;
1785c6c1daeSBarry Smith   PetscFunctionReturn(0);
1795c6c1daeSBarry Smith }
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith #undef __FUNCT__
1825c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetType"
1835c6c1daeSBarry Smith /*@C
1845c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith    Collective on PetscDraw
1875c6c1daeSBarry Smith 
1885c6c1daeSBarry Smith    Input Parameter:
1895c6c1daeSBarry Smith +  draw      - the graphics context
1905c6c1daeSBarry Smith -  type      - for example, PETSC_DRAW_X
1915c6c1daeSBarry Smith 
1925c6c1daeSBarry Smith    Options Database Command:
193236f5a4dSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
194236f5a4dSBarry Smith 
195*ba1e01c4SBarry Smith    See PetscDrawSetFromOptions() for additional options database keys
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith    Level: intermediate
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith    Notes:
2005c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
201*ba1e01c4SBarry Smith    PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)
2025c6c1daeSBarry Smith 
2035c6c1daeSBarry Smith    Concepts: drawing^X windows
2045c6c1daeSBarry Smith    Concepts: X windows^graphics
2055c6c1daeSBarry Smith    Concepts: drawing^Microsoft Windows
2065c6c1daeSBarry Smith 
207*ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
2085c6c1daeSBarry Smith @*/
2095c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
2105c6c1daeSBarry Smith {
2115c6c1daeSBarry Smith   PetscErrorCode ierr,(*r)(PetscDraw);
2125c6c1daeSBarry Smith   PetscBool      match;
2135c6c1daeSBarry Smith   PetscBool      flg=PETSC_FALSE;
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith   PetscFunctionBegin;
2165c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2175c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr);
2205c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith   /*  User requests no graphics */
223c5929fdfSBarry Smith   ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);CHKERRQ(ierr);
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith   /*
2265c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2275c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2285c6c1daeSBarry Smith    testing.
2295c6c1daeSBarry Smith    */
2305c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2315c6c1daeSBarry Smith   if (!flg) {
2325c6c1daeSBarry Smith     ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr);
2335c6c1daeSBarry Smith     if (match) {
2345c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2355c6c1daeSBarry Smith       flg  = PETSC_TRUE;
23676a34f28SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr);
237a297a907SKarl Rupp       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
2385c6c1daeSBarry Smith     }
2395c6c1daeSBarry Smith   }
2405c6c1daeSBarry Smith #endif
2410b50c7b2SBarry Smith   if (flg) {
2420b50c7b2SBarry Smith     ierr = PetscStrcmp(type,"tikz",&flg);CHKERRQ(ierr);
2430b50c7b2SBarry Smith     if (!flg) type = PETSC_DRAW_NULL;
2440b50c7b2SBarry Smith   }
2455c6c1daeSBarry Smith 
2461c9cd337SJed Brown   ierr =  PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr);
2475c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
248618c1b54SLisandro Dalcin   if (draw->ops->destroy) {ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr);}
249618c1b54SLisandro Dalcin   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
2505c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr);
2515c6c1daeSBarry Smith   ierr = (*r)(draw);CHKERRQ(ierr);
2525c6c1daeSBarry Smith   PetscFunctionReturn(0);
2535c6c1daeSBarry Smith }
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith #undef __FUNCT__
2565c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetType"
2575c6c1daeSBarry Smith /*@C
2585c6c1daeSBarry Smith    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith    Not Collective
2615c6c1daeSBarry Smith 
2625c6c1daeSBarry Smith    Input Parameter:
2635c6c1daeSBarry Smith .  draw - Krylov context
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith    Output Parameters:
2665c6c1daeSBarry Smith .  name - name of PetscDraw method
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith    Level: advanced
2695c6c1daeSBarry Smith 
270*ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawType
271*ba1e01c4SBarry Smith 
2725c6c1daeSBarry Smith @*/
2735c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
2745c6c1daeSBarry Smith {
2755c6c1daeSBarry Smith   PetscFunctionBegin;
2765c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2775c6c1daeSBarry Smith   PetscValidPointer(type,2);
2785c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2795c6c1daeSBarry Smith   PetscFunctionReturn(0);
2805c6c1daeSBarry Smith }
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith #undef __FUNCT__
2835c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRegister"
284607a6623SBarry Smith /*@C
2851c84c290SBarry Smith    PetscDrawRegister - Adds a method to the graphics package.
2861c84c290SBarry Smith 
2871c84c290SBarry Smith    Not Collective
2881c84c290SBarry Smith 
2891c84c290SBarry Smith    Input Parameters:
2900076e027SBarry Smith +  name_solver - name of a new user-defined graphics class
2911c84c290SBarry Smith -  routine_create - routine to create method context
2921c84c290SBarry Smith 
2931c84c290SBarry Smith    Level: developer
2941c84c290SBarry Smith 
2951c84c290SBarry Smith    Notes:
2960076e027SBarry Smith    PetscDrawRegister() may be called multiple times to add several user-defined graphics classes
2971c84c290SBarry Smith 
2981c84c290SBarry Smith    Sample usage:
2991c84c290SBarry Smith .vb
300bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
3011c84c290SBarry Smith .ve
3021c84c290SBarry Smith 
3030076e027SBarry Smith    Then, your specific graphics package can be chosen with the procedural interface via
3041c84c290SBarry Smith $     PetscDrawSetType(ksp,"my_draw_type")
3051c84c290SBarry Smith    or at runtime via the option
3061c84c290SBarry Smith $     -draw_type my_draw_type
3071c84c290SBarry Smith 
3081c84c290SBarry Smith    Concepts: graphics^registering new draw classes
3091c84c290SBarry Smith    Concepts: PetscDraw^registering new draw classes
3101c84c290SBarry Smith 
311*ba1e01c4SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
3121c84c290SBarry Smith @*/
313bdf89e91SBarry Smith PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
3145c6c1daeSBarry Smith {
3155c6c1daeSBarry Smith   PetscErrorCode ierr;
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith   PetscFunctionBegin;
318a240a19fSJed Brown   ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr);
3195c6c1daeSBarry Smith   PetscFunctionReturn(0);
3205c6c1daeSBarry Smith }
3215c6c1daeSBarry Smith 
3225c6c1daeSBarry Smith #undef __FUNCT__
3237faeec8aSLisandro Dalcin #define __FUNCT__ "PetscDrawSetOptionsPrefix"
3247faeec8aSLisandro Dalcin /*@C
3257faeec8aSLisandro Dalcin    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
3267faeec8aSLisandro Dalcin    PetscDraw options in the database.
3277faeec8aSLisandro Dalcin 
3287faeec8aSLisandro Dalcin    Logically Collective on PetscDraw
3297faeec8aSLisandro Dalcin 
3307faeec8aSLisandro Dalcin    Input Parameter:
3317faeec8aSLisandro Dalcin +  draw - the draw context
3327faeec8aSLisandro Dalcin -  prefix - the prefix to prepend to all option names
3337faeec8aSLisandro Dalcin 
3347faeec8aSLisandro Dalcin    Level: advanced
3357faeec8aSLisandro Dalcin 
3367faeec8aSLisandro Dalcin .keywords: PetscDraw, set, options, prefix, database
3377faeec8aSLisandro Dalcin 
338*ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
3397faeec8aSLisandro Dalcin @*/
3407faeec8aSLisandro Dalcin PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
3417faeec8aSLisandro Dalcin {
3427faeec8aSLisandro Dalcin   PetscErrorCode ierr;
3437faeec8aSLisandro Dalcin 
3447faeec8aSLisandro Dalcin   PetscFunctionBegin;
3457faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3467faeec8aSLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);CHKERRQ(ierr);
3477faeec8aSLisandro Dalcin   PetscFunctionReturn(0);
3487faeec8aSLisandro Dalcin }
3497faeec8aSLisandro Dalcin 
3507faeec8aSLisandro Dalcin #undef __FUNCT__
3515c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetFromOptions"
3525c6c1daeSBarry Smith /*@
3535c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
3545c6c1daeSBarry Smith       Defaults to a PETSc X windows graphics.
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith    Collective on PetscDraw
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith    Input Parameter:
3595c6c1daeSBarry Smith .     draw - the graphics context
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith    Options Database Keys:
3625c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
3631cda70a7SBarry Smith .   -nox_warning - when X windows support is not installed this prevents the warning message from being printed
3647450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
36573f7a4c5SBarry Smith .   -draw_marker_type - <x,point>
3665c6c1daeSBarry Smith .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
367287de1a7SBarry Smith .   -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window
368a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
369df8d4941SLisandro 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'
370df8d4941SLisandro Dalcin .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
371df8d4941SLisandro Dalcin -   -draw_save_on_flush - saves an image on each flush, mainly for debugging
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith    Level: intermediate
3745c6c1daeSBarry Smith 
3758067a7d5SLisandro Dalcin    Notes: Must be called after PetscDrawCreate() before the PetscDraw is used.
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith    Concepts: drawing^setting options
3785c6c1daeSBarry Smith    Concepts: graphics^setting options
3795c6c1daeSBarry Smith 
380*ba1e01c4SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith @*/
3835c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
3845c6c1daeSBarry Smith {
3855c6c1daeSBarry Smith   PetscErrorCode    ierr;
3865c6c1daeSBarry Smith   PetscBool         flg,nox;
3875c6c1daeSBarry Smith   char              vtype[256];
3885c6c1daeSBarry Smith   const char        *def;
3895c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3905c6c1daeSBarry Smith   PetscBool         warn;
3915c6c1daeSBarry Smith #endif
3925c6c1daeSBarry Smith 
3935c6c1daeSBarry Smith   PetscFunctionBegin;
3945c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3955c6c1daeSBarry Smith 
396607a6623SBarry Smith   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
3975c6c1daeSBarry Smith 
398a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
399a297a907SKarl Rupp   else {
400c5929fdfSBarry Smith     ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);CHKERRQ(ierr);
4015c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
4025c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
4035c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
4045c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
4055c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
4065c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT)
4075c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_GLUT;
4085c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES)
4095c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_OPENGLES;
4105c6c1daeSBarry Smith #else
41176a34f28SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);CHKERRQ(ierr);
412a297a907SKarl Rupp     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
4135c6c1daeSBarry Smith #endif
4145c6c1daeSBarry Smith   }
4155c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
416a264d7a6SBarry Smith   ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
4175c6c1daeSBarry Smith   if (flg) {
4185c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
4195c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
4205c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
4215c6c1daeSBarry Smith   }
4225c6c1daeSBarry Smith   ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
4235c6c1daeSBarry Smith   {
42449c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
42549c04938SLisandro Dalcin     char      movieext[32];
42649c04938SLisandro Dalcin     PetscBool image,movie;
42749c04938SLisandro Dalcin     ierr = PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");CHKERRQ(ierr);
42849c04938SLisandro Dalcin     ierr = PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");CHKERRQ(ierr);
4294f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
4304f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);CHKERRQ(ierr);
4314f7a95f2SLisandro Dalcin     ierr = PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",__FUNCT__,draw->savemoviefps,&draw->savemoviefps,NULL);CHKERRQ(ierr);
4323d242201SLisandro Dalcin     ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",__FUNCT__,draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr);
43349c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSave(draw,filename);CHKERRQ(ierr);}
43449c04938SLisandro Dalcin     if (movie) {ierr = PetscDrawSetSaveMovie(draw,movieext);CHKERRQ(ierr);}
4354f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
43649c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr);}
4374f7a95f2SLisandro Dalcin     ierr = PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",__FUNCT__,draw->saveonclear,&draw->saveonclear,NULL);CHKERRQ(ierr);
4384f7a95f2SLisandro Dalcin     ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",__FUNCT__,draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr);
4395c6c1daeSBarry Smith   }
440e118a51fSLisandro Dalcin   ierr = PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);CHKERRQ(ierr);
44173f7a4c5SBarry Smith   ierr = PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);CHKERRQ(ierr);
44273f7a4c5SBarry Smith 
4435c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
4440633abcbSJed Brown   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);CHKERRQ(ierr);
445ce1779c8SBarry Smith 
446ce1779c8SBarry Smith   ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr);
4475c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4485c6c1daeSBarry Smith   PetscFunctionReturn(0);
4495c6c1daeSBarry Smith }
450