xref: /petsc/src/sys/classes/draw/interface/dviewp.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith /*
3*5c6c1daeSBarry Smith        Provides the calling sequences for all the basic PetscDraw routines.
4*5c6c1daeSBarry Smith */
5*5c6c1daeSBarry Smith #include <petsc-private/drawimpl.h>  /*I "petscdraw.h" I*/
6*5c6c1daeSBarry Smith 
7*5c6c1daeSBarry Smith #undef __FUNCT__
8*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetViewPort"
9*5c6c1daeSBarry Smith /*@
10*5c6c1daeSBarry Smith    PetscDrawSetViewPort - Sets the portion of the window (page) to which draw
11*5c6c1daeSBarry Smith    routines will write.
12*5c6c1daeSBarry Smith 
13*5c6c1daeSBarry Smith    Collective on PetscDraw
14*5c6c1daeSBarry Smith 
15*5c6c1daeSBarry Smith    Input Parameters:
16*5c6c1daeSBarry Smith +  xl,yl,xr,yr - upper right and lower left corners of subwindow
17*5c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
18*5c6c1daeSBarry Smith                  Lower left corner is (0,0).
19*5c6c1daeSBarry Smith -  draw - the drawing context
20*5c6c1daeSBarry Smith 
21*5c6c1daeSBarry Smith    Level: advanced
22*5c6c1daeSBarry Smith 
23*5c6c1daeSBarry Smith    Concepts: drawing^in subset of window
24*5c6c1daeSBarry Smith    Concepts: graphics^in subset of window
25*5c6c1daeSBarry Smith 
26*5c6c1daeSBarry Smith @*/
27*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetViewPort(PetscDraw draw,PetscReal xl,PetscReal yl,PetscReal xr,PetscReal yr)
28*5c6c1daeSBarry Smith {
29*5c6c1daeSBarry Smith   PetscErrorCode ierr;
30*5c6c1daeSBarry Smith 
31*5c6c1daeSBarry Smith   PetscFunctionBegin;
32*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
33*5c6c1daeSBarry 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",xl,yl,xr,yr);
34*5c6c1daeSBarry Smith   draw->port_xl = xl; draw->port_yl = yl;
35*5c6c1daeSBarry Smith   draw->port_xr = xr; draw->port_yr = yr;
36*5c6c1daeSBarry Smith   if (draw->ops->setviewport) {
37*5c6c1daeSBarry Smith     ierr = (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
38*5c6c1daeSBarry Smith   }
39*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
40*5c6c1daeSBarry Smith }
41*5c6c1daeSBarry Smith 
42*5c6c1daeSBarry Smith #undef __FUNCT__
43*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetViewPort"
44*5c6c1daeSBarry Smith /*@
45*5c6c1daeSBarry Smith    PetscDrawGetViewPort - Gets the portion of the window (page) to which draw
46*5c6c1daeSBarry Smith    routines will write.
47*5c6c1daeSBarry Smith 
48*5c6c1daeSBarry Smith    Collective on PetscDraw
49*5c6c1daeSBarry Smith 
50*5c6c1daeSBarry Smith    Input Parameter:
51*5c6c1daeSBarry Smith .  draw - the drawing context
52*5c6c1daeSBarry Smith 
53*5c6c1daeSBarry Smith    Output Parameter:
54*5c6c1daeSBarry Smith .  xl,yl,xr,yr - upper right and lower left corners of subwindow
55*5c6c1daeSBarry Smith                  These numbers must always be between 0.0 and 1.0.
56*5c6c1daeSBarry Smith                  Lower left corner is (0,0).
57*5c6c1daeSBarry Smith 
58*5c6c1daeSBarry Smith    Level: advanced
59*5c6c1daeSBarry Smith 
60*5c6c1daeSBarry Smith    Concepts: drawing^in subset of window
61*5c6c1daeSBarry Smith    Concepts: graphics^in subset of window
62*5c6c1daeSBarry Smith 
63*5c6c1daeSBarry Smith @*/
64*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetViewPort(PetscDraw draw,PetscReal *xl,PetscReal *yl,PetscReal *xr,PetscReal *yr)
65*5c6c1daeSBarry Smith {
66*5c6c1daeSBarry Smith   PetscFunctionBegin;
67*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
68*5c6c1daeSBarry Smith   *xl = draw->port_xl;
69*5c6c1daeSBarry Smith   *yl = draw->port_yl;
70*5c6c1daeSBarry Smith   *xr = draw->port_xr;
71*5c6c1daeSBarry Smith   *yr = draw->port_yr;
72*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
73*5c6c1daeSBarry Smith }
74*5c6c1daeSBarry Smith 
75*5c6c1daeSBarry Smith #undef __FUNCT__
76*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSplitViewPort"
77*5c6c1daeSBarry Smith /*@
78*5c6c1daeSBarry Smith    PetscDrawSplitViewPort - Splits a window shared by several processes into smaller
79*5c6c1daeSBarry Smith    view ports. One for each process.
80*5c6c1daeSBarry Smith 
81*5c6c1daeSBarry Smith    Collective on PetscDraw
82*5c6c1daeSBarry Smith 
83*5c6c1daeSBarry Smith    Input Parameter:
84*5c6c1daeSBarry Smith .  draw - the drawing context
85*5c6c1daeSBarry Smith 
86*5c6c1daeSBarry Smith    Level: advanced
87*5c6c1daeSBarry Smith 
88*5c6c1daeSBarry Smith    Concepts: drawing^in subset of window
89*5c6c1daeSBarry Smith 
90*5c6c1daeSBarry Smith .seealso: PetscDrawDivideViewPort(), PetscDrawSetViewPort()
91*5c6c1daeSBarry Smith 
92*5c6c1daeSBarry Smith @*/
93*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawSplitViewPort(PetscDraw draw)
94*5c6c1daeSBarry Smith {
95*5c6c1daeSBarry Smith   PetscErrorCode ierr;
96*5c6c1daeSBarry Smith   PetscMPIInt    rank,size;
97*5c6c1daeSBarry Smith   int            n;
98*5c6c1daeSBarry Smith   PetscBool      isnull;
99*5c6c1daeSBarry Smith   PetscReal      xl,xr,yl,yr,h;
100*5c6c1daeSBarry Smith 
101*5c6c1daeSBarry Smith   PetscFunctionBegin;
102*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
103*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
104*5c6c1daeSBarry Smith   if (isnull) PetscFunctionReturn(0);
105*5c6c1daeSBarry Smith 
106*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(((PetscObject)draw)->comm,&rank);CHKERRQ(ierr);
107*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)draw)->comm,&size);CHKERRQ(ierr);
108*5c6c1daeSBarry Smith 
109*5c6c1daeSBarry Smith   n = (int)(.1 + sqrt((double)size));
110*5c6c1daeSBarry Smith   while (n*n < size) {n++;}
111*5c6c1daeSBarry Smith 
112*5c6c1daeSBarry Smith   h  = 1.0/n;
113*5c6c1daeSBarry Smith   xl = (rank % n)*h;
114*5c6c1daeSBarry Smith   xr = xl + h;
115*5c6c1daeSBarry Smith   yl = (rank/n)*h;
116*5c6c1daeSBarry Smith   yr = yl + h;
117*5c6c1daeSBarry Smith 
118*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yl,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
119*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xl,yr,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
120*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yr,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
121*5c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,xr,yl,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
122*5c6c1daeSBarry Smith   ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);
123*5c6c1daeSBarry Smith 
124*5c6c1daeSBarry Smith   draw->port_xl = xl + .1*h;
125*5c6c1daeSBarry Smith   draw->port_xr = xr - .1*h;
126*5c6c1daeSBarry Smith   draw->port_yl = yl + .1*h;
127*5c6c1daeSBarry Smith   draw->port_yr = yr - .1*h;
128*5c6c1daeSBarry Smith 
129*5c6c1daeSBarry Smith   if (draw->ops->setviewport) {
130*5c6c1daeSBarry Smith     ierr =  (*draw->ops->setviewport)(draw,xl,yl,xr,yr);CHKERRQ(ierr);
131*5c6c1daeSBarry Smith   }
132*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
133*5c6c1daeSBarry Smith }
134*5c6c1daeSBarry Smith 
135*5c6c1daeSBarry Smith #undef __FUNCT__
136*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreate"
137*5c6c1daeSBarry Smith /*@C
138*5c6c1daeSBarry Smith    PetscDrawViewPortsCreate - Splits a window into smaller
139*5c6c1daeSBarry Smith        view ports. Each processor shares all the viewports.
140*5c6c1daeSBarry Smith 
141*5c6c1daeSBarry Smith    Collective on PetscDraw
142*5c6c1daeSBarry Smith 
143*5c6c1daeSBarry Smith    Input Parameters:
144*5c6c1daeSBarry Smith +  draw - the drawing context
145*5c6c1daeSBarry Smith -  nports - the number of ports
146*5c6c1daeSBarry Smith 
147*5c6c1daeSBarry Smith    Output Parameter:
148*5c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
149*5c6c1daeSBarry Smith 
150*5c6c1daeSBarry Smith    Level: advanced
151*5c6c1daeSBarry Smith 
152*5c6c1daeSBarry Smith    Concepts: drawing^in subset of window
153*5c6c1daeSBarry Smith 
154*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
155*5c6c1daeSBarry Smith 
156*5c6c1daeSBarry Smith @*/
157*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsCreate(PetscDraw draw,PetscInt nports,PetscDrawViewPorts **ports)
158*5c6c1daeSBarry Smith {
159*5c6c1daeSBarry Smith   PetscInt       i,n;
160*5c6c1daeSBarry Smith   PetscErrorCode ierr;
161*5c6c1daeSBarry Smith   PetscBool      isnull;
162*5c6c1daeSBarry Smith   PetscReal      *xl,*xr,*yl,*yr,h;
163*5c6c1daeSBarry Smith 
164*5c6c1daeSBarry Smith   PetscFunctionBegin;
165*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
166*5c6c1daeSBarry Smith   PetscValidPointer(ports,3);
167*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr);
168*5c6c1daeSBarry Smith   if (isnull) {
169*5c6c1daeSBarry Smith     *ports = PETSC_NULL;
170*5c6c1daeSBarry Smith     PetscFunctionReturn(0);
171*5c6c1daeSBarry Smith   }
172*5c6c1daeSBarry Smith 
173*5c6c1daeSBarry Smith   ierr             = PetscNew(PetscDrawViewPorts,ports);CHKERRQ(ierr);
174*5c6c1daeSBarry Smith   (*ports)->draw   = draw;
175*5c6c1daeSBarry Smith   (*ports)->nports = nports;
176*5c6c1daeSBarry Smith 
177*5c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
178*5c6c1daeSBarry Smith 
179*5c6c1daeSBarry Smith   n = (int)(.1 + sqrt((double)nports));
180*5c6c1daeSBarry Smith   while (n*n < nports) {n++;}
181*5c6c1daeSBarry Smith 
182*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*n*sizeof(PetscReal),&xl);CHKERRQ(ierr);(*ports)->xl = xl;
183*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*n*sizeof(PetscReal),&xr);CHKERRQ(ierr);(*ports)->xr = xr;
184*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*n*sizeof(PetscReal),&yl);CHKERRQ(ierr);(*ports)->yl = yl;
185*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*n*sizeof(PetscReal),&yr);CHKERRQ(ierr);(*ports)->yr = yr;
186*5c6c1daeSBarry Smith 
187*5c6c1daeSBarry Smith   h  = 1.0/n;
188*5c6c1daeSBarry Smith 
189*5c6c1daeSBarry Smith   for (i=0; i<n*n; i++) {
190*5c6c1daeSBarry Smith     xl[i] = (i % n)*h;
191*5c6c1daeSBarry Smith     xr[i] = xl[i] + h;
192*5c6c1daeSBarry Smith     yl[i] = (i/n)*h;
193*5c6c1daeSBarry Smith     yr[i] = yl[i] + h;
194*5c6c1daeSBarry Smith 
195*5c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xl[i],yl[i],xl[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
196*5c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xl[i],yr[i],xr[i],yr[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
197*5c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr[i],yr[i],xr[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
198*5c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr[i],yl[i],xl[i],yl[i],PETSC_DRAW_BLACK);CHKERRQ(ierr);
199*5c6c1daeSBarry Smith 
200*5c6c1daeSBarry Smith     xl[i] += .1*h;
201*5c6c1daeSBarry Smith     xr[i] -= .1*h;
202*5c6c1daeSBarry Smith     yl[i] += .1*h;
203*5c6c1daeSBarry Smith     yr[i] -= .1*h;
204*5c6c1daeSBarry Smith   }
205*5c6c1daeSBarry Smith   /* save previous drawport of window */
206*5c6c1daeSBarry Smith   ierr = PetscDrawGetViewPort(draw,&(*ports)->port_xl,&(*ports)->port_yl,&(*ports)->port_xr,&(*ports)->port_yr);CHKERRQ(ierr);
207*5c6c1daeSBarry Smith   /* ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);*/  /* this causes flicker */
208*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
209*5c6c1daeSBarry Smith }
210*5c6c1daeSBarry Smith 
211*5c6c1daeSBarry Smith #undef __FUNCT__
212*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsCreateRect"
213*5c6c1daeSBarry Smith /*@C
214*5c6c1daeSBarry Smith    PetscDrawViewPortsCreateRect - Splits a window into smaller
215*5c6c1daeSBarry Smith        view ports. Each processor shares all the viewports. The number
216*5c6c1daeSBarry Smith        of views in the x- and y-directions is specified.
217*5c6c1daeSBarry Smith 
218*5c6c1daeSBarry Smith    Collective on PetscDraw
219*5c6c1daeSBarry Smith 
220*5c6c1daeSBarry Smith    Input Parameters:
221*5c6c1daeSBarry Smith +  draw - the drawing context
222*5c6c1daeSBarry Smith .  nx - the number of x divisions
223*5c6c1daeSBarry Smith -  ny - the number of y divisions
224*5c6c1daeSBarry Smith 
225*5c6c1daeSBarry Smith    Output Parameter:
226*5c6c1daeSBarry Smith .  ports - a PetscDrawViewPorts context (C structure)
227*5c6c1daeSBarry Smith 
228*5c6c1daeSBarry Smith    Level: advanced
229*5c6c1daeSBarry Smith 
230*5c6c1daeSBarry Smith    Concepts: drawing^in subset of window
231*5c6c1daeSBarry Smith 
232*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsDestroy()
233*5c6c1daeSBarry Smith 
234*5c6c1daeSBarry Smith @*/
235*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsCreateRect(PetscDraw draw,PetscInt nx,PetscInt ny,PetscDrawViewPorts **ports)
236*5c6c1daeSBarry Smith {
237*5c6c1daeSBarry Smith   PetscReal     *xl, *xr, *yl, *yr, hx, hy;
238*5c6c1daeSBarry Smith   PetscBool      isnull;
239*5c6c1daeSBarry Smith   PetscInt       i, j, n;
240*5c6c1daeSBarry Smith   PetscErrorCode ierr;
241*5c6c1daeSBarry Smith 
242*5c6c1daeSBarry Smith   PetscFunctionBegin;
243*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
244*5c6c1daeSBarry 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);
245*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr);
246*5c6c1daeSBarry Smith   if (isnull) {
247*5c6c1daeSBarry Smith     *ports = PETSC_NULL;
248*5c6c1daeSBarry Smith     PetscFunctionReturn(0);
249*5c6c1daeSBarry Smith   }
250*5c6c1daeSBarry Smith   n  = nx*ny;
251*5c6c1daeSBarry Smith   hx = 1.0/nx;
252*5c6c1daeSBarry Smith   hy = 1.0/ny;
253*5c6c1daeSBarry Smith   ierr = PetscNew(PetscDrawViewPorts, ports);CHKERRQ(ierr);
254*5c6c1daeSBarry Smith   (*ports)->draw   = draw;
255*5c6c1daeSBarry Smith   (*ports)->nports = n;
256*5c6c1daeSBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
257*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*sizeof(PetscReal), &xl);CHKERRQ(ierr);(*ports)->xl = xl;
258*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*sizeof(PetscReal), &xr);CHKERRQ(ierr);(*ports)->xr = xr;
259*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*sizeof(PetscReal), &yl);CHKERRQ(ierr);(*ports)->yl = yl;
260*5c6c1daeSBarry Smith   ierr = PetscMalloc(n*sizeof(PetscReal), &yr);CHKERRQ(ierr);(*ports)->yr = yr;
261*5c6c1daeSBarry Smith   for (i = 0; i < nx; i++) {
262*5c6c1daeSBarry Smith     for (j = 0; j < ny; j++) {
263*5c6c1daeSBarry Smith       PetscInt k = j*nx+i;
264*5c6c1daeSBarry Smith 
265*5c6c1daeSBarry Smith       xl[k] = i*hx;
266*5c6c1daeSBarry Smith       xr[k] = xl[k] + hx;
267*5c6c1daeSBarry Smith       yl[k] = j*hy;
268*5c6c1daeSBarry Smith       yr[k] = yl[k] + hy;
269*5c6c1daeSBarry Smith 
270*5c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[k],yl[k],xl[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
271*5c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xl[k],yr[k],xr[k],yr[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
272*5c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[k],yr[k],xr[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
273*5c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr[k],yl[k],xl[k],yl[k],PETSC_DRAW_BLACK);CHKERRQ(ierr);
274*5c6c1daeSBarry Smith 
275*5c6c1daeSBarry Smith       xl[k] += .01*hx;
276*5c6c1daeSBarry Smith       xr[k] -= .01*hx;
277*5c6c1daeSBarry Smith       yl[k] += .01*hy;
278*5c6c1daeSBarry Smith       yr[k] -= .01*hy;
279*5c6c1daeSBarry Smith     }
280*5c6c1daeSBarry Smith   }
281*5c6c1daeSBarry Smith   ierr = PetscDrawGetViewPort(draw,&(*ports)->port_xl,&(*ports)->port_yl,&(*ports)->port_xr,&(*ports)->port_yr);CHKERRQ(ierr);
282*5c6c1daeSBarry Smith   /* ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr); */  /* this causes flicker */
283*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
284*5c6c1daeSBarry Smith }
285*5c6c1daeSBarry Smith 
286*5c6c1daeSBarry Smith #undef __FUNCT__
287*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsDestroy"
288*5c6c1daeSBarry Smith /*@C
289*5c6c1daeSBarry Smith    PetscDrawViewPortsDestroy - frees a PetscDrawViewPorts object
290*5c6c1daeSBarry Smith 
291*5c6c1daeSBarry Smith    Collective on PetscDraw inside PetscDrawViewPorts
292*5c6c1daeSBarry Smith 
293*5c6c1daeSBarry Smith    Input Parameter:
294*5c6c1daeSBarry Smith .  ports - the PetscDrawViewPorts object
295*5c6c1daeSBarry Smith 
296*5c6c1daeSBarry Smith    Level: advanced
297*5c6c1daeSBarry Smith 
298*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsSet(), PetscDrawViewPortsCreate()
299*5c6c1daeSBarry Smith 
300*5c6c1daeSBarry Smith @*/
301*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsDestroy(PetscDrawViewPorts *ports)
302*5c6c1daeSBarry Smith {
303*5c6c1daeSBarry Smith   PetscErrorCode ierr;
304*5c6c1daeSBarry Smith 
305*5c6c1daeSBarry Smith   PetscFunctionBegin;
306*5c6c1daeSBarry Smith   if (!ports) PetscFunctionReturn(0);
307*5c6c1daeSBarry Smith   /* reset Drawport of Window back to previous value */
308*5c6c1daeSBarry Smith   ierr = PetscDrawSetViewPort(ports->draw,ports->port_xl,ports->port_yl,ports->port_xr,ports->port_yr);CHKERRQ(ierr);
309*5c6c1daeSBarry Smith   ierr = PetscDrawDestroy(&ports->draw);CHKERRQ(ierr);
310*5c6c1daeSBarry Smith   ierr = PetscFree(ports->xl);CHKERRQ(ierr);
311*5c6c1daeSBarry Smith   ierr = PetscFree(ports->xr);CHKERRQ(ierr);
312*5c6c1daeSBarry Smith   ierr = PetscFree(ports->yl);CHKERRQ(ierr);
313*5c6c1daeSBarry Smith   ierr = PetscFree(ports->yr);CHKERRQ(ierr);
314*5c6c1daeSBarry Smith   ierr = PetscFree(ports);CHKERRQ(ierr);
315*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
316*5c6c1daeSBarry Smith }
317*5c6c1daeSBarry Smith 
318*5c6c1daeSBarry Smith #undef __FUNCT__
319*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawViewPortsSet"
320*5c6c1daeSBarry Smith /*@C
321*5c6c1daeSBarry Smith    PetscDrawViewPortsSet - sets a draw object to use a particular subport
322*5c6c1daeSBarry Smith 
323*5c6c1daeSBarry Smith    Logically Collective on PetscDraw inside PetscDrawViewPorts
324*5c6c1daeSBarry Smith 
325*5c6c1daeSBarry Smith    Input Parameter:
326*5c6c1daeSBarry Smith +  ports - the PetscDrawViewPorts object
327*5c6c1daeSBarry Smith -  port - the port number, from 0 to nports-1
328*5c6c1daeSBarry Smith 
329*5c6c1daeSBarry Smith    Level: advanced
330*5c6c1daeSBarry Smith 
331*5c6c1daeSBarry Smith    Concepts: drawing^in subset of window
332*5c6c1daeSBarry Smith 
333*5c6c1daeSBarry Smith .seealso: PetscDrawSplitViewPort(), PetscDrawSetViewPort(), PetscDrawViewPortsDestroy(), PetscDrawViewPortsCreate()
334*5c6c1daeSBarry Smith 
335*5c6c1daeSBarry Smith @*/
336*5c6c1daeSBarry Smith PetscErrorCode  PetscDrawViewPortsSet(PetscDrawViewPorts *ports,PetscInt port)
337*5c6c1daeSBarry Smith {
338*5c6c1daeSBarry Smith   PetscErrorCode ierr;
339*5c6c1daeSBarry Smith 
340*5c6c1daeSBarry Smith   PetscFunctionBegin;
341*5c6c1daeSBarry Smith   if (ports) {
342*5c6c1daeSBarry Smith     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);
343*5c6c1daeSBarry Smith     ierr = PetscDrawSetViewPort(ports->draw,ports->xl[port],ports->yl[port],ports->xr[port],ports->yr[port]);CHKERRQ(ierr);
344*5c6c1daeSBarry Smith   }
345*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
346*5c6c1daeSBarry Smith }
347