xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision 8e5aa403b7b03f534f06e51c3ce666d21d397ddd)
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:
145c6c1daeSBarry Smith +  xl,yl,xr,yr - upper right and lower left corners of subwindow
155c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
165c6c1daeSBarry Smith                  Lower left corner is (0,0).
175c6c1daeSBarry Smith -  draw - the drawing context
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith    Level: advanced
205c6c1daeSBarry Smith 
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith @*/
235c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
245c6c1daeSBarry Smith {
255c6c1daeSBarry Smith   PetscErrorCode ierr;
265c6c1daeSBarry Smith 
275c6c1daeSBarry Smith   PetscFunctionBegin;
285c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2957622a8eSBarry Smith   if (xl < 0.0 || xr > 1.0 || yl < 0.0 || yr > 1.0 || xr <= xl || yr <= yl) SETERRQ4(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);
305c6c1daeSBarry Smith   draw->port_xl = xl; draw->port_yl = yl;
315c6c1daeSBarry Smith   draw->port_xr = xr; draw->port_yr = yr;
325c6c1daeSBarry Smith   if (draw->ops->setviewport) {
335c6c1daeSBarry Smith     ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
345c6c1daeSBarry Smith   }
355c6c1daeSBarry Smith   PetscFunctionReturn(0);
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 
425c6c1daeSBarry Smith    Collective on PetscDraw
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith    Input Parameter:
455c6c1daeSBarry Smith .  draw - the drawing context
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith    Output Parameter:
485c6c1daeSBarry Smith .  xl,yl,xr,yr - upper right and lower left corners of subwindow
495c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
505c6c1daeSBarry Smith                  Lower left corner is (0,0).
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith    Level: advanced
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith 
555c6c1daeSBarry Smith @*/
565c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
575c6c1daeSBarry Smith {
585c6c1daeSBarry Smith   PetscFunctionBegin;
595c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
608f69470aSLisandro Dalcin   PetscValidRealPointer(xl,2);
618f69470aSLisandro Dalcin   PetscValidRealPointer(yl,3);
628f69470aSLisandro Dalcin   PetscValidRealPointer(xr,4);
638f69470aSLisandro Dalcin   PetscValidRealPointer(yr,5);
645c6c1daeSBarry Smith   *xl = draw->port_xl;
655c6c1daeSBarry Smith   *yl = draw->port_yl;
665c6c1daeSBarry Smith   *xr = draw->port_xr;
675c6c1daeSBarry Smith   *yr = draw->port_yr;
685c6c1daeSBarry Smith   PetscFunctionReturn(0);
695c6c1daeSBarry Smith }
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith /*@
725c6c1daeSBarry Smith    PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
735c6c1daeSBarry Smith    view ports. One for each process.
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith    Collective on PetscDraw
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith    Input Parameter:
785c6c1daeSBarry Smith .  draw - the drawing context
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith    Level: advanced
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort()
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith @*/
855c6c1daeSBarry Smith PetscErrorCode  PetscDrawSplitViewPort(PetscDraw draw)
865c6c1daeSBarry Smith {
875c6c1daeSBarry Smith   PetscErrorCode ierr;
885c6c1daeSBarry Smith   PetscMPIInt    rank,size;
89369cc0aeSBarry Smith   PetscInt       n;
905c6c1daeSBarry Smith   PetscBool      isnull;
915c6c1daeSBarry Smith   PetscReal      xl,xr,yl,yr,h;
925c6c1daeSBarry Smith 
935c6c1daeSBarry Smith   PetscFunctionBegin;
945c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
958f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
965c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
97ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
98ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
995c6c1daeSBarry Smith 
100369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
101a297a907SKarl Rupp   while (n*n < size) n++;
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith   h  = 1.0/n;
1045c6c1daeSBarry Smith   xl = (rank % n)*h;
1055c6c1daeSBarry Smith   xr = xl + h;
1065c6c1daeSBarry Smith   yl = (rank / n)*h;
1075c6c1daeSBarry Smith   yr = yl + h;
1085c6c1daeSBarry Smith 
109e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1105c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1115c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1125c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1135c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
114e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1155b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1165c6c1daeSBarry Smith 
117e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05*h;
118e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05*h;
119e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05*h;
120e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05*h;
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith   if (draw->ops->setviewport) {
1235c6c1daeSBarry Smith     ierr =  (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1245c6c1daeSBarry Smith   }
1255c6c1daeSBarry Smith   PetscFunctionReturn(0);
1265c6c1daeSBarry Smith }
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith /*@C
129cf79e978SBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith    Collective on PetscDraw
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith    Input Parameters:
1345c6c1daeSBarry Smith +  draw - the drawing context
1355c6c1daeSBarry Smith -  nports - the number of ports
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith    Output Parameter:
1385c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
1395c6c1daeSBarry Smith 
140cf79e978SBarry Smith    Options Database:
141*8e5aa403SBarry Smith .  -draw_ports - display multiple fields in the same window with PetscDrawPorts instead of in separate windows
142cf79e978SBarry Smith 
1435c6c1daeSBarry Smith    Level: advanced
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith @*/
148e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports)
1495c6c1daeSBarry Smith {
150e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1515c6c1daeSBarry Smith   PetscInt           i,n;
1525c6c1daeSBarry Smith   PetscBool          isnull;
153e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
1545c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,h;
155e5ab1681SLisandro Dalcin   PetscErrorCode     ierr;
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith   PetscFunctionBegin;
1585c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
159e5ab1681SLisandro Dalcin   if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports);
160e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
161e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
162e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
163e5ab1681SLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
1645c6c1daeSBarry Smith 
165e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
166e5ab1681SLisandro Dalcin   ports->draw = draw;
167e5ab1681SLisandro Dalcin   ports->nports = nports;
1685c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
169e5ab1681SLisandro Dalcin   /* save previous drawport of window */
170e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
1715c6c1daeSBarry Smith 
172369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
173a297a907SKarl Rupp   while (n*n < nports) n++;
1745c6c1daeSBarry Smith   h = 1.0/n;
1755c6c1daeSBarry Smith 
176cf79e978SBarry Smith   ierr = PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr);CHKERRQ(ierr);
177cf79e978SBarry Smith   ports->xl = xl;
178cf79e978SBarry Smith   ports->xr = xr;
179cf79e978SBarry Smith   ports->yl = yl;
180cf79e978SBarry Smith   ports->yr = yr;
181e5ab1681SLisandro Dalcin 
182e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
183e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1845c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
1855c6c1daeSBarry Smith     xl[i] = (i % n)*h;
1865c6c1daeSBarry Smith     xr[i] = xl[i] + h;
1875c6c1daeSBarry Smith     yl[i] = (i / n)*h;
1885c6c1daeSBarry Smith     yr[i] = yl[i] + h;
1895c6c1daeSBarry Smith 
190e5ab1681SLisandro Dalcin     if (!rank) {
1915c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1925c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1935c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1945c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1955c6c1daeSBarry Smith     }
196e5ab1681SLisandro Dalcin 
197e5ab1681SLisandro Dalcin     xl[i] += .05*h;
198e5ab1681SLisandro Dalcin     xr[i] -= .05*h;
199e5ab1681SLisandro Dalcin     yl[i] += .05*h;
200e5ab1681SLisandro Dalcin     yr[i] -= .05*h;
201e5ab1681SLisandro Dalcin   }
202e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
203e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2045c6c1daeSBarry Smith   PetscFunctionReturn(0);
2055c6c1daeSBarry Smith }
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith /*@C
2085c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2095c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2105c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith    Collective on PetscDraw
2135c6c1daeSBarry Smith 
2145c6c1daeSBarry Smith    Input Parameters:
2155c6c1daeSBarry Smith +  draw - the drawing context
2165c6c1daeSBarry Smith .  nx - the number of x divisions
2175c6c1daeSBarry Smith -  ny - the number of y divisions
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith    Output Parameter:
2205c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith    Level: advanced
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith @*/
227e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports)
2285c6c1daeSBarry Smith {
229e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2305c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,hx,hy;
231e5ab1681SLisandro Dalcin   PetscInt           i,j,k,n;
2325c6c1daeSBarry Smith   PetscBool          isnull;
233e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
2345c6c1daeSBarry Smith   PetscErrorCode     ierr;
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith   PetscFunctionBegin;
2375c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2385c6c1daeSBarry Smith   if ((nx < 1) || (ny < 1)) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d x %d", nx, ny);
239e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
240e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
241e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
242e5ab1681SLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
243e118a51fSLisandro Dalcin 
2445c6c1daeSBarry Smith   n  = nx*ny;
2455c6c1daeSBarry Smith   hx = 1.0/nx;
2465c6c1daeSBarry Smith   hy = 1.0/ny;
247e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
248e5ab1681SLisandro Dalcin   ports->draw = draw;
249e5ab1681SLisandro Dalcin   ports->nports = n;
2505c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
251e5ab1681SLisandro Dalcin   /* save previous drawport of window */
252e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
253e5ab1681SLisandro Dalcin 
254cf79e978SBarry Smith   ierr = PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr);CHKERRQ(ierr);
255cf79e978SBarry Smith   ports->xr = xr;
256cf79e978SBarry Smith   ports->xl = xl;
257cf79e978SBarry Smith   ports->yl = yl;
258cf79e978SBarry Smith   ports->yr = yr;
259e5ab1681SLisandro Dalcin 
260e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
261e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
2625c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2635c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
264e5ab1681SLisandro Dalcin       k = j*nx+i;
2655c6c1daeSBarry Smith 
2665c6c1daeSBarry Smith       xl[k] = i*hx;
2675c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2685c6c1daeSBarry Smith       yl[k] = j*hy;
2695c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2705c6c1daeSBarry Smith 
271e5ab1681SLisandro Dalcin       if (!rank) {
2725c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2735c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2745c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2755c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
276e5ab1681SLisandro Dalcin       }
2775c6c1daeSBarry Smith 
278e5ab1681SLisandro Dalcin       xl[k] += .05*hx;
279e5ab1681SLisandro Dalcin       xr[k] -= .05*hx;
280e5ab1681SLisandro Dalcin       yl[k] += .05*hy;
281e5ab1681SLisandro Dalcin       yr[k] -= .05*hy;
2825c6c1daeSBarry Smith     }
2835c6c1daeSBarry Smith   }
284e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
285e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2865c6c1daeSBarry Smith   PetscFunctionReturn(0);
2875c6c1daeSBarry Smith }
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith /*@C
2905c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
2915c6c1daeSBarry Smith 
2925c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
2935c6c1daeSBarry Smith 
2945c6c1daeSBarry Smith    Input Parameter:
2955c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith    Level: advanced
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
3005c6c1daeSBarry Smith 
3015c6c1daeSBarry Smith @*/
3025c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
3035c6c1daeSBarry Smith {
3045c6c1daeSBarry Smith   PetscErrorCode ierr;
3055c6c1daeSBarry Smith 
3065c6c1daeSBarry Smith   PetscFunctionBegin;
3075c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3088f69470aSLisandro Dalcin   PetscValidPointer(ports,1);
3095c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3105c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr);
3115c6c1daeSBarry Smith   ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr);
312cf79e978SBarry Smith   ierr = PetscFree4(ports->xl,ports->xr,ports->yl,ports->yr);CHKERRQ(ierr);
3135c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
3145c6c1daeSBarry Smith   PetscFunctionReturn(0);
3155c6c1daeSBarry Smith }
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith /*@C
3185c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3195c6c1daeSBarry Smith 
3205c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
3215c6c1daeSBarry Smith 
3225c6c1daeSBarry Smith    Input Parameter:
3235c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
3245c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3255c6c1daeSBarry Smith 
3265c6c1daeSBarry Smith    Level: advanced
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
3295c6c1daeSBarry Smith 
3305c6c1daeSBarry Smith @*/
3315c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
3325c6c1daeSBarry Smith {
3335c6c1daeSBarry Smith   PetscErrorCode ierr;
3345c6c1daeSBarry Smith 
3355c6c1daeSBarry Smith   PetscFunctionBegin;
3368f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
33745f3bb6eSLisandro Dalcin   PetscValidPointer(ports,1);
338e5ab1681SLisandro Dalcin   if (port < 0 || port > ports->nports-1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Port is out of range requested %d from 0 to %d\n",port,ports->nports-1);
3395c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr);
3405c6c1daeSBarry Smith   PetscFunctionReturn(0);
3415c6c1daeSBarry Smith }
342