xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision e5ab1681210b093c2ee26b200f61e98eac43a430)
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 #undef __FUNCT__
85c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetViewPort"
95c6c1daeSBarry Smith /*@
105c6c1daeSBarry Smith    PetscDrawSetViewPort - Sets the portion of the window (page) to which draw
115c6c1daeSBarry Smith    routines will write.
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith    Collective on PetscDraw
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith    Input Parameters:
165c6c1daeSBarry Smith +  xl,yl,xr,yr - upper right and lower left corners of subwindow
175c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
185c6c1daeSBarry Smith                  Lower left corner is (0,0).
195c6c1daeSBarry Smith -  draw - the drawing context
205c6c1daeSBarry Smith 
215c6c1daeSBarry Smith    Level: advanced
225c6c1daeSBarry Smith 
235c6c1daeSBarry Smith    Concepts: drawing^in subset of window
245c6c1daeSBarry Smith    Concepts: graphics^in subset of window
255c6c1daeSBarry Smith 
265c6c1daeSBarry Smith @*/
275c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
285c6c1daeSBarry Smith {
295c6c1daeSBarry Smith   PetscErrorCode ierr;
305c6c1daeSBarry Smith 
315c6c1daeSBarry Smith   PetscFunctionBegin;
325c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3357622a8eSBarry 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);
345c6c1daeSBarry Smith   draw->port_xl = xl; draw->port_yl = yl;
355c6c1daeSBarry Smith   draw->port_xr = xr; draw->port_yr = yr;
365c6c1daeSBarry Smith   if (draw->ops->setviewport) {
375c6c1daeSBarry Smith     ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
385c6c1daeSBarry Smith   }
395c6c1daeSBarry Smith   PetscFunctionReturn(0);
405c6c1daeSBarry Smith }
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith #undef __FUNCT__
435c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetViewPort"
445c6c1daeSBarry Smith /*@
455c6c1daeSBarry Smith    PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
465c6c1daeSBarry Smith    routines will write.
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith    Collective on PetscDraw
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith    Input Parameter:
515c6c1daeSBarry Smith .  draw - the drawing context
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith    Output Parameter:
545c6c1daeSBarry Smith .  xl,yl,xr,yr - upper right and lower left corners of subwindow
555c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
565c6c1daeSBarry Smith                  Lower left corner is (0,0).
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith    Level: advanced
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith    Concepts: drawing^in subset of window
615c6c1daeSBarry Smith    Concepts: graphics^in subset of window
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith @*/
645c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
655c6c1daeSBarry Smith {
665c6c1daeSBarry Smith   PetscFunctionBegin;
675c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
688f69470aSLisandro Dalcin   PetscValidRealPointer(xl,2);
698f69470aSLisandro Dalcin   PetscValidRealPointer(yl,3);
708f69470aSLisandro Dalcin   PetscValidRealPointer(xr,4);
718f69470aSLisandro Dalcin   PetscValidRealPointer(yr,5);
725c6c1daeSBarry Smith   *xl = draw->port_xl;
735c6c1daeSBarry Smith   *yl = draw->port_yl;
745c6c1daeSBarry Smith   *xr = draw->port_xr;
755c6c1daeSBarry Smith   *yr = draw->port_yr;
765c6c1daeSBarry Smith   PetscFunctionReturn(0);
775c6c1daeSBarry Smith }
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith #undef __FUNCT__
805c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSplitViewPort"
815c6c1daeSBarry Smith /*@
825c6c1daeSBarry Smith    PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
835c6c1daeSBarry Smith    view ports. One for each process.
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith    Collective on PetscDraw
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith    Input Parameter:
885c6c1daeSBarry Smith .  draw - the drawing context
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith    Level: advanced
915c6c1daeSBarry Smith 
925c6c1daeSBarry Smith    Concepts: drawing^in subset of window
935c6c1daeSBarry Smith 
945c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort()
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith @*/
975c6c1daeSBarry Smith PetscErrorCode  PetscDrawSplitViewPort(PetscDraw draw)
985c6c1daeSBarry Smith {
995c6c1daeSBarry Smith   PetscErrorCode ierr;
1005c6c1daeSBarry Smith   PetscMPIInt    rank,size;
101369cc0aeSBarry Smith   PetscInt       n;
1025c6c1daeSBarry Smith   PetscBool      isnull;
1035c6c1daeSBarry Smith   PetscReal      xl,xr,yl,yr,h;
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith   PetscFunctionBegin;
1065c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1078f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1085c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
109ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
110ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr);
1115c6c1daeSBarry Smith 
112369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
113a297a907SKarl Rupp   while (n*n < size) n++;
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith   h  = 1.0/n;
1165c6c1daeSBarry Smith   xl = (rank % n)*h;
1175c6c1daeSBarry Smith   xr = xl + h;
1185c6c1daeSBarry Smith   yl = (rank / n)*h;
1195c6c1daeSBarry Smith   yr = yl + h;
1205c6c1daeSBarry Smith 
121*e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1225c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1235c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1245c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1255c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
126*e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1275b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1285c6c1daeSBarry Smith 
129*e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05*h;
130*e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05*h;
131*e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05*h;
132*e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05*h;
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith   if (draw->ops->setviewport) {
1355c6c1daeSBarry Smith     ierr =  (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1365c6c1daeSBarry Smith   }
1375c6c1daeSBarry Smith   PetscFunctionReturn(0);
1385c6c1daeSBarry Smith }
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith #undef __FUNCT__
1415c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreate"
1425c6c1daeSBarry Smith /*@C
1435c6c1daeSBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller
1445c6c1daeSBarry Smith        view ports. Each processor shares all the viewports.
1455c6c1daeSBarry Smith 
1465c6c1daeSBarry Smith    Collective on PetscDraw
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith    Input Parameters:
1495c6c1daeSBarry Smith +  draw - the drawing context
1505c6c1daeSBarry Smith -  nports - the number of ports
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith    Output Parameter:
1535c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith    Level: advanced
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith    Concepts: drawing^in subset of window
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith @*/
162*e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports)
1635c6c1daeSBarry Smith {
164*e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1655c6c1daeSBarry Smith   PetscInt           i,n;
1665c6c1daeSBarry Smith   PetscBool          isnull;
167*e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
1685c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,h;
169*e5ab1681SLisandro Dalcin   PetscErrorCode     ierr;
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith   PetscFunctionBegin;
1725c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
173*e5ab1681SLisandro Dalcin   if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports);
174*e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
175e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
176*e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
177*e5ab1681SLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
1785c6c1daeSBarry Smith 
179*e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
180*e5ab1681SLisandro Dalcin   ports->draw = draw;
181*e5ab1681SLisandro Dalcin   ports->nports = nports;
1825c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
183*e5ab1681SLisandro Dalcin   /* save previous drawport of window */
184*e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
1855c6c1daeSBarry Smith 
186369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
187a297a907SKarl Rupp   while (n*n < nports) n++;
1885c6c1daeSBarry Smith   h = 1.0/n;
1895c6c1daeSBarry Smith 
190*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n*n,&xl);CHKERRQ(ierr); ports->xl = xl;
191*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n*n,&xr);CHKERRQ(ierr); ports->xr = xr;
192*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n*n,&yl);CHKERRQ(ierr); ports->yl = yl;
193*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n*n,&yr);CHKERRQ(ierr); ports->yr = yr;
194*e5ab1681SLisandro Dalcin 
195*e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
196*e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1975c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
1985c6c1daeSBarry Smith     xl[i] = (i % n)*h;
1995c6c1daeSBarry Smith     xr[i] = xl[i] + h;
2005c6c1daeSBarry Smith     yl[i] = (i / n)*h;
2015c6c1daeSBarry Smith     yr[i] = yl[i] + h;
2025c6c1daeSBarry Smith 
203*e5ab1681SLisandro Dalcin     if (!rank) {
2045c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2055c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2065c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2075c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2085c6c1daeSBarry Smith     }
209*e5ab1681SLisandro Dalcin 
210*e5ab1681SLisandro Dalcin     xl[i] += .05*h;
211*e5ab1681SLisandro Dalcin     xr[i] -= .05*h;
212*e5ab1681SLisandro Dalcin     yl[i] += .05*h;
213*e5ab1681SLisandro Dalcin     yr[i] -= .05*h;
214*e5ab1681SLisandro Dalcin   }
215*e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
216*e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2175c6c1daeSBarry Smith   PetscFunctionReturn(0);
2185c6c1daeSBarry Smith }
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith #undef __FUNCT__
2215c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreateRect"
2225c6c1daeSBarry Smith /*@C
2235c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2245c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2255c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith    Collective on PetscDraw
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith    Input Parameters:
2305c6c1daeSBarry Smith +  draw - the drawing context
2315c6c1daeSBarry Smith .  nx - the number of x divisions
2325c6c1daeSBarry Smith -  ny - the number of y divisions
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith    Output Parameter:
2355c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith    Level: advanced
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith    Concepts: drawing^in subset of window
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith @*/
244*e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports)
2455c6c1daeSBarry Smith {
246*e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2475c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,hx,hy;
248*e5ab1681SLisandro Dalcin   PetscInt           i,j,k,n;
2495c6c1daeSBarry Smith   PetscBool          isnull;
250*e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
2515c6c1daeSBarry Smith   PetscErrorCode     ierr;
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith   PetscFunctionBegin;
2545c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2555c6c1daeSBarry 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);
256*e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
257e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
258*e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
259*e5ab1681SLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
260e118a51fSLisandro Dalcin 
2615c6c1daeSBarry Smith   n  = nx*ny;
2625c6c1daeSBarry Smith   hx = 1.0/nx;
2635c6c1daeSBarry Smith   hy = 1.0/ny;
264*e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
265*e5ab1681SLisandro Dalcin   ports->draw = draw;
266*e5ab1681SLisandro Dalcin   ports->nports = n;
2675c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
268*e5ab1681SLisandro Dalcin   /* save previous drawport of window */
269*e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
270*e5ab1681SLisandro Dalcin 
271*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n,&xl);CHKERRQ(ierr); ports->xl = xl;
272*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n,&xr);CHKERRQ(ierr); ports->xr = xr;
273*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n,&yl);CHKERRQ(ierr); ports->yl = yl;
274*e5ab1681SLisandro Dalcin   ierr = PetscMalloc1(n,&yr);CHKERRQ(ierr); ports->yr = yr;
275*e5ab1681SLisandro Dalcin 
276*e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
277*e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
2785c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2795c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
280*e5ab1681SLisandro Dalcin       k = j*nx+i;
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith       xl[k] = i*hx;
2835c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2845c6c1daeSBarry Smith       yl[k] = j*hy;
2855c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2865c6c1daeSBarry Smith 
287*e5ab1681SLisandro Dalcin       if (!rank) {
2885c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2895c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2905c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2915c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
292*e5ab1681SLisandro Dalcin       }
2935c6c1daeSBarry Smith 
294*e5ab1681SLisandro Dalcin       xl[k] += .05*hx;
295*e5ab1681SLisandro Dalcin       xr[k] -= .05*hx;
296*e5ab1681SLisandro Dalcin       yl[k] += .05*hy;
297*e5ab1681SLisandro Dalcin       yr[k] -= .05*hy;
2985c6c1daeSBarry Smith     }
2995c6c1daeSBarry Smith   }
300*e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
301*e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
3025c6c1daeSBarry Smith   PetscFunctionReturn(0);
3035c6c1daeSBarry Smith }
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith #undef __FUNCT__
3065c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsDestroy"
3075c6c1daeSBarry Smith /*@C
3085c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith    Input Parameter:
3135c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
3145c6c1daeSBarry Smith 
3155c6c1daeSBarry Smith    Level: advanced
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith @*/
3205c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
3215c6c1daeSBarry Smith {
3225c6c1daeSBarry Smith   PetscErrorCode ierr;
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith   PetscFunctionBegin;
3255c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3268f69470aSLisandro Dalcin   PetscValidPointer(ports,1);
3275c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3285c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr);
3295c6c1daeSBarry Smith   ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr);
3305c6c1daeSBarry Smith   ierr = PetscFree(ports->xl);CHKERRQ(ierr);
3315c6c1daeSBarry Smith   ierr = PetscFree(ports->xr);CHKERRQ(ierr);
3325c6c1daeSBarry Smith   ierr = PetscFree(ports->yl);CHKERRQ(ierr);
3335c6c1daeSBarry Smith   ierr = PetscFree(ports->yr);CHKERRQ(ierr);
3345c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
3355c6c1daeSBarry Smith   PetscFunctionReturn(0);
3365c6c1daeSBarry Smith }
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith #undef __FUNCT__
3395c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsSet"
3405c6c1daeSBarry Smith /*@C
3415c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith    Input Parameter:
3465c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
3475c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3485c6c1daeSBarry Smith 
3495c6c1daeSBarry Smith    Level: advanced
3505c6c1daeSBarry Smith 
3515c6c1daeSBarry Smith    Concepts: drawing^in subset of window
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith @*/
3565c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
3575c6c1daeSBarry Smith {
3585c6c1daeSBarry Smith   PetscErrorCode ierr;
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith   PetscFunctionBegin;
3618f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
362*e5ab1681SLisandro 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);
3635c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr);
3645c6c1daeSBarry Smith   PetscFunctionReturn(0);
3655c6c1daeSBarry Smith }
366