xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision 09b68a49ed2854d1e4985cc2aa6af33c7c4e69b3)
1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith /*@
45c6c1daeSBarry Smith   PetscDrawSetViewPort - Sets the portion of the window (page) to which draw
55c6c1daeSBarry Smith   routines will write.
65c6c1daeSBarry Smith 
7c3339decSBarry Smith   Collective
85c6c1daeSBarry Smith 
95c6c1daeSBarry Smith   Input Parameters:
106b867d5aSJose E. Roman + xl   - the horizontal coordinate of the lower left corner of the subwindow.
116b867d5aSJose E. Roman . yl   - the vertical coordinate of the lower left corner of the subwindow.
126b867d5aSJose E. Roman . xr   - the horizontal coordinate of the upper right corner of the subwindow.
136b867d5aSJose E. Roman . yr   - the vertical coordinate of the upper right corner of the subwindow.
146b867d5aSJose E. Roman - draw - the drawing context
156b867d5aSJose E. Roman 
162fe279fdSBarry Smith   Level: advanced
172fe279fdSBarry Smith 
186b867d5aSJose E. Roman   Notes:
195c6c1daeSBarry Smith   These numbers must always be between 0.0 and 1.0.
20811af0c4SBarry Smith 
215c6c1daeSBarry Smith   Lower left corner is (0,0).
225c6c1daeSBarry Smith 
2376fbde31SPierre Jolivet .seealso: `PetscDrawGetViewPort()`, `PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawViewPortsCreate()`
245c6c1daeSBarry Smith @*/
PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)25d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetViewPort(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr)
26d71ae5a4SJacob Faibussowitsch {
275c6c1daeSBarry Smith   PetscFunctionBegin;
285c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
292c71b3e2SJacob Faibussowitsch   PetscCheck(xl >= 0.0 && xr <= 1.0 && yl >= 0.0 && yr <= 1.0 && xr > xl && yr > yl, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "ViewPort values must be >= 0 and <= 1: Instead %g %g %g %g", (double)xl, (double)yl, (double)xr, (double)yr);
309371c9d4SSatish Balay   draw->port_xl = xl;
319371c9d4SSatish Balay   draw->port_yl = yl;
329371c9d4SSatish Balay   draw->port_xr = xr;
339371c9d4SSatish Balay   draw->port_yr = yr;
34dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr);
353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
365c6c1daeSBarry Smith }
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith /*@
395c6c1daeSBarry Smith   PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
405c6c1daeSBarry Smith   routines will write.
415c6c1daeSBarry Smith 
42c3339decSBarry Smith   Collective
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith   Input Parameter:
455c6c1daeSBarry Smith . draw - the drawing context
465c6c1daeSBarry Smith 
4797bb3fdcSJose E. Roman   Output Parameters:
486b867d5aSJose E. Roman + xl - the horizontal coordinate of the lower left corner of the subwindow.
496b867d5aSJose E. Roman . yl - the vertical coordinate of the lower left corner of the subwindow.
506b867d5aSJose E. Roman . xr - the horizontal coordinate of the upper right corner of the subwindow.
5197bb3fdcSJose E. Roman - yr - the vertical coordinate of the upper right corner of the subwindow.
526b867d5aSJose E. Roman 
532fe279fdSBarry Smith   Level: advanced
542fe279fdSBarry Smith 
556b867d5aSJose E. Roman   Notes:
565c6c1daeSBarry Smith   These numbers must always be between 0.0 and 1.0.
57811af0c4SBarry Smith 
585c6c1daeSBarry Smith   Lower left corner is (0,0).
595c6c1daeSBarry Smith 
60811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`
615c6c1daeSBarry Smith @*/
PetscDrawGetViewPort(PetscDraw draw,PetscReal * xl,PetscReal * yl,PetscReal * xr,PetscReal * yr)62d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetViewPort(PetscDraw draw, PetscReal *xl, PetscReal *yl, PetscReal *xr, PetscReal *yr)
63d71ae5a4SJacob Faibussowitsch {
645c6c1daeSBarry Smith   PetscFunctionBegin;
655c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
664f572ea9SToby Isaac   PetscAssertPointer(xl, 2);
674f572ea9SToby Isaac   PetscAssertPointer(yl, 3);
684f572ea9SToby Isaac   PetscAssertPointer(xr, 4);
694f572ea9SToby Isaac   PetscAssertPointer(yr, 5);
705c6c1daeSBarry Smith   *xl = draw->port_xl;
715c6c1daeSBarry Smith   *yl = draw->port_yl;
725c6c1daeSBarry Smith   *xr = draw->port_xr;
735c6c1daeSBarry Smith   *yr = draw->port_yr;
743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith /*@
785c6c1daeSBarry Smith   PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
795c6c1daeSBarry Smith   view ports. One for each process.
805c6c1daeSBarry Smith 
81c3339decSBarry Smith   Collective
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith   Input Parameter:
845c6c1daeSBarry Smith . draw - the drawing context
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith   Level: advanced
875c6c1daeSBarry Smith 
88db781477SPatrick Sanan .seealso: `PetscDrawDivideViewPort()`, `PetscDrawSetViewPort()`
895c6c1daeSBarry Smith @*/
PetscDrawSplitViewPort(PetscDraw draw)90d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSplitViewPort(PetscDraw draw)
91d71ae5a4SJacob Faibussowitsch {
925c6c1daeSBarry Smith   PetscMPIInt rank, size;
93369cc0aeSBarry Smith   PetscInt    n;
945c6c1daeSBarry Smith   PetscBool   isnull;
955c6c1daeSBarry Smith   PetscReal   xl, xr, yl, yr, h;
965c6c1daeSBarry Smith 
975c6c1daeSBarry Smith   PetscFunctionBegin;
985c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
999566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
1003ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
1019566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
1029566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
1035c6c1daeSBarry Smith 
104369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
105a297a907SKarl Rupp   while (n * n < size) n++;
1065c6c1daeSBarry Smith 
1076497c311SBarry Smith   h  = 1.0 / (PetscReal)n;
1086497c311SBarry Smith   xl = ((PetscReal)(rank % n)) * h;
1095c6c1daeSBarry Smith   xr = xl + h;
1106497c311SBarry Smith   yl = ((PetscReal)(rank / n)) * h;
1115c6c1daeSBarry Smith   yr = yl + h;
1125c6c1daeSBarry Smith 
113d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
1149566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xl, yl, xl, yr, PETSC_DRAW_BLACK));
1159566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xl, yr, xr, yr, PETSC_DRAW_BLACK));
1169566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xr, yr, xr, yl, PETSC_DRAW_BLACK));
1179566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xr, yl, xl, yl, PETSC_DRAW_BLACK));
118d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
1199566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
1205c6c1daeSBarry Smith 
121e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05 * h;
122e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05 * h;
123e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05 * h;
124e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05 * h;
1255c6c1daeSBarry Smith 
126dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr);
1273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1285c6c1daeSBarry Smith }
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith /*@C
131cf79e978SBarry Smith   PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1325c6c1daeSBarry Smith 
133c3339decSBarry Smith   Collective
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith   Input Parameters:
1365c6c1daeSBarry Smith + draw   - the drawing context
1375c6c1daeSBarry Smith - nports - the number of ports
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith   Output Parameter:
140aec76313SJacob Faibussowitsch . newports - a `PetscDrawViewPorts` context (C structure)
1415c6c1daeSBarry Smith 
142811af0c4SBarry Smith   Options Database Key:
143e1dfdf8eSBarry Smith . -draw_ports - display multiple fields in the same window with PetscDrawPorts() instead of in separate windows
144cf79e978SBarry Smith 
1455c6c1daeSBarry Smith   Level: advanced
1465c6c1daeSBarry Smith 
147cc4c1da9SBarry Smith   Fortran Note:
148cc4c1da9SBarry Smith   No Fortran support since `PetscDrawViewPorts` is a C struct
149cc4c1da9SBarry Smith 
150db781477SPatrick Sanan .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()`
1515c6c1daeSBarry Smith @*/
PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts * newports[])1525d83a8b1SBarry Smith PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw, PetscInt nports, PetscDrawViewPorts *newports[])
153d71ae5a4SJacob Faibussowitsch {
154e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1555c6c1daeSBarry Smith   PetscInt            i, n;
1565c6c1daeSBarry Smith   PetscBool           isnull;
157e5ab1681SLisandro Dalcin   PetscMPIInt         rank;
1585c6c1daeSBarry Smith   PetscReal          *xl, *xr, *yl, *yr, h;
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith   PetscFunctionBegin;
1615c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1622c71b3e2SJacob Faibussowitsch   PetscCheck(nports >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT, nports);
1634f572ea9SToby Isaac   PetscAssertPointer(newports, 3);
1649566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
1659371c9d4SSatish Balay   if (isnull) {
1669371c9d4SSatish Balay     *newports = NULL;
1673ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
1689371c9d4SSatish Balay   }
1699566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
1705c6c1daeSBarry Smith 
1719371c9d4SSatish Balay   PetscCall(PetscNew(&ports));
1729371c9d4SSatish Balay   *newports     = ports;
173e5ab1681SLisandro Dalcin   ports->draw   = draw;
174e5ab1681SLisandro Dalcin   ports->nports = nports;
1759566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
176e5ab1681SLisandro Dalcin   /* save previous drawport of window */
1779566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr));
1785c6c1daeSBarry Smith 
179369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
180a297a907SKarl Rupp   while (n * n < nports) n++;
1816497c311SBarry Smith   h = 1.0 / (PetscReal)n;
1825c6c1daeSBarry Smith 
1839566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(n * n, &xl, n * n, &xr, n * n, &yl, n * n, &yr));
184cf79e978SBarry Smith   ports->xl = xl;
185cf79e978SBarry Smith   ports->xr = xr;
186cf79e978SBarry Smith   ports->yl = yl;
187cf79e978SBarry Smith   ports->yr = yr;
188e5ab1681SLisandro Dalcin 
1899566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0));
190d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
1915c6c1daeSBarry Smith   for (i = 0; i < n * n; i++) {
1926497c311SBarry Smith     xl[i] = ((PetscReal)(i % n)) * h;
1935c6c1daeSBarry Smith     xr[i] = xl[i] + h;
1946497c311SBarry Smith     yl[i] = ((PetscReal)(i / n)) * h;
1955c6c1daeSBarry Smith     yr[i] = yl[i] + h;
1965c6c1daeSBarry Smith 
197dd400576SPatrick Sanan     if (rank == 0) {
1989566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xl[i], yl[i], xl[i], yr[i], PETSC_DRAW_BLACK));
1999566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xl[i], yr[i], xr[i], yr[i], PETSC_DRAW_BLACK));
2009566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xr[i], yr[i], xr[i], yl[i], PETSC_DRAW_BLACK));
2019566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xr[i], yl[i], xl[i], yl[i], PETSC_DRAW_BLACK));
2025c6c1daeSBarry Smith     }
203e5ab1681SLisandro Dalcin 
204e5ab1681SLisandro Dalcin     xl[i] += .05 * h;
205e5ab1681SLisandro Dalcin     xr[i] -= .05 * h;
206e5ab1681SLisandro Dalcin     yl[i] += .05 * h;
207e5ab1681SLisandro Dalcin     yr[i] -= .05 * h;
208e5ab1681SLisandro Dalcin   }
209d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2109566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2125c6c1daeSBarry Smith }
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith /*@C
2155c6c1daeSBarry Smith   PetscDrawViewPortsCreateRect - Splits a window into smaller
2165c6c1daeSBarry Smith   view ports. Each processor shares all the viewports. The number
2175c6c1daeSBarry Smith   of views in the x- and y-directions is specified.
2185c6c1daeSBarry Smith 
219c3339decSBarry Smith   Collective
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith   Input Parameters:
2225c6c1daeSBarry Smith + draw - the drawing context
2235c6c1daeSBarry Smith . nx   - the number of x divisions
2245c6c1daeSBarry Smith - ny   - the number of y divisions
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith   Output Parameter:
227aec76313SJacob Faibussowitsch . newports - a `PetscDrawViewPorts` context (C structure)
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith   Level: advanced
2305c6c1daeSBarry Smith 
231cc4c1da9SBarry Smith   Fortran Note:
232*feaf08eaSBarry Smith   No Fortran support
233cc4c1da9SBarry Smith 
234811af0c4SBarry Smith .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPorts`
2355c6c1daeSBarry Smith @*/
PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts * newports[])2365d83a8b1SBarry Smith PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw, PetscInt nx, PetscInt ny, PetscDrawViewPorts *newports[])
237d71ae5a4SJacob Faibussowitsch {
238e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2395c6c1daeSBarry Smith   PetscReal          *xl, *xr, *yl, *yr, hx, hy;
240e5ab1681SLisandro Dalcin   PetscInt            i, j, k, n;
2415c6c1daeSBarry Smith   PetscBool           isnull;
242e5ab1681SLisandro Dalcin   PetscMPIInt         rank;
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith   PetscFunctionBegin;
2455c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2462c71b3e2SJacob Faibussowitsch   PetscCheck(nx >= 1 && ny >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT " x %" PetscInt_FMT, nx, ny);
2474f572ea9SToby Isaac   PetscAssertPointer(newports, 4);
2489566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
2499371c9d4SSatish Balay   if (isnull) {
2509371c9d4SSatish Balay     *newports = NULL;
2513ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
2529371c9d4SSatish Balay   }
2539566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
254e118a51fSLisandro Dalcin 
2555c6c1daeSBarry Smith   n  = nx * ny;
2566497c311SBarry Smith   hx = 1.0 / (PetscReal)nx;
2576497c311SBarry Smith   hy = 1.0 / (PetscReal)ny;
2589371c9d4SSatish Balay   PetscCall(PetscNew(&ports));
2599371c9d4SSatish Balay   *newports     = ports;
260e5ab1681SLisandro Dalcin   ports->draw   = draw;
261e5ab1681SLisandro Dalcin   ports->nports = n;
2629566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
263e5ab1681SLisandro Dalcin   /* save previous drawport of window */
2649566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr));
265e5ab1681SLisandro Dalcin 
2669566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(n, &xl, n, &xr, n, &yl, n, &yr));
267cf79e978SBarry Smith   ports->xr = xr;
268cf79e978SBarry Smith   ports->xl = xl;
269cf79e978SBarry Smith   ports->yl = yl;
270cf79e978SBarry Smith   ports->yr = yr;
271e5ab1681SLisandro Dalcin 
2729566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0));
273d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
2745c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2755c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
276e5ab1681SLisandro Dalcin       k = j * nx + i;
2775c6c1daeSBarry Smith 
2786497c311SBarry Smith       xl[k] = ((PetscReal)i) * hx;
2795c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2806497c311SBarry Smith       yl[k] = ((PetscReal)j) * hy;
2815c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2825c6c1daeSBarry Smith 
283dd400576SPatrick Sanan       if (rank == 0) {
2849566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xl[k], yl[k], xl[k], yr[k], PETSC_DRAW_BLACK));
2859566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xl[k], yr[k], xr[k], yr[k], PETSC_DRAW_BLACK));
2869566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xr[k], yr[k], xr[k], yl[k], PETSC_DRAW_BLACK));
2879566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xr[k], yl[k], xl[k], yl[k], PETSC_DRAW_BLACK));
288e5ab1681SLisandro Dalcin       }
2895c6c1daeSBarry Smith 
290e5ab1681SLisandro Dalcin       xl[k] += .05 * hx;
291e5ab1681SLisandro Dalcin       xr[k] -= .05 * hx;
292e5ab1681SLisandro Dalcin       yl[k] += .05 * hy;
293e5ab1681SLisandro Dalcin       yr[k] -= .05 * hy;
2945c6c1daeSBarry Smith     }
2955c6c1daeSBarry Smith   }
296d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2979566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2995c6c1daeSBarry Smith }
3005c6c1daeSBarry Smith 
3015c6c1daeSBarry Smith /*@C
302811af0c4SBarry Smith   PetscDrawViewPortsDestroy - frees a `PetscDrawViewPorts` object
3035c6c1daeSBarry Smith 
3048f14a041SBarry Smith   Collective on the `PetscDraw` inside `ports`
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith   Input Parameter:
307811af0c4SBarry Smith . ports - the `PetscDrawViewPorts` object
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith   Level: advanced
3105c6c1daeSBarry Smith 
311cc4c1da9SBarry Smith   Fortran Note:
312*feaf08eaSBarry Smith   No Fortran support
313cc4c1da9SBarry Smith 
314811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsCreate()`
3155c6c1daeSBarry Smith @*/
PetscDrawViewPortsDestroy(PetscDrawViewPorts * ports)316d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
317d71ae5a4SJacob Faibussowitsch {
3185c6c1daeSBarry Smith   PetscFunctionBegin;
3193ba16761SJacob Faibussowitsch   if (!ports) PetscFunctionReturn(PETSC_SUCCESS);
3204f572ea9SToby Isaac   PetscAssertPointer(ports, 1);
3215c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3229566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetViewPort(ports->draw, ports->port_xl, ports->port_yl, ports->port_xr, ports->port_yr));
3239566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&ports->draw));
3249566063dSJacob Faibussowitsch   PetscCall(PetscFree4(ports->xl, ports->xr, ports->yl, ports->yr));
3259566063dSJacob Faibussowitsch   PetscCall(PetscFree(ports));
3263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3275c6c1daeSBarry Smith }
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith /*@C
3305c6c1daeSBarry Smith   PetscDrawViewPortsSet - sets a draw object to use a particular subport
3315c6c1daeSBarry Smith 
3328f14a041SBarry Smith   Logically Collective on the `PetscDraw` inside `ports`
3335c6c1daeSBarry Smith 
334d8d19677SJose E. Roman   Input Parameters:
335811af0c4SBarry Smith + ports - the `PetscDrawViewPorts` object
3365c6c1daeSBarry Smith - port  - the port number, from 0 to nports-1
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith   Level: advanced
3395c6c1daeSBarry Smith 
340cc4c1da9SBarry Smith   Fortran Note:
341*feaf08eaSBarry Smith   No Fortran support
342cc4c1da9SBarry Smith 
343811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPortsCreate()`
3445c6c1daeSBarry Smith @*/
PetscDrawViewPortsSet(PetscDrawViewPorts * ports,PetscInt port)345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *ports, PetscInt port)
346d71ae5a4SJacob Faibussowitsch {
3475c6c1daeSBarry Smith   PetscFunctionBegin;
3483ba16761SJacob Faibussowitsch   if (!ports) PetscFunctionReturn(PETSC_SUCCESS);
3494f572ea9SToby Isaac   PetscAssertPointer(ports, 1);
3502c71b3e2SJacob Faibussowitsch   PetscCheck(port >= 0 && (port <= ports->nports - 1), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Port is out of range requested %" PetscInt_FMT " from 0 to %" PetscInt_FMT, port, ports->nports - 1);
3519566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetViewPort(ports->draw, ports->xl[port], ports->yl[port], ports->xr[port], ports->yr[port]));
3523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3535c6c1daeSBarry Smith }
354