xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 10450e9e44b354a0a3da7bbd573407bdf051df10)
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
17811af0c4SBarry Smith   PetscDrawView - Prints the `PetscDraw` data structure.
180076e027SBarry Smith 
19c3339decSBarry Smith   Collective
200076e027SBarry Smith 
210076e027SBarry Smith   Input Parameters:
22811af0c4SBarry 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
29811af0c4SBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
30811af0c4SBarry 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
36811af0c4SBarry Smith   `PetscViewerASCIIOpen()` - output to a specified file.
370076e027SBarry Smith 
380076e027SBarry Smith   Level: beginner
390076e027SBarry Smith 
40811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscViewerASCIIOpen()`, `PetscViewer`
410076e027SBarry Smith @*/
42d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawView(PetscDraw indraw, PetscViewer viewer)
43d71ae5a4SJacob Faibussowitsch {
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);
5148a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw), &viewer));
520076e027SBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
530076e027SBarry Smith   PetscCheckSameComm(indraw, 1, viewer, 2);
540076e027SBarry Smith 
559566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)indraw, viewer));
569566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
57e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
589566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSAWS, &issaws));
590076e027SBarry Smith #endif
600076e027SBarry Smith   if (isdraw) {
610076e027SBarry Smith     PetscDraw draw;
620076e027SBarry Smith     char      str[36];
630076e027SBarry Smith     PetscReal x, y, bottom, h;
640076e027SBarry Smith 
659566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
669566063dSJacob Faibussowitsch     PetscCall(PetscDrawGetCurrentPoint(draw, &x, &y));
679566063dSJacob Faibussowitsch     PetscCall(PetscStrncpy(str, "PetscDraw: ", sizeof(str)));
689566063dSJacob Faibussowitsch     PetscCall(PetscStrlcat(str, ((PetscObject)indraw)->type_name, sizeof(str)));
699566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringBoxed(draw, x, y, PETSC_DRAW_RED, PETSC_DRAW_BLACK, str, NULL, &h));
700076e027SBarry Smith     bottom = y - h;
719566063dSJacob Faibussowitsch     PetscCall(PetscDrawPushCurrentPoint(draw, x, bottom));
72e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
73536b137fSBarry Smith   } else if (issaws) {
74d45a07a7SBarry Smith     PetscMPIInt rank;
75d45a07a7SBarry Smith 
769566063dSJacob Faibussowitsch     PetscCall(PetscObjectName((PetscObject)indraw));
779566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
7848a46eb9SPierre Jolivet     if (!((PetscObject)indraw)->amsmem && rank == 0) PetscCall(PetscObjectViewSAWs((PetscObject)indraw, viewer));
790076e027SBarry Smith #endif
80dbbe0bcdSBarry Smith   } else PetscTryTypeMethod(indraw, view, viewer);
813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
820076e027SBarry Smith }
830076e027SBarry Smith 
845c6c1daeSBarry Smith /*@C
85811af0c4SBarry Smith   PetscDrawViewFromOptions - View a `PetscDraw` from the option database
86fe2efc57SMark 
87c3339decSBarry Smith   Collective
88fe2efc57SMark 
89fe2efc57SMark   Input Parameters:
90811af0c4SBarry Smith + A    - the `PetscDraw` context
91736c3998SJose E. Roman . obj  - Optional object
92736c3998SJose E. Roman - name - command line option
93fe2efc57SMark 
94fe2efc57SMark   Level: intermediate
95aec76313SJacob Faibussowitsch 
96db781477SPatrick Sanan .seealso: `PetscDraw`, `PetscDrawView`, `PetscObjectViewFromOptions()`, `PetscDrawCreate()`
97fe2efc57SMark @*/
98d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewFromOptions(PetscDraw A, PetscObject obj, const char name[])
99d71ae5a4SJacob Faibussowitsch {
100fe2efc57SMark   PetscFunctionBegin;
101fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_DRAW_CLASSID, 1);
1029566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
1033ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
104fe2efc57SMark }
105fe2efc57SMark 
106fe2efc57SMark /*@C
1075c6c1daeSBarry Smith   PetscDrawCreate - Creates a graphics context.
1085c6c1daeSBarry Smith 
109d083f849SBarry Smith   Collective
1105c6c1daeSBarry Smith 
111d8d19677SJose E. Roman   Input Parameters:
1125c6c1daeSBarry Smith + comm    - MPI communicator
113e1dfdf8eSBarry Smith . display - X display when using X Windows
1145c6c1daeSBarry Smith . title   - optional title added to top of window
1152fe279fdSBarry Smith . x       - horizonatl coordinate of lower left corner of window or `PETSC_DECIDE`
1162fe279fdSBarry Smith . y       - vertical coordinate of lower left corner of window or `PETSC_DECIDE`
1172fe279fdSBarry Smith . w       - width of window, `PETSC_DECIDE`, `PETSC_DRAW_HALF_SIZE`, `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_THIRD_SIZE` or `PETSC_DRAW_QUARTER_SIZE`
1182fe279fdSBarry Smith - h       - height of window, `PETSC_DECIDE`, `PETSC_DRAW_HALF_SIZE`, `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_THIRD_SIZE` or `PETSC_DRAW_QUARTER_SIZE`
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith   Output Parameter:
121aec76313SJacob Faibussowitsch . indraw - location to put the `PetscDraw` context
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith   Level: beginner
1245c6c1daeSBarry Smith 
125aec76313SJacob Faibussowitsch .seealso: `PetscDrawSetType()`, `PetscDrawSetFromOptions()`, `PetscDrawDestroy()`, `PetscDrawLGCreate()`, `PetscDrawSPCreate()`,
126db781477SPatrick Sanan           `PetscDrawViewPortsCreate()`, `PetscDrawViewPortsSet()`, `PetscDrawAxisCreate()`, `PetscDrawHGCreate()`, `PetscDrawBarCreate()`,
127aec76313SJacob Faibussowitsch           `PetscViewerDrawGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSetSaveMovie()`, `PetscDrawSetSaveFinalImage()`,
128db781477SPatrick Sanan           `PetscDrawOpenX()`, `PetscDrawOpenImage()`, `PetscDrawIsNull()`, `PetscDrawGetPopup()`, `PetscDrawCheckResizedWindow()`, `PetscDrawResizeWindow()`,
129db781477SPatrick Sanan           `PetscDrawGetWindowSize()`, `PetscDrawLine()`, `PetscDrawArrow()`, `PetscDrawLineSetWidth()`, `PetscDrawLineGetWidth()`, `PetscDrawMarker()`,
130db781477SPatrick Sanan           `PetscDrawPoint()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`, `PetscDrawString()`, `PetscDrawStringCentered()`,
131db781477SPatrick Sanan           `PetscDrawStringBoxed()`, `PetscDrawStringVertical()`, `PetscDrawSetViewPort()`, `PetscDrawGetViewPort()`,
132db781477SPatrick Sanan           `PetscDrawSplitViewPort()`, `PetscDrawSetTitle()`, `PetscDrawAppendTitle()`, `PetscDrawGetTitle()`, `PetscDrawSetPause()`, `PetscDrawGetPause()`,
133db781477SPatrick Sanan           `PetscDrawPause()`, `PetscDrawSetDoubleBuffer()`, `PetscDrawClear()`, `PetscDrawFlush()`, `PetscDrawGetSingleton()`, `PetscDrawGetMouseButton()`,
134db781477SPatrick Sanan           `PetscDrawZoom()`, `PetscDrawGetBoundingBox()`
1355c6c1daeSBarry Smith @*/
136d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCreate(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscDraw *indraw)
137d71ae5a4SJacob Faibussowitsch {
1385c6c1daeSBarry Smith   PetscDraw draw;
139e118a51fSLisandro Dalcin   PetscReal dpause = 0.0;
1405c6c1daeSBarry Smith   PetscBool flag;
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith   PetscFunctionBegin;
1439566063dSJacob Faibussowitsch   PetscCall(PetscDrawInitializePackage());
14402c9f0b5SLisandro Dalcin   *indraw = NULL;
1459566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(draw, PETSC_DRAW_CLASSID, "Draw", "Graphics", "Draw", comm, PetscDrawDestroy, PetscDrawView));
146a297a907SKarl Rupp 
1478f69470aSLisandro Dalcin   draw->data = NULL;
1489566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &draw->display));
1499566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &draw->title));
1505c6c1daeSBarry Smith   draw->x       = x;
1515c6c1daeSBarry Smith   draw->y       = y;
1525c6c1daeSBarry Smith   draw->w       = w;
1535c6c1daeSBarry Smith   draw->h       = h;
1545c6c1daeSBarry Smith   draw->pause   = 0.0;
1555c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1565c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1575c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1585c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1595c6c1daeSBarry Smith   draw->port_xl = 0.0;
1605c6c1daeSBarry Smith   draw->port_xr = 1.0;
1615c6c1daeSBarry Smith   draw->port_yl = 0.0;
1625c6c1daeSBarry Smith   draw->port_yr = 1.0;
163e118a51fSLisandro Dalcin   draw->popup   = NULL;
164a297a907SKarl Rupp 
1659566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, NULL, "-draw_pause", &dpause, &flag));
1665c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1678067a7d5SLisandro Dalcin 
1680298fd71SBarry Smith   draw->savefilename   = NULL;
1698067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1708067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1715b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1728067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1733d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
174a297a907SKarl Rupp 
1759566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCurrentPoint(draw, .5, .9));
176a297a907SKarl Rupp 
1775c6c1daeSBarry Smith   draw->boundbox_xl = .5;
1785c6c1daeSBarry Smith   draw->boundbox_xr = .5;
1795c6c1daeSBarry Smith   draw->boundbox_yl = .9;
1805c6c1daeSBarry Smith   draw->boundbox_yr = .9;
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   *indraw = draw;
1833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1845c6c1daeSBarry Smith }
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith /*@C
1875c6c1daeSBarry Smith   PetscDrawSetType - Builds graphics object for a particular implementation
1885c6c1daeSBarry Smith 
189c3339decSBarry Smith   Collective
1905c6c1daeSBarry Smith 
191d8d19677SJose E. Roman   Input Parameters:
1925c6c1daeSBarry Smith + draw - the graphics context
193811af0c4SBarry Smith - type - for example, `PETSC_DRAW_X`
1945c6c1daeSBarry Smith 
1953c7db156SBarry Smith   Options Database Key:
196236f5a4dSBarry Smith . -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
197236f5a4dSBarry Smith 
1985c6c1daeSBarry Smith   Level: intermediate
1995c6c1daeSBarry Smith 
200811af0c4SBarry Smith   Note:
2013c7db156SBarry Smith   See `PetscDrawSetFromOptions()` for additional options database keys
2023c7db156SBarry Smith 
2035c6c1daeSBarry Smith   See "petsc/include/petscdraw.h" for available methods (for instance,
204811af0c4SBarry Smith   `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ` or `PETSC_DRAW_IMAGE`)
2055c6c1daeSBarry Smith 
206811af0c4SBarry Smith .seealso: `PetscDraw`, `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ`, `PETSC_DRAW_IMAGE`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`, `PetscDrawType`
2075c6c1daeSBarry Smith @*/
208d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetType(PetscDraw draw, PetscDrawType type)
209d71ae5a4SJacob Faibussowitsch {
2105c6c1daeSBarry Smith   PetscBool match;
2115c6c1daeSBarry Smith   PetscBool flg = PETSC_FALSE;
2125f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(PetscDraw);
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith   PetscFunctionBegin;
2155c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2165c6c1daeSBarry Smith   PetscValidCharPointer(type, 2);
2175c6c1daeSBarry Smith 
2189566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)draw, type, &match));
2193ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith   /*  User requests no graphics */
2229566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &flg));
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith   /*
2255c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2265c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2275c6c1daeSBarry Smith    testing.
2285c6c1daeSBarry Smith    */
2295c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2305c6c1daeSBarry Smith   if (!flg) {
2319566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(type, PETSC_DRAW_X, &match));
2325c6c1daeSBarry Smith     if (match) {
2335c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2345c6c1daeSBarry Smith       flg                = PETSC_TRUE;
2359566063dSJacob Faibussowitsch       PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &dontwarn));
2363ba16761SJacob Faibussowitsch       if (!dontwarn) PetscCall((*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n"));
2375c6c1daeSBarry Smith     }
2385c6c1daeSBarry Smith   }
2395c6c1daeSBarry Smith #endif
2400b50c7b2SBarry Smith   if (flg) {
2419566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(type, "tikz", &flg));
2429c8bf542SScott Kruger     if (!flg) type = PETSC_DRAW_NULL;
2439c8bf542SScott Kruger   }
2449c8bf542SScott Kruger 
2459566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(type, PETSC_DRAW_NULL, &match));
2469c8bf542SScott Kruger   if (match) {
2479566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_double_buffer", NULL));
2489566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_virtual", NULL));
2499566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_fast", NULL));
2509566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_ports", NULL));
2519566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_coordinates", NULL));
2520b50c7b2SBarry Smith   }
2535c6c1daeSBarry Smith 
2549566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscDrawList, type, &r));
2556adde796SStefano Zampini   PetscCheck(r, PetscObjectComm((PetscObject)draw), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDraw type given: %s", type);
256dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, destroy);
2579566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(draw->ops, sizeof(struct _PetscDrawOps)));
2589566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)draw, type));
2599566063dSJacob Faibussowitsch   PetscCall((*r)(draw));
2603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2615c6c1daeSBarry Smith }
2625c6c1daeSBarry Smith 
2635c6c1daeSBarry Smith /*@C
264811af0c4SBarry Smith   PetscDrawGetType - Gets the `PetscDraw` type as a string from the `PetscDraw` object.
2655c6c1daeSBarry Smith 
2665c6c1daeSBarry Smith   Not Collective
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith   Input Parameter:
2695c6c1daeSBarry Smith . draw - Krylov context
2705c6c1daeSBarry Smith 
2712fe279fdSBarry Smith   Output Parameter:
272aec76313SJacob Faibussowitsch . type - name of PetscDraw method
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith   Level: advanced
2755c6c1daeSBarry Smith 
276aec76313SJacob Faibussowitsch .seealso: `PetscDraw`, `PetscDrawType`, `PetscDrawSetType()`, `PetscDrawCreate()`
2775c6c1daeSBarry Smith @*/
278d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetType(PetscDraw draw, PetscDrawType *type)
279d71ae5a4SJacob Faibussowitsch {
2805c6c1daeSBarry Smith   PetscFunctionBegin;
2815c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2825c6c1daeSBarry Smith   PetscValidPointer(type, 2);
2835c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2855c6c1daeSBarry Smith }
2865c6c1daeSBarry Smith 
287607a6623SBarry Smith /*@C
2881c84c290SBarry Smith   PetscDrawRegister - Adds a method to the graphics package.
2891c84c290SBarry Smith 
2901c84c290SBarry Smith   Not Collective
2911c84c290SBarry Smith 
2921c84c290SBarry Smith   Input Parameters:
293*10450e9eSJacob Faibussowitsch + sname    - name of a new user-defined graphics class
294*10450e9eSJacob Faibussowitsch - function - routine to create method context
2951c84c290SBarry Smith 
2961c84c290SBarry Smith   Level: developer
2971c84c290SBarry Smith 
298811af0c4SBarry Smith   Note:
299811af0c4SBarry Smith   `PetscDrawRegister()` may be called multiple times to add several user-defined graphics classes
3001c84c290SBarry Smith 
301aec76313SJacob Faibussowitsch   Example Usage:
3021c84c290SBarry Smith .vb
303bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
3041c84c290SBarry Smith .ve
3051c84c290SBarry Smith 
3060076e027SBarry Smith   Then, your specific graphics package can be chosen with the procedural interface via
3071c84c290SBarry Smith $     PetscDrawSetType(ksp, "my_draw_type")
3081c84c290SBarry Smith   or at runtime via the option
3091c84c290SBarry Smith $     -draw_type my_draw_type
3101c84c290SBarry Smith 
311811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRegisterAll()`, `PetscDrawRegisterDestroy()`, `PetscDrawType`, `PetscDrawSetType()`
3121c84c290SBarry Smith @*/
313d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRegister(const char *sname, PetscErrorCode (*function)(PetscDraw))
314d71ae5a4SJacob Faibussowitsch {
3155c6c1daeSBarry Smith   PetscFunctionBegin;
3169566063dSJacob Faibussowitsch   PetscCall(PetscDrawInitializePackage());
3179566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscDrawList, sname, function));
3183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3195c6c1daeSBarry Smith }
3205c6c1daeSBarry Smith 
3217faeec8aSLisandro Dalcin /*@C
3227faeec8aSLisandro Dalcin   PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
323811af0c4SBarry Smith   `PetscDraw` options in the database.
3247faeec8aSLisandro Dalcin 
325c3339decSBarry Smith   Logically Collective
3267faeec8aSLisandro Dalcin 
327d8d19677SJose E. Roman   Input Parameters:
3287faeec8aSLisandro Dalcin + draw   - the draw context
3297faeec8aSLisandro Dalcin - prefix - the prefix to prepend to all option names
3307faeec8aSLisandro Dalcin 
3317faeec8aSLisandro Dalcin   Level: advanced
3327faeec8aSLisandro Dalcin 
333811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`
3347faeec8aSLisandro Dalcin @*/
335d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw, const char prefix[])
336d71ae5a4SJacob Faibussowitsch {
3377faeec8aSLisandro Dalcin   PetscFunctionBegin;
3387faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3399566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw, prefix));
3403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3417faeec8aSLisandro Dalcin }
3427faeec8aSLisandro Dalcin 
3435c6c1daeSBarry Smith /*@
3445c6c1daeSBarry Smith   PetscDrawSetFromOptions - Sets the graphics type from the options database.
345e1dfdf8eSBarry Smith   Defaults to a PETSc X Windows graphics.
3465c6c1daeSBarry Smith 
347c3339decSBarry Smith   Collective
3485c6c1daeSBarry Smith 
3495c6c1daeSBarry Smith   Input Parameter:
3505c6c1daeSBarry Smith . draw - the graphics context
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith   Options Database Keys:
3535c6c1daeSBarry Smith + -nox                                       - do not use X graphics (ignore graphics calls, but run program correctly)
354e1dfdf8eSBarry Smith . -nox_warning                               - when X Windows support is not installed this prevents the warning message from being printed
3557450148dSBarry Smith . -draw_pause <pause amount>                 - - -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
35673f7a4c5SBarry Smith . -draw_marker_type                          - <x,point>
357e1dfdf8eSBarry Smith . -draw_save [optional filename]             - (X Windows only) saves each image before it is cleared to a file
358e1dfdf8eSBarry Smith . -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window
359a4494fc1SBarry Smith . -draw_save_movie                           - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
360df8d4941SLisandro 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'
361df8d4941SLisandro Dalcin . -draw_save_on_clear                        - saves an image on each clear, mainly for debugging
362df8d4941SLisandro Dalcin - -draw_save_on_flush                        - saves an image on each flush, mainly for debugging
3635c6c1daeSBarry Smith 
3645c6c1daeSBarry Smith   Level: intermediate
3655c6c1daeSBarry Smith 
366811af0c4SBarry Smith   Note:
367811af0c4SBarry Smith   Must be called after `PetscDrawCreate()` before the `PetscDraw` is used.
3685c6c1daeSBarry Smith 
369811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`, `PetscDrawSetType()`, `PetscDrawSetSave()`, `PetscDrawSetSaveFinalImage()`, `PetscDrawPause()`, `PetscDrawSetPause()`
3705c6c1daeSBarry Smith @*/
371d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw)
372d71ae5a4SJacob Faibussowitsch {
3735c6c1daeSBarry Smith   PetscBool   flg, nox;
3745c6c1daeSBarry Smith   char        vtype[256];
3755c6c1daeSBarry Smith   const char *def;
3765c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3775c6c1daeSBarry Smith   PetscBool warn;
3785c6c1daeSBarry Smith #endif
3795c6c1daeSBarry Smith 
3805c6c1daeSBarry Smith   PetscFunctionBegin;
3815c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3825c6c1daeSBarry Smith 
3839566063dSJacob Faibussowitsch   PetscCall(PetscDrawRegisterAll());
3845c6c1daeSBarry Smith 
385a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
386a297a907SKarl Rupp   else {
3879566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &nox));
3885c6c1daeSBarry Smith     def = PETSC_DRAW_NULL;
3895c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3905c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3915c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
3925c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
3935c6c1daeSBarry Smith #else
3949566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &warn));
3953ba16761SJacob Faibussowitsch     if (!nox && !warn) PetscCall((*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n"));
3965c6c1daeSBarry Smith #endif
3975c6c1daeSBarry Smith   }
398d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)draw);
3999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-draw_type", "Type of graphical output", "PetscDrawSetType", PetscDrawList, def, vtype, 256, &flg));
4005c6c1daeSBarry Smith   if (flg) {
4019566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetType(draw, vtype));
4025c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
4039566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetType(draw, def));
4045c6c1daeSBarry Smith   }
4059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsName("-nox", "Run without graphics", "None", &nox));
4065c6c1daeSBarry Smith   {
40749c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
40849c04938SLisandro Dalcin     char      movieext[32];
40949c04938SLisandro Dalcin     PetscBool image, movie;
4109566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(filename, sizeof(filename), "%s%s", draw->savefilename ? draw->savefilename : "", draw->saveimageext ? draw->saveimageext : ""));
4119566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(movieext, sizeof(movieext), "%s", draw->savemovieext ? draw->savemovieext : ""));
4129566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save", "Save graphics to image file", "PetscDrawSetSave", filename, filename, sizeof(filename), &image));
4139566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save_movie", "Make a movie from saved images", "PetscDrawSetSaveMovie", movieext, movieext, sizeof(movieext), &movie));
4149566063dSJacob Faibussowitsch     PetscCall(PetscOptionsInt("-draw_save_movie_fps", "Set frames per second in saved movie", PETSC_FUNCTION_NAME, draw->savemoviefps, &draw->savemoviefps, NULL));
4159566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_single_file", "Each new image replaces previous image in file", PETSC_FUNCTION_NAME, draw->savesinglefile, &draw->savesinglefile, NULL));
4169566063dSJacob Faibussowitsch     if (image) PetscCall(PetscDrawSetSave(draw, filename));
4179566063dSJacob Faibussowitsch     if (movie) PetscCall(PetscDrawSetSaveMovie(draw, movieext));
4189566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save_final_image", "Save final graphics to image file", "PetscDrawSetSaveFinalImage", filename, filename, sizeof(filename), &image));
4199566063dSJacob Faibussowitsch     if (image) PetscCall(PetscDrawSetSaveFinalImage(draw, filename));
4209566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_on_clear", "Save graphics to file on each clear", PETSC_FUNCTION_NAME, draw->saveonclear, &draw->saveonclear, NULL));
4219566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_on_flush", "Save graphics to file on each flush", PETSC_FUNCTION_NAME, draw->saveonflush, &draw->saveonflush, NULL));
4225c6c1daeSBarry Smith   }
4239566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-draw_pause", "Amount of time that program pauses after plots", "PetscDrawSetPause", draw->pause, &draw->pause, NULL));
4249566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-draw_marker_type", "Type of marker to use on plots", "PetscDrawSetMarkerType", PetscDrawMarkerTypes, (PetscEnum)draw->markertype, (PetscEnum *)&draw->markertype, NULL));
42573f7a4c5SBarry Smith 
4265c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
427dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)draw, PetscOptionsObject));
428ce1779c8SBarry Smith 
4299566063dSJacob Faibussowitsch   PetscCall(PetscDrawViewFromOptions(draw, NULL, "-draw_view"));
430d0609cedSBarry Smith   PetscOptionsEnd();
4313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4325c6c1daeSBarry Smith }
433