xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision cf79e978598fb66de00940b63d96c389e19a3f75)
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 
121e5ab1681SLisandro 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);
126e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1275b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1285c6c1daeSBarry Smith 
129e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05*h;
130e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05*h;
131e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05*h;
132e5ab1681SLisandro 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
143*cf79e978SBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith    Collective on PetscDraw
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith    Input Parameters:
1485c6c1daeSBarry Smith +  draw - the drawing context
1495c6c1daeSBarry Smith -  nports - the number of ports
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith    Output Parameter:
1525c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
1535c6c1daeSBarry Smith 
154*cf79e978SBarry Smith    Options Database:
155*cf79e978SBarry Smith .  -draw_ports - display multiple fields in the same window with PetscDrawPorts instead of in seperate windows
156*cf79e978SBarry Smith 
1575c6c1daeSBarry Smith    Level: advanced
1585c6c1daeSBarry Smith 
1595c6c1daeSBarry Smith    Concepts: drawing^in subset of window
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
1625c6c1daeSBarry Smith 
1635c6c1daeSBarry Smith @*/
164e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports)
1655c6c1daeSBarry Smith {
166e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1675c6c1daeSBarry Smith   PetscInt           i,n;
1685c6c1daeSBarry Smith   PetscBool          isnull;
169e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
1705c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,h;
171e5ab1681SLisandro Dalcin   PetscErrorCode     ierr;
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith   PetscFunctionBegin;
1745c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
175e5ab1681SLisandro Dalcin   if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports);
176e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
177e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
178e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
179e5ab1681SLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
1805c6c1daeSBarry Smith 
181e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
182e5ab1681SLisandro Dalcin   ports->draw = draw;
183e5ab1681SLisandro Dalcin   ports->nports = nports;
1845c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
185e5ab1681SLisandro Dalcin   /* save previous drawport of window */
186e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
1875c6c1daeSBarry Smith 
188369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
189a297a907SKarl Rupp   while (n*n < nports) n++;
1905c6c1daeSBarry Smith   h = 1.0/n;
1915c6c1daeSBarry Smith 
192*cf79e978SBarry Smith   ierr = PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr);CHKERRQ(ierr);
193*cf79e978SBarry Smith   ports->xl = xl;
194*cf79e978SBarry Smith   ports->xr = xr;
195*cf79e978SBarry Smith   ports->yl = yl;
196*cf79e978SBarry Smith   ports->yr = yr;
197e5ab1681SLisandro Dalcin 
198e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
199e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
2005c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
2015c6c1daeSBarry Smith     xl[i] = (i % n)*h;
2025c6c1daeSBarry Smith     xr[i] = xl[i] + h;
2035c6c1daeSBarry Smith     yl[i] = (i / n)*h;
2045c6c1daeSBarry Smith     yr[i] = yl[i] + h;
2055c6c1daeSBarry Smith 
206e5ab1681SLisandro Dalcin     if (!rank) {
2075c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2085c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2095c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2105c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2115c6c1daeSBarry Smith     }
212e5ab1681SLisandro Dalcin 
213e5ab1681SLisandro Dalcin     xl[i] += .05*h;
214e5ab1681SLisandro Dalcin     xr[i] -= .05*h;
215e5ab1681SLisandro Dalcin     yl[i] += .05*h;
216e5ab1681SLisandro Dalcin     yr[i] -= .05*h;
217e5ab1681SLisandro Dalcin   }
218e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
219e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2205c6c1daeSBarry Smith   PetscFunctionReturn(0);
2215c6c1daeSBarry Smith }
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith #undef __FUNCT__
2245c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreateRect"
2255c6c1daeSBarry Smith /*@C
2265c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2275c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2285c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith    Collective on PetscDraw
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith    Input Parameters:
2335c6c1daeSBarry Smith +  draw - the drawing context
2345c6c1daeSBarry Smith .  nx - the number of x divisions
2355c6c1daeSBarry Smith -  ny - the number of y divisions
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith    Output Parameter:
2385c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith    Level: advanced
2415c6c1daeSBarry Smith 
2425c6c1daeSBarry Smith    Concepts: drawing^in subset of window
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
2455c6c1daeSBarry Smith 
2465c6c1daeSBarry Smith @*/
247e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports)
2485c6c1daeSBarry Smith {
249e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2505c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,hx,hy;
251e5ab1681SLisandro Dalcin   PetscInt           i,j,k,n;
2525c6c1daeSBarry Smith   PetscBool          isnull;
253e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
2545c6c1daeSBarry Smith   PetscErrorCode     ierr;
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith   PetscFunctionBegin;
2575c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2585c6c1daeSBarry 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);
259e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
260e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
261e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
262e5ab1681SLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr);
263e118a51fSLisandro Dalcin 
2645c6c1daeSBarry Smith   n  = nx*ny;
2655c6c1daeSBarry Smith   hx = 1.0/nx;
2665c6c1daeSBarry Smith   hy = 1.0/ny;
267e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
268e5ab1681SLisandro Dalcin   ports->draw = draw;
269e5ab1681SLisandro Dalcin   ports->nports = n;
2705c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
271e5ab1681SLisandro Dalcin   /* save previous drawport of window */
272e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
273e5ab1681SLisandro Dalcin 
274*cf79e978SBarry Smith   ierr = PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr);CHKERRQ(ierr);
275*cf79e978SBarry Smith   ports->xr = xr;
276*cf79e978SBarry Smith   ports->xl = xl;
277*cf79e978SBarry Smith   ports->yl = yl;
278*cf79e978SBarry Smith   ports->yr = yr;
279e5ab1681SLisandro Dalcin 
280e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
281e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
2825c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2835c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
284e5ab1681SLisandro Dalcin       k = j*nx+i;
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith       xl[k] = i*hx;
2875c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2885c6c1daeSBarry Smith       yl[k] = j*hy;
2895c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2905c6c1daeSBarry Smith 
291e5ab1681SLisandro Dalcin       if (!rank) {
2925c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2935c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2945c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2955c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
296e5ab1681SLisandro Dalcin       }
2975c6c1daeSBarry Smith 
298e5ab1681SLisandro Dalcin       xl[k] += .05*hx;
299e5ab1681SLisandro Dalcin       xr[k] -= .05*hx;
300e5ab1681SLisandro Dalcin       yl[k] += .05*hy;
301e5ab1681SLisandro Dalcin       yr[k] -= .05*hy;
3025c6c1daeSBarry Smith     }
3035c6c1daeSBarry Smith   }
304e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
305e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
3065c6c1daeSBarry Smith   PetscFunctionReturn(0);
3075c6c1daeSBarry Smith }
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith #undef __FUNCT__
3105c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsDestroy"
3115c6c1daeSBarry Smith /*@C
3125c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
3135c6c1daeSBarry Smith 
3145c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith    Input Parameter:
3175c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
3185c6c1daeSBarry Smith 
3195c6c1daeSBarry Smith    Level: advanced
3205c6c1daeSBarry Smith 
3215c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
3225c6c1daeSBarry Smith 
3235c6c1daeSBarry Smith @*/
3245c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
3255c6c1daeSBarry Smith {
3265c6c1daeSBarry Smith   PetscErrorCode ierr;
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith   PetscFunctionBegin;
3295c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3308f69470aSLisandro Dalcin   PetscValidPointer(ports,1);
3315c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3325c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr);
3335c6c1daeSBarry Smith   ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr);
334*cf79e978SBarry Smith   ierr = PetscFree4(ports->xl,ports->xr,ports->yl,ports->yr);CHKERRQ(ierr);
3355c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
3365c6c1daeSBarry Smith   PetscFunctionReturn(0);
3375c6c1daeSBarry Smith }
3385c6c1daeSBarry Smith 
3395c6c1daeSBarry Smith #undef __FUNCT__
3405c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsSet"
3415c6c1daeSBarry Smith /*@C
3425c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
3455c6c1daeSBarry Smith 
3465c6c1daeSBarry Smith    Input Parameter:
3475c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
3485c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith    Level: advanced
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith    Concepts: drawing^in subset of window
3535c6c1daeSBarry Smith 
3545c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith @*/
3575c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
3585c6c1daeSBarry Smith {
3595c6c1daeSBarry Smith   PetscErrorCode ierr;
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith   PetscFunctionBegin;
3628f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
36345f3bb6eSLisandro Dalcin   PetscValidPointer(ports,1);
364e5ab1681SLisandro 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);
3655c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr);
3665c6c1daeSBarry Smith   PetscFunctionReturn(0);
3675c6c1daeSBarry Smith }
368