15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the registration process for PETSc PetscDraw routines 45c6c1daeSBarry Smith */ 5af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6111ee811SBarry Smith #include <petscviewer.h> /*I "petscviewer.h" I*/ 7111ee811SBarry Smith #if defined(PETSC_HAVE_SAWS) 8111ee811SBarry Smith #include <petscviewersaws.h> 9111ee811SBarry Smith #endif 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith /* 125c6c1daeSBarry Smith Contains the list of registered PetscDraw routines 135c6c1daeSBarry Smith */ 1402c9f0b5SLisandro Dalcin PetscFunctionList PetscDrawList = NULL; 155c6c1daeSBarry Smith 160076e027SBarry Smith /*@C 170076e027SBarry Smith PetscDrawView - Prints the PetscDraw data structure. 180076e027SBarry Smith 190076e027SBarry Smith Collective on PetscDraw 200076e027SBarry Smith 210076e027SBarry Smith Input Parameters: 220076e027SBarry Smith + indraw - the PetscDraw context 230076e027SBarry Smith - viewer - visualization context 240076e027SBarry Smith 25236f5a4dSBarry Smith See PetscDrawSetFromOptions() for options database keys 260076e027SBarry Smith 270076e027SBarry Smith Note: 280076e027SBarry Smith The available visualization contexts include 290076e027SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 300076e027SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 310076e027SBarry Smith output where only the first processor opens 320076e027SBarry Smith the file. All other processors send their 330076e027SBarry Smith data to the first processor to print. 340076e027SBarry Smith 350076e027SBarry Smith The user can open an alternative visualization context with 360076e027SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 370076e027SBarry Smith 380076e027SBarry Smith Level: beginner 390076e027SBarry Smith 40db781477SPatrick Sanan .seealso: `PCView()`, `PetscViewerASCIIOpen()` 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); 50*48a46eb9SPierre 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)); 77*48a46eb9SPierre 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 84fe2efc57SMark PetscDrawViewFromOptions - View from Options 85fe2efc57SMark 86fe2efc57SMark Collective on PetscDraw 87fe2efc57SMark 88fe2efc57SMark Input Parameters: 89fe2efc57SMark + 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 1125c6c1daeSBarry Smith . x,y - coordinates of lower left corner of window or PETSC_DECIDE 1135c6c1daeSBarry Smith - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 1145c6c1daeSBarry Smith or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 1155c6c1daeSBarry Smith 1165c6c1daeSBarry Smith Output Parameter: 1175c6c1daeSBarry 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()` 131ba1e01c4SBarry Smith 1325c6c1daeSBarry Smith @*/ 1339371c9d4SSatish Balay PetscErrorCode PetscDrawCreate(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscDraw *indraw) { 1345c6c1daeSBarry Smith PetscDraw draw; 135e118a51fSLisandro Dalcin PetscReal dpause = 0.0; 1365c6c1daeSBarry Smith PetscBool flag; 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith PetscFunctionBegin; 1399566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 14002c9f0b5SLisandro Dalcin *indraw = NULL; 1419566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(draw, PETSC_DRAW_CLASSID, "Draw", "Graphics", "Draw", comm, PetscDrawDestroy, PetscDrawView)); 142a297a907SKarl Rupp 1438f69470aSLisandro Dalcin draw->data = NULL; 1449566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &draw->display)); 1459566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &draw->title)); 1465c6c1daeSBarry Smith draw->x = x; 1475c6c1daeSBarry Smith draw->y = y; 1485c6c1daeSBarry Smith draw->w = w; 1495c6c1daeSBarry Smith draw->h = h; 1505c6c1daeSBarry Smith draw->pause = 0.0; 1515c6c1daeSBarry Smith draw->coor_xl = 0.0; 1525c6c1daeSBarry Smith draw->coor_xr = 1.0; 1535c6c1daeSBarry Smith draw->coor_yl = 0.0; 1545c6c1daeSBarry Smith draw->coor_yr = 1.0; 1555c6c1daeSBarry Smith draw->port_xl = 0.0; 1565c6c1daeSBarry Smith draw->port_xr = 1.0; 1575c6c1daeSBarry Smith draw->port_yl = 0.0; 1585c6c1daeSBarry Smith draw->port_yr = 1.0; 159e118a51fSLisandro Dalcin draw->popup = NULL; 160a297a907SKarl Rupp 1619566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(NULL, NULL, "-draw_pause", &dpause, &flag)); 1625c6c1daeSBarry Smith if (flag) draw->pause = dpause; 1638067a7d5SLisandro Dalcin 1640298fd71SBarry Smith draw->savefilename = NULL; 1658067a7d5SLisandro Dalcin draw->saveimageext = NULL; 1668067a7d5SLisandro Dalcin draw->savemovieext = NULL; 1675b399a63SLisandro Dalcin draw->savefilecount = 0; 1688067a7d5SLisandro Dalcin draw->savesinglefile = PETSC_FALSE; 1693d242201SLisandro Dalcin draw->savemoviefps = PETSC_DECIDE; 170a297a907SKarl Rupp 1719566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCurrentPoint(draw, .5, .9)); 172a297a907SKarl Rupp 1735c6c1daeSBarry Smith draw->boundbox_xl = .5; 1745c6c1daeSBarry Smith draw->boundbox_xr = .5; 1755c6c1daeSBarry Smith draw->boundbox_yl = .9; 1765c6c1daeSBarry Smith draw->boundbox_yr = .9; 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith *indraw = draw; 1795c6c1daeSBarry Smith PetscFunctionReturn(0); 1805c6c1daeSBarry Smith } 1815c6c1daeSBarry Smith 1825c6c1daeSBarry Smith /*@C 1835c6c1daeSBarry Smith PetscDrawSetType - Builds graphics object for a particular implementation 1845c6c1daeSBarry Smith 1855c6c1daeSBarry Smith Collective on PetscDraw 1865c6c1daeSBarry Smith 187d8d19677SJose E. Roman Input Parameters: 1885c6c1daeSBarry Smith + draw - the graphics context 1895c6c1daeSBarry Smith - type - for example, PETSC_DRAW_X 1905c6c1daeSBarry Smith 1915c6c1daeSBarry Smith Options Database Command: 192236f5a4dSBarry Smith . -draw_type <type> - Sets the type; use -help for a list of available methods (for instance, x) 193236f5a4dSBarry Smith 194ba1e01c4SBarry Smith See PetscDrawSetFromOptions() for additional options database keys 1955c6c1daeSBarry Smith 1965c6c1daeSBarry Smith Level: intermediate 1975c6c1daeSBarry Smith 1985c6c1daeSBarry Smith Notes: 1995c6c1daeSBarry Smith See "petsc/include/petscdraw.h" for available methods (for instance, 200ba1e01c4SBarry Smith PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE) 2015c6c1daeSBarry Smith 202db781477SPatrick Sanan .seealso: `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`, `PetscDrawType` 2035c6c1daeSBarry Smith @*/ 2049371c9d4SSatish Balay PetscErrorCode PetscDrawSetType(PetscDraw draw, PetscDrawType type) { 2055c6c1daeSBarry Smith PetscBool match; 2065c6c1daeSBarry Smith PetscBool flg = PETSC_FALSE; 2075f80ce2aSJacob Faibussowitsch PetscErrorCode (*r)(PetscDraw); 2085c6c1daeSBarry Smith 2095c6c1daeSBarry Smith PetscFunctionBegin; 2105c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2115c6c1daeSBarry Smith PetscValidCharPointer(type, 2); 2125c6c1daeSBarry Smith 2139566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)draw, type, &match)); 2145c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2155c6c1daeSBarry Smith 2165c6c1daeSBarry Smith /* User requests no graphics */ 2179566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &flg)); 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith /* 2205c6c1daeSBarry Smith This is not ideal, but it allows codes to continue to run if X graphics 2215c6c1daeSBarry Smith was requested but is not installed on this machine. Mostly this is for 2225c6c1daeSBarry Smith testing. 2235c6c1daeSBarry Smith */ 2245c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X) 2255c6c1daeSBarry Smith if (!flg) { 2269566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type, PETSC_DRAW_X, &match)); 2275c6c1daeSBarry Smith if (match) { 2285c6c1daeSBarry Smith PetscBool dontwarn = PETSC_TRUE; 2295c6c1daeSBarry Smith flg = PETSC_TRUE; 2309566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &dontwarn)); 231e1dfdf8eSBarry Smith if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n"); 2325c6c1daeSBarry Smith } 2335c6c1daeSBarry Smith } 2345c6c1daeSBarry Smith #endif 2350b50c7b2SBarry Smith if (flg) { 2369566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type, "tikz", &flg)); 2379c8bf542SScott Kruger if (!flg) type = PETSC_DRAW_NULL; 2389c8bf542SScott Kruger } 2399c8bf542SScott Kruger 2409566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type, PETSC_DRAW_NULL, &match)); 2419c8bf542SScott Kruger if (match) { 2429566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_double_buffer", NULL)); 2439566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_virtual", NULL)); 2449566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_fast", NULL)); 2459566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_ports", NULL)); 2469566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_coordinates", NULL)); 2470b50c7b2SBarry Smith } 2485c6c1daeSBarry Smith 2499566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscDrawList, type, &r)); 25028b400f6SJacob Faibussowitsch PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDraw type given: %s", type); 251dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, destroy); 2529566063dSJacob Faibussowitsch PetscCall(PetscMemzero(draw->ops, sizeof(struct _PetscDrawOps))); 2539566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)draw, type)); 2549566063dSJacob Faibussowitsch PetscCall((*r)(draw)); 2555c6c1daeSBarry Smith PetscFunctionReturn(0); 2565c6c1daeSBarry Smith } 2575c6c1daeSBarry Smith 2585c6c1daeSBarry Smith /*@C 2595c6c1daeSBarry Smith PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 2605c6c1daeSBarry Smith 2615c6c1daeSBarry Smith Not Collective 2625c6c1daeSBarry Smith 2635c6c1daeSBarry Smith Input Parameter: 2645c6c1daeSBarry Smith . draw - Krylov context 2655c6c1daeSBarry Smith 2665c6c1daeSBarry Smith Output Parameters: 2675c6c1daeSBarry Smith . name - name of PetscDraw method 2685c6c1daeSBarry Smith 2695c6c1daeSBarry Smith Level: advanced 2705c6c1daeSBarry Smith 271db781477SPatrick Sanan .seealso: `PetscDrawSetType()`, `PetscDrawType` 272ba1e01c4SBarry Smith 2735c6c1daeSBarry Smith @*/ 2749371c9d4SSatish Balay PetscErrorCode PetscDrawGetType(PetscDraw draw, PetscDrawType *type) { 2755c6c1daeSBarry Smith PetscFunctionBegin; 2765c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2775c6c1daeSBarry Smith PetscValidPointer(type, 2); 2785c6c1daeSBarry Smith *type = ((PetscObject)draw)->type_name; 2795c6c1daeSBarry Smith PetscFunctionReturn(0); 2805c6c1daeSBarry Smith } 2815c6c1daeSBarry Smith 282607a6623SBarry Smith /*@C 2831c84c290SBarry Smith PetscDrawRegister - Adds a method to the graphics package. 2841c84c290SBarry Smith 2851c84c290SBarry Smith Not Collective 2861c84c290SBarry Smith 2871c84c290SBarry Smith Input Parameters: 2880076e027SBarry Smith + name_solver - name of a new user-defined graphics class 2891c84c290SBarry Smith - routine_create - routine to create method context 2901c84c290SBarry Smith 2911c84c290SBarry Smith Level: developer 2921c84c290SBarry Smith 2931c84c290SBarry Smith Notes: 2940076e027SBarry Smith PetscDrawRegister() may be called multiple times to add several user-defined graphics classes 2951c84c290SBarry Smith 2961c84c290SBarry Smith Sample usage: 2971c84c290SBarry Smith .vb 298bdf89e91SBarry Smith PetscDrawRegister("my_draw_type", MyDrawCreate); 2991c84c290SBarry Smith .ve 3001c84c290SBarry Smith 3010076e027SBarry Smith Then, your specific graphics package can be chosen with the procedural interface via 3021c84c290SBarry Smith $ PetscDrawSetType(ksp,"my_draw_type") 3031c84c290SBarry Smith or at runtime via the option 3041c84c290SBarry Smith $ -draw_type my_draw_type 3051c84c290SBarry Smith 306db781477SPatrick Sanan .seealso: `PetscDrawRegisterAll()`, `PetscDrawRegisterDestroy()`, `PetscDrawType`, `PetscDrawSetType()` 3071c84c290SBarry Smith @*/ 3089371c9d4SSatish Balay PetscErrorCode PetscDrawRegister(const char *sname, PetscErrorCode (*function)(PetscDraw)) { 3095c6c1daeSBarry Smith PetscFunctionBegin; 3109566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 3119566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscDrawList, sname, function)); 3125c6c1daeSBarry Smith PetscFunctionReturn(0); 3135c6c1daeSBarry Smith } 3145c6c1daeSBarry Smith 3157faeec8aSLisandro Dalcin /*@C 3167faeec8aSLisandro Dalcin PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all 3177faeec8aSLisandro Dalcin PetscDraw options in the database. 3187faeec8aSLisandro Dalcin 3197faeec8aSLisandro Dalcin Logically Collective on PetscDraw 3207faeec8aSLisandro Dalcin 321d8d19677SJose E. Roman Input Parameters: 3227faeec8aSLisandro Dalcin + draw - the draw context 3237faeec8aSLisandro Dalcin - prefix - the prefix to prepend to all option names 3247faeec8aSLisandro Dalcin 3257faeec8aSLisandro Dalcin Level: advanced 3267faeec8aSLisandro Dalcin 327db781477SPatrick Sanan .seealso: `PetscDrawSetFromOptions()`, `PetscDrawCreate()` 3287faeec8aSLisandro Dalcin @*/ 3299371c9d4SSatish Balay PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw, const char prefix[]) { 3307faeec8aSLisandro Dalcin PetscFunctionBegin; 3317faeec8aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3329566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw, prefix)); 3337faeec8aSLisandro Dalcin PetscFunctionReturn(0); 3347faeec8aSLisandro Dalcin } 3357faeec8aSLisandro Dalcin 3365c6c1daeSBarry Smith /*@ 3375c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 338e1dfdf8eSBarry Smith Defaults to a PETSc X Windows graphics. 3395c6c1daeSBarry Smith 3405c6c1daeSBarry Smith Collective on PetscDraw 3415c6c1daeSBarry Smith 3425c6c1daeSBarry Smith Input Parameter: 3435c6c1daeSBarry Smith . draw - the graphics context 3445c6c1daeSBarry Smith 3455c6c1daeSBarry Smith Options Database Keys: 3465c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 347e1dfdf8eSBarry Smith . -nox_warning - when X Windows support is not installed this prevents the warning message from being printed 3487450148dSBarry Smith . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 34973f7a4c5SBarry Smith . -draw_marker_type - <x,point> 350e1dfdf8eSBarry Smith . -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file 351e1dfdf8eSBarry Smith . -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window 352a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 353df8d4941SLisandro 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' 354df8d4941SLisandro Dalcin . -draw_save_on_clear - saves an image on each clear, mainly for debugging 355df8d4941SLisandro Dalcin - -draw_save_on_flush - saves an image on each flush, mainly for debugging 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Level: intermediate 3585c6c1daeSBarry Smith 35995452b02SPatrick Sanan Notes: 36095452b02SPatrick Sanan Must be called after PetscDrawCreate() before the PetscDraw is used. 3615c6c1daeSBarry Smith 362db781477SPatrick Sanan .seealso: `PetscDrawCreate()`, `PetscDrawSetType()`, `PetscDrawSetSave()`, `PetscDrawSetSaveFinalImage()`, `PetscDrawPause()`, `PetscDrawSetPause()` 3635c6c1daeSBarry Smith 3645c6c1daeSBarry Smith @*/ 3659371c9d4SSatish Balay PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) { 3665c6c1daeSBarry Smith PetscBool flg, nox; 3675c6c1daeSBarry Smith char vtype[256]; 3685c6c1daeSBarry Smith const char *def; 3695c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3705c6c1daeSBarry Smith PetscBool warn; 3715c6c1daeSBarry Smith #endif 3725c6c1daeSBarry Smith 3735c6c1daeSBarry Smith PetscFunctionBegin; 3745c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3755c6c1daeSBarry Smith 3769566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 3775c6c1daeSBarry Smith 378a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 379a297a907SKarl Rupp else { 3809566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &nox)); 3815c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3825c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3835c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3845c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3855c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 3865c6c1daeSBarry Smith #else 3879566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &warn)); 388e1dfdf8eSBarry Smith if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n"); 3895c6c1daeSBarry Smith #endif 3905c6c1daeSBarry Smith } 391d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)draw); 3929566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-draw_type", "Type of graphical output", "PetscDrawSetType", PetscDrawList, def, vtype, 256, &flg)); 3935c6c1daeSBarry Smith if (flg) { 3949566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw, vtype)); 3955c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 3969566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw, def)); 3975c6c1daeSBarry Smith } 3989566063dSJacob Faibussowitsch PetscCall(PetscOptionsName("-nox", "Run without graphics", "None", &nox)); 3995c6c1daeSBarry Smith { 40049c04938SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 40149c04938SLisandro Dalcin char movieext[32]; 40249c04938SLisandro Dalcin PetscBool image, movie; 4039566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(filename, sizeof(filename), "%s%s", draw->savefilename ? draw->savefilename : "", draw->saveimageext ? draw->saveimageext : "")); 4049566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(movieext, sizeof(movieext), "%s", draw->savemovieext ? draw->savemovieext : "")); 4059566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save", "Save graphics to image file", "PetscDrawSetSave", filename, filename, sizeof(filename), &image)); 4069566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_movie", "Make a movie from saved images", "PetscDrawSetSaveMovie", movieext, movieext, sizeof(movieext), &movie)); 4079566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-draw_save_movie_fps", "Set frames per second in saved movie", PETSC_FUNCTION_NAME, draw->savemoviefps, &draw->savemoviefps, NULL)); 4089566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_single_file", "Each new image replaces previous image in file", PETSC_FUNCTION_NAME, draw->savesinglefile, &draw->savesinglefile, NULL)); 4099566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSave(draw, filename)); 4109566063dSJacob Faibussowitsch if (movie) PetscCall(PetscDrawSetSaveMovie(draw, movieext)); 4119566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_final_image", "Save final graphics to image file", "PetscDrawSetSaveFinalImage", filename, filename, sizeof(filename), &image)); 4129566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSaveFinalImage(draw, filename)); 4139566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_clear", "Save graphics to file on each clear", PETSC_FUNCTION_NAME, draw->saveonclear, &draw->saveonclear, NULL)); 4149566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_flush", "Save graphics to file on each flush", PETSC_FUNCTION_NAME, draw->saveonflush, &draw->saveonflush, NULL)); 4155c6c1daeSBarry Smith } 4169566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-draw_pause", "Amount of time that program pauses after plots", "PetscDrawSetPause", draw->pause, &draw->pause, NULL)); 4179566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-draw_marker_type", "Type of marker to use on plots", "PetscDrawSetMarkerType", PetscDrawMarkerTypes, (PetscEnum)draw->markertype, (PetscEnum *)&draw->markertype, NULL)); 41873f7a4c5SBarry Smith 4195c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 420dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)draw, PetscOptionsObject)); 421ce1779c8SBarry Smith 4229566063dSJacob Faibussowitsch PetscCall(PetscDrawViewFromOptions(draw, NULL, "-draw_view")); 423d0609cedSBarry Smith PetscOptionsEnd(); 4245c6c1daeSBarry Smith PetscFunctionReturn(0); 4255c6c1daeSBarry Smith } 426