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 19*c3339decSBarry 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); 810076e027SBarry Smith PetscFunctionReturn(0); 820076e027SBarry Smith } 830076e027SBarry Smith 845c6c1daeSBarry Smith /*@C 85811af0c4SBarry Smith PetscDrawViewFromOptions - View a `PetscDraw` from the option database 86fe2efc57SMark 87*c3339decSBarry 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 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)); 102fe2efc57SMark PetscFunctionReturn(0); 103fe2efc57SMark } 104fe2efc57SMark 105fe2efc57SMark /*@C 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 114811af0c4SBarry Smith . x,y - coordinates of lower left corner of window or `PETSC_DECIDE` 115811af0c4SBarry Smith - w, h - width and height of window or `PETSC_DECIDE` or `PETSC_DRAW_HALF_SIZE`, `PETSC_DRAW_FULL_SIZE`, 116811af0c4SBarry Smith or `PETSC_DRAW_THIRD_SIZE` or `PETSC_DRAW_QUARTER_SIZE` 1175c6c1daeSBarry Smith 1185c6c1daeSBarry Smith Output Parameter: 119811af0c4SBarry Smith . draw - location to put the `PetscDraw` context 1205c6c1daeSBarry Smith 1215c6c1daeSBarry Smith Level: beginner 1225c6c1daeSBarry Smith 123db781477SPatrick Sanan .seealso: `PetscDrawSetType()`, `PetscDrawSetFromOptions()`, `PetscDrawDestroy()`, `PetscDrawSetType()`, `PetscDrawLGCreate()`, `PetscDrawSPCreate()`, 124db781477SPatrick Sanan `PetscDrawViewPortsCreate()`, `PetscDrawViewPortsSet()`, `PetscDrawAxisCreate()`, `PetscDrawHGCreate()`, `PetscDrawBarCreate()`, 125db781477SPatrick Sanan `PetscViewerDrawGetDraw()`, `PetscDrawSetFromOptions()`, `PetscDrawSetSave()`, `PetscDrawSetSaveMovie()`, `PetscDrawSetSaveFinalImage()`, 126db781477SPatrick Sanan `PetscDrawOpenX()`, `PetscDrawOpenImage()`, `PetscDrawIsNull()`, `PetscDrawGetPopup()`, `PetscDrawCheckResizedWindow()`, `PetscDrawResizeWindow()`, 127db781477SPatrick Sanan `PetscDrawGetWindowSize()`, `PetscDrawLine()`, `PetscDrawArrow()`, `PetscDrawLineSetWidth()`, `PetscDrawLineGetWidth()`, `PetscDrawMarker()`, 128db781477SPatrick Sanan `PetscDrawPoint()`, `PetscDrawRectangle()`, `PetscDrawTriangle()`, `PetscDrawEllipse()`, `PetscDrawString()`, `PetscDrawStringCentered()`, 129db781477SPatrick Sanan `PetscDrawStringBoxed()`, `PetscDrawStringVertical()`, `PetscDrawSetViewPort()`, `PetscDrawGetViewPort()`, 130db781477SPatrick Sanan `PetscDrawSplitViewPort()`, `PetscDrawSetTitle()`, `PetscDrawAppendTitle()`, `PetscDrawGetTitle()`, `PetscDrawSetPause()`, `PetscDrawGetPause()`, 131db781477SPatrick Sanan `PetscDrawPause()`, `PetscDrawSetDoubleBuffer()`, `PetscDrawClear()`, `PetscDrawFlush()`, `PetscDrawGetSingleton()`, `PetscDrawGetMouseButton()`, 132db781477SPatrick Sanan `PetscDrawZoom()`, `PetscDrawGetBoundingBox()` 1335c6c1daeSBarry Smith @*/ 134d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawCreate(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscDraw *indraw) 135d71ae5a4SJacob Faibussowitsch { 1365c6c1daeSBarry Smith PetscDraw draw; 137e118a51fSLisandro Dalcin PetscReal dpause = 0.0; 1385c6c1daeSBarry Smith PetscBool flag; 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith PetscFunctionBegin; 1419566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 14202c9f0b5SLisandro Dalcin *indraw = NULL; 1439566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(draw, PETSC_DRAW_CLASSID, "Draw", "Graphics", "Draw", comm, PetscDrawDestroy, PetscDrawView)); 144a297a907SKarl Rupp 1458f69470aSLisandro Dalcin draw->data = NULL; 1469566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &draw->display)); 1479566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &draw->title)); 1485c6c1daeSBarry Smith draw->x = x; 1495c6c1daeSBarry Smith draw->y = y; 1505c6c1daeSBarry Smith draw->w = w; 1515c6c1daeSBarry Smith draw->h = h; 1525c6c1daeSBarry Smith draw->pause = 0.0; 1535c6c1daeSBarry Smith draw->coor_xl = 0.0; 1545c6c1daeSBarry Smith draw->coor_xr = 1.0; 1555c6c1daeSBarry Smith draw->coor_yl = 0.0; 1565c6c1daeSBarry Smith draw->coor_yr = 1.0; 1575c6c1daeSBarry Smith draw->port_xl = 0.0; 1585c6c1daeSBarry Smith draw->port_xr = 1.0; 1595c6c1daeSBarry Smith draw->port_yl = 0.0; 1605c6c1daeSBarry Smith draw->port_yr = 1.0; 161e118a51fSLisandro Dalcin draw->popup = NULL; 162a297a907SKarl Rupp 1639566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(NULL, NULL, "-draw_pause", &dpause, &flag)); 1645c6c1daeSBarry Smith if (flag) draw->pause = dpause; 1658067a7d5SLisandro Dalcin 1660298fd71SBarry Smith draw->savefilename = NULL; 1678067a7d5SLisandro Dalcin draw->saveimageext = NULL; 1688067a7d5SLisandro Dalcin draw->savemovieext = NULL; 1695b399a63SLisandro Dalcin draw->savefilecount = 0; 1708067a7d5SLisandro Dalcin draw->savesinglefile = PETSC_FALSE; 1713d242201SLisandro Dalcin draw->savemoviefps = PETSC_DECIDE; 172a297a907SKarl Rupp 1739566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCurrentPoint(draw, .5, .9)); 174a297a907SKarl Rupp 1755c6c1daeSBarry Smith draw->boundbox_xl = .5; 1765c6c1daeSBarry Smith draw->boundbox_xr = .5; 1775c6c1daeSBarry Smith draw->boundbox_yl = .9; 1785c6c1daeSBarry Smith draw->boundbox_yr = .9; 1795c6c1daeSBarry Smith 1805c6c1daeSBarry Smith *indraw = draw; 1815c6c1daeSBarry Smith PetscFunctionReturn(0); 1825c6c1daeSBarry Smith } 1835c6c1daeSBarry Smith 1845c6c1daeSBarry Smith /*@C 1855c6c1daeSBarry Smith PetscDrawSetType - Builds graphics object for a particular implementation 1865c6c1daeSBarry Smith 187*c3339decSBarry Smith Collective 1885c6c1daeSBarry Smith 189d8d19677SJose E. Roman Input Parameters: 1905c6c1daeSBarry Smith + draw - the graphics context 191811af0c4SBarry Smith - type - for example, `PETSC_DRAW_X` 1925c6c1daeSBarry Smith 1933c7db156SBarry Smith Options Database Key: 194236f5a4dSBarry Smith . -draw_type <type> - Sets the type; use -help for a list of available methods (for instance, x) 195236f5a4dSBarry Smith 1965c6c1daeSBarry Smith Level: intermediate 1975c6c1daeSBarry Smith 198811af0c4SBarry Smith Note: 1993c7db156SBarry Smith See `PetscDrawSetFromOptions()` for additional options database keys 2003c7db156SBarry Smith 2015c6c1daeSBarry Smith See "petsc/include/petscdraw.h" for available methods (for instance, 202811af0c4SBarry Smith `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ` or `PETSC_DRAW_IMAGE`) 2035c6c1daeSBarry Smith 204811af0c4SBarry Smith .seealso: `PetscDraw`, `PETSC_DRAW_X`, `PETSC_DRAW_TIKZ`, `PETSC_DRAW_IMAGE`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()`, `PetscDrawDestroy()`, `PetscDrawType` 2055c6c1daeSBarry Smith @*/ 206d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetType(PetscDraw draw, PetscDrawType type) 207d71ae5a4SJacob Faibussowitsch { 2085c6c1daeSBarry Smith PetscBool match; 2095c6c1daeSBarry Smith PetscBool flg = PETSC_FALSE; 2105f80ce2aSJacob Faibussowitsch PetscErrorCode (*r)(PetscDraw); 2115c6c1daeSBarry Smith 2125c6c1daeSBarry Smith PetscFunctionBegin; 2135c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2145c6c1daeSBarry Smith PetscValidCharPointer(type, 2); 2155c6c1daeSBarry Smith 2169566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)draw, type, &match)); 2175c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith /* User requests no graphics */ 2209566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &flg)); 2215c6c1daeSBarry Smith 2225c6c1daeSBarry Smith /* 2235c6c1daeSBarry Smith This is not ideal, but it allows codes to continue to run if X graphics 2245c6c1daeSBarry Smith was requested but is not installed on this machine. Mostly this is for 2255c6c1daeSBarry Smith testing. 2265c6c1daeSBarry Smith */ 2275c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X) 2285c6c1daeSBarry Smith if (!flg) { 2299566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type, PETSC_DRAW_X, &match)); 2305c6c1daeSBarry Smith if (match) { 2315c6c1daeSBarry Smith PetscBool dontwarn = PETSC_TRUE; 2325c6c1daeSBarry Smith flg = PETSC_TRUE; 2339566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &dontwarn)); 234e1dfdf8eSBarry Smith if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n"); 2355c6c1daeSBarry Smith } 2365c6c1daeSBarry Smith } 2375c6c1daeSBarry Smith #endif 2380b50c7b2SBarry Smith if (flg) { 2399566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type, "tikz", &flg)); 2409c8bf542SScott Kruger if (!flg) type = PETSC_DRAW_NULL; 2419c8bf542SScott Kruger } 2429c8bf542SScott Kruger 2439566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(type, PETSC_DRAW_NULL, &match)); 2449c8bf542SScott Kruger if (match) { 2459566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_double_buffer", NULL)); 2469566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_virtual", NULL)); 2479566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_fast", NULL)); 2489566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_ports", NULL)); 2499566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-draw_coordinates", NULL)); 2500b50c7b2SBarry Smith } 2515c6c1daeSBarry Smith 2529566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(PetscDrawList, type, &r)); 25328b400f6SJacob Faibussowitsch PetscCheck(r, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscDraw type given: %s", type); 254dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, destroy); 2559566063dSJacob Faibussowitsch PetscCall(PetscMemzero(draw->ops, sizeof(struct _PetscDrawOps))); 2569566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)draw, type)); 2579566063dSJacob Faibussowitsch PetscCall((*r)(draw)); 2585c6c1daeSBarry Smith PetscFunctionReturn(0); 2595c6c1daeSBarry Smith } 2605c6c1daeSBarry Smith 2615c6c1daeSBarry Smith /*@C 262811af0c4SBarry Smith PetscDrawGetType - Gets the `PetscDraw` type as a string from the `PetscDraw` object. 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith Not Collective 2655c6c1daeSBarry Smith 2665c6c1daeSBarry Smith Input Parameter: 2675c6c1daeSBarry Smith . draw - Krylov context 2685c6c1daeSBarry Smith 2695c6c1daeSBarry Smith Output Parameters: 2705c6c1daeSBarry Smith . name - name of PetscDraw method 2715c6c1daeSBarry Smith 2725c6c1daeSBarry Smith Level: advanced 2735c6c1daeSBarry Smith 274811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawType`, `PetscDrawSetType()`, `PetscDrawCreate() 2755c6c1daeSBarry Smith @*/ 276d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetType(PetscDraw draw, PetscDrawType *type) 277d71ae5a4SJacob Faibussowitsch { 2785c6c1daeSBarry Smith PetscFunctionBegin; 2795c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2805c6c1daeSBarry Smith PetscValidPointer(type, 2); 2815c6c1daeSBarry Smith *type = ((PetscObject)draw)->type_name; 2825c6c1daeSBarry Smith PetscFunctionReturn(0); 2835c6c1daeSBarry Smith } 2845c6c1daeSBarry Smith 285607a6623SBarry Smith /*@C 2861c84c290SBarry Smith PetscDrawRegister - Adds a method to the graphics package. 2871c84c290SBarry Smith 2881c84c290SBarry Smith Not Collective 2891c84c290SBarry Smith 2901c84c290SBarry Smith Input Parameters: 2910076e027SBarry Smith + name_solver - name of a new user-defined graphics class 2921c84c290SBarry Smith - routine_create - routine to create method context 2931c84c290SBarry Smith 2941c84c290SBarry Smith Level: developer 2951c84c290SBarry Smith 296811af0c4SBarry Smith Note: 297811af0c4SBarry Smith `PetscDrawRegister()` may be called multiple times to add several user-defined graphics classes 2981c84c290SBarry Smith 2991c84c290SBarry Smith Sample usage: 3001c84c290SBarry Smith .vb 301bdf89e91SBarry Smith PetscDrawRegister("my_draw_type", MyDrawCreate); 3021c84c290SBarry Smith .ve 3031c84c290SBarry Smith 3040076e027SBarry Smith Then, your specific graphics package can be chosen with the procedural interface via 3051c84c290SBarry Smith $ PetscDrawSetType(ksp,"my_draw_type") 3061c84c290SBarry Smith or at runtime via the option 3071c84c290SBarry Smith $ -draw_type my_draw_type 3081c84c290SBarry Smith 309811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRegisterAll()`, `PetscDrawRegisterDestroy()`, `PetscDrawType`, `PetscDrawSetType()` 3101c84c290SBarry Smith @*/ 311d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawRegister(const char *sname, PetscErrorCode (*function)(PetscDraw)) 312d71ae5a4SJacob Faibussowitsch { 3135c6c1daeSBarry Smith PetscFunctionBegin; 3149566063dSJacob Faibussowitsch PetscCall(PetscDrawInitializePackage()); 3159566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&PetscDrawList, sname, function)); 3165c6c1daeSBarry Smith PetscFunctionReturn(0); 3175c6c1daeSBarry Smith } 3185c6c1daeSBarry Smith 3197faeec8aSLisandro Dalcin /*@C 3207faeec8aSLisandro Dalcin PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all 321811af0c4SBarry Smith `PetscDraw` options in the database. 3227faeec8aSLisandro Dalcin 323*c3339decSBarry Smith Logically Collective 3247faeec8aSLisandro Dalcin 325d8d19677SJose E. Roman Input Parameters: 3267faeec8aSLisandro Dalcin + draw - the draw context 3277faeec8aSLisandro Dalcin - prefix - the prefix to prepend to all option names 3287faeec8aSLisandro Dalcin 3297faeec8aSLisandro Dalcin Level: advanced 3307faeec8aSLisandro Dalcin 331811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetFromOptions()`, `PetscDrawCreate()` 3327faeec8aSLisandro Dalcin @*/ 333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw, const char prefix[]) 334d71ae5a4SJacob Faibussowitsch { 3357faeec8aSLisandro Dalcin PetscFunctionBegin; 3367faeec8aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3379566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)draw, prefix)); 3387faeec8aSLisandro Dalcin PetscFunctionReturn(0); 3397faeec8aSLisandro Dalcin } 3407faeec8aSLisandro Dalcin 3415c6c1daeSBarry Smith /*@ 3425c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 343e1dfdf8eSBarry Smith Defaults to a PETSc X Windows graphics. 3445c6c1daeSBarry Smith 345*c3339decSBarry Smith Collective 3465c6c1daeSBarry Smith 3475c6c1daeSBarry Smith Input Parameter: 3485c6c1daeSBarry Smith . draw - the graphics context 3495c6c1daeSBarry Smith 3505c6c1daeSBarry Smith Options Database Keys: 3515c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 352e1dfdf8eSBarry Smith . -nox_warning - when X Windows support is not installed this prevents the warning message from being printed 3537450148dSBarry Smith . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 35473f7a4c5SBarry Smith . -draw_marker_type - <x,point> 355e1dfdf8eSBarry Smith . -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file 356e1dfdf8eSBarry Smith . -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window 357a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 358df8d4941SLisandro 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' 359df8d4941SLisandro Dalcin . -draw_save_on_clear - saves an image on each clear, mainly for debugging 360df8d4941SLisandro Dalcin - -draw_save_on_flush - saves an image on each flush, mainly for debugging 3615c6c1daeSBarry Smith 3625c6c1daeSBarry Smith Level: intermediate 3635c6c1daeSBarry Smith 364811af0c4SBarry Smith Note: 365811af0c4SBarry Smith Must be called after `PetscDrawCreate()` before the `PetscDraw` is used. 3665c6c1daeSBarry Smith 367811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()`, `PetscDrawSetType()`, `PetscDrawSetSave()`, `PetscDrawSetSaveFinalImage()`, `PetscDrawPause()`, `PetscDrawSetPause()` 3685c6c1daeSBarry Smith @*/ 369d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 370d71ae5a4SJacob Faibussowitsch { 3715c6c1daeSBarry Smith PetscBool flg, nox; 3725c6c1daeSBarry Smith char vtype[256]; 3735c6c1daeSBarry Smith const char *def; 3745c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3755c6c1daeSBarry Smith PetscBool warn; 3765c6c1daeSBarry Smith #endif 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith PetscFunctionBegin; 3795c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3805c6c1daeSBarry Smith 3819566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 3825c6c1daeSBarry Smith 383a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 384a297a907SKarl Rupp else { 3859566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)draw)->options, NULL, "-nox", &nox)); 3865c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3875c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3885c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3895c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3905c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 3915c6c1daeSBarry Smith #else 3929566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(NULL, NULL, "-nox_warning", &warn)); 393e1dfdf8eSBarry Smith if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n"); 3945c6c1daeSBarry Smith #endif 3955c6c1daeSBarry Smith } 396d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)draw); 3979566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-draw_type", "Type of graphical output", "PetscDrawSetType", PetscDrawList, def, vtype, 256, &flg)); 3985c6c1daeSBarry Smith if (flg) { 3999566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw, vtype)); 4005c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 4019566063dSJacob Faibussowitsch PetscCall(PetscDrawSetType(draw, def)); 4025c6c1daeSBarry Smith } 4039566063dSJacob Faibussowitsch PetscCall(PetscOptionsName("-nox", "Run without graphics", "None", &nox)); 4045c6c1daeSBarry Smith { 40549c04938SLisandro Dalcin char filename[PETSC_MAX_PATH_LEN]; 40649c04938SLisandro Dalcin char movieext[32]; 40749c04938SLisandro Dalcin PetscBool image, movie; 4089566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(filename, sizeof(filename), "%s%s", draw->savefilename ? draw->savefilename : "", draw->saveimageext ? draw->saveimageext : "")); 4099566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(movieext, sizeof(movieext), "%s", draw->savemovieext ? draw->savemovieext : "")); 4109566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save", "Save graphics to image file", "PetscDrawSetSave", filename, filename, sizeof(filename), &image)); 4119566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_movie", "Make a movie from saved images", "PetscDrawSetSaveMovie", movieext, movieext, sizeof(movieext), &movie)); 4129566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-draw_save_movie_fps", "Set frames per second in saved movie", PETSC_FUNCTION_NAME, draw->savemoviefps, &draw->savemoviefps, NULL)); 4139566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_single_file", "Each new image replaces previous image in file", PETSC_FUNCTION_NAME, draw->savesinglefile, &draw->savesinglefile, NULL)); 4149566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSave(draw, filename)); 4159566063dSJacob Faibussowitsch if (movie) PetscCall(PetscDrawSetSaveMovie(draw, movieext)); 4169566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-draw_save_final_image", "Save final graphics to image file", "PetscDrawSetSaveFinalImage", filename, filename, sizeof(filename), &image)); 4179566063dSJacob Faibussowitsch if (image) PetscCall(PetscDrawSetSaveFinalImage(draw, filename)); 4189566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_clear", "Save graphics to file on each clear", PETSC_FUNCTION_NAME, draw->saveonclear, &draw->saveonclear, NULL)); 4199566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-draw_save_on_flush", "Save graphics to file on each flush", PETSC_FUNCTION_NAME, draw->saveonflush, &draw->saveonflush, NULL)); 4205c6c1daeSBarry Smith } 4219566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-draw_pause", "Amount of time that program pauses after plots", "PetscDrawSetPause", draw->pause, &draw->pause, NULL)); 4229566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-draw_marker_type", "Type of marker to use on plots", "PetscDrawSetMarkerType", PetscDrawMarkerTypes, (PetscEnum)draw->markertype, (PetscEnum *)&draw->markertype, NULL)); 42373f7a4c5SBarry Smith 4245c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 425dbbe0bcdSBarry Smith PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)draw, PetscOptionsObject)); 426ce1779c8SBarry Smith 4279566063dSJacob Faibussowitsch PetscCall(PetscDrawViewFromOptions(draw, NULL, "-draw_view")); 428d0609cedSBarry Smith PetscOptionsEnd(); 4295c6c1daeSBarry Smith PetscFunctionReturn(0); 4305c6c1daeSBarry Smith } 431