xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision c3339decea92175325d9368fa13196bcd0e0e58b)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith /*@
85c6c1daeSBarry Smith    PetscDrawSetViewPort - Sets the portion of the window (page) to which draw
95c6c1daeSBarry Smith    routines will write.
105c6c1daeSBarry Smith 
11*c3339decSBarry Smith    Collective
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith    Input Parameters:
146b867d5aSJose E. Roman +  xl - the horizontal coordinate of the lower left corner of the subwindow.
156b867d5aSJose E. Roman .  yl - the vertical coordinate of the lower left corner of the subwindow.
166b867d5aSJose E. Roman .  xr - the horizontal coordinate of the upper right corner of the subwindow.
176b867d5aSJose E. Roman .  yr - the vertical coordinate of the upper right corner of the subwindow.
186b867d5aSJose E. Roman -  draw - the drawing context
196b867d5aSJose E. Roman 
206b867d5aSJose E. Roman    Notes:
215c6c1daeSBarry Smith    These numbers must always be between 0.0 and 1.0.
22811af0c4SBarry Smith 
235c6c1daeSBarry Smith    Lower left corner is (0,0).
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith    Level: advanced
265c6c1daeSBarry Smith 
27811af0c4SBarry Smith .seealso: `PetscDrawGetViewPort(), ``PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawViewPortsCreate()`
285c6c1daeSBarry Smith @*/
29d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSetViewPort(PetscDraw draw, PetscReal xl, PetscReal yl, PetscReal xr, PetscReal yr)
30d71ae5a4SJacob Faibussowitsch {
315c6c1daeSBarry Smith   PetscFunctionBegin;
325c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
332c71b3e2SJacob 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);
349371c9d4SSatish Balay   draw->port_xl = xl;
359371c9d4SSatish Balay   draw->port_yl = yl;
369371c9d4SSatish Balay   draw->port_xr = xr;
379371c9d4SSatish Balay   draw->port_yr = yr;
38dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr);
395c6c1daeSBarry Smith   PetscFunctionReturn(0);
405c6c1daeSBarry Smith }
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith /*@
435c6c1daeSBarry Smith    PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
445c6c1daeSBarry Smith    routines will write.
455c6c1daeSBarry Smith 
46*c3339decSBarry Smith    Collective
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith    Input Parameter:
495c6c1daeSBarry Smith .  draw - the drawing context
505c6c1daeSBarry Smith 
5197bb3fdcSJose E. Roman    Output Parameters:
526b867d5aSJose E. Roman +  xl - the horizontal coordinate of the lower left corner of the subwindow.
536b867d5aSJose E. Roman .  yl - the vertical coordinate of the lower left corner of the subwindow.
546b867d5aSJose E. Roman .  xr - the horizontal coordinate of the upper right corner of the subwindow.
5597bb3fdcSJose E. Roman -  yr - the vertical coordinate of the upper right corner of the subwindow.
566b867d5aSJose E. Roman 
576b867d5aSJose E. Roman    Notes:
585c6c1daeSBarry Smith    These numbers must always be between 0.0 and 1.0.
59811af0c4SBarry Smith 
605c6c1daeSBarry Smith    Lower left corner is (0,0).
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith    Level: advanced
635c6c1daeSBarry Smith 
64811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`
655c6c1daeSBarry Smith @*/
66d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawGetViewPort(PetscDraw draw, PetscReal *xl, PetscReal *yl, PetscReal *xr, PetscReal *yr)
67d71ae5a4SJacob Faibussowitsch {
685c6c1daeSBarry Smith   PetscFunctionBegin;
695c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
708f69470aSLisandro Dalcin   PetscValidRealPointer(xl, 2);
718f69470aSLisandro Dalcin   PetscValidRealPointer(yl, 3);
728f69470aSLisandro Dalcin   PetscValidRealPointer(xr, 4);
738f69470aSLisandro Dalcin   PetscValidRealPointer(yr, 5);
745c6c1daeSBarry Smith   *xl = draw->port_xl;
755c6c1daeSBarry Smith   *yl = draw->port_yl;
765c6c1daeSBarry Smith   *xr = draw->port_xr;
775c6c1daeSBarry Smith   *yr = draw->port_yr;
785c6c1daeSBarry Smith   PetscFunctionReturn(0);
795c6c1daeSBarry Smith }
805c6c1daeSBarry Smith 
815c6c1daeSBarry Smith /*@
825c6c1daeSBarry Smith    PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
835c6c1daeSBarry Smith    view ports. One for each process.
845c6c1daeSBarry Smith 
85*c3339decSBarry Smith    Collective
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith    Input Parameter:
885c6c1daeSBarry Smith .  draw - the drawing context
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith    Level: advanced
915c6c1daeSBarry Smith 
92db781477SPatrick Sanan .seealso: `PetscDrawDivideViewPort()`, `PetscDrawSetViewPort()`
935c6c1daeSBarry Smith @*/
94d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSplitViewPort(PetscDraw draw)
95d71ae5a4SJacob Faibussowitsch {
965c6c1daeSBarry Smith   PetscMPIInt rank, size;
97369cc0aeSBarry Smith   PetscInt    n;
985c6c1daeSBarry Smith   PetscBool   isnull;
995c6c1daeSBarry Smith   PetscReal   xl, xr, yl, yr, h;
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith   PetscFunctionBegin;
1025c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1039566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
1045c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
1059566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
1069566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size));
1075c6c1daeSBarry Smith 
108369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
109a297a907SKarl Rupp   while (n * n < size) n++;
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith   h  = 1.0 / n;
1125c6c1daeSBarry Smith   xl = (rank % n) * h;
1135c6c1daeSBarry Smith   xr = xl + h;
1145c6c1daeSBarry Smith   yl = (rank / n) * h;
1155c6c1daeSBarry Smith   yr = yl + h;
1165c6c1daeSBarry Smith 
117d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
1189566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xl, yl, xl, yr, PETSC_DRAW_BLACK));
1199566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xl, yr, xr, yr, PETSC_DRAW_BLACK));
1209566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xr, yr, xr, yl, PETSC_DRAW_BLACK));
1219566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw, xr, yl, xl, yl, PETSC_DRAW_BLACK));
122d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
1239566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
1245c6c1daeSBarry Smith 
125e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05 * h;
126e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05 * h;
127e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05 * h;
128e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05 * h;
1295c6c1daeSBarry Smith 
130dbbe0bcdSBarry Smith   PetscTryTypeMethod(draw, setviewport, xl, yl, xr, yr);
1315c6c1daeSBarry Smith   PetscFunctionReturn(0);
1325c6c1daeSBarry Smith }
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith /*@C
135cf79e978SBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1365c6c1daeSBarry Smith 
137*c3339decSBarry Smith    Collective
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith    Input Parameters:
1405c6c1daeSBarry Smith +  draw - the drawing context
1415c6c1daeSBarry Smith -  nports - the number of ports
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith    Output Parameter:
144811af0c4SBarry Smith .  ports - a `PetscDrawViewPorts` context (C structure)
1455c6c1daeSBarry Smith 
146811af0c4SBarry Smith    Options Database Key:
147e1dfdf8eSBarry Smith .  -draw_ports - display multiple fields in the same window with PetscDrawPorts() instead of in separate windows
148cf79e978SBarry Smith 
1495c6c1daeSBarry Smith    Level: advanced
1505c6c1daeSBarry Smith 
151db781477SPatrick Sanan .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()`
1525c6c1daeSBarry Smith @*/
153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsCreate(PetscDraw draw, PetscInt nports, PetscDrawViewPorts **newports)
154d71ae5a4SJacob Faibussowitsch {
155e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1565c6c1daeSBarry Smith   PetscInt            i, n;
1575c6c1daeSBarry Smith   PetscBool           isnull;
158e5ab1681SLisandro Dalcin   PetscMPIInt         rank;
1595c6c1daeSBarry Smith   PetscReal          *xl, *xr, *yl, *yr, h;
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith   PetscFunctionBegin;
1625c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
1632c71b3e2SJacob Faibussowitsch   PetscCheck(nports >= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT, nports);
164e5ab1681SLisandro Dalcin   PetscValidPointer(newports, 3);
1659566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
1669371c9d4SSatish Balay   if (isnull) {
1679371c9d4SSatish Balay     *newports = NULL;
1689371c9d4SSatish Balay     PetscFunctionReturn(0);
1699371c9d4SSatish Balay   }
1709566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
1715c6c1daeSBarry Smith 
1729371c9d4SSatish Balay   PetscCall(PetscNew(&ports));
1739371c9d4SSatish Balay   *newports     = ports;
174e5ab1681SLisandro Dalcin   ports->draw   = draw;
175e5ab1681SLisandro Dalcin   ports->nports = nports;
1769566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
177e5ab1681SLisandro Dalcin   /* save previous drawport of window */
1789566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr));
1795c6c1daeSBarry Smith 
180369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
181a297a907SKarl Rupp   while (n * n < nports) n++;
1825c6c1daeSBarry Smith   h = 1.0 / n;
1835c6c1daeSBarry Smith 
1849566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(n * n, &xl, n * n, &xr, n * n, &yl, n * n, &yr));
185cf79e978SBarry Smith   ports->xl = xl;
186cf79e978SBarry Smith   ports->xr = xr;
187cf79e978SBarry Smith   ports->yl = yl;
188cf79e978SBarry Smith   ports->yr = yr;
189e5ab1681SLisandro Dalcin 
1909566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0));
191d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
1925c6c1daeSBarry Smith   for (i = 0; i < n * n; i++) {
1935c6c1daeSBarry Smith     xl[i] = (i % n) * h;
1945c6c1daeSBarry Smith     xr[i] = xl[i] + h;
1955c6c1daeSBarry Smith     yl[i] = (i / n) * h;
1965c6c1daeSBarry Smith     yr[i] = yl[i] + h;
1975c6c1daeSBarry Smith 
198dd400576SPatrick Sanan     if (rank == 0) {
1999566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xl[i], yl[i], xl[i], yr[i], PETSC_DRAW_BLACK));
2009566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xl[i], yr[i], xr[i], yr[i], PETSC_DRAW_BLACK));
2019566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xr[i], yr[i], xr[i], yl[i], PETSC_DRAW_BLACK));
2029566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, xr[i], yl[i], xl[i], yl[i], PETSC_DRAW_BLACK));
2035c6c1daeSBarry Smith     }
204e5ab1681SLisandro Dalcin 
205e5ab1681SLisandro Dalcin     xl[i] += .05 * h;
206e5ab1681SLisandro Dalcin     xr[i] -= .05 * h;
207e5ab1681SLisandro Dalcin     yl[i] += .05 * h;
208e5ab1681SLisandro Dalcin     yr[i] -= .05 * h;
209e5ab1681SLisandro Dalcin   }
210d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2119566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2125c6c1daeSBarry Smith   PetscFunctionReturn(0);
2135c6c1daeSBarry Smith }
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith /*@C
2165c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2175c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2185c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2195c6c1daeSBarry Smith 
220*c3339decSBarry Smith    Collective
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith    Input Parameters:
2235c6c1daeSBarry Smith +  draw - the drawing context
2245c6c1daeSBarry Smith .  nx - the number of x divisions
2255c6c1daeSBarry Smith -  ny - the number of y divisions
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith    Output Parameter:
228811af0c4SBarry Smith .  ports - a `PetscDrawViewPorts` context (C structure)
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith    Level: advanced
2315c6c1daeSBarry Smith 
232811af0c4SBarry Smith .seealso: `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPorts`
2335c6c1daeSBarry Smith @*/
234d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsCreateRect(PetscDraw draw, PetscInt nx, PetscInt ny, PetscDrawViewPorts **newports)
235d71ae5a4SJacob Faibussowitsch {
236e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2375c6c1daeSBarry Smith   PetscReal          *xl, *xr, *yl, *yr, hx, hy;
238e5ab1681SLisandro Dalcin   PetscInt            i, j, k, n;
2395c6c1daeSBarry Smith   PetscBool           isnull;
240e5ab1681SLisandro Dalcin   PetscMPIInt         rank;
2415c6c1daeSBarry Smith 
2425c6c1daeSBarry Smith   PetscFunctionBegin;
2435c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
2442c71b3e2SJacob 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);
245064a246eSJacob Faibussowitsch   PetscValidPointer(newports, 4);
2469566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw, &isnull));
2479371c9d4SSatish Balay   if (isnull) {
2489371c9d4SSatish Balay     *newports = NULL;
2499371c9d4SSatish Balay     PetscFunctionReturn(0);
2509371c9d4SSatish Balay   }
2519566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw), &rank));
252e118a51fSLisandro Dalcin 
2535c6c1daeSBarry Smith   n  = nx * ny;
2545c6c1daeSBarry Smith   hx = 1.0 / nx;
2555c6c1daeSBarry Smith   hy = 1.0 / ny;
2569371c9d4SSatish Balay   PetscCall(PetscNew(&ports));
2579371c9d4SSatish Balay   *newports     = ports;
258e5ab1681SLisandro Dalcin   ports->draw   = draw;
259e5ab1681SLisandro Dalcin   ports->nports = n;
2609566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
261e5ab1681SLisandro Dalcin   /* save previous drawport of window */
2629566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetViewPort(draw, &ports->port_xl, &ports->port_yl, &ports->port_xr, &ports->port_yr));
263e5ab1681SLisandro Dalcin 
2649566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(n, &xl, n, &xr, n, &yl, n, &yr));
265cf79e978SBarry Smith   ports->xr = xr;
266cf79e978SBarry Smith   ports->xl = xl;
267cf79e978SBarry Smith   ports->yl = yl;
268cf79e978SBarry Smith   ports->yr = yr;
269e5ab1681SLisandro Dalcin 
2709566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw, 0.0, 0.0, 1.0, 1.0));
271d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
2725c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2735c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
274e5ab1681SLisandro Dalcin       k = j * nx + i;
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith       xl[k] = i * hx;
2775c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2785c6c1daeSBarry Smith       yl[k] = j * hy;
2795c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2805c6c1daeSBarry Smith 
281dd400576SPatrick Sanan       if (rank == 0) {
2829566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xl[k], yl[k], xl[k], yr[k], PETSC_DRAW_BLACK));
2839566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xl[k], yr[k], xr[k], yr[k], PETSC_DRAW_BLACK));
2849566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xr[k], yr[k], xr[k], yl[k], PETSC_DRAW_BLACK));
2859566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, xr[k], yl[k], xl[k], yl[k], PETSC_DRAW_BLACK));
286e5ab1681SLisandro Dalcin       }
2875c6c1daeSBarry Smith 
288e5ab1681SLisandro Dalcin       xl[k] += .05 * hx;
289e5ab1681SLisandro Dalcin       xr[k] -= .05 * hx;
290e5ab1681SLisandro Dalcin       yl[k] += .05 * hy;
291e5ab1681SLisandro Dalcin       yr[k] -= .05 * hy;
2925c6c1daeSBarry Smith     }
2935c6c1daeSBarry Smith   }
294d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2959566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2965c6c1daeSBarry Smith   PetscFunctionReturn(0);
2975c6c1daeSBarry Smith }
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith /*@C
300811af0c4SBarry Smith    PetscDrawViewPortsDestroy - frees a `PetscDrawViewPorts` object
3015c6c1daeSBarry Smith 
302811af0c4SBarry Smith    Collective on the PetscDraw inside ports
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith    Input Parameter:
305811af0c4SBarry Smith .  ports - the `PetscDrawViewPorts` object
3065c6c1daeSBarry Smith 
3075c6c1daeSBarry Smith    Level: advanced
3085c6c1daeSBarry Smith 
309811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsSet()`, `PetscDrawViewPortsCreate()`
3105c6c1daeSBarry Smith @*/
311d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
312d71ae5a4SJacob Faibussowitsch {
3135c6c1daeSBarry Smith   PetscFunctionBegin;
3145c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3158f69470aSLisandro Dalcin   PetscValidPointer(ports, 1);
3165c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3179566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetViewPort(ports->draw, ports->port_xl, ports->port_yl, ports->port_xr, ports->port_yr));
3189566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&ports->draw));
3199566063dSJacob Faibussowitsch   PetscCall(PetscFree4(ports->xl, ports->xr, ports->yl, ports->yr));
3209566063dSJacob Faibussowitsch   PetscCall(PetscFree(ports));
3215c6c1daeSBarry Smith   PetscFunctionReturn(0);
3225c6c1daeSBarry Smith }
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith /*@C
3255c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3265c6c1daeSBarry Smith 
327811af0c4SBarry Smith    Logically Collective on the `PetscDraw` inside ports
3285c6c1daeSBarry Smith 
329d8d19677SJose E. Roman    Input Parameters:
330811af0c4SBarry Smith +  ports - the `PetscDrawViewPorts` object
3315c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3325c6c1daeSBarry Smith 
3335c6c1daeSBarry Smith    Level: advanced
3345c6c1daeSBarry Smith 
335811af0c4SBarry Smith .seealso: `PetscDrawViewPorts`, `PetscDrawSplitViewPort()`, `PetscDrawSetViewPort()`, `PetscDrawViewPortsDestroy()`, `PetscDrawViewPortsCreate()`
3365c6c1daeSBarry Smith @*/
337d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawViewPortsSet(PetscDrawViewPorts *ports, PetscInt port)
338d71ae5a4SJacob Faibussowitsch {
3395c6c1daeSBarry Smith   PetscFunctionBegin;
3408f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
34145f3bb6eSLisandro Dalcin   PetscValidPointer(ports, 1);
3422c71b3e2SJacob 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);
3439566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetViewPort(ports->draw, ports->xl[port], ports->yl[port], ports->xr[port], ports->yr[port]));
3445c6c1daeSBarry Smith   PetscFunctionReturn(0);
3455c6c1daeSBarry Smith }
346