xref: /petsc/src/sys/classes/viewer/impls/draw/drawv.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/
3*5c6c1daeSBarry Smith 
4*5c6c1daeSBarry Smith #undef __FUNCT__
5*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDestroy_Draw"
6*5c6c1daeSBarry Smith PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v)
7*5c6c1daeSBarry Smith {
8*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
9*5c6c1daeSBarry Smith   PetscInt         i;
10*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data;
11*5c6c1daeSBarry Smith 
12*5c6c1daeSBarry Smith   PetscFunctionBegin;
13*5c6c1daeSBarry Smith   if (vdraw->singleton_made) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Destroying PetscViewer without first restoring singleton");
14*5c6c1daeSBarry Smith   for (i=0; i<vdraw->draw_max; i++) {
15*5c6c1daeSBarry Smith     ierr = PetscDrawAxisDestroy(&vdraw->drawaxis[i]);CHKERRQ(ierr);
16*5c6c1daeSBarry Smith     ierr = PetscDrawLGDestroy(&vdraw->drawlg[i]);CHKERRQ(ierr);
17*5c6c1daeSBarry Smith     ierr = PetscDrawDestroy(&vdraw->draw[i]);CHKERRQ(ierr);
18*5c6c1daeSBarry Smith   }
19*5c6c1daeSBarry Smith 
20*5c6c1daeSBarry Smith   ierr = PetscFree(vdraw->display);CHKERRQ(ierr);
21*5c6c1daeSBarry Smith   ierr = PetscFree(vdraw->title);CHKERRQ(ierr);
22*5c6c1daeSBarry Smith   ierr = PetscFree3(vdraw->draw,vdraw->drawlg,vdraw->drawaxis);CHKERRQ(ierr);
23*5c6c1daeSBarry Smith   ierr = PetscFree(vdraw->bounds);CHKERRQ(ierr);
24*5c6c1daeSBarry Smith   ierr = PetscFree(vdraw);CHKERRQ(ierr);
25*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
26*5c6c1daeSBarry Smith }
27*5c6c1daeSBarry Smith 
28*5c6c1daeSBarry Smith #undef __FUNCT__
29*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerFlush_Draw"
30*5c6c1daeSBarry Smith PetscErrorCode PetscViewerFlush_Draw(PetscViewer v)
31*5c6c1daeSBarry Smith {
32*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
33*5c6c1daeSBarry Smith   PetscInt         i;
34*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data;
35*5c6c1daeSBarry Smith 
36*5c6c1daeSBarry Smith   PetscFunctionBegin;
37*5c6c1daeSBarry Smith   for (i=0; i<vdraw->draw_max; i++) {
38*5c6c1daeSBarry Smith     if (vdraw->draw[i]) {ierr = PetscDrawSynchronizedFlush(vdraw->draw[i]);CHKERRQ(ierr);}
39*5c6c1daeSBarry Smith   }
40*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
41*5c6c1daeSBarry Smith }
42*5c6c1daeSBarry Smith 
43*5c6c1daeSBarry Smith #undef __FUNCT__
44*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetDraw"
45*5c6c1daeSBarry Smith /*@C
46*5c6c1daeSBarry Smith     PetscViewerDrawGetDraw - Returns PetscDraw object from PetscViewer object.
47*5c6c1daeSBarry Smith     This PetscDraw object may then be used to perform graphics using
48*5c6c1daeSBarry Smith     PetscDrawXXX() commands.
49*5c6c1daeSBarry Smith 
50*5c6c1daeSBarry Smith     Not collective (but PetscDraw returned will be parallel object if PetscViewer is)
51*5c6c1daeSBarry Smith 
52*5c6c1daeSBarry Smith     Input Parameters:
53*5c6c1daeSBarry Smith +  viewer - the PetscViewer (created with PetscViewerDrawOpen())
54*5c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
55*5c6c1daeSBarry Smith 
56*5c6c1daeSBarry Smith     Ouput Parameter:
57*5c6c1daeSBarry Smith .   draw - the draw object
58*5c6c1daeSBarry Smith 
59*5c6c1daeSBarry Smith     Level: intermediate
60*5c6c1daeSBarry Smith 
61*5c6c1daeSBarry Smith    Concepts: drawing^accessing PetscDraw context from PetscViewer
62*5c6c1daeSBarry Smith    Concepts: graphics
63*5c6c1daeSBarry Smith 
64*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen()
65*5c6c1daeSBarry Smith @*/
66*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawGetDraw(PetscViewer viewer,PetscInt  windownumber,PetscDraw *draw)
67*5c6c1daeSBarry Smith {
68*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;
69*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
70*5c6c1daeSBarry Smith   PetscBool        isdraw;
71*5c6c1daeSBarry Smith   char             *title;
72*5c6c1daeSBarry Smith 
73*5c6c1daeSBarry Smith   PetscFunctionBegin;
74*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
75*5c6c1daeSBarry Smith   if (draw) PetscValidPointer(draw,3);
76*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
77*5c6c1daeSBarry Smith   if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer");
78*5c6c1daeSBarry Smith   if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative");
79*5c6c1daeSBarry Smith   windownumber += vdraw->draw_base;
80*5c6c1daeSBarry Smith   if (windownumber >= vdraw->draw_max) {
81*5c6c1daeSBarry Smith      /* allocate twice as many slots as needed */
82*5c6c1daeSBarry Smith      PetscInt      draw_max = vdraw->draw_max;
83*5c6c1daeSBarry Smith      PetscDraw     *tdraw = vdraw->draw;
84*5c6c1daeSBarry Smith      PetscDrawLG   *drawlg = vdraw->drawlg;
85*5c6c1daeSBarry Smith      PetscDrawAxis *drawaxis = vdraw->drawaxis;
86*5c6c1daeSBarry Smith 
87*5c6c1daeSBarry Smith      vdraw->draw_max = 2*windownumber;
88*5c6c1daeSBarry Smith      ierr = PetscMalloc3(vdraw->draw_max,PetscDraw,&vdraw->draw,vdraw->draw_max,PetscDrawLG,&vdraw->drawlg,vdraw->draw_max,PetscDrawAxis,&vdraw->drawaxis);CHKERRQ(ierr);
89*5c6c1daeSBarry Smith      ierr = PetscMemzero(vdraw->draw,vdraw->draw_max*sizeof(PetscDraw));CHKERRQ(ierr);
90*5c6c1daeSBarry Smith      ierr = PetscMemzero(vdraw->drawlg,vdraw->draw_max*sizeof(PetscDrawLG));CHKERRQ(ierr);
91*5c6c1daeSBarry Smith      ierr = PetscMemzero(vdraw->drawaxis,vdraw->draw_max*sizeof(PetscDrawAxis));CHKERRQ(ierr);
92*5c6c1daeSBarry Smith 
93*5c6c1daeSBarry Smith      ierr = PetscMemcpy(vdraw->draw,tdraw,draw_max*sizeof(PetscDraw));CHKERRQ(ierr);
94*5c6c1daeSBarry Smith      ierr = PetscMemcpy(vdraw->drawlg,drawlg,draw_max*sizeof(PetscDrawLG));CHKERRQ(ierr);
95*5c6c1daeSBarry Smith      ierr = PetscMemcpy(vdraw->drawaxis,drawaxis,draw_max*sizeof(PetscDrawAxis));CHKERRQ(ierr);
96*5c6c1daeSBarry Smith 
97*5c6c1daeSBarry Smith      ierr = PetscFree3(tdraw,drawlg,drawaxis);CHKERRQ(ierr);
98*5c6c1daeSBarry Smith   }
99*5c6c1daeSBarry Smith 
100*5c6c1daeSBarry Smith   if (!vdraw->draw[windownumber]) {
101*5c6c1daeSBarry Smith     if (!windownumber) {
102*5c6c1daeSBarry Smith       title = vdraw->title;
103*5c6c1daeSBarry Smith     } else {
104*5c6c1daeSBarry Smith       char tmp_str[128];
105*5c6c1daeSBarry Smith       ierr = PetscSNPrintf(tmp_str, 128, "%s:%d", vdraw->title,windownumber);CHKERRQ(ierr);
106*5c6c1daeSBarry Smith       title = tmp_str;
107*5c6c1daeSBarry Smith     }
108*5c6c1daeSBarry Smith     ierr = PetscDrawCreate(((PetscObject)viewer)->comm,vdraw->display,title,PETSC_DECIDE,PETSC_DECIDE,vdraw->w,vdraw->h,&vdraw->draw[windownumber]);CHKERRQ(ierr);
109*5c6c1daeSBarry Smith     ierr = PetscDrawSetFromOptions(vdraw->draw[windownumber]);CHKERRQ(ierr);
110*5c6c1daeSBarry Smith   }
111*5c6c1daeSBarry Smith   if (draw) *draw = vdraw->draw[windownumber];
112*5c6c1daeSBarry Smith   if (draw) PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,-1);
113*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
114*5c6c1daeSBarry Smith }
115*5c6c1daeSBarry Smith 
116*5c6c1daeSBarry Smith #undef __FUNCT__
117*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawBaseAdd"
118*5c6c1daeSBarry Smith /*@C
119*5c6c1daeSBarry Smith     PetscViewerDrawBaseAdd - add to the base integer that is added to the windownumber passed to PetscViewerDrawGetDraw()
120*5c6c1daeSBarry Smith 
121*5c6c1daeSBarry Smith     Not collective (but PetscDraw returned will be parallel object if PetscViewer is)
122*5c6c1daeSBarry Smith 
123*5c6c1daeSBarry Smith     Input Parameters:
124*5c6c1daeSBarry Smith +  viewer - the PetscViewer (created with PetscViewerDrawOpen())
125*5c6c1daeSBarry Smith -   windownumber - how much to add to the base
126*5c6c1daeSBarry Smith 
127*5c6c1daeSBarry Smith     Level: developer
128*5c6c1daeSBarry Smith 
129*5c6c1daeSBarry Smith    Concepts: drawing^accessing PetscDraw context from PetscViewer
130*5c6c1daeSBarry Smith    Concepts: graphics
131*5c6c1daeSBarry Smith 
132*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), PetscViewerDrawBaseSet()
133*5c6c1daeSBarry Smith @*/
134*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawBaseAdd(PetscViewer viewer,PetscInt  windownumber)
135*5c6c1daeSBarry Smith {
136*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;
137*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
138*5c6c1daeSBarry Smith   PetscBool        isdraw;
139*5c6c1daeSBarry Smith 
140*5c6c1daeSBarry Smith   PetscFunctionBegin;
141*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
142*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
143*5c6c1daeSBarry Smith   if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer");
144*5c6c1daeSBarry Smith   if (windownumber + vdraw->draw_base < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Resulting base %D cannot be negative",windownumber+vdraw->draw_base);
145*5c6c1daeSBarry Smith   vdraw->draw_base += windownumber;
146*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
147*5c6c1daeSBarry Smith }
148*5c6c1daeSBarry Smith 
149*5c6c1daeSBarry Smith #undef __FUNCT__
150*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawBaseSet"
151*5c6c1daeSBarry Smith /*@C
152*5c6c1daeSBarry Smith     PetscViewerDrawBaseSet - sets the base integer that is added to the windownumber passed to PetscViewerDrawGetDraw()
153*5c6c1daeSBarry Smith 
154*5c6c1daeSBarry Smith     Not collective (but PetscDraw returned will be parallel object if PetscViewer is)
155*5c6c1daeSBarry Smith 
156*5c6c1daeSBarry Smith     Input Parameters:
157*5c6c1daeSBarry Smith +  viewer - the PetscViewer (created with PetscViewerDrawOpen())
158*5c6c1daeSBarry Smith -   windownumber - value to set the base
159*5c6c1daeSBarry Smith 
160*5c6c1daeSBarry Smith     Level: developer
161*5c6c1daeSBarry Smith 
162*5c6c1daeSBarry Smith    Concepts: drawing^accessing PetscDraw context from PetscViewer
163*5c6c1daeSBarry Smith    Concepts: graphics
164*5c6c1daeSBarry Smith 
165*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen(), PetscViewerDrawGetDraw(), PetscViewerDrawBaseAdd()
166*5c6c1daeSBarry Smith @*/
167*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawBaseSet(PetscViewer viewer,PetscInt  windownumber)
168*5c6c1daeSBarry Smith {
169*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;
170*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
171*5c6c1daeSBarry Smith   PetscBool        isdraw;
172*5c6c1daeSBarry Smith 
173*5c6c1daeSBarry Smith   PetscFunctionBegin;
174*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
175*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
176*5c6c1daeSBarry Smith   if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer");
177*5c6c1daeSBarry Smith   if (windownumber < 0) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Resulting base %D cannot be negative",windownumber);
178*5c6c1daeSBarry Smith   vdraw->draw_base = windownumber;
179*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
180*5c6c1daeSBarry Smith }
181*5c6c1daeSBarry Smith 
182*5c6c1daeSBarry Smith #undef __FUNCT__
183*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetDrawLG"
184*5c6c1daeSBarry Smith /*@C
185*5c6c1daeSBarry Smith     PetscViewerDrawGetDrawLG - Returns PetscDrawLG object from PetscViewer object.
186*5c6c1daeSBarry Smith     This PetscDrawLG object may then be used to perform graphics using
187*5c6c1daeSBarry Smith     PetscDrawLGXXX() commands.
188*5c6c1daeSBarry Smith 
189*5c6c1daeSBarry Smith     Not Collective (but PetscDrawLG object will be parallel if PetscViewer is)
190*5c6c1daeSBarry Smith 
191*5c6c1daeSBarry Smith     Input Parameter:
192*5c6c1daeSBarry Smith +   PetscViewer - the PetscViewer (created with PetscViewerDrawOpen())
193*5c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
194*5c6c1daeSBarry Smith 
195*5c6c1daeSBarry Smith     Ouput Parameter:
196*5c6c1daeSBarry Smith .   draw - the draw line graph object
197*5c6c1daeSBarry Smith 
198*5c6c1daeSBarry Smith     Level: intermediate
199*5c6c1daeSBarry Smith 
200*5c6c1daeSBarry Smith   Concepts: line graph^accessing context
201*5c6c1daeSBarry Smith 
202*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetDraw(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen()
203*5c6c1daeSBarry Smith @*/
204*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawGetDrawLG(PetscViewer viewer,PetscInt  windownumber,PetscDrawLG *drawlg)
205*5c6c1daeSBarry Smith {
206*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
207*5c6c1daeSBarry Smith   PetscBool        isdraw;
208*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;
209*5c6c1daeSBarry Smith 
210*5c6c1daeSBarry Smith   PetscFunctionBegin;
211*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
212*5c6c1daeSBarry Smith   PetscValidPointer(drawlg,3);
213*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
214*5c6c1daeSBarry Smith   if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer");
215*5c6c1daeSBarry Smith   if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative");
216*5c6c1daeSBarry Smith 
217*5c6c1daeSBarry Smith   if (windownumber+vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber+vdraw->draw_base]) {
218*5c6c1daeSBarry Smith     ierr = PetscViewerDrawGetDraw(viewer,windownumber,PETSC_NULL);CHKERRQ(ierr);
219*5c6c1daeSBarry Smith   }
220*5c6c1daeSBarry Smith   if (!vdraw->drawlg[windownumber+vdraw->draw_base]) {
221*5c6c1daeSBarry Smith     ierr = PetscDrawLGCreate(vdraw->draw[windownumber+vdraw->draw_base],1,&vdraw->drawlg[windownumber+vdraw->draw_base]);CHKERRQ(ierr);
222*5c6c1daeSBarry Smith     ierr = PetscLogObjectParent(viewer,vdraw->drawlg[windownumber+vdraw->draw_base]);CHKERRQ(ierr);
223*5c6c1daeSBarry Smith   }
224*5c6c1daeSBarry Smith   *drawlg = vdraw->drawlg[windownumber+vdraw->draw_base];
225*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
226*5c6c1daeSBarry Smith }
227*5c6c1daeSBarry Smith 
228*5c6c1daeSBarry Smith #undef __FUNCT__
229*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetDrawAxis"
230*5c6c1daeSBarry Smith /*@C
231*5c6c1daeSBarry Smith     PetscViewerDrawGetDrawAxis - Returns PetscDrawAxis object from PetscViewer object.
232*5c6c1daeSBarry Smith     This PetscDrawAxis object may then be used to perform graphics using
233*5c6c1daeSBarry Smith     PetscDrawAxisXXX() commands.
234*5c6c1daeSBarry Smith 
235*5c6c1daeSBarry Smith     Not Collective (but PetscDrawAxis object will be parallel if PetscViewer is)
236*5c6c1daeSBarry Smith 
237*5c6c1daeSBarry Smith     Input Parameter:
238*5c6c1daeSBarry Smith +   viewer - the PetscViewer (created with PetscViewerDrawOpen()
239*5c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
240*5c6c1daeSBarry Smith 
241*5c6c1daeSBarry Smith     Ouput Parameter:
242*5c6c1daeSBarry Smith .   drawaxis - the draw axis object
243*5c6c1daeSBarry Smith 
244*5c6c1daeSBarry Smith     Level: advanced
245*5c6c1daeSBarry Smith 
246*5c6c1daeSBarry Smith   Concepts: line graph^accessing context
247*5c6c1daeSBarry Smith 
248*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetDraw(), PetscViewerDrawGetLG(), PetscViewerDrawOpen()
249*5c6c1daeSBarry Smith @*/
250*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawGetDrawAxis(PetscViewer viewer,PetscInt  windownumber,PetscDrawAxis *drawaxis)
251*5c6c1daeSBarry Smith {
252*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
253*5c6c1daeSBarry Smith   PetscBool        isdraw;
254*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;;
255*5c6c1daeSBarry Smith 
256*5c6c1daeSBarry Smith   PetscFunctionBegin;
257*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
258*5c6c1daeSBarry Smith   PetscValidPointer(drawaxis,3);
259*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
260*5c6c1daeSBarry Smith   if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer");
261*5c6c1daeSBarry Smith   if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative");
262*5c6c1daeSBarry Smith 
263*5c6c1daeSBarry Smith   if (windownumber+vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber+vdraw->draw_base]) {
264*5c6c1daeSBarry Smith     ierr = PetscViewerDrawGetDraw(viewer,windownumber,PETSC_NULL);CHKERRQ(ierr);
265*5c6c1daeSBarry Smith   }
266*5c6c1daeSBarry Smith   if (!vdraw->drawaxis[windownumber+vdraw->draw_base]) {
267*5c6c1daeSBarry Smith     ierr = PetscDrawAxisCreate(vdraw->draw[windownumber+vdraw->draw_base],&vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr);
268*5c6c1daeSBarry Smith     ierr = PetscLogObjectParent(viewer,vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr);
269*5c6c1daeSBarry Smith   }
270*5c6c1daeSBarry Smith   *drawaxis = vdraw->drawaxis[windownumber+vdraw->draw_base];
271*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
272*5c6c1daeSBarry Smith }
273*5c6c1daeSBarry Smith 
274*5c6c1daeSBarry Smith #undef __FUNCT__
275*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawResize"
276*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawResize(PetscViewer v,int w,int h)
277*5c6c1daeSBarry Smith {
278*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data;
279*5c6c1daeSBarry Smith 
280*5c6c1daeSBarry Smith   PetscFunctionBegin;
281*5c6c1daeSBarry Smith   vdraw->h  = h;
282*5c6c1daeSBarry Smith   vdraw->w  = w;
283*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
284*5c6c1daeSBarry Smith }
285*5c6c1daeSBarry Smith 
286*5c6c1daeSBarry Smith #undef __FUNCT__
287*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetInfo"
288*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawSetInfo(PetscViewer v,const char display[],const char title[],int x,int y,int w,int h)
289*5c6c1daeSBarry Smith {
290*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
291*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)v->data;
292*5c6c1daeSBarry Smith 
293*5c6c1daeSBarry Smith   PetscFunctionBegin;
294*5c6c1daeSBarry Smith   vdraw->h  = h;
295*5c6c1daeSBarry Smith   vdraw->w  = w;
296*5c6c1daeSBarry Smith   ierr      = PetscStrallocpy(display,&vdraw->display);CHKERRQ(ierr);
297*5c6c1daeSBarry Smith   ierr      = PetscStrallocpy(title,&vdraw->title);CHKERRQ(ierr);
298*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
299*5c6c1daeSBarry Smith }
300*5c6c1daeSBarry Smith 
301*5c6c1daeSBarry Smith #undef __FUNCT__
302*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawOpen"
303*5c6c1daeSBarry Smith /*@C
304*5c6c1daeSBarry Smith    PetscViewerDrawOpen - Opens a window for use as a PetscViewer. If you want to
305*5c6c1daeSBarry Smith    do graphics in this window, you must call PetscViewerDrawGetDraw() and
306*5c6c1daeSBarry Smith    perform the graphics on the PetscDraw object.
307*5c6c1daeSBarry Smith 
308*5c6c1daeSBarry Smith    Collective on MPI_Comm
309*5c6c1daeSBarry Smith 
310*5c6c1daeSBarry Smith    Input Parameters:
311*5c6c1daeSBarry Smith +  comm - communicator that will share window
312*5c6c1daeSBarry Smith .  display - the X display on which to open, or null for the local machine
313*5c6c1daeSBarry Smith .  title - the title to put in the title bar, or null for no title
314*5c6c1daeSBarry Smith .  x, y - the screen coordinates of the upper left corner of window, or use PETSC_DECIDE
315*5c6c1daeSBarry Smith -  w, h - window width and height in pixels, or may use PETSC_DECIDE or PETSC_DRAW_FULL_SIZE, PETSC_DRAW_HALF_SIZE,
316*5c6c1daeSBarry Smith           PETSC_DRAW_THIRD_SIZE, PETSC_DRAW_QUARTER_SIZE
317*5c6c1daeSBarry Smith 
318*5c6c1daeSBarry Smith    Output Parameters:
319*5c6c1daeSBarry Smith . viewer - the PetscViewer
320*5c6c1daeSBarry Smith 
321*5c6c1daeSBarry Smith    Format Options:
322*5c6c1daeSBarry Smith +  PETSC_VIEWER_DRAW_BASIC - displays with basic format
323*5c6c1daeSBarry Smith -  PETSC_VIEWER_DRAW_LG    - displays using a line graph
324*5c6c1daeSBarry Smith 
325*5c6c1daeSBarry Smith    Options Database Keys:
326*5c6c1daeSBarry Smith    PetscViewerDrawOpen() calls PetscDrawCreate(), so see the manual page for
327*5c6c1daeSBarry Smith    PetscDrawCreate() for runtime options, including
328*5c6c1daeSBarry Smith +  -draw_type x or null
329*5c6c1daeSBarry Smith .  -nox - Disables all x-windows output
330*5c6c1daeSBarry Smith .  -display <name> - Specifies name of machine for the X display
331*5c6c1daeSBarry Smith .  -geometry <x,y,w,h> - allows setting the window location and size
332*5c6c1daeSBarry Smith -  -draw_pause <pause> - Sets time (in seconds) that the
333*5c6c1daeSBarry Smith      program pauses after PetscDrawPause() has been called
334*5c6c1daeSBarry Smith      (0 is default, -1 implies until user input).
335*5c6c1daeSBarry Smith 
336*5c6c1daeSBarry Smith    Level: beginner
337*5c6c1daeSBarry Smith 
338*5c6c1daeSBarry Smith    Note for Fortran Programmers:
339*5c6c1daeSBarry Smith    Whenever indicating null character data in a Fortran code,
340*5c6c1daeSBarry Smith    PETSC_NULL_CHARACTER must be employed; using PETSC_NULL is not
341*5c6c1daeSBarry Smith    correct for character data!  Thus, PETSC_NULL_CHARACTER can be
342*5c6c1daeSBarry Smith    used for the display and title input parameters.
343*5c6c1daeSBarry Smith 
344*5c6c1daeSBarry Smith   Concepts: graphics^opening PetscViewer
345*5c6c1daeSBarry Smith   Concepts: drawing^opening PetscViewer
346*5c6c1daeSBarry Smith 
347*5c6c1daeSBarry Smith 
348*5c6c1daeSBarry Smith .seealso: PetscDrawCreate(), PetscViewerDestroy(), PetscViewerDrawGetDraw(), PetscViewerCreate(), PETSC_VIEWER_DRAW_,
349*5c6c1daeSBarry Smith           PETSC_VIEWER_DRAW_WORLD, PETSC_VIEWER_DRAW_SELF
350*5c6c1daeSBarry Smith @*/
351*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawOpen(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscViewer *viewer)
352*5c6c1daeSBarry Smith {
353*5c6c1daeSBarry Smith   PetscErrorCode ierr;
354*5c6c1daeSBarry Smith 
355*5c6c1daeSBarry Smith   PetscFunctionBegin;
356*5c6c1daeSBarry Smith   ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr);
357*5c6c1daeSBarry Smith   ierr = PetscViewerSetType(*viewer,PETSCVIEWERDRAW);CHKERRQ(ierr);
358*5c6c1daeSBarry Smith   ierr = PetscViewerDrawSetInfo(*viewer,display,title,x,y,w,h);CHKERRQ(ierr);
359*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
360*5c6c1daeSBarry Smith }
361*5c6c1daeSBarry Smith 
362*5c6c1daeSBarry Smith #undef __FUNCT__
363*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton_Draw"
364*5c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton_Draw(PetscViewer viewer,PetscViewer *sviewer)
365*5c6c1daeSBarry Smith {
366*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
367*5c6c1daeSBarry Smith   PetscMPIInt      rank;
368*5c6c1daeSBarry Smith   PetscInt         i;
369*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data,*vsdraw;
370*5c6c1daeSBarry Smith 
371*5c6c1daeSBarry Smith   PetscFunctionBegin;
372*5c6c1daeSBarry Smith   if (vdraw->singleton_made) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Trying to get singleton without first restoring previous");
373*5c6c1daeSBarry Smith 
374*5c6c1daeSBarry Smith   /* only processor zero can use the PetscViewer draw singleton */
375*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr);
376*5c6c1daeSBarry Smith   if (!rank) {
377*5c6c1daeSBarry Smith     ierr   = PetscViewerCreate(PETSC_COMM_SELF,sviewer);CHKERRQ(ierr);
378*5c6c1daeSBarry Smith     ierr   = PetscViewerSetType(*sviewer,PETSCVIEWERDRAW);CHKERRQ(ierr);
379*5c6c1daeSBarry Smith     vsdraw = (PetscViewer_Draw *)(*sviewer)->data;
380*5c6c1daeSBarry Smith     for (i=0; i<vdraw->draw_max; i++) {
381*5c6c1daeSBarry Smith       if (vdraw->draw[i]) {
382*5c6c1daeSBarry Smith         ierr = PetscDrawGetSingleton(vdraw->draw[i],&vsdraw->draw[i]);CHKERRQ(ierr);
383*5c6c1daeSBarry Smith       }
384*5c6c1daeSBarry Smith     }
385*5c6c1daeSBarry Smith   }
386*5c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_TRUE;
387*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
388*5c6c1daeSBarry Smith }
389*5c6c1daeSBarry Smith 
390*5c6c1daeSBarry Smith #undef __FUNCT__
391*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton_Draw"
392*5c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton_Draw(PetscViewer viewer,PetscViewer *sviewer)
393*5c6c1daeSBarry Smith {
394*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
395*5c6c1daeSBarry Smith   PetscMPIInt      rank;
396*5c6c1daeSBarry Smith   PetscInt         i;
397*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data,*vsdraw;
398*5c6c1daeSBarry Smith 
399*5c6c1daeSBarry Smith   PetscFunctionBegin;
400*5c6c1daeSBarry Smith   if (!vdraw->singleton_made) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ORDER,"Trying to restore a singleton that was not gotten");
401*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(((PetscObject)viewer)->comm,&rank);CHKERRQ(ierr);
402*5c6c1daeSBarry Smith   if (!rank) {
403*5c6c1daeSBarry Smith     vsdraw = (PetscViewer_Draw *)(*sviewer)->data;
404*5c6c1daeSBarry Smith     for (i=0; i<vdraw->draw_max; i++) {
405*5c6c1daeSBarry Smith       if (vdraw->draw[i] && vsdraw->draw[i]) {
406*5c6c1daeSBarry Smith          ierr = PetscDrawRestoreSingleton(vdraw->draw[i],&vsdraw->draw[i]);CHKERRQ(ierr);
407*5c6c1daeSBarry Smith       }
408*5c6c1daeSBarry Smith     }
409*5c6c1daeSBarry Smith     ierr = PetscFree3(vsdraw->draw,vsdraw->drawlg,vsdraw->drawaxis);CHKERRQ(ierr);
410*5c6c1daeSBarry Smith     ierr = PetscFree((*sviewer)->data);CHKERRQ(ierr);
411*5c6c1daeSBarry Smith     ierr = PetscHeaderDestroy(sviewer);CHKERRQ(ierr);
412*5c6c1daeSBarry Smith   }
413*5c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
414*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
415*5c6c1daeSBarry Smith }
416*5c6c1daeSBarry Smith 
417*5c6c1daeSBarry Smith EXTERN_C_BEGIN
418*5c6c1daeSBarry Smith #undef __FUNCT__
419*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate_Draw"
420*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerCreate_Draw(PetscViewer viewer)
421*5c6c1daeSBarry Smith {
422*5c6c1daeSBarry Smith   PetscInt         i;
423*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
424*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
425*5c6c1daeSBarry Smith 
426*5c6c1daeSBarry Smith   PetscFunctionBegin;
427*5c6c1daeSBarry Smith   ierr         = PetscNewLog(viewer,PetscViewer_Draw,&vdraw);CHKERRQ(ierr);
428*5c6c1daeSBarry Smith   viewer->data = (void*)vdraw;
429*5c6c1daeSBarry Smith 
430*5c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_Draw;
431*5c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_Draw;
432*5c6c1daeSBarry Smith   viewer->ops->getsingleton     = PetscViewerGetSingleton_Draw;
433*5c6c1daeSBarry Smith   viewer->ops->restoresingleton = PetscViewerRestoreSingleton_Draw;
434*5c6c1daeSBarry Smith   viewer->format                = PETSC_VIEWER_NOFORMAT;
435*5c6c1daeSBarry Smith 
436*5c6c1daeSBarry Smith   /* these are created on the fly if requested */
437*5c6c1daeSBarry Smith   vdraw->draw_max  = 5;
438*5c6c1daeSBarry Smith   vdraw->draw_base = 0;
439*5c6c1daeSBarry Smith   ierr = PetscMalloc3(vdraw->draw_max,PetscDraw,&vdraw->draw,vdraw->draw_max,PetscDrawLG,&vdraw->drawlg,vdraw->draw_max,PetscDrawAxis,&vdraw->drawaxis);CHKERRQ(ierr);
440*5c6c1daeSBarry Smith   ierr = PetscMemzero(vdraw->draw,vdraw->draw_max*sizeof(PetscDraw));CHKERRQ(ierr);
441*5c6c1daeSBarry Smith   ierr = PetscMemzero(vdraw->drawlg,vdraw->draw_max*sizeof(PetscDrawLG));CHKERRQ(ierr);
442*5c6c1daeSBarry Smith   ierr = PetscMemzero(vdraw->drawaxis,vdraw->draw_max*sizeof(PetscDrawAxis));CHKERRQ(ierr);
443*5c6c1daeSBarry Smith   for (i=0; i<vdraw->draw_max; i++) {
444*5c6c1daeSBarry Smith     vdraw->draw[i]     = 0;
445*5c6c1daeSBarry Smith     vdraw->drawlg[i]   = 0;
446*5c6c1daeSBarry Smith     vdraw->drawaxis[i] = 0;
447*5c6c1daeSBarry Smith   }
448*5c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
449*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
450*5c6c1daeSBarry Smith }
451*5c6c1daeSBarry Smith EXTERN_C_END
452*5c6c1daeSBarry Smith 
453*5c6c1daeSBarry Smith #undef __FUNCT__
454*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawClear"
455*5c6c1daeSBarry Smith /*@
456*5c6c1daeSBarry Smith     PetscViewerDrawClear - Clears a PetscDraw graphic associated with a PetscViewer.
457*5c6c1daeSBarry Smith 
458*5c6c1daeSBarry Smith     Not Collective
459*5c6c1daeSBarry Smith 
460*5c6c1daeSBarry Smith     Input Parameter:
461*5c6c1daeSBarry Smith .  viewer - the PetscViewer
462*5c6c1daeSBarry Smith 
463*5c6c1daeSBarry Smith     Level: intermediate
464*5c6c1daeSBarry Smith 
465*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(),
466*5c6c1daeSBarry Smith 
467*5c6c1daeSBarry Smith @*/
468*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawClear(PetscViewer viewer)
469*5c6c1daeSBarry Smith {
470*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
471*5c6c1daeSBarry Smith   PetscInt         i;
472*5c6c1daeSBarry Smith   PetscBool        isdraw;
473*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
474*5c6c1daeSBarry Smith 
475*5c6c1daeSBarry Smith   PetscFunctionBegin;
476*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
477*5c6c1daeSBarry Smith   if (isdraw) {
478*5c6c1daeSBarry Smith     vdraw = (PetscViewer_Draw*)viewer->data;
479*5c6c1daeSBarry Smith     for (i=0; i<vdraw->draw_max; i++) {
480*5c6c1daeSBarry Smith       if (vdraw->draw[i]) {ierr = PetscDrawClear(vdraw->draw[i]);CHKERRQ(ierr);}
481*5c6c1daeSBarry Smith     }
482*5c6c1daeSBarry Smith   }
483*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
484*5c6c1daeSBarry Smith }
485*5c6c1daeSBarry Smith 
486*5c6c1daeSBarry Smith #undef __FUNCT__
487*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetPause"
488*5c6c1daeSBarry Smith /*@
489*5c6c1daeSBarry Smith     PetscViewerDrawGetPause - Gets a pause for the first present draw
490*5c6c1daeSBarry Smith 
491*5c6c1daeSBarry Smith     Not Collective
492*5c6c1daeSBarry Smith 
493*5c6c1daeSBarry Smith     Input Parameter:
494*5c6c1daeSBarry Smith .  viewer - the PetscViewer
495*5c6c1daeSBarry Smith 
496*5c6c1daeSBarry Smith     Output Parameter:
497*5c6c1daeSBarry Smith .  pause - the pause value
498*5c6c1daeSBarry Smith 
499*5c6c1daeSBarry Smith     Level: intermediate
500*5c6c1daeSBarry Smith 
501*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(),
502*5c6c1daeSBarry Smith 
503*5c6c1daeSBarry Smith @*/
504*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawGetPause(PetscViewer viewer,PetscReal *pause)
505*5c6c1daeSBarry Smith {
506*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
507*5c6c1daeSBarry Smith   PetscInt         i;
508*5c6c1daeSBarry Smith   PetscBool        isdraw;
509*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
510*5c6c1daeSBarry Smith   PetscDraw        draw;
511*5c6c1daeSBarry Smith 
512*5c6c1daeSBarry Smith   PetscFunctionBegin;
513*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
514*5c6c1daeSBarry Smith   *pause = 0.0;
515*5c6c1daeSBarry Smith   if (isdraw) {
516*5c6c1daeSBarry Smith     vdraw = (PetscViewer_Draw*)viewer->data;
517*5c6c1daeSBarry Smith     for (i=0; i<vdraw->draw_max; i++) {
518*5c6c1daeSBarry Smith       if (vdraw->draw[i]) {
519*5c6c1daeSBarry Smith         ierr = PetscDrawGetPause(vdraw->draw[i],pause);CHKERRQ(ierr);
520*5c6c1daeSBarry Smith         PetscFunctionReturn(0);
521*5c6c1daeSBarry Smith       }
522*5c6c1daeSBarry Smith     }
523*5c6c1daeSBarry Smith     /* none exist yet so create one and get its pause */
524*5c6c1daeSBarry Smith     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
525*5c6c1daeSBarry Smith     ierr = PetscDrawGetPause(vdraw->draw[0],pause);CHKERRQ(ierr);
526*5c6c1daeSBarry Smith   }
527*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
528*5c6c1daeSBarry Smith }
529*5c6c1daeSBarry Smith 
530*5c6c1daeSBarry Smith #undef __FUNCT__
531*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetPause"
532*5c6c1daeSBarry Smith /*@
533*5c6c1daeSBarry Smith     PetscViewerDrawSetPause - Sets a pause for each PetscDraw in the viewer
534*5c6c1daeSBarry Smith 
535*5c6c1daeSBarry Smith     Not Collective
536*5c6c1daeSBarry Smith 
537*5c6c1daeSBarry Smith     Input Parameters:
538*5c6c1daeSBarry Smith +  viewer - the PetscViewer
539*5c6c1daeSBarry Smith -  pause - the pause value
540*5c6c1daeSBarry Smith 
541*5c6c1daeSBarry Smith     Level: intermediate
542*5c6c1daeSBarry Smith 
543*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(),
544*5c6c1daeSBarry Smith 
545*5c6c1daeSBarry Smith @*/
546*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawSetPause(PetscViewer viewer,PetscReal pause)
547*5c6c1daeSBarry Smith {
548*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
549*5c6c1daeSBarry Smith   PetscInt         i;
550*5c6c1daeSBarry Smith   PetscBool        isdraw;
551*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
552*5c6c1daeSBarry Smith 
553*5c6c1daeSBarry Smith   PetscFunctionBegin;
554*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
555*5c6c1daeSBarry Smith   if (isdraw) {
556*5c6c1daeSBarry Smith     vdraw = (PetscViewer_Draw*)viewer->data;
557*5c6c1daeSBarry Smith     for (i=0; i<vdraw->draw_max; i++) {
558*5c6c1daeSBarry Smith       if (vdraw->draw[i]) {ierr = PetscDrawSetPause(vdraw->draw[i],pause);CHKERRQ(ierr);}
559*5c6c1daeSBarry Smith     }
560*5c6c1daeSBarry Smith   }
561*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
562*5c6c1daeSBarry Smith }
563*5c6c1daeSBarry Smith 
564*5c6c1daeSBarry Smith 
565*5c6c1daeSBarry Smith #undef __FUNCT__
566*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetHold"
567*5c6c1daeSBarry Smith /*@
568*5c6c1daeSBarry Smith     PetscViewerDrawSetHold - Holds previous image when drawing new image
569*5c6c1daeSBarry Smith 
570*5c6c1daeSBarry Smith     Not Collective
571*5c6c1daeSBarry Smith 
572*5c6c1daeSBarry Smith     Input Parameters:
573*5c6c1daeSBarry Smith +  viewer - the PetscViewer
574*5c6c1daeSBarry Smith -  hold - indicates to hold or not
575*5c6c1daeSBarry Smith 
576*5c6c1daeSBarry Smith     Level: intermediate
577*5c6c1daeSBarry Smith 
578*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(),
579*5c6c1daeSBarry Smith 
580*5c6c1daeSBarry Smith @*/
581*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawSetHold(PetscViewer viewer,PetscBool hold)
582*5c6c1daeSBarry Smith {
583*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
584*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
585*5c6c1daeSBarry Smith   PetscBool        isdraw;
586*5c6c1daeSBarry Smith 
587*5c6c1daeSBarry Smith   PetscFunctionBegin;
588*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
589*5c6c1daeSBarry Smith   if (isdraw) {
590*5c6c1daeSBarry Smith     vdraw = (PetscViewer_Draw*)viewer->data;
591*5c6c1daeSBarry Smith     vdraw->hold = hold;
592*5c6c1daeSBarry Smith   }
593*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
594*5c6c1daeSBarry Smith }
595*5c6c1daeSBarry Smith 
596*5c6c1daeSBarry Smith #undef __FUNCT__
597*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetHold"
598*5c6c1daeSBarry Smith /*@
599*5c6c1daeSBarry Smith     PetscViewerDrawGetHold - Holds previous image when drawing new image
600*5c6c1daeSBarry Smith 
601*5c6c1daeSBarry Smith     Not Collective
602*5c6c1daeSBarry Smith 
603*5c6c1daeSBarry Smith     Input Parameter:
604*5c6c1daeSBarry Smith .  viewer - the PetscViewer
605*5c6c1daeSBarry Smith 
606*5c6c1daeSBarry Smith     Output Parameter:
607*5c6c1daeSBarry Smith .  hold - indicates to hold or not
608*5c6c1daeSBarry Smith 
609*5c6c1daeSBarry Smith     Level: intermediate
610*5c6c1daeSBarry Smith 
611*5c6c1daeSBarry Smith .seealso: PetscViewerDrawOpen(), PetscViewerDrawGetDraw(),
612*5c6c1daeSBarry Smith 
613*5c6c1daeSBarry Smith @*/
614*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawGetHold(PetscViewer viewer,PetscBool *hold)
615*5c6c1daeSBarry Smith {
616*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
617*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
618*5c6c1daeSBarry Smith   PetscBool        isdraw;
619*5c6c1daeSBarry Smith 
620*5c6c1daeSBarry Smith   PetscFunctionBegin;
621*5c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
622*5c6c1daeSBarry Smith   if (isdraw) {
623*5c6c1daeSBarry Smith     vdraw = (PetscViewer_Draw*)viewer->data;
624*5c6c1daeSBarry Smith     *hold = vdraw->hold;
625*5c6c1daeSBarry Smith   }
626*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
627*5c6c1daeSBarry Smith }
628*5c6c1daeSBarry Smith 
629*5c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/
630*5c6c1daeSBarry Smith /*
631*5c6c1daeSBarry Smith     The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that
632*5c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
633*5c6c1daeSBarry Smith */
634*5c6c1daeSBarry Smith static PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID;
635*5c6c1daeSBarry Smith 
636*5c6c1daeSBarry Smith #undef __FUNCT__
637*5c6c1daeSBarry Smith #define __FUNCT__ "PETSC_VIEWER_DRAW_"
638*5c6c1daeSBarry Smith /*@C
639*5c6c1daeSBarry Smith     PETSC_VIEWER_DRAW_ - Creates a window PetscViewer shared by all processors
640*5c6c1daeSBarry Smith                      in a communicator.
641*5c6c1daeSBarry Smith 
642*5c6c1daeSBarry Smith      Collective on MPI_Comm
643*5c6c1daeSBarry Smith 
644*5c6c1daeSBarry Smith      Input Parameter:
645*5c6c1daeSBarry Smith .    comm - the MPI communicator to share the window PetscViewer
646*5c6c1daeSBarry Smith 
647*5c6c1daeSBarry Smith      Level: intermediate
648*5c6c1daeSBarry Smith 
649*5c6c1daeSBarry Smith      Notes:
650*5c6c1daeSBarry Smith      Unlike almost all other PETSc routines, PETSC_VIEWER_DRAW_ does not return
651*5c6c1daeSBarry Smith      an error code.  The window is usually used in the form
652*5c6c1daeSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_DRAW_(comm));
653*5c6c1daeSBarry Smith 
654*5c6c1daeSBarry Smith .seealso: PETSC_VIEWER_DRAW_WORLD, PETSC_VIEWER_DRAW_SELF, PetscViewerDrawOpen(),
655*5c6c1daeSBarry Smith @*/
656*5c6c1daeSBarry Smith PetscViewer  PETSC_VIEWER_DRAW_(MPI_Comm comm)
657*5c6c1daeSBarry Smith {
658*5c6c1daeSBarry Smith   PetscErrorCode ierr;
659*5c6c1daeSBarry Smith   PetscMPIInt    flag;
660*5c6c1daeSBarry Smith   PetscViewer    viewer;
661*5c6c1daeSBarry Smith   MPI_Comm       ncomm;
662*5c6c1daeSBarry Smith 
663*5c6c1daeSBarry Smith   PetscFunctionBegin;
664*5c6c1daeSBarry Smith   ierr = PetscCommDuplicate(comm,&ncomm,PETSC_NULL);if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
665*5c6c1daeSBarry Smith   if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) {
666*5c6c1daeSBarry Smith     ierr = MPI_Keyval_create(MPI_NULL_COPY_FN,MPI_NULL_DELETE_FN,&Petsc_Viewer_Draw_keyval,0);
667*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
668*5c6c1daeSBarry Smith   }
669*5c6c1daeSBarry Smith   ierr = MPI_Attr_get(ncomm,Petsc_Viewer_Draw_keyval,(void **)&viewer,&flag);
670*5c6c1daeSBarry Smith   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
671*5c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
672*5c6c1daeSBarry Smith     ierr = PetscViewerDrawOpen(ncomm,0,0,PETSC_DECIDE,PETSC_DECIDE,300,300,&viewer);
673*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
674*5c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
675*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
676*5c6c1daeSBarry Smith     ierr = MPI_Attr_put(ncomm,Petsc_Viewer_Draw_keyval,(void*)viewer);
677*5c6c1daeSBarry Smith     if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
678*5c6c1daeSBarry Smith   }
679*5c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
680*5c6c1daeSBarry Smith   if (ierr) {PetscError(PETSC_COMM_SELF,__LINE__,"PETSC_VIEWER_DRAW_",__FILE__,__SDIR__,PETSC_ERR_PLIB,PETSC_ERROR_INITIAL," ");PetscFunctionReturn(0);}
681*5c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
682*5c6c1daeSBarry Smith }
683*5c6c1daeSBarry Smith 
684*5c6c1daeSBarry Smith #undef __FUNCT__
685*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawSetBounds"
686*5c6c1daeSBarry Smith /*@
687*5c6c1daeSBarry Smith     PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting
688*5c6c1daeSBarry Smith 
689*5c6c1daeSBarry Smith     Collective on PetscViewer
690*5c6c1daeSBarry Smith 
691*5c6c1daeSBarry Smith     Input Parameters:
692*5c6c1daeSBarry Smith +   viewer - the PetscViewer (created with PetscViewerDrawOpen())
693*5c6c1daeSBarry Smith .   nbounds - number of plots that can be made with this viewer, for example the dof passed to DMDACreate()
694*5c6c1daeSBarry Smith -   bounds - the actual bounds, the size of this is 2*nbounds, the values are stored in the order min F_0, max F_0, min F_1, max F_1, .....
695*5c6c1daeSBarry Smith 
696*5c6c1daeSBarry Smith     Level: intermediate
697*5c6c1daeSBarry Smith 
698*5c6c1daeSBarry Smith    Concepts: drawing^accessing PetscDraw context from PetscViewer
699*5c6c1daeSBarry Smith    Concepts: graphics
700*5c6c1daeSBarry Smith 
701*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen()
702*5c6c1daeSBarry Smith @*/
703*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawSetBounds(PetscViewer viewer,PetscInt nbounds,const PetscReal *bounds)
704*5c6c1daeSBarry Smith {
705*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;
706*5c6c1daeSBarry Smith   PetscErrorCode   ierr;
707*5c6c1daeSBarry Smith 
708*5c6c1daeSBarry Smith 
709*5c6c1daeSBarry Smith   PetscFunctionBegin;
710*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
711*5c6c1daeSBarry Smith   vdraw->nbounds   = nbounds;
712*5c6c1daeSBarry Smith   ierr = PetscMalloc(2*nbounds*sizeof(PetscReal),&vdraw->bounds);CHKERRQ(ierr);
713*5c6c1daeSBarry Smith   ierr = PetscMemcpy(vdraw->bounds,bounds,2*nbounds*sizeof(PetscReal));CHKERRQ(ierr);
714*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
715*5c6c1daeSBarry Smith }
716*5c6c1daeSBarry Smith 
717*5c6c1daeSBarry Smith #undef __FUNCT__
718*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerDrawGetBounds"
719*5c6c1daeSBarry Smith /*@C
720*5c6c1daeSBarry Smith     PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with PetscViewerDrawSetBounds()
721*5c6c1daeSBarry Smith 
722*5c6c1daeSBarry Smith     Collective on PetscViewer
723*5c6c1daeSBarry Smith 
724*5c6c1daeSBarry Smith     Input Parameter:
725*5c6c1daeSBarry Smith .   viewer - the PetscViewer (created with PetscViewerDrawOpen())
726*5c6c1daeSBarry Smith 
727*5c6c1daeSBarry Smith     Output Paramters:
728*5c6c1daeSBarry Smith +   nbounds - number of plots that can be made with this viewer, for example the dof passed to DMDACreate()
729*5c6c1daeSBarry Smith -   bounds - the actual bounds, the size of this is 2*nbounds, the values are stored in the order min F_0, max F_0, min F_1, max F_1, .....
730*5c6c1daeSBarry Smith 
731*5c6c1daeSBarry Smith     Level: intermediate
732*5c6c1daeSBarry Smith 
733*5c6c1daeSBarry Smith    Concepts: drawing^accessing PetscDraw context from PetscViewer
734*5c6c1daeSBarry Smith    Concepts: graphics
735*5c6c1daeSBarry Smith 
736*5c6c1daeSBarry Smith .seealso: PetscViewerDrawGetLG(), PetscViewerDrawGetAxis(), PetscViewerDrawOpen()
737*5c6c1daeSBarry Smith @*/
738*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerDrawGetBounds(PetscViewer viewer,PetscInt *nbounds,const PetscReal **bounds)
739*5c6c1daeSBarry Smith {
740*5c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;
741*5c6c1daeSBarry Smith 
742*5c6c1daeSBarry Smith   PetscFunctionBegin;
743*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
744*5c6c1daeSBarry Smith   *nbounds = vdraw->nbounds;
745*5c6c1daeSBarry Smith   *bounds  = vdraw->bounds;
746*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
747*5c6c1daeSBarry Smith }
748