xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision 97bb3fdc57998093333768643284f5be71d00324)
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   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 /*@
435c6c1daeSBarry Smith    PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
445c6c1daeSBarry Smith    routines will write.
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Collective on PetscDraw
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith    Input Parameter:
495c6c1daeSBarry Smith .  draw - the drawing context
505c6c1daeSBarry Smith 
51*97bb3fdcSJose E. Roman    Output Parameters:
526b867d5aSJose E. Roman +  xl - the horizontal coordinate of the lower left corner of the subwindow.
536b867d5aSJose E. Roman .  yl - the vertical coordinate of the lower left corner of the subwindow.
546b867d5aSJose E. Roman .  xr - the horizontal coordinate of the upper right corner of the subwindow.
55*97bb3fdcSJose E. Roman -  yr - the vertical coordinate of the upper right corner of the subwindow.
566b867d5aSJose E. Roman 
576b867d5aSJose E. Roman    Notes:
585c6c1daeSBarry Smith    These numbers must always be between 0.0 and 1.0.
595c6c1daeSBarry Smith    Lower left corner is (0,0).
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith    Level: advanced
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 /*@
805c6c1daeSBarry Smith    PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
815c6c1daeSBarry Smith    view ports. One for each process.
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith    Collective on PetscDraw
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith    Input Parameter:
865c6c1daeSBarry Smith .  draw - the drawing context
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith    Level: advanced
895c6c1daeSBarry Smith 
905c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort()
915c6c1daeSBarry Smith 
925c6c1daeSBarry Smith @*/
935c6c1daeSBarry Smith PetscErrorCode  PetscDrawSplitViewPort(PetscDraw draw)
945c6c1daeSBarry Smith {
955c6c1daeSBarry Smith   PetscErrorCode ierr;
965c6c1daeSBarry Smith   PetscMPIInt    rank,size;
97369cc0aeSBarry Smith   PetscInt       n;
985c6c1daeSBarry Smith   PetscBool      isnull;
995c6c1daeSBarry Smith   PetscReal      xl,xr,yl,yr,h;
1005c6c1daeSBarry Smith 
1015c6c1daeSBarry Smith   PetscFunctionBegin;
1025c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
1038f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1045c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
105ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr);
106ffc4695bSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRMPI(ierr);
1075c6c1daeSBarry Smith 
108369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)size));
109a297a907SKarl Rupp   while (n*n < size) n++;
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith   h  = 1.0/n;
1125c6c1daeSBarry Smith   xl = (rank % n)*h;
1135c6c1daeSBarry Smith   xr = xl + h;
1145c6c1daeSBarry Smith   yl = (rank / n)*h;
1155c6c1daeSBarry Smith   yr = yl + h;
1165c6c1daeSBarry Smith 
117e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1185c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1195c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1205c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
1215c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
122e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1235b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1245c6c1daeSBarry Smith 
125e5ab1681SLisandro Dalcin   draw->port_xl = xl + .05*h;
126e5ab1681SLisandro Dalcin   draw->port_xr = xr - .05*h;
127e5ab1681SLisandro Dalcin   draw->port_yl = yl + .05*h;
128e5ab1681SLisandro Dalcin   draw->port_yr = yr - .05*h;
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith   if (draw->ops->setviewport) {
1315c6c1daeSBarry Smith     ierr =  (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1325c6c1daeSBarry Smith   }
1335c6c1daeSBarry Smith   PetscFunctionReturn(0);
1345c6c1daeSBarry Smith }
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith /*@C
137cf79e978SBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller view ports. Each processor shares all the viewports.
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith    Collective on PetscDraw
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith    Input Parameters:
1425c6c1daeSBarry Smith +  draw - the drawing context
1435c6c1daeSBarry Smith -  nports - the number of ports
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith    Output Parameter:
1465c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
1475c6c1daeSBarry Smith 
148cf79e978SBarry Smith    Options Database:
1498e5aa403SBarry Smith .  -draw_ports - display multiple fields in the same window with PetscDrawPorts instead of in separate windows
150cf79e978SBarry Smith 
1515c6c1daeSBarry Smith    Level: advanced
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
1545c6c1daeSBarry Smith 
1555c6c1daeSBarry Smith @*/
156e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **newports)
1575c6c1daeSBarry Smith {
158e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
1595c6c1daeSBarry Smith   PetscInt           i,n;
1605c6c1daeSBarry Smith   PetscBool          isnull;
161e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
1625c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,h;
163e5ab1681SLisandro Dalcin   PetscErrorCode     ierr;
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith   PetscFunctionBegin;
1665c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
167e5ab1681SLisandro Dalcin   if (nports < 1) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE, "Number of divisions must be positive: %d", nports);
168e5ab1681SLisandro Dalcin   PetscValidPointer(newports,3);
169e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
170e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
171ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr);
1725c6c1daeSBarry Smith 
173e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
174e5ab1681SLisandro Dalcin   ports->draw = draw;
175e5ab1681SLisandro Dalcin   ports->nports = nports;
1765c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
177e5ab1681SLisandro Dalcin   /* save previous drawport of window */
178e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
1795c6c1daeSBarry Smith 
180369cc0aeSBarry Smith   n = (PetscInt)(.1 + PetscSqrtReal((PetscReal)nports));
181a297a907SKarl Rupp   while (n*n < nports) n++;
1825c6c1daeSBarry Smith   h = 1.0/n;
1835c6c1daeSBarry Smith 
184cf79e978SBarry Smith   ierr = PetscMalloc4(n*n,&xl,n*n,&xr,n*n,&yl,n*n,&yr);CHKERRQ(ierr);
185cf79e978SBarry Smith   ports->xl = xl;
186cf79e978SBarry Smith   ports->xr = xr;
187cf79e978SBarry Smith   ports->yl = yl;
188cf79e978SBarry Smith   ports->yr = yr;
189e5ab1681SLisandro Dalcin 
190e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
191e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1925c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
1935c6c1daeSBarry Smith     xl[i] = (i % n)*h;
1945c6c1daeSBarry Smith     xr[i] = xl[i] + h;
1955c6c1daeSBarry Smith     yl[i] = (i / n)*h;
1965c6c1daeSBarry Smith     yr[i] = yl[i] + h;
1975c6c1daeSBarry Smith 
198e5ab1681SLisandro Dalcin     if (!rank) {
1995c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2005c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2015c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2025c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2035c6c1daeSBarry Smith     }
204e5ab1681SLisandro Dalcin 
205e5ab1681SLisandro Dalcin     xl[i] += .05*h;
206e5ab1681SLisandro Dalcin     xr[i] -= .05*h;
207e5ab1681SLisandro Dalcin     yl[i] += .05*h;
208e5ab1681SLisandro Dalcin     yr[i] -= .05*h;
209e5ab1681SLisandro Dalcin   }
210e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
211e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2125c6c1daeSBarry Smith   PetscFunctionReturn(0);
2135c6c1daeSBarry Smith }
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith /*@C
2165c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
2175c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
2185c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
2195c6c1daeSBarry Smith 
2205c6c1daeSBarry Smith    Collective on PetscDraw
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith    Input Parameters:
2235c6c1daeSBarry Smith +  draw - the drawing context
2245c6c1daeSBarry Smith .  nx - the number of x divisions
2255c6c1daeSBarry Smith -  ny - the number of y divisions
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith    Output Parameter:
2285c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith    Level: advanced
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith @*/
235e5ab1681SLisandro Dalcin PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **newports)
2365c6c1daeSBarry Smith {
237e5ab1681SLisandro Dalcin   PetscDrawViewPorts *ports;
2385c6c1daeSBarry Smith   PetscReal          *xl,*xr,*yl,*yr,hx,hy;
239e5ab1681SLisandro Dalcin   PetscInt           i,j,k,n;
2405c6c1daeSBarry Smith   PetscBool          isnull;
241e5ab1681SLisandro Dalcin   PetscMPIInt        rank;
2425c6c1daeSBarry Smith   PetscErrorCode     ierr;
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith   PetscFunctionBegin;
2455c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2465c6c1daeSBarry 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);
247064a246eSJacob Faibussowitsch   PetscValidPointer(newports,4);
248e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
249e5ab1681SLisandro Dalcin   if (isnull) {*newports = NULL; PetscFunctionReturn(0);}
250ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRMPI(ierr);
251e118a51fSLisandro Dalcin 
2525c6c1daeSBarry Smith   n  = nx*ny;
2535c6c1daeSBarry Smith   hx = 1.0/nx;
2545c6c1daeSBarry Smith   hy = 1.0/ny;
255e5ab1681SLisandro Dalcin   ierr = PetscNew(&ports);CHKERRQ(ierr); *newports = ports;
256e5ab1681SLisandro Dalcin   ports->draw = draw;
257e5ab1681SLisandro Dalcin   ports->nports = n;
2585c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
259e5ab1681SLisandro Dalcin   /* save previous drawport of window */
260e5ab1681SLisandro Dalcin   ierr = PetscDrawGetViewPort(draw,&ports->port_xl,&ports->port_yl,&ports->port_xr,&ports->port_yr);CHKERRQ(ierr);
261e5ab1681SLisandro Dalcin 
262cf79e978SBarry Smith   ierr = PetscMalloc4(n,&xl,n,&xr,n,&yl,n,&yr);CHKERRQ(ierr);
263cf79e978SBarry Smith   ports->xr = xr;
264cf79e978SBarry Smith   ports->xl = xl;
265cf79e978SBarry Smith   ports->yl = yl;
266cf79e978SBarry Smith   ports->yr = yr;
267e5ab1681SLisandro Dalcin 
268e5ab1681SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0.0,0.0,1.0,1.0);CHKERRQ(ierr);
269e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
2705c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
2715c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
272e5ab1681SLisandro Dalcin       k = j*nx+i;
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith       xl[k] = i*hx;
2755c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
2765c6c1daeSBarry Smith       yl[k] = j*hy;
2775c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
2785c6c1daeSBarry Smith 
279e5ab1681SLisandro Dalcin       if (!rank) {
2805c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2815c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2825c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
2835c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
284e5ab1681SLisandro Dalcin       }
2855c6c1daeSBarry Smith 
286e5ab1681SLisandro Dalcin       xl[k] += .05*hx;
287e5ab1681SLisandro Dalcin       xr[k] -= .05*hx;
288e5ab1681SLisandro Dalcin       yl[k] += .05*hy;
289e5ab1681SLisandro Dalcin       yr[k] -= .05*hy;
2905c6c1daeSBarry Smith     }
2915c6c1daeSBarry Smith   }
292e5ab1681SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
293e5ab1681SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
2945c6c1daeSBarry Smith   PetscFunctionReturn(0);
2955c6c1daeSBarry Smith }
2965c6c1daeSBarry Smith 
2975c6c1daeSBarry Smith /*@C
2985c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith    Input Parameter:
3035c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith    Level: advanced
3065c6c1daeSBarry Smith 
3075c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith @*/
3105c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
3115c6c1daeSBarry Smith {
3125c6c1daeSBarry Smith   PetscErrorCode ierr;
3135c6c1daeSBarry Smith 
3145c6c1daeSBarry Smith   PetscFunctionBegin;
3155c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
3168f69470aSLisandro Dalcin   PetscValidPointer(ports,1);
3175c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
3185c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr);
3195c6c1daeSBarry Smith   ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr);
320cf79e978SBarry Smith   ierr = PetscFree4(ports->xl,ports->xr,ports->yl,ports->yr);CHKERRQ(ierr);
3215c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
3225c6c1daeSBarry Smith   PetscFunctionReturn(0);
3235c6c1daeSBarry Smith }
3245c6c1daeSBarry Smith 
3255c6c1daeSBarry Smith /*@C
3265c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
3275c6c1daeSBarry Smith 
3285c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
3295c6c1daeSBarry Smith 
330d8d19677SJose E. Roman    Input Parameters:
3315c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
3325c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith    Level: advanced
3355c6c1daeSBarry Smith 
3365c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith @*/
3395c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
3405c6c1daeSBarry Smith {
3415c6c1daeSBarry Smith   PetscErrorCode ierr;
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith   PetscFunctionBegin;
3448f69470aSLisandro Dalcin   if (!ports) PetscFunctionReturn(0);
34545f3bb6eSLisandro Dalcin   PetscValidPointer(ports,1);
346e5ab1681SLisandro 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);
3475c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr);
3485c6c1daeSBarry Smith   PetscFunctionReturn(0);
3495c6c1daeSBarry Smith }
350