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 15*ffeef943SBarry 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 @*/ 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 83*ffeef943SBarry 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 @*/ 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 @*/ 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; 1429566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 14302c9f0b5SLisandro Dalcin *indraw = NULL; 1449566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(draw, PETSC_DRAW_CLASSID, "Draw", "Graphics", "Draw", comm, PetscDrawDestroy, PetscDrawView)); 145a297a907SKarl Rupp 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 @*/ 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 @*/ 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 3061c84c290SBarry Smith $ PetscDrawSetType(ksp, "my_draw_type") 3071c84c290SBarry Smith or at runtime via the option 3081c84c290SBarry Smith $ -draw_type my_draw_type 3091c84c290SBarry Smith 310811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRegisterAll()`, `PetscDrawRegisterDestroy()`, `PetscDrawType`, `PetscDrawSetType()` 3111c84c290SBarry Smith @*/ 312d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRegister(const char *sname, PetscErrorCode (*function)(PetscDraw)) 313d71ae5a4SJacob Faibussowitsch { 3145c6c1daeSBarry Smith PetscFunctionBegin; 3159566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 3169566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscDrawList, sname, function)); 3173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3185c6c1daeSBarry Smith } 3195c6c1daeSBarry Smith 320cc4c1da9SBarry Smith /*@ 3217faeec8aSLisandro Dalcin PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all 322811af0c4SBarry Smith `PetscDraw` options in the database. 3237faeec8aSLisandro Dalcin 324c3339decSBarry Smith Logically Collective 3257faeec8aSLisandro Dalcin 326d8d19677SJose E. Roman Input Parameters: 3277faeec8aSLisandro Dalcin + draw - the draw context 3287faeec8aSLisandro Dalcin - prefix - the prefix to prepend to all option names 3297faeec8aSLisandro Dalcin 3307faeec8aSLisandro Dalcin Level: advanced 3317faeec8aSLisandro Dalcin 332811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()` 3337faeec8aSLisandro Dalcin @*/ 334d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw, const char prefix[]) 335d71ae5a4SJacob Faibussowitsch { 3367faeec8aSLisandro Dalcin PetscFunctionBegin; 3377faeec8aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3389566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw, prefix)); 3393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3407faeec8aSLisandro Dalcin } 3417faeec8aSLisandro Dalcin 3425c6c1daeSBarry Smith /*@ 3435c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 344e1dfdf8eSBarry Smith Defaults to a PETSc X Windows graphics. 3455c6c1daeSBarry Smith 346c3339decSBarry Smith Collective 3475c6c1daeSBarry Smith 3485c6c1daeSBarry Smith Input Parameter: 3495c6c1daeSBarry Smith . draw - the graphics context 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith Options Database Keys: 3525c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 353e1dfdf8eSBarry Smith . -nox_warning - when X Windows support is not installed this prevents the warning message from being printed 3547450148dSBarry Smith . -draw_pause <pause amount> - - -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 35573f7a4c5SBarry Smith . -draw_marker_type - <x,point> 356e1dfdf8eSBarry Smith . -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file 357e1dfdf8eSBarry Smith . -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window 358a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 359df8d4941SLisandro 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' 360df8d4941SLisandro Dalcin . -draw_save_on_clear - saves an image on each clear, mainly for debugging 361df8d4941SLisandro Dalcin - -draw_save_on_flush - saves an image on each flush, mainly for debugging 3625c6c1daeSBarry Smith 3635c6c1daeSBarry Smith Level: intermediate 3645c6c1daeSBarry Smith 365811af0c4SBarry Smith Note: 366811af0c4SBarry Smith Must be called after `PetscDrawCreate()` before the `PetscDraw` is used. 3675c6c1daeSBarry Smith 368811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`, `PetscDrawSetType()`, `PetscDrawSetSave()`, `PetscDrawSetSaveFinalImage()`, `PetscDrawPause()`, `PetscDrawSetPause()` 3695c6c1daeSBarry Smith @*/ 370d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 371d71ae5a4SJacob Faibussowitsch { 3725c6c1daeSBarry Smith PetscBool flg, nox; 3735c6c1daeSBarry Smith char vtype[256]; 3745c6c1daeSBarry Smith const char *def; 3755c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3765c6c1daeSBarry Smith PetscBool warn; 3775c6c1daeSBarry Smith #endif 3785c6c1daeSBarry Smith 3795c6c1daeSBarry Smith PetscFunctionBegin; 3805c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3815c6c1daeSBarry Smith 3829566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 3835c6c1daeSBarry Smith 384a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 385a297a907SKarl Rupp else { 3869566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &nox)); 3875c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3885c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3895c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3905c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3915c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 3925c6c1daeSBarry Smith #else 3939566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &warn)); 3943ba16761SJacob Faibussowitsch if (!nox && !warn) PetscCall((*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n")); 3955c6c1daeSBarry Smith #endif 3965c6c1daeSBarry Smith } 397d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)draw); 3989566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-draw_type", "Type of graphical output", "PetscDrawSetType", PetscDrawList, def, vtype, 256, &flg)); 3995c6c1daeSBarry Smith if (flg) { 4009566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw, vtype)); 4015c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 4029566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw, def)); 4035c6c1daeSBarry Smith } 4049566063dSJacob Faibussowitsch PetscCall(PetscOptionsName("-nox", "Run without graphics", "None", &nox)); 4055c6c1daeSBarry Smith { 40649c04938SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 40749c04938SLisandro Dalcin char movieext[32]; 40849c04938SLisandro Dalcin PetscBool image, movie; 4099566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(filename, sizeof(filename), "%s%s", draw->savefilename ? draw->savefilename : "", draw->saveimageext ? draw->saveimageext : "")); 4109566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(movieext, sizeof(movieext), "%s", draw->savemovieext ? draw->savemovieext : "")); 4119566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save", "Save graphics to image file", "PetscDrawSetSave", filename, filename, sizeof(filename), &image)); 4129566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_movie", "Make a movie from saved images", "PetscDrawSetSaveMovie", movieext, movieext, sizeof(movieext), &movie)); 4139566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-draw_save_movie_fps", "Set frames per second in saved movie", PETSC_FUNCTION_NAME, draw->savemoviefps, &draw->savemoviefps, NULL)); 4149566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_single_file", "Each new image replaces previous image in file", PETSC_FUNCTION_NAME, draw->savesinglefile, &draw->savesinglefile, NULL)); 4159566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSave(draw, filename)); 4169566063dSJacob Faibussowitsch if (movie) PetscCall(PetscDrawSetSaveMovie(draw, movieext)); 4179566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_final_image", "Save final graphics to image file", "PetscDrawSetSaveFinalImage", filename, filename, sizeof(filename), &image)); 4189566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSaveFinalImage(draw, filename)); 4199566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_clear", "Save graphics to file on each clear", PETSC_FUNCTION_NAME, draw->saveonclear, &draw->saveonclear, NULL)); 4209566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_flush", "Save graphics to file on each flush", PETSC_FUNCTION_NAME, draw->saveonflush, &draw->saveonflush, NULL)); 4215c6c1daeSBarry Smith } 4229566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-draw_pause", "Amount of time that program pauses after plots", "PetscDrawSetPause", draw->pause, &draw->pause, NULL)); 4239566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-draw_marker_type", "Type of marker to use on plots", "PetscDrawSetMarkerType", PetscDrawMarkerTypes, (PetscEnum)draw->markertype, (PetscEnum *)&draw->markertype, NULL)); 42473f7a4c5SBarry Smith 4255c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 426dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)draw, PetscOptionsObject)); 427ce1779c8SBarry Smith 4289566063dSJacob Faibussowitsch PetscCall(PetscDrawViewFromOptions(draw, NULL, "-draw_view")); 429d0609cedSBarry Smith PetscOptionsEnd(); 4303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4315c6c1daeSBarry Smith } 432