xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 174dc0c8cee294b82b85e4dd3b331b29396264fc)
15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith        Provides the registration process for PETSc PetscDraw routines
35c6c1daeSBarry Smith */
4af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
5111ee811SBarry Smith #include <petscviewer.h>            /*I "petscviewer.h" I*/
6111ee811SBarry Smith #if defined(PETSC_HAVE_SAWS)
7111ee811SBarry Smith   #include <petscviewersaws.h>
8111ee811SBarry Smith #endif
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith /*
115c6c1daeSBarry Smith    Contains the list of registered PetscDraw routines
125c6c1daeSBarry Smith */
1302c9f0b5SLisandro Dalcin PetscFunctionList PetscDrawList = NULL;
145c6c1daeSBarry Smith 
15ffeef943SBarry Smith /*@
16811af0c4SBarry Smith   PetscDrawView - Prints the `PetscDraw` data structure.
170076e027SBarry Smith 
18c3339decSBarry Smith   Collective
190076e027SBarry Smith 
200076e027SBarry Smith   Input Parameters:
21811af0c4SBarry Smith + indraw - the `PetscDraw` context
220076e027SBarry Smith - viewer - visualization context
230076e027SBarry Smith 
24236f5a4dSBarry Smith    See PetscDrawSetFromOptions() for options database keys
250076e027SBarry Smith 
260076e027SBarry Smith   Note:
270076e027SBarry Smith   The available visualization contexts include
28811af0c4SBarry Smith +     `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
29811af0c4SBarry Smith -     `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
300076e027SBarry Smith   output where only the first processor opens
310076e027SBarry Smith   the file.  All other processors send their
320076e027SBarry Smith   data to the first processor to print.
330076e027SBarry Smith 
340076e027SBarry Smith   The user can open an alternative visualization context with
35811af0c4SBarry Smith   `PetscViewerASCIIOpen()` - output to a specified file.
360076e027SBarry Smith 
370076e027SBarry Smith   Level: beginner
380076e027SBarry Smith 
39811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscViewerASCIIOpen()`, `PetscViewer`
400076e027SBarry Smith @*/
PetscDrawView(PetscDraw indraw,PetscViewer viewer)41d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawView(PetscDraw indraw, PetscViewer viewer)
42d71ae5a4SJacob Faibussowitsch {
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);
803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
810076e027SBarry Smith }
820076e027SBarry Smith 
83ffeef943SBarry Smith /*@
84811af0c4SBarry Smith   PetscDrawViewFromOptions - View a `PetscDraw` from the option database
85fe2efc57SMark 
86c3339decSBarry Smith   Collective
87fe2efc57SMark 
88fe2efc57SMark   Input Parameters:
89811af0c4SBarry Smith + A    - the `PetscDraw` context
90736c3998SJose E. Roman . obj  - Optional object
91736c3998SJose E. Roman - name - command line option
92fe2efc57SMark 
93fe2efc57SMark   Level: intermediate
94aec76313SJacob Faibussowitsch 
95db781477SPatrick Sanan .seealso: `PetscDraw`, `PetscDrawView`, `PetscObjectViewFromOptions()`, `PetscDrawCreate()`
96fe2efc57SMark @*/
PetscDrawViewFromOptions(PetscDraw A,PetscObject obj,const char name[])97d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewFromOptions(PetscDraw A, PetscObject obj, const char name[])
98d71ae5a4SJacob Faibussowitsch {
99fe2efc57SMark   PetscFunctionBegin;
100fe2efc57SMark   PetscValidHeaderSpecific(A, PETSC_DRAW_CLASSID, 1);
1019566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
1023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
103fe2efc57SMark }
104fe2efc57SMark 
105cc4c1da9SBarry Smith /*@
1065c6c1daeSBarry Smith   PetscDrawCreate - Creates a graphics context.
1075c6c1daeSBarry Smith 
108d083f849SBarry Smith   Collective
1095c6c1daeSBarry Smith 
110d8d19677SJose E. Roman   Input Parameters:
1115c6c1daeSBarry Smith + comm    - MPI communicator
112e1dfdf8eSBarry Smith . display - X display when using X Windows
1135c6c1daeSBarry Smith . title   - optional title added to top of window
1142fe279fdSBarry Smith . x       - horizonatl coordinate of lower left corner of window or `PETSC_DECIDE`
1152fe279fdSBarry Smith . y       - vertical coordinate of lower left corner of window or `PETSC_DECIDE`
1162fe279fdSBarry Smith . w       - width of window, `PETSC_DECIDE`, `PETSC_DRAW_HALF_SIZE`, `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_THIRD_SIZE` or `PETSC_DRAW_QUARTER_SIZE`
1172fe279fdSBarry Smith - h       - height of window, `PETSC_DECIDE`, `PETSC_DRAW_HALF_SIZE`, `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_THIRD_SIZE` or `PETSC_DRAW_QUARTER_SIZE`
1185c6c1daeSBarry Smith 
1195c6c1daeSBarry Smith   Output Parameter:
120aec76313SJacob Faibussowitsch . indraw - location to put the `PetscDraw` context
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith   Level: beginner
1235c6c1daeSBarry Smith 
124aec76313SJacob Faibussowitsch .seealso: `PetscDrawSetType()`, `PetscDrawSetFromOptions()`, `PetscDrawDestroy()`, `PetscDrawLGCreate()`, `PetscDrawSPCreate()`,
125db781477SPatrick Sanan           `PetscDrawViewPortsCreate()`, `PetscDrawViewPortsSet()`, `PetscDrawAxisCreate()`, `PetscDrawHGCreate()`, `PetscDrawBarCreate()`,
126aec76313SJacob Faibussowitsch           `PetscViewerDrawGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSetSaveMovie()`, `PetscDrawSetSaveFinalImage()`,
127db781477SPatrick Sanan           `PetscDrawOpenX()`, `PetscDrawOpenImage()`, `PetscDrawIsNull()`, `PetscDrawGetPopup()`, `PetscDrawCheckResizedWindow()`, `PetscDrawResizeWindow()`,
128db781477SPatrick Sanan           `PetscDrawGetWindowSize()`, `PetscDrawLine()`, `PetscDrawArrow()`, `PetscDrawLineSetWidth()`, `PetscDrawLineGetWidth()`, `PetscDrawMarker()`,
129db781477SPatrick Sanan           `PetscDrawPoint()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`, `PetscDrawString()`, `PetscDrawStringCentered()`,
130db781477SPatrick Sanan           `PetscDrawStringBoxed()`, `PetscDrawStringVertical()`, `PetscDrawSetViewPort()`, `PetscDrawGetViewPort()`,
131db781477SPatrick Sanan           `PetscDrawSplitViewPort()`, `PetscDrawSetTitle()`, `PetscDrawAppendTitle()`, `PetscDrawGetTitle()`, `PetscDrawSetPause()`, `PetscDrawGetPause()`,
132db781477SPatrick Sanan           `PetscDrawPause()`, `PetscDrawSetDoubleBuffer()`, `PetscDrawClear()`, `PetscDrawFlush()`, `PetscDrawGetSingleton()`, `PetscDrawGetMouseButton()`,
133db781477SPatrick Sanan           `PetscDrawZoom()`, `PetscDrawGetBoundingBox()`
1345c6c1daeSBarry Smith @*/
PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw * indraw)135d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCreate(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscDraw *indraw)
136d71ae5a4SJacob Faibussowitsch {
1375c6c1daeSBarry Smith   PetscDraw draw;
138e118a51fSLisandro Dalcin   PetscReal dpause = 0.0;
1395c6c1daeSBarry Smith   PetscBool flag;
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith   PetscFunctionBegin;
1425d83a8b1SBarry Smith   PetscAssertPointer(indraw, 8);
1439566063dSJacob Faibussowitsch   PetscCall(PetscDrawInitializePackage());
144a297a907SKarl Rupp 
145377f809aSBarry Smith   PetscCall(PetscHeaderCreate(draw, PETSC_DRAW_CLASSID, "Draw", "Graphics", "Draw", comm, PetscDrawDestroy, PetscDrawView));
1468f69470aSLisandro Dalcin   draw->data = NULL;
1479566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &draw->display));
1489566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &draw->title));
1495c6c1daeSBarry Smith   draw->x       = x;
1505c6c1daeSBarry Smith   draw->y       = y;
1515c6c1daeSBarry Smith   draw->w       = w;
1525c6c1daeSBarry Smith   draw->h       = h;
1535c6c1daeSBarry Smith   draw->pause   = 0.0;
1545c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1555c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1565c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1575c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1585c6c1daeSBarry Smith   draw->port_xl = 0.0;
1595c6c1daeSBarry Smith   draw->port_xr = 1.0;
1605c6c1daeSBarry Smith   draw->port_yl = 0.0;
1615c6c1daeSBarry Smith   draw->port_yr = 1.0;
162e118a51fSLisandro Dalcin   draw->popup   = NULL;
163a297a907SKarl Rupp 
1649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetReal(NULL, NULL, "-draw_pause", &dpause, &flag));
1655c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1668067a7d5SLisandro Dalcin 
1670298fd71SBarry Smith   draw->savefilename   = NULL;
1688067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1698067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1705b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1718067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1723d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
173a297a907SKarl Rupp 
1749566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCurrentPoint(draw, .5, .9));
175a297a907SKarl Rupp 
1765c6c1daeSBarry Smith   draw->boundbox_xl = .5;
1775c6c1daeSBarry Smith   draw->boundbox_xr = .5;
1785c6c1daeSBarry Smith   draw->boundbox_yl = .9;
1795c6c1daeSBarry Smith   draw->boundbox_yr = .9;
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   *indraw = draw;
1823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1835c6c1daeSBarry Smith }
1845c6c1daeSBarry Smith 
185cc4c1da9SBarry Smith /*@
1865c6c1daeSBarry Smith   PetscDrawSetType - Builds graphics object for a particular implementation
1875c6c1daeSBarry Smith 
188c3339decSBarry Smith   Collective
1895c6c1daeSBarry Smith 
190d8d19677SJose E. Roman   Input Parameters:
1915c6c1daeSBarry Smith + draw - the graphics context
192811af0c4SBarry Smith - type - for example, `PETSC_DRAW_X`
1935c6c1daeSBarry Smith 
1943c7db156SBarry Smith   Options Database Key:
195236f5a4dSBarry Smith . -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
196236f5a4dSBarry Smith 
1975c6c1daeSBarry Smith   Level: intermediate
1985c6c1daeSBarry Smith 
199811af0c4SBarry Smith   Note:
2003c7db156SBarry Smith   See `PetscDrawSetFromOptions()` for additional options database keys
2013c7db156SBarry Smith 
2025c6c1daeSBarry Smith   See "petsc/include/petscdraw.h" for available methods (for instance,
203811af0c4SBarry Smith   `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ` or `PETSC_DRAW_IMAGE`)
2045c6c1daeSBarry Smith 
205811af0c4SBarry Smith .seealso: `PetscDraw`, `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ`, `PETSC_DRAW_IMAGE`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`, `PetscDrawType`
2065c6c1daeSBarry Smith @*/
PetscDrawSetType(PetscDraw draw,PetscDrawType type)207d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetType(PetscDraw draw, PetscDrawType type)
208d71ae5a4SJacob Faibussowitsch {
2095c6c1daeSBarry Smith   PetscBool match;
2105c6c1daeSBarry Smith   PetscBool flg = PETSC_FALSE;
2115f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(PetscDraw);
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith   PetscFunctionBegin;
2145c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2154f572ea9SToby Isaac   PetscAssertPointer(type, 2);
2165c6c1daeSBarry Smith 
2179566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)draw, type, &match));
2183ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith   /*  User requests no graphics */
2219566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &flg));
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith   /*
2245c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2255c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2265c6c1daeSBarry Smith    testing.
2275c6c1daeSBarry Smith    */
2285c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2295c6c1daeSBarry Smith   if (!flg) {
2309566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(type, PETSC_DRAW_X, &match));
2315c6c1daeSBarry Smith     if (match) {
2325c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2335c6c1daeSBarry Smith       flg                = PETSC_TRUE;
2349566063dSJacob Faibussowitsch       PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &dontwarn));
2353ba16761SJacob Faibussowitsch       if (!dontwarn) PetscCall((*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n"));
2365c6c1daeSBarry Smith     }
2375c6c1daeSBarry Smith   }
2385c6c1daeSBarry Smith #endif
2390b50c7b2SBarry Smith   if (flg) {
2409566063dSJacob Faibussowitsch     PetscCall(PetscStrcmp(type, "tikz", &flg));
2419c8bf542SScott Kruger     if (!flg) type = PETSC_DRAW_NULL;
2429c8bf542SScott Kruger   }
2439c8bf542SScott Kruger 
2449566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(type, PETSC_DRAW_NULL, &match));
2459c8bf542SScott Kruger   if (match) {
2469566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_double_buffer", NULL));
2479566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_virtual", NULL));
2489566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_fast", NULL));
2499566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_ports", NULL));
2509566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_coordinates", NULL));
2510b50c7b2SBarry Smith   }
2525c6c1daeSBarry Smith 
2539566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscDrawList, type, &r));
2546adde796SStefano Zampini   PetscCheck(r, PetscObjectComm((PetscObject)draw), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDraw type given: %s", type);
255dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, destroy);
2569566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(draw->ops, sizeof(struct _PetscDrawOps)));
2579566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)draw, type));
2589566063dSJacob Faibussowitsch   PetscCall((*r)(draw));
2593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2605c6c1daeSBarry Smith }
2615c6c1daeSBarry Smith 
262cc4c1da9SBarry Smith /*@
263811af0c4SBarry Smith   PetscDrawGetType - Gets the `PetscDraw` type as a string from the `PetscDraw` object.
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith   Not Collective
2665c6c1daeSBarry Smith 
2675c6c1daeSBarry Smith   Input Parameter:
2685c6c1daeSBarry Smith . draw - Krylov context
2695c6c1daeSBarry Smith 
2702fe279fdSBarry Smith   Output Parameter:
271aec76313SJacob Faibussowitsch . type - name of PetscDraw method
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith   Level: advanced
2745c6c1daeSBarry Smith 
275aec76313SJacob Faibussowitsch .seealso: `PetscDraw`, `PetscDrawType`, `PetscDrawSetType()`, `PetscDrawCreate()`
2765c6c1daeSBarry Smith @*/
PetscDrawGetType(PetscDraw draw,PetscDrawType * type)277d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetType(PetscDraw draw, PetscDrawType *type)
278d71ae5a4SJacob Faibussowitsch {
2795c6c1daeSBarry Smith   PetscFunctionBegin;
2805c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2814f572ea9SToby Isaac   PetscAssertPointer(type, 2);
2825c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2845c6c1daeSBarry Smith }
2855c6c1daeSBarry Smith 
286607a6623SBarry Smith /*@C
2871c84c290SBarry Smith   PetscDrawRegister - Adds a method to the graphics package.
2881c84c290SBarry Smith 
289cc4c1da9SBarry Smith   Not Collective, No Fortran Support
2901c84c290SBarry Smith 
2911c84c290SBarry Smith   Input Parameters:
29210450e9eSJacob Faibussowitsch + sname    - name of a new user-defined graphics class
29310450e9eSJacob Faibussowitsch - function - routine to create method context
2941c84c290SBarry Smith 
2951c84c290SBarry Smith   Level: developer
2961c84c290SBarry Smith 
297811af0c4SBarry Smith   Note:
298811af0c4SBarry Smith   `PetscDrawRegister()` may be called multiple times to add several user-defined graphics classes
2991c84c290SBarry Smith 
300aec76313SJacob Faibussowitsch   Example Usage:
3011c84c290SBarry Smith .vb
302bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
3031c84c290SBarry Smith .ve
3041c84c290SBarry Smith 
3050076e027SBarry Smith   Then, your specific graphics package can be chosen with the procedural interface via
306*b44f4de4SBarry Smith .vb
307*b44f4de4SBarry Smith   PetscDrawSetType(ksp, "my_draw_type")
308*b44f4de4SBarry Smith .ve
3091c84c290SBarry Smith   or at runtime via the option
310*b44f4de4SBarry Smith .vb
311*b44f4de4SBarry Smith   -draw_type my_draw_type
312*b44f4de4SBarry Smith .ve
3131c84c290SBarry Smith 
314811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRegisterAll()`, `PetscDrawRegisterDestroy()`, `PetscDrawType`, `PetscDrawSetType()`
3151c84c290SBarry Smith @*/
PetscDrawRegister(const char * sname,PetscErrorCode (* function)(PetscDraw))316d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRegister(const char *sname, PetscErrorCode (*function)(PetscDraw))
317d71ae5a4SJacob Faibussowitsch {
3185c6c1daeSBarry Smith   PetscFunctionBegin;
3199566063dSJacob Faibussowitsch   PetscCall(PetscDrawInitializePackage());
3209566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscDrawList, sname, function));
3213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3225c6c1daeSBarry Smith }
3235c6c1daeSBarry Smith 
324cc4c1da9SBarry Smith /*@
3257faeec8aSLisandro Dalcin   PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
326811af0c4SBarry Smith   `PetscDraw` options in the database.
3277faeec8aSLisandro Dalcin 
328c3339decSBarry Smith   Logically Collective
3297faeec8aSLisandro Dalcin 
330d8d19677SJose E. Roman   Input Parameters:
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 
336811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`
3377faeec8aSLisandro Dalcin @*/
PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])338d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw, const char prefix[])
339d71ae5a4SJacob Faibussowitsch {
3407faeec8aSLisandro Dalcin   PetscFunctionBegin;
3417faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3429566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw, prefix));
3433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3447faeec8aSLisandro Dalcin }
3457faeec8aSLisandro Dalcin 
3465c6c1daeSBarry Smith /*@
3475c6c1daeSBarry Smith   PetscDrawSetFromOptions - Sets the graphics type from the options database.
348e1dfdf8eSBarry Smith   Defaults to a PETSc X Windows graphics.
3495c6c1daeSBarry Smith 
350c3339decSBarry Smith   Collective
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith   Input Parameter:
3535c6c1daeSBarry Smith . draw - the graphics context
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith   Options Database Keys:
3565c6c1daeSBarry Smith + -nox                                       - do not use X graphics (ignore graphics calls, but run program correctly)
357e1dfdf8eSBarry Smith . -nox_warning                               - when X Windows support is not installed this prevents the warning message from being printed
3587450148dSBarry Smith . -draw_pause <pause amount>                 - - -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
35973f7a4c5SBarry Smith . -draw_marker_type                          - <x,point>
360e1dfdf8eSBarry Smith . -draw_save [optional filename]             - (X Windows only) saves each image before it is cleared to a file
361e1dfdf8eSBarry Smith . -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window
362a4494fc1SBarry Smith . -draw_save_movie                           - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
363df8d4941SLisandro 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'
364df8d4941SLisandro Dalcin . -draw_save_on_clear                        - saves an image on each clear, mainly for debugging
365df8d4941SLisandro Dalcin - -draw_save_on_flush                        - saves an image on each flush, mainly for debugging
3665c6c1daeSBarry Smith 
3675c6c1daeSBarry Smith   Level: intermediate
3685c6c1daeSBarry Smith 
369811af0c4SBarry Smith   Note:
370811af0c4SBarry Smith   Must be called after `PetscDrawCreate()` before the `PetscDraw` is used.
3715c6c1daeSBarry Smith 
372811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`, `PetscDrawSetType()`, `PetscDrawSetSave()`, `PetscDrawSetSaveFinalImage()`, `PetscDrawPause()`, `PetscDrawSetPause()`
3735c6c1daeSBarry Smith @*/
PetscDrawSetFromOptions(PetscDraw draw)374d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw)
375d71ae5a4SJacob Faibussowitsch {
3765c6c1daeSBarry Smith   PetscBool   flg, nox;
3775c6c1daeSBarry Smith   char        vtype[256];
3785c6c1daeSBarry Smith   const char *def;
3795c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3805c6c1daeSBarry Smith   PetscBool warn;
3815c6c1daeSBarry Smith #endif
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith   PetscFunctionBegin;
3845c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
3855c6c1daeSBarry Smith 
3869566063dSJacob Faibussowitsch   PetscCall(PetscDrawRegisterAll());
3875c6c1daeSBarry Smith 
388a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
389a297a907SKarl Rupp   else {
3909566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &nox));
3915c6c1daeSBarry Smith     def = PETSC_DRAW_NULL;
3925c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3935c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3945c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
3955c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
3965c6c1daeSBarry Smith #else
3979566063dSJacob Faibussowitsch     PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &warn));
3983ba16761SJacob Faibussowitsch     if (!nox && !warn) PetscCall((*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n"));
3995c6c1daeSBarry Smith #endif
4005c6c1daeSBarry Smith   }
401d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)draw);
4029566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-draw_type", "Type of graphical output", "PetscDrawSetType", PetscDrawList, def, vtype, 256, &flg));
4035c6c1daeSBarry Smith   if (flg) {
4049566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetType(draw, vtype));
4055c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
4069566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetType(draw, def));
4075c6c1daeSBarry Smith   }
4089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsName("-nox", "Run without graphics", "None", &nox));
4095c6c1daeSBarry Smith   {
41049c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
41149c04938SLisandro Dalcin     char      movieext[32];
41249c04938SLisandro Dalcin     PetscBool image, movie;
4139566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(filename, sizeof(filename), "%s%s", draw->savefilename ? draw->savefilename : "", draw->saveimageext ? draw->saveimageext : ""));
4149566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(movieext, sizeof(movieext), "%s", draw->savemovieext ? draw->savemovieext : ""));
4159566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save", "Save graphics to image file", "PetscDrawSetSave", filename, filename, sizeof(filename), &image));
4169566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save_movie", "Make a movie from saved images", "PetscDrawSetSaveMovie", movieext, movieext, sizeof(movieext), &movie));
4179566063dSJacob Faibussowitsch     PetscCall(PetscOptionsInt("-draw_save_movie_fps", "Set frames per second in saved movie", PETSC_FUNCTION_NAME, draw->savemoviefps, &draw->savemoviefps, NULL));
4189566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_single_file", "Each new image replaces previous image in file", PETSC_FUNCTION_NAME, draw->savesinglefile, &draw->savesinglefile, NULL));
4199566063dSJacob Faibussowitsch     if (image) PetscCall(PetscDrawSetSave(draw, filename));
4209566063dSJacob Faibussowitsch     if (movie) PetscCall(PetscDrawSetSaveMovie(draw, movieext));
4219566063dSJacob Faibussowitsch     PetscCall(PetscOptionsString("-draw_save_final_image", "Save final graphics to image file", "PetscDrawSetSaveFinalImage", filename, filename, sizeof(filename), &image));
4229566063dSJacob Faibussowitsch     if (image) PetscCall(PetscDrawSetSaveFinalImage(draw, filename));
4239566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_on_clear", "Save graphics to file on each clear", PETSC_FUNCTION_NAME, draw->saveonclear, &draw->saveonclear, NULL));
4249566063dSJacob Faibussowitsch     PetscCall(PetscOptionsBool("-draw_save_on_flush", "Save graphics to file on each flush", PETSC_FUNCTION_NAME, draw->saveonflush, &draw->saveonflush, NULL));
4255c6c1daeSBarry Smith   }
4269566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-draw_pause", "Amount of time that program pauses after plots", "PetscDrawSetPause", draw->pause, &draw->pause, NULL));
4279566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEnum("-draw_marker_type", "Type of marker to use on plots", "PetscDrawSetMarkerType", PetscDrawMarkerTypes, (PetscEnum)draw->markertype, (PetscEnum *)&draw->markertype, NULL));
42873f7a4c5SBarry Smith 
4295c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
430dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)draw, PetscOptionsObject));
431ce1779c8SBarry Smith 
4329566063dSJacob Faibussowitsch   PetscCall(PetscDrawViewFromOptions(draw, NULL, "-draw_view"));
433d0609cedSBarry Smith   PetscOptionsEnd();
4343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4355c6c1daeSBarry Smith }
436