15c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/ 2665c2dedSJed Brown #include <petscviewer.h> /*I "petscviewer.h" I*/ 35c6c1daeSBarry Smith 4d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v) 5d71ae5a4SJacob Faibussowitsch { 65c6c1daeSBarry Smith PetscInt i; 75c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data; 85c6c1daeSBarry Smith 95c6c1daeSBarry Smith PetscFunctionBegin; 1028b400f6SJacob Faibussowitsch PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Destroying PetscViewer without first restoring singleton"); 115c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 129566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&vdraw->drawaxis[i])); 139566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDestroy(&vdraw->drawlg[i])); 149566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&vdraw->draw[i])); 155c6c1daeSBarry Smith } 169566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->display)); 179566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->title)); 189566063dSJacob Faibussowitsch PetscCall(PetscFree3(vdraw->draw, vdraw->drawlg, vdraw->drawaxis)); 199566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->bounds)); 209566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->drawtype)); 219566063dSJacob Faibussowitsch PetscCall(PetscFree(v->data)); 223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 235c6c1daeSBarry Smith } 245c6c1daeSBarry Smith 25d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v) 26d71ae5a4SJacob Faibussowitsch { 275c6c1daeSBarry Smith PetscInt i; 285c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data; 295c6c1daeSBarry Smith 305c6c1daeSBarry Smith PetscFunctionBegin; 315c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 329566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i])); 335c6c1daeSBarry Smith } 343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 355c6c1daeSBarry Smith } 365c6c1daeSBarry Smith 375d83a8b1SBarry Smith /*@ 38c410d8ccSBarry Smith PetscViewerDrawBaseAdd - add to the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()` 395c6c1daeSBarry Smith 40c3339decSBarry Smith Logically Collective 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith Input Parameters: 43811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 445c6c1daeSBarry Smith - windownumber - how much to add to the base 455c6c1daeSBarry Smith 465c6c1daeSBarry Smith Level: developer 475c6c1daeSBarry Smith 48811af0c4SBarry Smith Note: 49811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()` 50811af0c4SBarry Smith 51d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()` 525c6c1daeSBarry Smith @*/ 53d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber) 54d71ae5a4SJacob Faibussowitsch { 55e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 565c6c1daeSBarry Smith PetscBool isdraw; 575c6c1daeSBarry Smith 585c6c1daeSBarry Smith PetscFunctionBegin; 595c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 60e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 619566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6228b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 63e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 64e5ab1681SLisandro Dalcin 65cc73adaaSBarry Smith PetscCheck(windownumber + vdraw->draw_base >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber + vdraw->draw_base); 665c6c1daeSBarry Smith vdraw->draw_base += windownumber; 673ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 685c6c1daeSBarry Smith } 695c6c1daeSBarry Smith 705d83a8b1SBarry Smith /*@ 71c410d8ccSBarry Smith PetscViewerDrawBaseSet - sets the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()` 725c6c1daeSBarry Smith 73c3339decSBarry Smith Logically Collective 745c6c1daeSBarry Smith 755c6c1daeSBarry Smith Input Parameters: 76811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 775c6c1daeSBarry Smith - windownumber - value to set the base 785c6c1daeSBarry Smith 795c6c1daeSBarry Smith Level: developer 805c6c1daeSBarry Smith 81811af0c4SBarry Smith Note: 82811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()` 83811af0c4SBarry Smith 84d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()` 855c6c1daeSBarry Smith @*/ 86d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber) 87d71ae5a4SJacob Faibussowitsch { 88e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 895c6c1daeSBarry Smith PetscBool isdraw; 905c6c1daeSBarry Smith 915c6c1daeSBarry Smith PetscFunctionBegin; 925c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 93e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 949566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 9528b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 96e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 97e5ab1681SLisandro Dalcin 9808401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber); 995c6c1daeSBarry Smith vdraw->draw_base = windownumber; 1003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1015c6c1daeSBarry Smith } 1025c6c1daeSBarry Smith 103d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h) 104d71ae5a4SJacob Faibussowitsch { 105e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 106e5ab1681SLisandro Dalcin PetscBool isdraw; 1075c6c1daeSBarry Smith 1085c6c1daeSBarry Smith PetscFunctionBegin; 109e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 1109566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 1113ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 112e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 113e5ab1681SLisandro Dalcin 114e5ab1681SLisandro Dalcin if (w >= 1) vdraw->w = w; 115e5ab1681SLisandro Dalcin if (h >= 1) vdraw->h = h; 1163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1175c6c1daeSBarry Smith } 1185c6c1daeSBarry Smith 119d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h) 120d71ae5a4SJacob Faibussowitsch { 121e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 122e5ab1681SLisandro Dalcin PetscBool isdraw; 1235c6c1daeSBarry Smith 1245c6c1daeSBarry Smith PetscFunctionBegin; 125e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 1269566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 1273ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 128e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 129e5ab1681SLisandro Dalcin 1309566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &vdraw->display)); 1319566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &vdraw->title)); 132e5ab1681SLisandro Dalcin if (w >= 1) vdraw->w = w; 133e5ab1681SLisandro Dalcin if (h >= 1) vdraw->h = h; 1343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1355c6c1daeSBarry Smith } 1365c6c1daeSBarry Smith 137d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[]) 138d71ae5a4SJacob Faibussowitsch { 139f55236e4SLisandro Dalcin PetscViewer_Draw *vdraw; 140f55236e4SLisandro Dalcin PetscBool isdraw; 141f55236e4SLisandro Dalcin 142f55236e4SLisandro Dalcin PetscFunctionBegin; 143f55236e4SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 1449566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 1453ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 146f55236e4SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 147f55236e4SLisandro Dalcin 1489566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->title)); 1499566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &vdraw->title)); 1503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 151f55236e4SLisandro Dalcin } 152f55236e4SLisandro Dalcin 153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[]) 154d71ae5a4SJacob Faibussowitsch { 155f55236e4SLisandro Dalcin PetscViewer_Draw *vdraw; 156f55236e4SLisandro Dalcin PetscBool isdraw; 157f55236e4SLisandro Dalcin 158f55236e4SLisandro Dalcin PetscFunctionBegin; 159f55236e4SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 1609566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 16128b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 162f55236e4SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 163f55236e4SLisandro Dalcin 164f55236e4SLisandro Dalcin *title = vdraw->title; 1653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 166f55236e4SLisandro Dalcin } 167f55236e4SLisandro Dalcin 168cc4c1da9SBarry Smith /*@ 16910450e9eSJacob Faibussowitsch PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type 17010450e9eSJacob Faibussowitsch `PETSCVIEWERDRAW`. 1715c6c1daeSBarry Smith 172d083f849SBarry Smith Collective 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith Input Parameters: 1755c6c1daeSBarry Smith + comm - communicator that will share window 1763f423023SBarry Smith . display - the X display on which to open, or `NULL` for the local machine 1773f423023SBarry Smith . title - the title to put in the title bar, or `NULL` for no title 178aaa8cc7dSPierre Jolivet . x - horizontal screen coordinate of the upper left corner of window, or use `PETSC_DECIDE` 1792fe279fdSBarry Smith . y - vertical screen coordinate of the upper left corner of window, or use `PETSC_DECIDE` 1802fe279fdSBarry Smith . w - window width in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 1812fe279fdSBarry Smith - h - window height in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 1825c6c1daeSBarry Smith 183f899ff85SJose E. Roman Output Parameter: 184811af0c4SBarry Smith . viewer - the `PetscViewer` 1855c6c1daeSBarry Smith 1865c6c1daeSBarry Smith Options Database Keys: 18710699b91SBarry Smith + -draw_type - use x or null 1885c6c1daeSBarry Smith . -nox - Disables all x-windows output 1895c6c1daeSBarry Smith . -display <name> - Specifies name of machine for the X display 1905c6c1daeSBarry Smith . -geometry <x,y,w,h> - allows setting the window location and size 1915c6c1daeSBarry Smith - -draw_pause <pause> - Sets time (in seconds) that the 192*feaf08eaSBarry Smith program pauses after `PetscDrawPause()` has been called 1935c6c1daeSBarry Smith (0 is default, -1 implies until user input). 1945c6c1daeSBarry Smith 1955c6c1daeSBarry Smith Level: beginner 1965c6c1daeSBarry Smith 19710450e9eSJacob Faibussowitsch Notes: 19810450e9eSJacob Faibussowitsch If you want to do graphics in this window, you must call `PetscViewerDrawGetDraw()` and 19910450e9eSJacob Faibussowitsch perform the graphics on the `PetscDraw` object. 20010450e9eSJacob Faibussowitsch 20110450e9eSJacob Faibussowitsch Format options include\: 20210450e9eSJacob Faibussowitsch + `PETSC_VIEWER_DRAW_BASIC` - displays with basic format 20310450e9eSJacob Faibussowitsch - `PETSC_VIEWER_DRAW_LG` - displays using a line graph 20410450e9eSJacob Faibussowitsch 205*feaf08eaSBarry Smith Fortran Note: 2065c6c1daeSBarry Smith Whenever indicating null character data in a Fortran code, 207*feaf08eaSBarry Smith `PETSC_NULL_CHARACTER` must be employed. Thus, `PETSC_NULL_CHARACTER` can be 208*feaf08eaSBarry Smith used for the `display` and `title` input parameters. 2095c6c1daeSBarry Smith 210d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`, 211db781477SPatrick Sanan `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF` 2125c6c1daeSBarry Smith @*/ 213d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer) 214d71ae5a4SJacob Faibussowitsch { 2155c6c1daeSBarry Smith PetscFunctionBegin; 2169566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, viewer)); 2179566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW)); 2189566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h)); 2193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2205c6c1daeSBarry Smith } 2215c6c1daeSBarry Smith 222a9db196aSBarry Smith #include <petsc/private/drawimpl.h> 223a9db196aSBarry Smith 22434e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) 225d71ae5a4SJacob Faibussowitsch { 2265c6c1daeSBarry Smith PetscMPIInt rank; 2275c6c1daeSBarry Smith PetscInt i; 228c6228bbaSLisandro Dalcin PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw; 2295c6c1daeSBarry Smith 2305c6c1daeSBarry Smith PetscFunctionBegin; 23128b400f6SJacob Faibussowitsch PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous"); 2325c6c1daeSBarry Smith /* only processor zero can use the PetscViewer draw singleton */ 2339566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 234dd400576SPatrick Sanan if (rank == 0) { 235e5afcf28SBarry Smith PetscMPIInt flg; 236a9db196aSBarry Smith PetscDraw draw, sdraw; 237e5afcf28SBarry Smith 2389566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg)); 239cc73adaaSBarry Smith PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm"); 2409566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, sviewer)); 2419566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW)); 242c6228bbaSLisandro Dalcin svdraw = (PetscViewer_Draw *)(*sviewer)->data; 243c6228bbaSLisandro Dalcin (*sviewer)->format = viewer->format; 244c6228bbaSLisandro Dalcin for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */ 2459566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i])); 2465c6c1daeSBarry Smith } 2479566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 2489566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw)); 249a9db196aSBarry Smith if (draw->savefilename) { 2509566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(sdraw, draw->savefilename)); 251a9db196aSBarry Smith sdraw->savefilecount = draw->savefilecount; 252a9db196aSBarry Smith sdraw->savesinglefile = draw->savesinglefile; 253a9db196aSBarry Smith sdraw->savemoviefps = draw->savemoviefps; 254a9db196aSBarry Smith sdraw->saveonclear = draw->saveonclear; 255a9db196aSBarry Smith sdraw->saveonflush = draw->saveonflush; 256a9db196aSBarry Smith } 2579566063dSJacob Faibussowitsch if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename)); 258a9db196aSBarry Smith } else { 259a9db196aSBarry Smith PetscDraw draw; 2609566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 2615c6c1daeSBarry Smith } 2625c6c1daeSBarry Smith vdraw->singleton_made = PETSC_TRUE; 2633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2645c6c1daeSBarry Smith } 2655c6c1daeSBarry Smith 26634e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) 267d71ae5a4SJacob Faibussowitsch { 2685c6c1daeSBarry Smith PetscMPIInt rank; 2695c6c1daeSBarry Smith PetscInt i; 270c6228bbaSLisandro Dalcin PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw; 2715c6c1daeSBarry Smith 2725c6c1daeSBarry Smith PetscFunctionBegin; 27328b400f6SJacob Faibussowitsch PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten"); 2749566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 275dd400576SPatrick Sanan if (rank == 0) { 276a9db196aSBarry Smith PetscDraw draw, sdraw; 277a9db196aSBarry Smith 2789566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 2799566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw)); 280a9db196aSBarry Smith if (draw->savefilename) { 281a9db196aSBarry Smith draw->savefilecount = sdraw->savefilecount; 2829566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw))); 283a9db196aSBarry Smith } 284c6228bbaSLisandro Dalcin svdraw = (PetscViewer_Draw *)(*sviewer)->data; 2855c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 28648a46eb9SPierre Jolivet if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i])); 2875c6c1daeSBarry Smith } 2889566063dSJacob Faibussowitsch PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis)); 2899566063dSJacob Faibussowitsch PetscCall(PetscFree((*sviewer)->data)); 2909566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(sviewer)); 291a9db196aSBarry Smith } else { 292a9db196aSBarry Smith PetscDraw draw; 293a9db196aSBarry Smith 2949566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 29548a46eb9SPierre Jolivet if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw))); 296a9db196aSBarry Smith } 297a9db196aSBarry Smith 2985c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 2993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3005c6c1daeSBarry Smith } 3015c6c1daeSBarry Smith 302ce78bad3SBarry Smith static PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems PetscOptionsObject) 303d71ae5a4SJacob Faibussowitsch { 304e9457bf7SBarry Smith PetscReal bounds[16]; 305e9457bf7SBarry Smith PetscInt nbounds = 16; 306e9457bf7SBarry Smith PetscBool flg; 307e9457bf7SBarry Smith 308e9457bf7SBarry Smith PetscFunctionBegin; 309d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options"); 3109566063dSJacob Faibussowitsch PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg)); 31148a46eb9SPierre Jolivet if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds)); 312d0609cedSBarry Smith PetscOptionsHeadEnd(); 3133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 314e9457bf7SBarry Smith } 315e9457bf7SBarry Smith 31634e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v) 317d71ae5a4SJacob Faibussowitsch { 3180076e027SBarry Smith PetscDraw draw; 3190076e027SBarry Smith PetscInt i; 3200076e027SBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data; 321ccb5f961SBarry Smith PetscBool iascii; 3220076e027SBarry Smith 3230076e027SBarry Smith PetscFunctionBegin; 324ccb5f961SBarry Smith PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii)); 325ccb5f961SBarry Smith if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Draw viewer is of type %s\n", vdraw->drawtype)); 3260076e027SBarry Smith /* If the PetscViewer has just been created then no vdraw->draw yet 3270076e027SBarry Smith exists so this will not actually call the viewer on any draws. */ 3280076e027SBarry Smith for (i = 0; i < vdraw->draw_base; i++) { 3290076e027SBarry Smith if (vdraw->draw[i]) { 3309566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw)); 3319566063dSJacob Faibussowitsch PetscCall(PetscDrawView(draw, v)); 3320076e027SBarry Smith } 3330076e027SBarry Smith } 3343ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3350076e027SBarry Smith } 3360076e027SBarry Smith 3378556b5ebSBarry Smith /*MC 3388556b5ebSBarry Smith PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file 3398556b5ebSBarry Smith 340811af0c4SBarry Smith Level: beginner 341811af0c4SBarry Smith 342d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`, 343db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, 344db781477SPatrick Sanan `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, 345db781477SPatrick Sanan `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()` 3468556b5ebSBarry Smith M*/ 347d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer) 348d71ae5a4SJacob Faibussowitsch { 3495c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith PetscFunctionBegin; 3524dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&vdraw)); 3535c6c1daeSBarry Smith viewer->data = (void *)vdraw; 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_Draw; 3560076e027SBarry Smith viewer->ops->view = PetscViewerView_Draw; 3575c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_Draw; 358e9457bf7SBarry Smith viewer->ops->setfromoptions = PetscViewerSetFromOptions_Draw; 359559f443fSBarry Smith viewer->ops->getsubviewer = PetscViewerGetSubViewer_Draw; 360559f443fSBarry Smith viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw; 3615c6c1daeSBarry Smith 3625c6c1daeSBarry Smith /* these are created on the fly if requested */ 3635c6c1daeSBarry Smith vdraw->draw_max = 5; 3645c6c1daeSBarry Smith vdraw->draw_base = 0; 365ccad63c3SBarry Smith vdraw->w = PETSC_DECIDE; 366ccad63c3SBarry Smith vdraw->h = PETSC_DECIDE; 367a297a907SKarl Rupp 3689566063dSJacob Faibussowitsch PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis)); 3695c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 3703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3715c6c1daeSBarry Smith } 3725c6c1daeSBarry Smith 3735c6c1daeSBarry Smith /*@ 374811af0c4SBarry Smith PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`. 3755c6c1daeSBarry Smith 3765c6c1daeSBarry Smith Not Collective 3775c6c1daeSBarry Smith 3785c6c1daeSBarry Smith Input Parameter: 379811af0c4SBarry Smith . viewer - the `PetscViewer` 3805c6c1daeSBarry Smith 3815c6c1daeSBarry Smith Level: intermediate 3825c6c1daeSBarry Smith 383d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 3845c6c1daeSBarry Smith @*/ 385d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawClear(PetscViewer viewer) 386d71ae5a4SJacob Faibussowitsch { 3875c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 388e5ab1681SLisandro Dalcin PetscBool isdraw; 389e5ab1681SLisandro Dalcin PetscInt i; 3905c6c1daeSBarry Smith 3915c6c1daeSBarry Smith PetscFunctionBegin; 392e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 3939566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 3943ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 3955c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 396e5ab1681SLisandro Dalcin 3975c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 3989566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i])); 3995c6c1daeSBarry Smith } 4003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4015c6c1daeSBarry Smith } 4025c6c1daeSBarry Smith 4035c6c1daeSBarry Smith /*@ 404811af0c4SBarry Smith PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed) in the `PETSCVIEWERDRAW` `PetscViewer` 4055c6c1daeSBarry Smith 4065c6c1daeSBarry Smith Not Collective 4075c6c1daeSBarry Smith 4085c6c1daeSBarry Smith Input Parameter: 409811af0c4SBarry Smith . viewer - the `PetscViewer` 4105c6c1daeSBarry Smith 4115c6c1daeSBarry Smith Output Parameter: 4125c6c1daeSBarry Smith . pause - the pause value 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith Level: intermediate 4155c6c1daeSBarry Smith 416d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 4175c6c1daeSBarry Smith @*/ 418d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause) 419d71ae5a4SJacob Faibussowitsch { 4205c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 421e5ab1681SLisandro Dalcin PetscBool isdraw; 422e5ab1681SLisandro Dalcin PetscInt i; 4235c6c1daeSBarry Smith PetscDraw draw; 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith PetscFunctionBegin; 426e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4279566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 4289371c9d4SSatish Balay if (!isdraw) { 4299371c9d4SSatish Balay *pause = 0.0; 4303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4319371c9d4SSatish Balay } 4325c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 433e5ab1681SLisandro Dalcin 4345c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 4355c6c1daeSBarry Smith if (vdraw->draw[i]) { 4369566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPause(vdraw->draw[i], pause)); 4373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4385c6c1daeSBarry Smith } 4395c6c1daeSBarry Smith } 4405c6c1daeSBarry Smith /* none exist yet so create one and get its pause */ 4419566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 4429566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPause(draw, pause)); 4433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4445c6c1daeSBarry Smith } 4455c6c1daeSBarry Smith 4465c6c1daeSBarry Smith /*@ 447811af0c4SBarry Smith PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer` 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith Not Collective 4505c6c1daeSBarry Smith 4515c6c1daeSBarry Smith Input Parameters: 452811af0c4SBarry Smith + viewer - the `PetscViewer` 4535c6c1daeSBarry Smith - pause - the pause value 4545c6c1daeSBarry Smith 4555c6c1daeSBarry Smith Level: intermediate 4565c6c1daeSBarry Smith 457d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 4585c6c1daeSBarry Smith @*/ 459d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause) 460d71ae5a4SJacob Faibussowitsch { 461e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 4625c6c1daeSBarry Smith PetscBool isdraw; 463e5ab1681SLisandro Dalcin PetscInt i; 4645c6c1daeSBarry Smith 4655c6c1daeSBarry Smith PetscFunctionBegin; 466e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4679566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 4683ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 469e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 470afe78b3cSBarry Smith 471afe78b3cSBarry Smith vdraw->pause = pause; 4725c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 4739566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause)); 4745c6c1daeSBarry Smith } 4753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4765c6c1daeSBarry Smith } 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith /*@ 479c410d8ccSBarry Smith PetscViewerDrawSetHold - Holds previous image when drawing new image in a `PETSCVIEWERDRAW` 4805c6c1daeSBarry Smith 4815c6c1daeSBarry Smith Not Collective 4825c6c1daeSBarry Smith 4835c6c1daeSBarry Smith Input Parameters: 484811af0c4SBarry Smith + viewer - the `PetscViewer` 485811af0c4SBarry Smith - hold - `PETSC_TRUE` indicates to hold the previous image 4865c6c1daeSBarry Smith 4875c6c1daeSBarry Smith Level: intermediate 4885c6c1daeSBarry Smith 489d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 4905c6c1daeSBarry Smith @*/ 491d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold) 492d71ae5a4SJacob Faibussowitsch { 4935c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 4945c6c1daeSBarry Smith PetscBool isdraw; 4955c6c1daeSBarry Smith 4965c6c1daeSBarry Smith PetscFunctionBegin; 497e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 4989566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 4993ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 5005c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 501e5ab1681SLisandro Dalcin 5025c6c1daeSBarry Smith vdraw->hold = hold; 5033ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5045c6c1daeSBarry Smith } 5055c6c1daeSBarry Smith 5065c6c1daeSBarry Smith /*@ 507811af0c4SBarry Smith PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image 5085c6c1daeSBarry Smith 5095c6c1daeSBarry Smith Not Collective 5105c6c1daeSBarry Smith 5115c6c1daeSBarry Smith Input Parameter: 512811af0c4SBarry Smith . viewer - the `PetscViewer` 5135c6c1daeSBarry Smith 5145c6c1daeSBarry Smith Output Parameter: 5155c6c1daeSBarry Smith . hold - indicates to hold or not 5165c6c1daeSBarry Smith 5175c6c1daeSBarry Smith Level: intermediate 5185c6c1daeSBarry Smith 519d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 5205c6c1daeSBarry Smith @*/ 521d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold) 522d71ae5a4SJacob Faibussowitsch { 5235c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 5245c6c1daeSBarry Smith PetscBool isdraw; 5255c6c1daeSBarry Smith 5265c6c1daeSBarry Smith PetscFunctionBegin; 527e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 5289566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 5299371c9d4SSatish Balay if (!isdraw) { 5309371c9d4SSatish Balay *hold = PETSC_FALSE; 5313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5329371c9d4SSatish Balay } 5335c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 534e5ab1681SLisandro Dalcin 5355c6c1daeSBarry Smith *hold = vdraw->hold; 5363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5375c6c1daeSBarry Smith } 5385c6c1daeSBarry Smith 5395c6c1daeSBarry Smith /* 5405c6c1daeSBarry Smith The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that 5415c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 5425c6c1daeSBarry Smith */ 543d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID; 5445c6c1daeSBarry Smith 5455c6c1daeSBarry Smith /*@C 546811af0c4SBarry Smith PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors 547c410d8ccSBarry Smith in an MPI communicator. 5485c6c1daeSBarry Smith 549d083f849SBarry Smith Collective 5505c6c1daeSBarry Smith 5515c6c1daeSBarry Smith Input Parameter: 552811af0c4SBarry Smith . comm - the MPI communicator to share the window `PetscViewer` 5535c6c1daeSBarry Smith 5545c6c1daeSBarry Smith Level: intermediate 5555c6c1daeSBarry Smith 55634fa283eSBarry Smith Notes: 55734fa283eSBarry Smith This object is destroyed in `PetscFinalize()`, `PetscViewerDestroy()` should never be called on it 55834fa283eSBarry Smith 559811af0c4SBarry Smith Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return 5605c6c1daeSBarry Smith an error code. The window is usually used in the form 561ce78bad3SBarry Smith .vb 562ce78bad3SBarry Smith XXXView(XXX object, PETSC_VIEWER_DRAW_(comm)); 563ce78bad3SBarry Smith .ve 5645c6c1daeSBarry Smith 565d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`, 5665c6c1daeSBarry Smith @*/ 567d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm) 568d71ae5a4SJacob Faibussowitsch { 569648c30bcSBarry Smith PetscMPIInt flag; 5705c6c1daeSBarry Smith PetscViewer viewer; 5715c6c1daeSBarry Smith MPI_Comm ncomm; 5725c6c1daeSBarry Smith 5735c6c1daeSBarry Smith PetscFunctionBegin; 574648c30bcSBarry Smith PetscCallNull(PetscCommDuplicate(comm, &ncomm, NULL)); 575648c30bcSBarry Smith if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) { PetscCallMPINull(MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL)); } 576648c30bcSBarry Smith PetscCallMPINull(MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag)); 5775c6c1daeSBarry Smith if (!flag) { /* PetscViewer not yet created */ 578648c30bcSBarry Smith PetscCallNull(PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer)); 579648c30bcSBarry Smith PetscCallNull(PetscObjectRegisterDestroy((PetscObject)viewer)); 580648c30bcSBarry Smith PetscCallMPINull(MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer)); 5819371c9d4SSatish Balay } 582648c30bcSBarry Smith PetscCallNull(PetscCommDestroy(&ncomm)); 5835c6c1daeSBarry Smith PetscFunctionReturn(viewer); 5845c6c1daeSBarry Smith } 5855c6c1daeSBarry Smith 5865c6c1daeSBarry Smith /*@ 587c410d8ccSBarry Smith PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting in a `PETSCVIEWERDRAW` `PetscViewer` 5885c6c1daeSBarry Smith 589c3339decSBarry Smith Collective 5905c6c1daeSBarry Smith 5915c6c1daeSBarry Smith Input Parameters: 592811af0c4SBarry Smith + viewer - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`) 593811af0c4SBarry Smith . nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()` 594c410d8ccSBarry Smith - bounds - the actual bounds, the size of this is 2*`nbounds`, the values are stored in the order min F_0, max F_0, min F_1, max F_1, ..... 5955c6c1daeSBarry Smith 596811af0c4SBarry Smith Options Database Key: 59710699b91SBarry Smith . -draw_bounds minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds 598e9457bf7SBarry Smith 5995c6c1daeSBarry Smith Level: intermediate 6005c6c1daeSBarry Smith 601811af0c4SBarry Smith Note: 602811af0c4SBarry Smith this determines the colors used in 2d contour plots generated with VecView() for `DMDA` in 2d. Any values in the vector below or above the 603f3f0eb19SBarry Smith bounds are moved to the bound value before plotting. In this way the color index from color to physical value remains the same for all plots generated with 604f3f0eb19SBarry Smith this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set. 605f3f0eb19SBarry Smith 606d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 6075c6c1daeSBarry Smith @*/ 608d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds) 609d71ae5a4SJacob Faibussowitsch { 610e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 611e5ab1681SLisandro Dalcin PetscBool isdraw; 6125c6c1daeSBarry Smith 6135c6c1daeSBarry Smith PetscFunctionBegin; 6145c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6159566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6163ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 617e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 618a297a907SKarl Rupp 619e5ab1681SLisandro Dalcin vdraw->nbounds = nbounds; 6209566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->bounds)); 6219566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds)); 6229566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds)); 6233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6245c6c1daeSBarry Smith } 6255c6c1daeSBarry Smith 6265c6c1daeSBarry Smith /*@C 627811af0c4SBarry Smith PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()` 6285c6c1daeSBarry Smith 629c3339decSBarry Smith Collective 6305c6c1daeSBarry Smith 6315c6c1daeSBarry Smith Input Parameter: 632811af0c4SBarry Smith . viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 6335c6c1daeSBarry Smith 634fd292e60Sprj- Output Parameters: 635811af0c4SBarry Smith + nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()` 636c410d8ccSBarry Smith - bounds - the actual bounds, the size of this is 2*`nbounds`, the values are stored in the order min F_0, max F_0, min F_1, max F_1, ..... 6375c6c1daeSBarry Smith 6385c6c1daeSBarry Smith Level: intermediate 6395c6c1daeSBarry Smith 640d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()` 6415c6c1daeSBarry Smith @*/ 642cc4c1da9SBarry Smith PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal *bounds[]) 643d71ae5a4SJacob Faibussowitsch { 644e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 645e5ab1681SLisandro Dalcin PetscBool isdraw; 6465c6c1daeSBarry Smith 6475c6c1daeSBarry Smith PetscFunctionBegin; 6485c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6499566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6509371c9d4SSatish Balay if (!isdraw) { 6519371c9d4SSatish Balay if (nbounds) *nbounds = 0; 6529371c9d4SSatish Balay if (bounds) *bounds = NULL; 6533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6549371c9d4SSatish Balay } 655e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 656e5ab1681SLisandro Dalcin 657e5ab1681SLisandro Dalcin if (nbounds) *nbounds = vdraw->nbounds; 658e5ab1681SLisandro Dalcin if (bounds) *bounds = vdraw->bounds; 6593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6605c6c1daeSBarry Smith } 661ce78bad3SBarry Smith 662ce78bad3SBarry Smith /*@C 663ce78bad3SBarry Smith PetscViewerMonitorLGSetUp - sets up a viewer to be used by line graph monitoring routines such as `KSPMonitorResidualDrawLG()` 664ce78bad3SBarry Smith 665ce78bad3SBarry Smith Collective 666ce78bad3SBarry Smith 667ce78bad3SBarry Smith Input Parameters: 668ce78bad3SBarry Smith + viewer - the viewer in which to display the line graphs, it not a `PETSCVIEWERDRAW` it will set to that `PetscViewerType` 669ce78bad3SBarry Smith . host - the host to open the window on, 'NULL' indicates the local host 670ce78bad3SBarry Smith . title - the title at the top of the window 671ce78bad3SBarry Smith . metric - the label above the graph 672ce78bad3SBarry Smith . l - the number of curves 673ce78bad3SBarry Smith . names - the names of each curve to be used in displaying the legend. May be 'NULL' 674ce78bad3SBarry Smith . x - horizontal screen coordinate of the upper left corner of window, or use `PETSC_DECIDE` 675ce78bad3SBarry Smith . y - vertical screen coordinate of the upper left corner of window, or use `PETSC_DECIDE` 676ce78bad3SBarry Smith . m - window width in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 677ce78bad3SBarry Smith - n - window height in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 678ce78bad3SBarry Smith 679ce78bad3SBarry Smith Level: developer 680ce78bad3SBarry Smith 681ce78bad3SBarry Smith .seealso: `PetscViewer()`, `PETSCVIEWERDRAW`, `PetscViewerDrawGetDrawLG()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetInfo()` 682ce78bad3SBarry Smith @*/ 683ce78bad3SBarry Smith PetscErrorCode PetscViewerMonitorLGSetUp(PetscViewer viewer, const char host[], const char title[], const char metric[], PetscInt l, const char *names[], int x, int y, int m, int n) PeNS 684ce78bad3SBarry Smith { 685ce78bad3SBarry Smith PetscDrawAxis axis; 686ce78bad3SBarry Smith PetscDrawLG lg; 687ce78bad3SBarry Smith 688ce78bad3SBarry Smith PetscFunctionBegin; 689ce78bad3SBarry Smith PetscCall(PetscViewerSetType(viewer, PETSCVIEWERDRAW)); 690ce78bad3SBarry Smith PetscCall(PetscViewerDrawSetInfo(viewer, host, title, x, y, m, n)); 691ce78bad3SBarry Smith PetscCall(PetscViewerDrawGetDrawLG(viewer, 0, &lg)); 692ce78bad3SBarry Smith if (names) PetscCall(PetscDrawLGSetLegend(lg, names)); 693ce78bad3SBarry Smith PetscCall(PetscDrawLGSetFromOptions(lg)); 694ce78bad3SBarry Smith PetscCall(PetscDrawLGGetAxis(lg, &axis)); 695ce78bad3SBarry Smith PetscCall(PetscDrawAxisSetLabels(axis, "Convergence", "Iteration", metric)); 696ce78bad3SBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 697ce78bad3SBarry Smith } 698