xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
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 PetscErrorCode  PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
235c6c1daeSBarry Smith {
245c6c1daeSBarry Smith   PetscErrorCode ierr;
255c6c1daeSBarry Smith 
265c6c1daeSBarry Smith   PetscFunctionBegin;
275c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2857622a8eSBarry 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);
295c6c1daeSBarry Smith   draw->port_xl = xl; draw->port_yl = yl;
305c6c1daeSBarry Smith   draw->port_xr = xr; draw->port_yr = yr;
315c6c1daeSBarry Smith   if (draw->ops->setviewport) {
325c6c1daeSBarry Smith     ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
335c6c1daeSBarry Smith   }
345c6c1daeSBarry Smith   PetscFunctionReturn(0);
355c6c1daeSBarry Smith }
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith /*@
385c6c1daeSBarry Smith    PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
395c6c1daeSBarry Smith    routines will write.
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith    Collective on PetscDraw
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith    Input Parameter:
445c6c1daeSBarry Smith .  draw - the drawing context
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Output Parameter:
475c6c1daeSBarry Smith .  xl,yl,xr,yr - upper right and lower left corners of subwindow
485c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
495c6c1daeSBarry Smith                  Lower left corner is (0,0).
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith    Level: advanced
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith @*/
545c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
555c6c1daeSBarry Smith {
565c6c1daeSBarry Smith   PetscFunctionBegin;
575c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
588f69470aSLisandro Dalcin   PetscValidRealPointer(xl,2);
598f69470aSLisandro Dalcin   PetscValidRealPointer(yl,3);
608f69470aSLisandro Dalcin   PetscValidRealPointer(xr,4);
618f69470aSLisandro Dalcin   PetscValidRealPointer(yr,5);
625c6c1daeSBarry Smith   *xl = draw->port_xl;
635c6c1daeSBarry Smith   *yl = draw->port_yl;
645c6c1daeSBarry Smith   *xr = draw->port_xr;
655c6c1daeSBarry Smith   *yr = draw->port_yr;
665c6c1daeSBarry Smith   PetscFunctionReturn(0);
675c6c1daeSBarry Smith }
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith /*@
705c6c1daeSBarry Smith    PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
715c6c1daeSBarry Smith    view ports. One for each process.
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith    Collective on PetscDraw
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith    Input Parameter:
765c6c1daeSBarry Smith .  draw - the drawing context
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith    Level: advanced
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort()
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith @*/
835c6c1daeSBarry Smith PetscErrorCode  PetscDrawSplitViewPort(PetscDraw draw)
845c6c1daeSBarry Smith {
855c6c1daeSBarry Smith   PetscErrorCode ierr;
865c6c1daeSBarry Smith   PetscMPIInt    rank,size;
87369cc0aeSBarry Smith   PetscInt       n;
885c6c1daeSBarry Smith   PetscBool      isnull;
895c6c1daeSBarry Smith   PetscReal      xl,xr,yl,yr,h;
905c6c1daeSBarry Smith 
915c6c1daeSBarry Smith   PetscFunctionBegin;
925c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
938f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
945c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
95ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr);
96ffc4695bSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRMPI(ierr);
975c6c1daeSBarry Smith 
98369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
99a297a907SKarl Rupp   while (n*n < size) n++;
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith   h  = 1.0/n;
1025c6c1daeSBarry Smith   xl = (rank % n)*h;
1035c6c1daeSBarry Smith   xr = xl + h;
1045c6c1daeSBarry Smith   yl = (rank / n)*h;
1055c6c1daeSBarry Smith   yr = yl + h;
1065c6c1daeSBarry Smith 
107e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1085c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1095c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1105c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1115c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
112e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1135b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1145c6c1daeSBarry Smith 
115e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05*h;
116e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05*h;
117e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05*h;
118e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05*h;
1195c6c1daeSBarry Smith 
1205c6c1daeSBarry Smith   if (draw->ops->setviewport) {
1215c6c1daeSBarry Smith     ierr =  (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1225c6c1daeSBarry Smith   }
1235c6c1daeSBarry Smith   PetscFunctionReturn(0);
1245c6c1daeSBarry Smith }
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith /*@C
127cf79e978SBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith    Collective on PetscDraw
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith    Input Parameters:
1325c6c1daeSBarry Smith +  draw - the drawing context
1335c6c1daeSBarry Smith -  nports - the number of ports
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith    Output Parameter:
1365c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
1375c6c1daeSBarry Smith 
138cf79e978SBarry Smith    Options Database:
1398e5aa403SBarry Smith .  -draw_ports - display multiple fields in the same window with PetscDrawPorts instead of in separate windows
140cf79e978SBarry Smith 
1415c6c1daeSBarry Smith    Level: advanced
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith @*/
146e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports)
1475c6c1daeSBarry Smith {
148e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1495c6c1daeSBarry Smith   PetscInt           i,n;
1505c6c1daeSBarry Smith   PetscBool          isnull;
151e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
1525c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,h;
153e5ab1681SLisandro Dalcin   PetscErrorCode     ierr;
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith   PetscFunctionBegin;
1565c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
157e5ab1681SLisandro Dalcin   if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports);
158e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
159e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
160e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
161ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr);
1625c6c1daeSBarry Smith 
163e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
164e5ab1681SLisandro Dalcin   ports->draw = draw;
165e5ab1681SLisandro Dalcin   ports->nports = nports;
1665c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
167e5ab1681SLisandro Dalcin   /* save previous drawport of window */
168e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
1695c6c1daeSBarry Smith 
170369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
171a297a907SKarl Rupp   while (n*n < nports) n++;
1725c6c1daeSBarry Smith   h = 1.0/n;
1735c6c1daeSBarry Smith 
174cf79e978SBarry Smith   ierr = PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr);CHKERRQ(ierr);
175cf79e978SBarry Smith   ports->xl = xl;
176cf79e978SBarry Smith   ports->xr = xr;
177cf79e978SBarry Smith   ports->yl = yl;
178cf79e978SBarry Smith   ports->yr = yr;
179e5ab1681SLisandro Dalcin 
180e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
181e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1825c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
1835c6c1daeSBarry Smith     xl[i] = (i % n)*h;
1845c6c1daeSBarry Smith     xr[i] = xl[i] + h;
1855c6c1daeSBarry Smith     yl[i] = (i / n)*h;
1865c6c1daeSBarry Smith     yr[i] = yl[i] + h;
1875c6c1daeSBarry Smith 
188e5ab1681SLisandro Dalcin     if (!rank) {
1895c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1905c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1915c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1925c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
1935c6c1daeSBarry Smith     }
194e5ab1681SLisandro Dalcin 
195e5ab1681SLisandro Dalcin     xl[i] += .05*h;
196e5ab1681SLisandro Dalcin     xr[i] -= .05*h;
197e5ab1681SLisandro Dalcin     yl[i] += .05*h;
198e5ab1681SLisandro Dalcin     yr[i] -= .05*h;
199e5ab1681SLisandro Dalcin   }
200e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
201e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2025c6c1daeSBarry Smith   PetscFunctionReturn(0);
2035c6c1daeSBarry Smith }
2045c6c1daeSBarry Smith 
2055c6c1daeSBarry Smith /*@C
2065c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2075c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2085c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith    Collective on PetscDraw
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith    Input Parameters:
2135c6c1daeSBarry Smith +  draw - the drawing context
2145c6c1daeSBarry Smith .  nx - the number of x divisions
2155c6c1daeSBarry Smith -  ny - the number of y divisions
2165c6c1daeSBarry Smith 
2175c6c1daeSBarry Smith    Output Parameter:
2185c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith    Level: advanced
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith @*/
225e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports)
2265c6c1daeSBarry Smith {
227e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2285c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,hx,hy;
229e5ab1681SLisandro Dalcin   PetscInt           i,j,k,n;
2305c6c1daeSBarry Smith   PetscBool          isnull;
231e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
2325c6c1daeSBarry Smith   PetscErrorCode     ierr;
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith   PetscFunctionBegin;
2355c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2365c6c1daeSBarry 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);
237064a246eSJacob Faibussowitsch   PetscValidPointer(newports,4);
238e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
239e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
240ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr);
241e118a51fSLisandro Dalcin 
2425c6c1daeSBarry Smith   n  = nx*ny;
2435c6c1daeSBarry Smith   hx = 1.0/nx;
2445c6c1daeSBarry Smith   hy = 1.0/ny;
245e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
246e5ab1681SLisandro Dalcin   ports->draw = draw;
247e5ab1681SLisandro Dalcin   ports->nports = n;
2485c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
249e5ab1681SLisandro Dalcin   /* save previous drawport of window */
250e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
251e5ab1681SLisandro Dalcin 
252cf79e978SBarry Smith   ierr = PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr);CHKERRQ(ierr);
253cf79e978SBarry Smith   ports->xr = xr;
254cf79e978SBarry Smith   ports->xl = xl;
255cf79e978SBarry Smith   ports->yl = yl;
256cf79e978SBarry Smith   ports->yr = yr;
257e5ab1681SLisandro Dalcin 
258e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
259e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
2605c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2615c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
262e5ab1681SLisandro Dalcin       k = j*nx+i;
2635c6c1daeSBarry Smith 
2645c6c1daeSBarry Smith       xl[k] = i*hx;
2655c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2665c6c1daeSBarry Smith       yl[k] = j*hy;
2675c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2685c6c1daeSBarry Smith 
269e5ab1681SLisandro Dalcin       if (!rank) {
2705c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2715c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2725c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2735c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
274e5ab1681SLisandro Dalcin       }
2755c6c1daeSBarry Smith 
276e5ab1681SLisandro Dalcin       xl[k] += .05*hx;
277e5ab1681SLisandro Dalcin       xr[k] -= .05*hx;
278e5ab1681SLisandro Dalcin       yl[k] += .05*hy;
279e5ab1681SLisandro Dalcin       yr[k] -= .05*hy;
2805c6c1daeSBarry Smith     }
2815c6c1daeSBarry Smith   }
282e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
283e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2845c6c1daeSBarry Smith   PetscFunctionReturn(0);
2855c6c1daeSBarry Smith }
2865c6c1daeSBarry Smith 
2875c6c1daeSBarry Smith /*@C
2885c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
2915c6c1daeSBarry Smith 
2925c6c1daeSBarry Smith    Input Parameter:
2935c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
2945c6c1daeSBarry Smith 
2955c6c1daeSBarry Smith    Level: advanced
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith @*/
3005c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
3015c6c1daeSBarry Smith {
3025c6c1daeSBarry Smith   PetscErrorCode ierr;
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith   PetscFunctionBegin;
3055c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3068f69470aSLisandro Dalcin   PetscValidPointer(ports,1);
3075c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3085c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr);
3095c6c1daeSBarry Smith   ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr);
310cf79e978SBarry Smith   ierr = PetscFree4(ports->xl,ports->xr,ports->yl,ports->yr);CHKERRQ(ierr);
3115c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
3125c6c1daeSBarry Smith   PetscFunctionReturn(0);
3135c6c1daeSBarry Smith }
3145c6c1daeSBarry Smith 
3155c6c1daeSBarry Smith /*@C
3165c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3175c6c1daeSBarry Smith 
3185c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
3195c6c1daeSBarry Smith 
320*d8d19677SJose E. Roman    Input Parameters:
3215c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
3225c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith    Level: advanced
3255c6c1daeSBarry Smith 
3265c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith @*/
3295c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
3305c6c1daeSBarry Smith {
3315c6c1daeSBarry Smith   PetscErrorCode ierr;
3325c6c1daeSBarry Smith 
3335c6c1daeSBarry Smith   PetscFunctionBegin;
3348f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
33545f3bb6eSLisandro Dalcin   PetscValidPointer(ports,1);
336e5ab1681SLisandro 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);
3375c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr);
3385c6c1daeSBarry Smith   PetscFunctionReturn(0);
3395c6c1daeSBarry Smith }
340