xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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
17*811af0c4SBarry Smith    PetscDrawView - Prints the `PetscDraw` data structure.
180076e027SBarry Smith 
19*811af0c4SBarry Smith    Collective on indraw
200076e027SBarry Smith 
210076e027SBarry Smith    Input Parameters:
22*811af0c4SBarry 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
29*811af0c4SBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
30*811af0c4SBarry 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
36*811af0c4SBarry Smith    `PetscViewerASCIIOpen()` - output to a specified file.
370076e027SBarry Smith 
380076e027SBarry Smith    Level: beginner
390076e027SBarry Smith 
40*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscViewerASCIIOpen()`, `PetscViewer`
410076e027SBarry Smith @*/
429371c9d4SSatish Balay PetscErrorCode PetscDrawView(PetscDraw indraw, PetscViewer viewer) {
430076e027SBarry Smith   PetscBool isdraw;
44e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
45536b137fSBarry Smith   PetscBool issaws;
460076e027SBarry Smith #endif
470076e027SBarry Smith 
480076e027SBarry Smith   PetscFunctionBegin;
490076e027SBarry Smith   PetscValidHeaderSpecific(indraw, PETSC_DRAW_CLASSID, 1);
5048a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw), &viewer));
510076e027SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
520076e027SBarry Smith   PetscCheckSameComm(indraw, 1, viewer, 2);
530076e027SBarry Smith 
549566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)indraw, viewer));
559566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
56e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
579566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
580076e027SBarry Smith #endif
590076e027SBarry Smith   if (isdraw) {
600076e027SBarry Smith     PetscDraw draw;
610076e027SBarry Smith     char      str[36];
620076e027SBarry Smith     PetscReal x, y, bottom, h;
630076e027SBarry Smith 
649566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
659566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetCurrentPoint(draw, &x, &y));
669566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(str, "PetscDraw: ", sizeof(str)));
679566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(str, ((PetscObject)indraw)->type_name, sizeof(str)));
689566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringBoxed(draw, x, y, PETSC_DRAW_RED, PETSC_DRAW_BLACK, str, NULL, &h));
690076e027SBarry Smith     bottom = y - h;
709566063dSJacob Faibussowitsch     PetscCall(PetscDrawPushCurrentPoint(draw, x, bottom));
71e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
72536b137fSBarry Smith   } else if (issaws) {
73d45a07a7SBarry Smith     PetscMPIInt rank;
74d45a07a7SBarry Smith 
759566063dSJacob Faibussowitsch     PetscCall(PetscObjectName((PetscObject)indraw));
769566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
7748a46eb9SPierre Jolivet     if (!((PetscObject)indraw)->amsmem && rank == 0) PetscCall(PetscObjectViewSAWs((PetscObject)indraw, viewer));
780076e027SBarry Smith #endif
79dbbe0bcdSBarry Smith   } else PetscTryTypeMethod(indraw, view, viewer);
800076e027SBarry Smith   PetscFunctionReturn(0);
810076e027SBarry Smith }
820076e027SBarry Smith 
835c6c1daeSBarry Smith /*@C
84*811af0c4SBarry Smith    PetscDrawViewFromOptions - View a `PetscDraw` from the option database
85fe2efc57SMark 
86*811af0c4SBarry Smith    Collective on A
87fe2efc57SMark 
88fe2efc57SMark    Input Parameters:
89*811af0c4SBarry Smith +  A - the `PetscDraw` context
90736c3998SJose E. Roman .  obj - Optional object
91736c3998SJose E. Roman -  name - command line option
92fe2efc57SMark 
93fe2efc57SMark    Level: intermediate
94db781477SPatrick Sanan .seealso: `PetscDraw`, `PetscDrawView`, `PetscObjectViewFromOptions()`, `PetscDrawCreate()`
95fe2efc57SMark @*/
969371c9d4SSatish Balay PetscErrorCode PetscDrawViewFromOptions(PetscDraw A, PetscObject obj, const char name[]) {
97fe2efc57SMark   PetscFunctionBegin;
98fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_DRAW_CLASSID, 1);
999566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
100fe2efc57SMark   PetscFunctionReturn(0);
101fe2efc57SMark }
102fe2efc57SMark 
103fe2efc57SMark /*@C
1045c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
1055c6c1daeSBarry Smith 
106d083f849SBarry Smith    Collective
1075c6c1daeSBarry Smith 
108d8d19677SJose E. Roman    Input Parameters:
1095c6c1daeSBarry Smith +  comm - MPI communicator
110e1dfdf8eSBarry Smith .  display - X display when using X Windows
1115c6c1daeSBarry Smith .  title - optional title added to top of window
112*811af0c4SBarry Smith .  x,y - coordinates of lower left corner of window or `PETSC_DECIDE`
113*811af0c4SBarry Smith -  w, h - width and height of window or `PETSC_DECIDE` or `PETSC_DRAW_HALF_SIZE`, `PETSC_DRAW_FULL_SIZE`,
114*811af0c4SBarry Smith           or `PETSC_DRAW_THIRD_SIZE` or `PETSC_DRAW_QUARTER_SIZE`
1155c6c1daeSBarry Smith 
1165c6c1daeSBarry Smith    Output Parameter:
117*811af0c4SBarry Smith .  draw - location to put the `PetscDraw` context
1185c6c1daeSBarry Smith 
1195c6c1daeSBarry Smith    Level: beginner
1205c6c1daeSBarry Smith 
121db781477SPatrick Sanan .seealso: `PetscDrawSetType()`, `PetscDrawSetFromOptions()`, `PetscDrawDestroy()`, `PetscDrawSetType()`, `PetscDrawLGCreate()`, `PetscDrawSPCreate()`,
122db781477SPatrick Sanan           `PetscDrawViewPortsCreate()`, `PetscDrawViewPortsSet()`, `PetscDrawAxisCreate()`, `PetscDrawHGCreate()`, `PetscDrawBarCreate()`,
123db781477SPatrick Sanan           `PetscViewerDrawGetDraw()`, `PetscDrawSetFromOptions()`, `PetscDrawSetSave()`, `PetscDrawSetSaveMovie()`, `PetscDrawSetSaveFinalImage()`,
124db781477SPatrick Sanan           `PetscDrawOpenX()`, `PetscDrawOpenImage()`, `PetscDrawIsNull()`, `PetscDrawGetPopup()`, `PetscDrawCheckResizedWindow()`, `PetscDrawResizeWindow()`,
125db781477SPatrick Sanan           `PetscDrawGetWindowSize()`, `PetscDrawLine()`, `PetscDrawArrow()`, `PetscDrawLineSetWidth()`, `PetscDrawLineGetWidth()`, `PetscDrawMarker()`,
126db781477SPatrick Sanan           `PetscDrawPoint()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`, `PetscDrawString()`, `PetscDrawStringCentered()`,
127db781477SPatrick Sanan           `PetscDrawStringBoxed()`, `PetscDrawStringVertical()`, `PetscDrawSetViewPort()`, `PetscDrawGetViewPort()`,
128db781477SPatrick Sanan           `PetscDrawSplitViewPort()`, `PetscDrawSetTitle()`, `PetscDrawAppendTitle()`, `PetscDrawGetTitle()`, `PetscDrawSetPause()`, `PetscDrawGetPause()`,
129db781477SPatrick Sanan           `PetscDrawPause()`, `PetscDrawSetDoubleBuffer()`, `PetscDrawClear()`, `PetscDrawFlush()`, `PetscDrawGetSingleton()`, `PetscDrawGetMouseButton()`,
130db781477SPatrick Sanan           `PetscDrawZoom()`, `PetscDrawGetBoundingBox()`
1315c6c1daeSBarry Smith @*/
1329371c9d4SSatish Balay PetscErrorCode PetscDrawCreate(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscDraw *indraw) {
1335c6c1daeSBarry Smith   PetscDraw draw;
134e118a51fSLisandro Dalcin   PetscReal dpause = 0.0;
1355c6c1daeSBarry Smith   PetscBool flag;
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith   PetscFunctionBegin;
1389566063dSJacob Faibussowitsch   PetscCall(PetscDrawInitializePackage());
13902c9f0b5SLisandro Dalcin   *indraw = NULL;
1409566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(draw, PETSC_DRAW_CLASSID, "Draw", "Graphics", "Draw", comm, PetscDrawDestroy, PetscDrawView));
141a297a907SKarl Rupp 
1428f69470aSLisandro Dalcin   draw->data = NULL;
1439566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &draw->display));
1449566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &draw->title));
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 
1609566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, NULL, "-draw_pause", &dpause, &flag));
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 
1709566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCurrentPoint(draw, .5, .9));
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 /*@C
1825c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
1835c6c1daeSBarry Smith 
184*811af0c4SBarry Smith    Collective on draw
1855c6c1daeSBarry Smith 
186d8d19677SJose E. Roman    Input Parameters:
1875c6c1daeSBarry Smith +  draw      - the graphics context
188*811af0c4SBarry Smith -  type      - for example, `PETSC_DRAW_X`
1895c6c1daeSBarry Smith 
1905c6c1daeSBarry Smith    Options Database Command:
191236f5a4dSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
192236f5a4dSBarry Smith 
193ba1e01c4SBarry Smith    See PetscDrawSetFromOptions() for additional options database keys
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith    Level: intermediate
1965c6c1daeSBarry Smith 
197*811af0c4SBarry Smith    Note:
1985c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
199*811af0c4SBarry Smith    `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ` or `PETSC_DRAW_IMAGE`)
2005c6c1daeSBarry Smith 
201*811af0c4SBarry Smith .seealso: `PetscDraw`, `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ`, `PETSC_DRAW_IMAGE`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`, `PetscDrawType`
2025c6c1daeSBarry Smith @*/
2039371c9d4SSatish Balay PetscErrorCode PetscDrawSetType(PetscDraw draw, PetscDrawType type) {
2045c6c1daeSBarry Smith   PetscBool match;
2055c6c1daeSBarry Smith   PetscBool flg = PETSC_FALSE;
2065f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(PetscDraw);
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith   PetscFunctionBegin;
2095c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2105c6c1daeSBarry Smith   PetscValidCharPointer(type, 2);
2115c6c1daeSBarry Smith 
2129566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)draw, type, &match));
2135c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith   /*  User requests no graphics */
2169566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &flg));
2175c6c1daeSBarry Smith 
2185c6c1daeSBarry Smith   /*
2195c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2205c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2215c6c1daeSBarry Smith    testing.
2225c6c1daeSBarry Smith    */
2235c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2245c6c1daeSBarry Smith   if (!flg) {
2259566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(type, PETSC_DRAW_X, &match));
2265c6c1daeSBarry Smith     if (match) {
2275c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2285c6c1daeSBarry Smith       flg                = PETSC_TRUE;
2299566063dSJacob Faibussowitsch       PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &dontwarn));
230e1dfdf8eSBarry Smith       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n");
2315c6c1daeSBarry Smith     }
2325c6c1daeSBarry Smith   }
2335c6c1daeSBarry Smith #endif
2340b50c7b2SBarry Smith   if (flg) {
2359566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(type, "tikz", &flg));
2369c8bf542SScott Kruger     if (!flg) type = PETSC_DRAW_NULL;
2379c8bf542SScott Kruger   }
2389c8bf542SScott Kruger 
2399566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(type, PETSC_DRAW_NULL, &match));
2409c8bf542SScott Kruger   if (match) {
2419566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_double_buffer", NULL));
2429566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_virtual", NULL));
2439566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_fast", NULL));
2449566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_ports", NULL));
2459566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_coordinates", NULL));
2460b50c7b2SBarry Smith   }
2475c6c1daeSBarry Smith 
2489566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscDrawList, type, &r));
24928b400f6SJacob Faibussowitsch   PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDraw type given: %s", type);
250dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, destroy);
2519566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(draw->ops, sizeof(struct _PetscDrawOps)));
2529566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)draw, type));
2539566063dSJacob Faibussowitsch   PetscCall((*r)(draw));
2545c6c1daeSBarry Smith   PetscFunctionReturn(0);
2555c6c1daeSBarry Smith }
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith /*@C
258*811af0c4SBarry 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*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawType`, `PetscDrawSetType()`, `PetscDrawCreate()
2715c6c1daeSBarry Smith @*/
2729371c9d4SSatish Balay PetscErrorCode PetscDrawGetType(PetscDraw draw, PetscDrawType *type) {
2735c6c1daeSBarry Smith   PetscFunctionBegin;
2745c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2755c6c1daeSBarry Smith   PetscValidPointer(type, 2);
2765c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2775c6c1daeSBarry Smith   PetscFunctionReturn(0);
2785c6c1daeSBarry Smith }
2795c6c1daeSBarry Smith 
280607a6623SBarry Smith /*@C
2811c84c290SBarry Smith    PetscDrawRegister - Adds a method to the graphics package.
2821c84c290SBarry Smith 
2831c84c290SBarry Smith    Not Collective
2841c84c290SBarry Smith 
2851c84c290SBarry Smith    Input Parameters:
2860076e027SBarry Smith +  name_solver - name of a new user-defined graphics class
2871c84c290SBarry Smith -  routine_create - routine to create method context
2881c84c290SBarry Smith 
2891c84c290SBarry Smith    Level: developer
2901c84c290SBarry Smith 
291*811af0c4SBarry Smith    Note:
292*811af0c4SBarry Smith    `PetscDrawRegister()` may be called multiple times to add several user-defined graphics classes
2931c84c290SBarry Smith 
2941c84c290SBarry Smith    Sample usage:
2951c84c290SBarry Smith .vb
296bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
2971c84c290SBarry Smith .ve
2981c84c290SBarry Smith 
2990076e027SBarry Smith    Then, your specific graphics package can be chosen with the procedural interface via
3001c84c290SBarry Smith $     PetscDrawSetType(ksp,"my_draw_type")
3011c84c290SBarry Smith    or at runtime via the option
3021c84c290SBarry Smith $     -draw_type my_draw_type
3031c84c290SBarry Smith 
304*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRegisterAll()`, `PetscDrawRegisterDestroy()`, `PetscDrawType`, `PetscDrawSetType()`
3051c84c290SBarry Smith @*/
3069371c9d4SSatish Balay PetscErrorCode PetscDrawRegister(const char *sname, PetscErrorCode (*function)(PetscDraw)) {
3075c6c1daeSBarry Smith   PetscFunctionBegin;
3089566063dSJacob Faibussowitsch   PetscCall(PetscDrawInitializePackage());
3099566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscDrawList, sname, function));
3105c6c1daeSBarry Smith   PetscFunctionReturn(0);
3115c6c1daeSBarry Smith }
3125c6c1daeSBarry Smith 
3137faeec8aSLisandro Dalcin /*@C
3147faeec8aSLisandro Dalcin    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
315*811af0c4SBarry Smith    `PetscDraw` options in the database.
3167faeec8aSLisandro Dalcin 
317*811af0c4SBarry Smith    Logically Collective on draw
3187faeec8aSLisandro Dalcin 
319d8d19677SJose E. Roman    Input Parameters:
3207faeec8aSLisandro Dalcin +  draw - the draw context
3217faeec8aSLisandro Dalcin -  prefix - the prefix to prepend to all option names
3227faeec8aSLisandro Dalcin 
3237faeec8aSLisandro Dalcin    Level: advanced
3247faeec8aSLisandro Dalcin 
325*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`
3267faeec8aSLisandro Dalcin @*/
3279371c9d4SSatish Balay PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw, const char prefix[]) {
3287faeec8aSLisandro Dalcin   PetscFunctionBegin;
3297faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3309566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw, prefix));
3317faeec8aSLisandro Dalcin   PetscFunctionReturn(0);
3327faeec8aSLisandro Dalcin }
3337faeec8aSLisandro Dalcin 
3345c6c1daeSBarry Smith /*@
3355c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
336e1dfdf8eSBarry Smith       Defaults to a PETSc X Windows graphics.
3375c6c1daeSBarry Smith 
338*811af0c4SBarry Smith    Collective on draw
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith    Input Parameter:
3415c6c1daeSBarry Smith .     draw - the graphics context
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith    Options Database Keys:
3445c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
345e1dfdf8eSBarry Smith .   -nox_warning - when X Windows support is not installed this prevents the warning message from being printed
3467450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
34773f7a4c5SBarry Smith .   -draw_marker_type - <x,point>
348e1dfdf8eSBarry Smith .   -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file
349e1dfdf8eSBarry Smith .   -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window
350a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
351df8d4941SLisandro 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'
352df8d4941SLisandro Dalcin .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
353df8d4941SLisandro Dalcin -   -draw_save_on_flush - saves an image on each flush, mainly for debugging
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith    Level: intermediate
3565c6c1daeSBarry Smith 
357*811af0c4SBarry Smith    Note:
358*811af0c4SBarry Smith     Must be called after `PetscDrawCreate()` before the `PetscDraw` is used.
3595c6c1daeSBarry Smith 
360*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`, `PetscDrawSetType()`, `PetscDrawSetSave()`, `PetscDrawSetSaveFinalImage()`, `PetscDrawPause()`, `PetscDrawSetPause()`
3615c6c1daeSBarry Smith @*/
3629371c9d4SSatish Balay PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) {
3635c6c1daeSBarry Smith   PetscBool   flg, nox;
3645c6c1daeSBarry Smith   char        vtype[256];
3655c6c1daeSBarry Smith   const char *def;
3665c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3675c6c1daeSBarry Smith   PetscBool warn;
3685c6c1daeSBarry Smith #endif
3695c6c1daeSBarry Smith 
3705c6c1daeSBarry Smith   PetscFunctionBegin;
3715c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3725c6c1daeSBarry Smith 
3739566063dSJacob Faibussowitsch   PetscCall(PetscDrawRegisterAll());
3745c6c1daeSBarry Smith 
375a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
376a297a907SKarl Rupp   else {
3779566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &nox));
3785c6c1daeSBarry Smith     def = PETSC_DRAW_NULL;
3795c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3805c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3815c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
3825c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
3835c6c1daeSBarry Smith #else
3849566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &warn));
385e1dfdf8eSBarry Smith     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n");
3865c6c1daeSBarry Smith #endif
3875c6c1daeSBarry Smith   }
388d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)draw);
3899566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-draw_type", "Type of graphical output", "PetscDrawSetType", PetscDrawList, def, vtype, 256, &flg));
3905c6c1daeSBarry Smith   if (flg) {
3919566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetType(draw, vtype));
3925c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
3939566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetType(draw, def));
3945c6c1daeSBarry Smith   }
3959566063dSJacob Faibussowitsch   PetscCall(PetscOptionsName("-nox", "Run without graphics", "None", &nox));
3965c6c1daeSBarry Smith   {
39749c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
39849c04938SLisandro Dalcin     char      movieext[32];
39949c04938SLisandro Dalcin     PetscBool image, movie;
4009566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(filename, sizeof(filename), "%s%s", draw->savefilename ? draw->savefilename : "", draw->saveimageext ? draw->saveimageext : ""));
4019566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(movieext, sizeof(movieext), "%s", draw->savemovieext ? draw->savemovieext : ""));
4029566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save", "Save graphics to image file", "PetscDrawSetSave", filename, filename, sizeof(filename), &image));
4039566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save_movie", "Make a movie from saved images", "PetscDrawSetSaveMovie", movieext, movieext, sizeof(movieext), &movie));
4049566063dSJacob Faibussowitsch     PetscCall(PetscOptionsInt("-draw_save_movie_fps", "Set frames per second in saved movie", PETSC_FUNCTION_NAME, draw->savemoviefps, &draw->savemoviefps, NULL));
4059566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_single_file", "Each new image replaces previous image in file", PETSC_FUNCTION_NAME, draw->savesinglefile, &draw->savesinglefile, NULL));
4069566063dSJacob Faibussowitsch     if (image) PetscCall(PetscDrawSetSave(draw, filename));
4079566063dSJacob Faibussowitsch     if (movie) PetscCall(PetscDrawSetSaveMovie(draw, movieext));
4089566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save_final_image", "Save final graphics to image file", "PetscDrawSetSaveFinalImage", filename, filename, sizeof(filename), &image));
4099566063dSJacob Faibussowitsch     if (image) PetscCall(PetscDrawSetSaveFinalImage(draw, filename));
4109566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_on_clear", "Save graphics to file on each clear", PETSC_FUNCTION_NAME, draw->saveonclear, &draw->saveonclear, NULL));
4119566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_on_flush", "Save graphics to file on each flush", PETSC_FUNCTION_NAME, draw->saveonflush, &draw->saveonflush, NULL));
4125c6c1daeSBarry Smith   }
4139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-draw_pause", "Amount of time that program pauses after plots", "PetscDrawSetPause", draw->pause, &draw->pause, NULL));
4149566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-draw_marker_type", "Type of marker to use on plots", "PetscDrawSetMarkerType", PetscDrawMarkerTypes, (PetscEnum)draw->markertype, (PetscEnum *)&draw->markertype, NULL));
41573f7a4c5SBarry Smith 
4165c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
417dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)draw, PetscOptionsObject));
418ce1779c8SBarry Smith 
4199566063dSJacob Faibussowitsch   PetscCall(PetscDrawViewFromOptions(draw, NULL, "-draw_view"));
420d0609cedSBarry Smith   PetscOptionsEnd();
4215c6c1daeSBarry Smith   PetscFunctionReturn(0);
4225c6c1daeSBarry Smith }
423