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