xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision d0609ced746bc51b019815ca91d747429db24893)
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 
115c6c1daeSBarry Smith    Collective on PetscDraw
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.
225c6c1daeSBarry Smith    Lower left corner is (0,0).
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith    Level: advanced
255c6c1daeSBarry Smith 
265c6c1daeSBarry Smith @*/
275c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
285c6c1daeSBarry Smith {
295c6c1daeSBarry Smith   PetscFunctionBegin;
305c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
312c71b3e2SJacob 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);
325c6c1daeSBarry Smith   draw->port_xl = xl; draw->port_yl = yl;
335c6c1daeSBarry Smith   draw->port_xr = xr; draw->port_yr = yr;
345c6c1daeSBarry Smith   if (draw->ops->setviewport) {
359566063dSJacob Faibussowitsch     PetscCall((*draw->ops->setviewport)(draw,xl,yl,xr,yr));
365c6c1daeSBarry Smith   }
375c6c1daeSBarry Smith   PetscFunctionReturn(0);
385c6c1daeSBarry Smith }
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith /*@
415c6c1daeSBarry Smith    PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
425c6c1daeSBarry Smith    routines will write.
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith    Collective on PetscDraw
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Input Parameter:
475c6c1daeSBarry Smith .  draw - the drawing context
485c6c1daeSBarry Smith 
4997bb3fdcSJose E. Roman    Output Parameters:
506b867d5aSJose E. Roman +  xl - the horizontal coordinate of the lower left corner of the subwindow.
516b867d5aSJose E. Roman .  yl - the vertical coordinate of the lower left corner of the subwindow.
526b867d5aSJose E. Roman .  xr - the horizontal coordinate of the upper right corner of the subwindow.
5397bb3fdcSJose E. Roman -  yr - the vertical coordinate of the upper right corner of the subwindow.
546b867d5aSJose E. Roman 
556b867d5aSJose E. Roman    Notes:
565c6c1daeSBarry Smith    These numbers must always be between 0.0 and 1.0.
575c6c1daeSBarry Smith    Lower left corner is (0,0).
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith    Level: advanced
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith @*/
625c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
635c6c1daeSBarry Smith {
645c6c1daeSBarry Smith   PetscFunctionBegin;
655c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
668f69470aSLisandro Dalcin   PetscValidRealPointer(xl,2);
678f69470aSLisandro Dalcin   PetscValidRealPointer(yl,3);
688f69470aSLisandro Dalcin   PetscValidRealPointer(xr,4);
698f69470aSLisandro Dalcin   PetscValidRealPointer(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;
745c6c1daeSBarry Smith   PetscFunctionReturn(0);
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 
815c6c1daeSBarry Smith    Collective on PetscDraw
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith    Input Parameter:
845c6c1daeSBarry Smith .  draw - the drawing context
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith    Level: advanced
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort()
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith @*/
915c6c1daeSBarry Smith PetscErrorCode  PetscDrawSplitViewPort(PetscDraw draw)
925c6c1daeSBarry Smith {
935c6c1daeSBarry Smith   PetscMPIInt    rank,size;
94369cc0aeSBarry Smith   PetscInt       n;
955c6c1daeSBarry Smith   PetscBool      isnull;
965c6c1daeSBarry Smith   PetscReal      xl,xr,yl,yr,h;
975c6c1daeSBarry Smith 
985c6c1daeSBarry Smith   PetscFunctionBegin;
995c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1009566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw,&isnull));
1015c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
1029566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank));
1039566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size));
1045c6c1daeSBarry Smith 
105369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
106a297a907SKarl Rupp   while (n*n < size) n++;
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   h  = 1.0/n;
1095c6c1daeSBarry Smith   xl = (rank % n)*h;
1105c6c1daeSBarry Smith   xr = xl + h;
1115c6c1daeSBarry Smith   yl = (rank / n)*h;
1125c6c1daeSBarry Smith   yr = yl + h;
1135c6c1daeSBarry Smith 
114*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
1159566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK));
1169566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK));
1179566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK));
1189566063dSJacob Faibussowitsch   PetscCall(PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK));
119*d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
1209566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
1215c6c1daeSBarry Smith 
122e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05*h;
123e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05*h;
124e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05*h;
125e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05*h;
1265c6c1daeSBarry Smith 
1279566063dSJacob Faibussowitsch   if (draw->ops->setviewport) PetscCall((*draw->ops->setviewport)(draw,xl,yl,xr,yr));
1285c6c1daeSBarry Smith   PetscFunctionReturn(0);
1295c6c1daeSBarry Smith }
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith /*@C
132cf79e978SBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith    Collective on PetscDraw
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith    Input Parameters:
1375c6c1daeSBarry Smith +  draw - the drawing context
1385c6c1daeSBarry Smith -  nports - the number of ports
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith    Output Parameter:
1415c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
1425c6c1daeSBarry Smith 
143cf79e978SBarry Smith    Options Database:
144e1dfdf8eSBarry Smith .  -draw_ports - display multiple fields in the same window with PetscDrawPorts() instead of in separate windows
145cf79e978SBarry Smith 
1465c6c1daeSBarry Smith    Level: advanced
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith @*/
151e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports)
1525c6c1daeSBarry Smith {
153e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1545c6c1daeSBarry Smith   PetscInt           i,n;
1555c6c1daeSBarry Smith   PetscBool          isnull;
156e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
1575c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,h;
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith   PetscFunctionBegin;
1605c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1612c71b3e2SJacob Faibussowitsch   PetscCheck(nports >= 1,PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %" PetscInt_FMT, nports);
162e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
1639566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw,&isnull));
164e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
1659566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank));
1665c6c1daeSBarry Smith 
1679566063dSJacob Faibussowitsch   PetscCall(PetscNew(&ports)); *newports = ports;
168e5ab1681SLisandro Dalcin   ports->draw = draw;
169e5ab1681SLisandro Dalcin   ports->nports = nports;
1709566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
171e5ab1681SLisandro Dalcin   /* save previous drawport of window */
1729566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr));
1735c6c1daeSBarry Smith 
174369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
175a297a907SKarl Rupp   while (n*n < nports) n++;
1765c6c1daeSBarry Smith   h = 1.0/n;
1775c6c1daeSBarry Smith 
1789566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr));
179cf79e978SBarry Smith   ports->xl = xl;
180cf79e978SBarry Smith   ports->xr = xr;
181cf79e978SBarry Smith   ports->yl = yl;
182cf79e978SBarry Smith   ports->yr = yr;
183e5ab1681SLisandro Dalcin 
1849566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0));
185*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
1865c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
1875c6c1daeSBarry Smith     xl[i] = (i % n)*h;
1885c6c1daeSBarry Smith     xr[i] = xl[i] + h;
1895c6c1daeSBarry Smith     yl[i] = (i / n)*h;
1905c6c1daeSBarry Smith     yr[i] = yl[i] + h;
1915c6c1daeSBarry Smith 
192dd400576SPatrick Sanan     if (rank == 0) {
1939566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK));
1949566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK));
1959566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK));
1969566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK));
1975c6c1daeSBarry Smith     }
198e5ab1681SLisandro Dalcin 
199e5ab1681SLisandro Dalcin     xl[i] += .05*h;
200e5ab1681SLisandro Dalcin     xr[i] -= .05*h;
201e5ab1681SLisandro Dalcin     yl[i] += .05*h;
202e5ab1681SLisandro Dalcin     yr[i] -= .05*h;
203e5ab1681SLisandro Dalcin   }
204*d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2059566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2065c6c1daeSBarry Smith   PetscFunctionReturn(0);
2075c6c1daeSBarry Smith }
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith /*@C
2105c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2115c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2125c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith    Collective on PetscDraw
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith    Input Parameters:
2175c6c1daeSBarry Smith +  draw - the drawing context
2185c6c1daeSBarry Smith .  nx - the number of x divisions
2195c6c1daeSBarry Smith -  ny - the number of y divisions
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith    Output Parameter:
2225c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith    Level: advanced
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith @*/
229e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports)
2305c6c1daeSBarry Smith {
231e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2325c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,hx,hy;
233e5ab1681SLisandro Dalcin   PetscInt           i,j,k,n;
2345c6c1daeSBarry Smith   PetscBool          isnull;
235e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith   PetscFunctionBegin;
2385c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2392c71b3e2SJacob 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);
240064a246eSJacob Faibussowitsch   PetscValidPointer(newports,4);
2419566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(draw,&isnull));
242e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
2439566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank));
244e118a51fSLisandro Dalcin 
2455c6c1daeSBarry Smith   n  = nx*ny;
2465c6c1daeSBarry Smith   hx = 1.0/nx;
2475c6c1daeSBarry Smith   hy = 1.0/ny;
2489566063dSJacob Faibussowitsch   PetscCall(PetscNew(&ports)); *newports = ports;
249e5ab1681SLisandro Dalcin   ports->draw = draw;
250e5ab1681SLisandro Dalcin   ports->nports = n;
2519566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject) draw));
252e5ab1681SLisandro Dalcin   /* save previous drawport of window */
2539566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr));
254e5ab1681SLisandro Dalcin 
2559566063dSJacob Faibussowitsch   PetscCall(PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr));
256cf79e978SBarry Smith   ports->xr = xr;
257cf79e978SBarry Smith   ports->xl = xl;
258cf79e978SBarry Smith   ports->yl = yl;
259cf79e978SBarry Smith   ports->yr = yr;
260e5ab1681SLisandro Dalcin 
2619566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0));
262*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
2635c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2645c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
265e5ab1681SLisandro Dalcin       k = j*nx+i;
2665c6c1daeSBarry Smith 
2675c6c1daeSBarry Smith       xl[k] = i*hx;
2685c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2695c6c1daeSBarry Smith       yl[k] = j*hy;
2705c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2715c6c1daeSBarry Smith 
272dd400576SPatrick Sanan       if (rank == 0) {
2739566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK));
2749566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK));
2759566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK));
2769566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK));
277e5ab1681SLisandro Dalcin       }
2785c6c1daeSBarry Smith 
279e5ab1681SLisandro Dalcin       xl[k] += .05*hx;
280e5ab1681SLisandro Dalcin       xr[k] -= .05*hx;
281e5ab1681SLisandro Dalcin       yl[k] += .05*hy;
282e5ab1681SLisandro Dalcin       yr[k] -= .05*hy;
2835c6c1daeSBarry Smith     }
2845c6c1daeSBarry Smith   }
285*d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2869566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2875c6c1daeSBarry Smith   PetscFunctionReturn(0);
2885c6c1daeSBarry Smith }
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith /*@C
2915c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
2945c6c1daeSBarry Smith 
2955c6c1daeSBarry Smith    Input Parameter:
2965c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
2975c6c1daeSBarry Smith 
2985c6c1daeSBarry Smith    Level: advanced
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith @*/
3035c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
3045c6c1daeSBarry Smith {
3055c6c1daeSBarry Smith   PetscFunctionBegin;
3065c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3078f69470aSLisandro Dalcin   PetscValidPointer(ports,1);
3085c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3099566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr));
3109566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&ports->draw));
3119566063dSJacob Faibussowitsch   PetscCall(PetscFree4(ports->xl,ports->xr,ports->yl,ports->yr));
3129566063dSJacob Faibussowitsch   PetscCall(PetscFree(ports));
3135c6c1daeSBarry Smith   PetscFunctionReturn(0);
3145c6c1daeSBarry Smith }
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith /*@C
3175c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
3205c6c1daeSBarry Smith 
321d8d19677SJose E. Roman    Input Parameters:
3225c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
3235c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith    Level: advanced
3265c6c1daeSBarry Smith 
3275c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith @*/
3305c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
3315c6c1daeSBarry Smith {
3325c6c1daeSBarry Smith   PetscFunctionBegin;
3338f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
33445f3bb6eSLisandro Dalcin   PetscValidPointer(ports,1);
3352c71b3e2SJacob 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);
3369566063dSJacob Faibussowitsch   PetscCall(PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]));
3375c6c1daeSBarry Smith   PetscFunctionReturn(0);
3385c6c1daeSBarry Smith }
339