xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
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 */
1402c9f0b5SLisandro Dalcin PetscFunctionList PetscDrawList = NULL;
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   PetscBool      isdraw;
45e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
46536b137fSBarry Smith   PetscBool      issaws;
470076e027SBarry Smith #endif
480076e027SBarry Smith 
490076e027SBarry Smith   PetscFunctionBegin;
500076e027SBarry Smith   PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1);
51f55353a2SBarry Smith   if (!viewer) {
525f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer));
53f55353a2SBarry Smith   }
540076e027SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
550076e027SBarry Smith   PetscCheckSameComm(indraw,1,viewer,2);
560076e027SBarry Smith 
575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer));
585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw));
59e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
605f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws));
610076e027SBarry Smith #endif
620076e027SBarry Smith   if (isdraw) {
630076e027SBarry Smith     PetscDraw draw;
640076e027SBarry Smith     char      str[36];
650076e027SBarry Smith     PetscReal x,y,bottom,h;
660076e027SBarry Smith 
675f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDrawGetDraw(viewer,0,&draw));
685f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawGetCurrentPoint(draw,&x,&y));
695f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrncpy(str,"PetscDraw: ",sizeof(str)));
705f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str)));
715f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h));
720076e027SBarry Smith     bottom = y - h;
735f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawPushCurrentPoint(draw,x,bottom));
74e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
75536b137fSBarry Smith   } else if (issaws) {
76d45a07a7SBarry Smith     PetscMPIInt rank;
77d45a07a7SBarry Smith 
785f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscObjectName((PetscObject)indraw));
795f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_rank(PETSC_COMM_WORLD,&rank));
80dd400576SPatrick Sanan     if (!((PetscObject)indraw)->amsmem && rank == 0) {
815f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscObjectViewSAWs((PetscObject)indraw,viewer));
820076e027SBarry Smith     }
830076e027SBarry Smith #endif
840076e027SBarry Smith   } else if (indraw->ops->view) {
855f80ce2aSJacob Faibussowitsch     CHKERRQ((*indraw->ops->view)(indraw,viewer));
860076e027SBarry Smith   }
870076e027SBarry Smith   PetscFunctionReturn(0);
880076e027SBarry Smith }
890076e027SBarry Smith 
905c6c1daeSBarry Smith /*@C
91fe2efc57SMark    PetscDrawViewFromOptions - View from Options
92fe2efc57SMark 
93fe2efc57SMark    Collective on PetscDraw
94fe2efc57SMark 
95fe2efc57SMark    Input Parameters:
96fe2efc57SMark +  A - the PetscDraw context
97736c3998SJose E. Roman .  obj - Optional object
98736c3998SJose E. Roman -  name - command line option
99fe2efc57SMark 
100fe2efc57SMark    Level: intermediate
101fe2efc57SMark .seealso:  PetscDraw, PetscDrawView, PetscObjectViewFromOptions(), PetscDrawCreate()
102fe2efc57SMark @*/
103fe2efc57SMark PetscErrorCode  PetscDrawViewFromOptions(PetscDraw A,PetscObject obj,const char name[])
104fe2efc57SMark {
105fe2efc57SMark   PetscFunctionBegin;
106fe2efc57SMark   PetscValidHeaderSpecific(A,PETSC_DRAW_CLASSID,1);
1075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectViewFromOptions((PetscObject)A,obj,name));
108fe2efc57SMark   PetscFunctionReturn(0);
109fe2efc57SMark }
110fe2efc57SMark 
111fe2efc57SMark /*@C
1125c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
1135c6c1daeSBarry Smith 
114d083f849SBarry Smith    Collective
1155c6c1daeSBarry Smith 
116d8d19677SJose E. Roman    Input Parameters:
1175c6c1daeSBarry Smith +  comm - MPI communicator
118e1dfdf8eSBarry Smith .  display - X display when using X Windows
1195c6c1daeSBarry Smith .  title - optional title added to top of window
1205c6c1daeSBarry Smith .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
1215c6c1daeSBarry Smith -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
1225c6c1daeSBarry Smith           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
1235c6c1daeSBarry Smith 
1245c6c1daeSBarry Smith    Output Parameter:
1255c6c1daeSBarry Smith .  draw - location to put the PetscDraw context
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith    Level: beginner
1285c6c1daeSBarry Smith 
129ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
130ba1e01c4SBarry Smith           PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
131ba1e01c4SBarry Smith           PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
132ba1e01c4SBarry Smith           PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
133ba1e01c4SBarry Smith           PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
134ba1e01c4SBarry Smith           PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
13550d92d24SPierre Jolivet           PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
136ba1e01c4SBarry Smith           PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
137ba1e01c4SBarry Smith           PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
138ba1e01c4SBarry Smith           PetscDrawZoom(), PetscDrawGetBoundingBox()
139ba1e01c4SBarry Smith 
1405c6c1daeSBarry Smith @*/
1415c6c1daeSBarry Smith PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
1425c6c1daeSBarry Smith {
1435c6c1daeSBarry Smith   PetscDraw      draw;
144e118a51fSLisandro Dalcin   PetscReal      dpause = 0.0;
1455c6c1daeSBarry Smith   PetscBool      flag;
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith   PetscFunctionBegin;
1485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawInitializePackage());
14902c9f0b5SLisandro Dalcin   *indraw = NULL;
1505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView));
151a297a907SKarl Rupp 
1528f69470aSLisandro Dalcin   draw->data    = NULL;
1535f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(display,&draw->display));
1545f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(title,&draw->title));
1555c6c1daeSBarry Smith   draw->x       = x;
1565c6c1daeSBarry Smith   draw->y       = y;
1575c6c1daeSBarry Smith   draw->w       = w;
1585c6c1daeSBarry Smith   draw->h       = h;
1595c6c1daeSBarry Smith   draw->pause   = 0.0;
1605c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1615c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1625c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1635c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1645c6c1daeSBarry Smith   draw->port_xl = 0.0;
1655c6c1daeSBarry Smith   draw->port_xr = 1.0;
1665c6c1daeSBarry Smith   draw->port_yl = 0.0;
1675c6c1daeSBarry Smith   draw->port_yr = 1.0;
168e118a51fSLisandro Dalcin   draw->popup   = NULL;
169a297a907SKarl Rupp 
1705f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag));
1715c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1728067a7d5SLisandro Dalcin 
1730298fd71SBarry Smith   draw->savefilename   = NULL;
1748067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1758067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1765b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1778067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1783d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
179a297a907SKarl Rupp 
1805f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSetCurrentPoint(draw,.5,.9));
181a297a907SKarl Rupp 
1825c6c1daeSBarry Smith   draw->boundbox_xl  = .5;
1835c6c1daeSBarry Smith   draw->boundbox_xr  = .5;
1845c6c1daeSBarry Smith   draw->boundbox_yl  = .9;
1855c6c1daeSBarry Smith   draw->boundbox_yr  = .9;
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith   *indraw = draw;
1885c6c1daeSBarry Smith   PetscFunctionReturn(0);
1895c6c1daeSBarry Smith }
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith /*@C
1925c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith    Collective on PetscDraw
1955c6c1daeSBarry Smith 
196d8d19677SJose E. Roman    Input Parameters:
1975c6c1daeSBarry Smith +  draw      - the graphics context
1985c6c1daeSBarry Smith -  type      - for example, PETSC_DRAW_X
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith    Options Database Command:
201236f5a4dSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
202236f5a4dSBarry Smith 
203ba1e01c4SBarry Smith    See PetscDrawSetFromOptions() for additional options database keys
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith    Level: intermediate
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith    Notes:
2085c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
209ba1e01c4SBarry Smith    PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)
2105c6c1daeSBarry Smith 
211ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
2125c6c1daeSBarry Smith @*/
2135c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
2145c6c1daeSBarry Smith {
2155c6c1daeSBarry Smith   PetscBool      match;
2165c6c1daeSBarry Smith   PetscBool      flg=PETSC_FALSE;
2175f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(PetscDraw);
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith   PetscFunctionBegin;
2205c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2215c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
2225c6c1daeSBarry Smith 
2235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)draw,type,&match));
2245c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith   /*  User requests no graphics */
2275f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg));
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith   /*
2305c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2315c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2325c6c1daeSBarry Smith    testing.
2335c6c1daeSBarry Smith    */
2345c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2355c6c1daeSBarry Smith   if (!flg) {
2365f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp(type,PETSC_DRAW_X,&match));
2375c6c1daeSBarry Smith     if (match) {
2385c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2395c6c1daeSBarry Smith       flg  = PETSC_TRUE;
2405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn));
241e1dfdf8eSBarry Smith       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n");
2425c6c1daeSBarry Smith     }
2435c6c1daeSBarry Smith   }
2445c6c1daeSBarry Smith #endif
2450b50c7b2SBarry Smith   if (flg) {
2465f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcmp(type,"tikz",&flg));
2479c8bf542SScott Kruger     if (!flg) type = PETSC_DRAW_NULL;
2489c8bf542SScott Kruger   }
2499c8bf542SScott Kruger 
2505f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrcmp(type,PETSC_DRAW_NULL,&match));
2519c8bf542SScott Kruger   if (match) {
2525f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL));
2535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL));
2545f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL));
2555f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL));
2565f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL));
2570b50c7b2SBarry Smith   }
2585c6c1daeSBarry Smith 
2595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListFind(PetscDrawList,type,&r));
260*28b400f6SJacob Faibussowitsch   PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
2615f80ce2aSJacob Faibussowitsch   if (draw->ops->destroy) CHKERRQ((*draw->ops->destroy)(draw));
2625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps)));
2635f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectChangeTypeName((PetscObject)draw,type));
2645f80ce2aSJacob Faibussowitsch   CHKERRQ((*r)(draw));
2655c6c1daeSBarry Smith   PetscFunctionReturn(0);
2665c6c1daeSBarry Smith }
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith /*@C
2695c6c1daeSBarry Smith    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
2705c6c1daeSBarry Smith 
2715c6c1daeSBarry Smith    Not Collective
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith    Input Parameter:
2745c6c1daeSBarry Smith .  draw - Krylov context
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith    Output Parameters:
2775c6c1daeSBarry Smith .  name - name of PetscDraw method
2785c6c1daeSBarry Smith 
2795c6c1daeSBarry Smith    Level: advanced
2805c6c1daeSBarry Smith 
281ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawType
282ba1e01c4SBarry Smith 
2835c6c1daeSBarry Smith @*/
2845c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
2855c6c1daeSBarry Smith {
2865c6c1daeSBarry Smith   PetscFunctionBegin;
2875c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2885c6c1daeSBarry Smith   PetscValidPointer(type,2);
2895c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2905c6c1daeSBarry Smith   PetscFunctionReturn(0);
2915c6c1daeSBarry Smith }
2925c6c1daeSBarry Smith 
293607a6623SBarry Smith /*@C
2941c84c290SBarry Smith    PetscDrawRegister - Adds a method to the graphics package.
2951c84c290SBarry Smith 
2961c84c290SBarry Smith    Not Collective
2971c84c290SBarry Smith 
2981c84c290SBarry Smith    Input Parameters:
2990076e027SBarry Smith +  name_solver - name of a new user-defined graphics class
3001c84c290SBarry Smith -  routine_create - routine to create method context
3011c84c290SBarry Smith 
3021c84c290SBarry Smith    Level: developer
3031c84c290SBarry Smith 
3041c84c290SBarry Smith    Notes:
3050076e027SBarry Smith    PetscDrawRegister() may be called multiple times to add several user-defined graphics classes
3061c84c290SBarry Smith 
3071c84c290SBarry Smith    Sample usage:
3081c84c290SBarry Smith .vb
309bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
3101c84c290SBarry Smith .ve
3111c84c290SBarry Smith 
3120076e027SBarry Smith    Then, your specific graphics package can be chosen with the procedural interface via
3131c84c290SBarry Smith $     PetscDrawSetType(ksp,"my_draw_type")
3141c84c290SBarry Smith    or at runtime via the option
3151c84c290SBarry Smith $     -draw_type my_draw_type
3161c84c290SBarry Smith 
317ba1e01c4SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
3181c84c290SBarry Smith @*/
319bdf89e91SBarry Smith PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
3205c6c1daeSBarry Smith {
3215c6c1daeSBarry Smith   PetscFunctionBegin;
3225f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawInitializePackage());
3235f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFunctionListAdd(&PetscDrawList,sname,function));
3245c6c1daeSBarry Smith   PetscFunctionReturn(0);
3255c6c1daeSBarry Smith }
3265c6c1daeSBarry Smith 
3277faeec8aSLisandro Dalcin /*@C
3287faeec8aSLisandro Dalcin    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
3297faeec8aSLisandro Dalcin    PetscDraw options in the database.
3307faeec8aSLisandro Dalcin 
3317faeec8aSLisandro Dalcin    Logically Collective on PetscDraw
3327faeec8aSLisandro Dalcin 
333d8d19677SJose E. Roman    Input Parameters:
3347faeec8aSLisandro Dalcin +  draw - the draw context
3357faeec8aSLisandro Dalcin -  prefix - the prefix to prepend to all option names
3367faeec8aSLisandro Dalcin 
3377faeec8aSLisandro Dalcin    Level: advanced
3387faeec8aSLisandro Dalcin 
339ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
3407faeec8aSLisandro Dalcin @*/
3417faeec8aSLisandro Dalcin PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
3427faeec8aSLisandro Dalcin {
3437faeec8aSLisandro Dalcin   PetscFunctionBegin;
3447faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3455f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetOptionsPrefix((PetscObject)draw,prefix));
3467faeec8aSLisandro Dalcin   PetscFunctionReturn(0);
3477faeec8aSLisandro Dalcin }
3487faeec8aSLisandro Dalcin 
3495c6c1daeSBarry Smith /*@
3505c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
351e1dfdf8eSBarry Smith       Defaults to a PETSc X Windows graphics.
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith    Collective on PetscDraw
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith    Input Parameter:
3565c6c1daeSBarry Smith .     draw - the graphics context
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith    Options Database Keys:
3595c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
360e1dfdf8eSBarry Smith .   -nox_warning - when X Windows support is not installed this prevents the warning message from being printed
3617450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
36273f7a4c5SBarry Smith .   -draw_marker_type - <x,point>
363e1dfdf8eSBarry Smith .   -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file
364e1dfdf8eSBarry Smith .   -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window
365a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
366df8d4941SLisandro 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'
367df8d4941SLisandro Dalcin .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
368df8d4941SLisandro Dalcin -   -draw_save_on_flush - saves an image on each flush, mainly for debugging
3695c6c1daeSBarry Smith 
3705c6c1daeSBarry Smith    Level: intermediate
3715c6c1daeSBarry Smith 
37295452b02SPatrick Sanan    Notes:
37395452b02SPatrick Sanan     Must be called after PetscDrawCreate() before the PetscDraw is used.
3745c6c1daeSBarry Smith 
375ba1e01c4SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith @*/
3785c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
3795c6c1daeSBarry Smith {
3805c6c1daeSBarry Smith   PetscErrorCode    ierr;
3815c6c1daeSBarry Smith   PetscBool         flg,nox;
3825c6c1daeSBarry Smith   char              vtype[256];
3835c6c1daeSBarry Smith   const char        *def;
3845c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3855c6c1daeSBarry Smith   PetscBool         warn;
3865c6c1daeSBarry Smith #endif
3875c6c1daeSBarry Smith 
3885c6c1daeSBarry Smith   PetscFunctionBegin;
3895c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3905c6c1daeSBarry Smith 
3915f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawRegisterAll());
3925c6c1daeSBarry Smith 
393a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
394a297a907SKarl Rupp   else {
3955f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox));
3965c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
3975c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3985c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3995c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
4005c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
4015c6c1daeSBarry Smith #else
4025f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn));
403e1dfdf8eSBarry Smith     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n");
4045c6c1daeSBarry Smith #endif
4055c6c1daeSBarry Smith   }
4065c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
4075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg));
4085c6c1daeSBarry Smith   if (flg) {
4095f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawSetType(draw,vtype));
4105c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
4115f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawSetType(draw,def));
4125c6c1daeSBarry Smith   }
4135f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsName("-nox","Run without graphics","None",&nox));
4145c6c1daeSBarry Smith   {
41549c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
41649c04938SLisandro Dalcin     char      movieext[32];
41749c04938SLisandro Dalcin     PetscBool image,movie;
4185f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:""));
4195f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:""));
4205f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image));
4215f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie));
4225f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL));
4235f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",PETSC_FUNCTION_NAME,draw->savesinglefile,&draw->savesinglefile,NULL));
4245f80ce2aSJacob Faibussowitsch     if (image) CHKERRQ(PetscDrawSetSave(draw,filename));
4255f80ce2aSJacob Faibussowitsch     if (movie) CHKERRQ(PetscDrawSetSaveMovie(draw,movieext));
4265f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image));
4275f80ce2aSJacob Faibussowitsch     if (image) CHKERRQ(PetscDrawSetSaveFinalImage(draw,filename));
4285f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL));
4295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL));
4305c6c1daeSBarry Smith   }
4315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL));
4325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL));
43373f7a4c5SBarry Smith 
4345c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
4355f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw));
436ce1779c8SBarry Smith 
4375f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawViewFromOptions(draw,NULL,"-draw_view"));
4385c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4395c6c1daeSBarry Smith   PetscFunctionReturn(0);
4405c6c1daeSBarry Smith }
441