xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 51fa3d41ed3feb8cf78b09fc9e5a282491d54f25)
1*51fa3d41SBarry Smith 
2*51fa3d41SBarry Smith /*
3*51fa3d41SBarry Smith   Contains the data structure for plotting a bargraph in a window with an axis.
4*51fa3d41SBarry Smith */
5*51fa3d41SBarry Smith #include <petscdraw.h>         /*I "petscdraw.h" I*/
6*51fa3d41SBarry Smith #include <petsc-private/petscimpl.h>         /*I "petscsys.h" I*/
7*51fa3d41SBarry Smith #include <petscviewer.h>         /*I "petscviewer.h" I*/
8*51fa3d41SBarry Smith #include <../src/sys/classes/draw/utils/axisimpl.h>   /* so we can directly modify axis xticks */
9*51fa3d41SBarry Smith 
10*51fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0;
11*51fa3d41SBarry Smith 
12*51fa3d41SBarry Smith struct _p_PetscDrawBar {
13*51fa3d41SBarry Smith   PETSCHEADER(int);
14*51fa3d41SBarry Smith   PetscErrorCode (*destroy)(PetscDrawSP);
15*51fa3d41SBarry Smith   PetscErrorCode (*view)(PetscDrawSP,PetscViewer);
16*51fa3d41SBarry Smith   PetscDraw      win;
17*51fa3d41SBarry Smith   PetscDrawAxis  axis;
18*51fa3d41SBarry Smith   PetscReal      ymin,ymax;
19*51fa3d41SBarry Smith   int            numBins;
20*51fa3d41SBarry Smith   PetscReal      *values;
21*51fa3d41SBarry Smith   int            color;
22*51fa3d41SBarry Smith   char           **labels;
23*51fa3d41SBarry Smith   PetscBool      sort;
24*51fa3d41SBarry Smith   PetscReal      sorttolerance;
25*51fa3d41SBarry Smith };
26*51fa3d41SBarry Smith 
27*51fa3d41SBarry Smith #define CHUNKSIZE 100
28*51fa3d41SBarry Smith 
29*51fa3d41SBarry Smith #undef __FUNCT__
30*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarCreate"
31*51fa3d41SBarry Smith /*@C
32*51fa3d41SBarry Smith    PetscDrawBarCreate - Creates a bar graph data structure.
33*51fa3d41SBarry Smith 
34*51fa3d41SBarry Smith    Collective over PetscDraw
35*51fa3d41SBarry Smith 
36*51fa3d41SBarry Smith    Input Parameters:
37*51fa3d41SBarry Smith .  draw  - The window where the graph will be made
38*51fa3d41SBarry Smith 
39*51fa3d41SBarry Smith    Output Parameters:
40*51fa3d41SBarry Smith .  bar - The bar graph context
41*51fa3d41SBarry Smith 
42*51fa3d41SBarry Smith    Level: intermediate
43*51fa3d41SBarry Smith 
44*51fa3d41SBarry Smith    Concepts: bar graph^creating
45*51fa3d41SBarry Smith 
46*51fa3d41SBarry Smith .seealso: PetscDrawBarDestroy()
47*51fa3d41SBarry Smith 
48*51fa3d41SBarry Smith @*/
49*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar)
50*51fa3d41SBarry Smith {
51*51fa3d41SBarry Smith   PetscDrawBar    h;
52*51fa3d41SBarry Smith   MPI_Comm       comm;
53*51fa3d41SBarry Smith   PetscBool      isnull;
54*51fa3d41SBarry Smith   PetscErrorCode ierr;
55*51fa3d41SBarry Smith 
56*51fa3d41SBarry Smith   PetscFunctionBegin;
57*51fa3d41SBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID,1);
58*51fa3d41SBarry Smith   PetscValidPointer(bar,3);
59*51fa3d41SBarry Smith   ierr = PetscObjectGetComm((PetscObject) draw, &comm);CHKERRQ(ierr);
60*51fa3d41SBarry Smith   ierr = PetscHeaderCreate(h, _p_PetscDrawBar, int, PETSC_DRAWBAR_CLASSID,  "PetscDrawBar", "Bar Graph", "Draw", comm, PetscDrawBarDestroy, NULL);CHKERRQ(ierr);
61*51fa3d41SBarry Smith 
62*51fa3d41SBarry Smith   h->view        = NULL;
63*51fa3d41SBarry Smith   h->destroy     = NULL;
64*51fa3d41SBarry Smith   h->win         = draw;
65*51fa3d41SBarry Smith 
66*51fa3d41SBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
67*51fa3d41SBarry Smith 
68*51fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
69*51fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
70*51fa3d41SBarry Smith   h->ymax        = 0.;
71*51fa3d41SBarry Smith   h->numBins     = 0;
72*51fa3d41SBarry Smith 
73*51fa3d41SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr);
74*51fa3d41SBarry Smith   if (!isnull) {
75*51fa3d41SBarry Smith     ierr = PetscDrawAxisCreate(draw, &h->axis);CHKERRQ(ierr);
76*51fa3d41SBarry Smith     ierr = PetscLogObjectParent((PetscObject)h, (PetscObject)h->axis);CHKERRQ(ierr);
77*51fa3d41SBarry Smith     h->axis->xticks = NULL;
78*51fa3d41SBarry Smith   } else h->axis = NULL;
79*51fa3d41SBarry Smith   *bar = h;
80*51fa3d41SBarry Smith   PetscFunctionReturn(0);
81*51fa3d41SBarry Smith }
82*51fa3d41SBarry Smith 
83*51fa3d41SBarry Smith #undef __FUNCT__
84*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData"
85*51fa3d41SBarry Smith /*@C
86*51fa3d41SBarry Smith    PetscDrawBarSetData
87*51fa3d41SBarry Smith 
88*51fa3d41SBarry Smith    Not Collective (ignored except on processor 0 of PetscDrawBar)
89*51fa3d41SBarry Smith 
90*51fa3d41SBarry Smith    Input Parameter:
91*51fa3d41SBarry Smith +  bar - The bar graph context.
92*51fa3d41SBarry Smith .  bins  - number of items
93*51fa3d41SBarry Smith .  values - values of each item
94*51fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
95*51fa3d41SBarry Smith 
96*51fa3d41SBarry Smith    Level: intermediate
97*51fa3d41SBarry Smith 
98*51fa3d41SBarry Smith 
99*51fa3d41SBarry Smith @*/
100*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins,const PetscReal data[],const char *const *labels)
101*51fa3d41SBarry Smith {
102*51fa3d41SBarry Smith   PetscErrorCode ierr;
103*51fa3d41SBarry Smith 
104*51fa3d41SBarry Smith   PetscFunctionBegin;
105*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
106*51fa3d41SBarry Smith   if (bar->numBins != bins) {
107*51fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
108*51fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
109*51fa3d41SBarry Smith     bar->numBins = bins;
110*51fa3d41SBarry Smith   }
111*51fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
112*51fa3d41SBarry Smith   bar->numBins = bins;
113*51fa3d41SBarry Smith   if (labels) {
114*51fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
115*51fa3d41SBarry Smith   }
116*51fa3d41SBarry Smith   PetscFunctionReturn(0);
117*51fa3d41SBarry Smith }
118*51fa3d41SBarry Smith 
119*51fa3d41SBarry Smith #undef __FUNCT__
120*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy"
121*51fa3d41SBarry Smith /*@C
122*51fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
123*51fa3d41SBarry Smith 
124*51fa3d41SBarry Smith   Collective over PetscDrawBar
125*51fa3d41SBarry Smith 
126*51fa3d41SBarry Smith   Input Parameter:
127*51fa3d41SBarry Smith . bar - The bar graph context
128*51fa3d41SBarry Smith 
129*51fa3d41SBarry Smith   Level: intermediate
130*51fa3d41SBarry Smith 
131*51fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
132*51fa3d41SBarry Smith @*/
133*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
134*51fa3d41SBarry Smith {
135*51fa3d41SBarry Smith   PetscErrorCode ierr;
136*51fa3d41SBarry Smith 
137*51fa3d41SBarry Smith   PetscFunctionBegin;
138*51fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
139*51fa3d41SBarry Smith   PetscValidHeader(*bar,1);
140*51fa3d41SBarry Smith 
141*51fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
142*51fa3d41SBarry Smith   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
143*51fa3d41SBarry Smith   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
144*51fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
145*51fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
146*51fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
147*51fa3d41SBarry Smith   PetscFunctionReturn(0);
148*51fa3d41SBarry Smith }
149*51fa3d41SBarry Smith 
150*51fa3d41SBarry Smith #undef __FUNCT__
151*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw"
152*51fa3d41SBarry Smith /*@
153*51fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
154*51fa3d41SBarry Smith 
155*51fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
156*51fa3d41SBarry Smith 
157*51fa3d41SBarry Smith   Input Parameter:
158*51fa3d41SBarry Smith . bar - The bar graph context
159*51fa3d41SBarry Smith 
160*51fa3d41SBarry Smith   Level: intermediate
161*51fa3d41SBarry Smith 
162*51fa3d41SBarry Smith @*/
163*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
164*51fa3d41SBarry Smith {
165*51fa3d41SBarry Smith   PetscDraw      draw = bar->win;
166*51fa3d41SBarry Smith   PetscBool      isnull;
167*51fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
168*51fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
169*51fa3d41SBarry Smith   PetscErrorCode ierr;
170*51fa3d41SBarry Smith   char           **labels;
171*51fa3d41SBarry Smith 
172*51fa3d41SBarry Smith   PetscFunctionBegin;
173*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
174*51fa3d41SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr);
175*51fa3d41SBarry Smith   if (isnull) PetscFunctionReturn(0);
176*51fa3d41SBarry Smith   if (bar->numBins < 1) PetscFunctionReturn(0);
177*51fa3d41SBarry Smith 
178*51fa3d41SBarry Smith   color = bar->color;
179*51fa3d41SBarry Smith   if (color == PETSC_DRAW_ROTATE) bcolor = 2;
180*51fa3d41SBarry Smith   else bcolor = color;
181*51fa3d41SBarry Smith 
182*51fa3d41SBarry Smith   numValues = bar->numBins;
183*51fa3d41SBarry Smith   values    = bar->values;
184*51fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
185*51fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
186*51fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
187*51fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
188*51fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
189*51fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
190*51fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
191*51fa3d41SBarry Smith     }
192*51fa3d41SBarry Smith   } else {
193*51fa3d41SBarry Smith     ymin      = bar->ymin;
194*51fa3d41SBarry Smith     ymax      = bar->ymax;
195*51fa3d41SBarry Smith   }
196*51fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
197*51fa3d41SBarry Smith   xmin   = 0.0;
198*51fa3d41SBarry Smith   labels = bar->labels;
199*51fa3d41SBarry Smith 
200*51fa3d41SBarry Smith   if (bar->sort) {
201*51fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
202*51fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
203*51fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
204*51fa3d41SBarry Smith     if (bar->sorttolerance) {
205*51fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
206*51fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
207*51fa3d41SBarry Smith           nplot = i;
208*51fa3d41SBarry Smith           break;
209*51fa3d41SBarry Smith         }
210*51fa3d41SBarry Smith       }
211*51fa3d41SBarry Smith     }
212*51fa3d41SBarry Smith   }
213*51fa3d41SBarry Smith 
214*51fa3d41SBarry Smith   xmax   = nplot;
215*51fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax);CHKERRQ(ierr);
216*51fa3d41SBarry Smith   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
217*51fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
218*51fa3d41SBarry Smith 
219*51fa3d41SBarry Smith   /* Draw bins */
220*51fa3d41SBarry Smith   for (i = 0; i < nplot; i++) {
221*51fa3d41SBarry Smith     idx = (bar->sort ? perm[numValues - i - 1] : i);
222*51fa3d41SBarry Smith     binLeft  = xmin + i;
223*51fa3d41SBarry Smith     binRight = xmin + i + 1;
224*51fa3d41SBarry Smith     ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
225*51fa3d41SBarry Smith     ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
226*51fa3d41SBarry Smith     ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
227*51fa3d41SBarry Smith     ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
228*51fa3d41SBarry Smith     if (labels) {
229*51fa3d41SBarry Smith       PetscReal h;
230*51fa3d41SBarry Smith       ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
231*51fa3d41SBarry Smith       ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.2*h,bcolor,labels[idx]);CHKERRQ(ierr);
232*51fa3d41SBarry Smith     }
233*51fa3d41SBarry Smith     if (color == PETSC_DRAW_ROTATE) bcolor++;
234*51fa3d41SBarry Smith     if (bcolor > 31) bcolor = 2;
235*51fa3d41SBarry Smith   }
236*51fa3d41SBarry Smith   if (bar->sort) {
237*51fa3d41SBarry Smith     ierr = PetscFree(perm);CHKERRQ(ierr);
238*51fa3d41SBarry Smith   }
239*51fa3d41SBarry Smith   ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);
240*51fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
241*51fa3d41SBarry Smith   PetscFunctionReturn(0);
242*51fa3d41SBarry Smith }
243*51fa3d41SBarry Smith 
244*51fa3d41SBarry Smith #undef __FUNCT__
245*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor"
246*51fa3d41SBarry Smith /*@
247*51fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
248*51fa3d41SBarry Smith 
249*51fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
250*51fa3d41SBarry Smith 
251*51fa3d41SBarry Smith   Input Parameters:
252*51fa3d41SBarry Smith + bar - The bar graph context
253*51fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
254*51fa3d41SBarry Smith           different color
255*51fa3d41SBarry Smith 
256*51fa3d41SBarry Smith   Level: intermediate
257*51fa3d41SBarry Smith 
258*51fa3d41SBarry Smith @*/
259*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
260*51fa3d41SBarry Smith {
261*51fa3d41SBarry Smith   PetscFunctionBegin;
262*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
263*51fa3d41SBarry Smith   bar->color = color;
264*51fa3d41SBarry Smith   PetscFunctionReturn(0);
265*51fa3d41SBarry Smith }
266*51fa3d41SBarry Smith 
267*51fa3d41SBarry Smith #undef __FUNCT__
268*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort"
269*51fa3d41SBarry Smith /*@
270*51fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
271*51fa3d41SBarry Smith 
272*51fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
273*51fa3d41SBarry Smith 
274*51fa3d41SBarry Smith   Input Parameters:
275*51fa3d41SBarry Smith + bar - The bar graph context
276*51fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
277*51fa3d41SBarry Smith . tolerance - discard values less than tolerance
278*51fa3d41SBarry Smith 
279*51fa3d41SBarry Smith   Level: intermediate
280*51fa3d41SBarry Smith 
281*51fa3d41SBarry Smith   Concepts: bar graph^setting axis
282*51fa3d41SBarry Smith @*/
283*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
284*51fa3d41SBarry Smith {
285*51fa3d41SBarry Smith   PetscFunctionBegin;
286*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
287*51fa3d41SBarry Smith   bar->sort          = sort;
288*51fa3d41SBarry Smith   bar->sorttolerance = tolerance;
289*51fa3d41SBarry Smith   PetscFunctionReturn(0);
290*51fa3d41SBarry Smith }
291*51fa3d41SBarry Smith 
292*51fa3d41SBarry Smith #undef __FUNCT__
293*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits"
294*51fa3d41SBarry Smith /*@
295*51fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
296*51fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
297*51fa3d41SBarry Smith   include those additional points.
298*51fa3d41SBarry Smith 
299*51fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
300*51fa3d41SBarry Smith 
301*51fa3d41SBarry Smith   Input Parameters:
302*51fa3d41SBarry Smith + bar - The bar graph context
303*51fa3d41SBarry Smith - y_min,y_max - The limits
304*51fa3d41SBarry Smith 
305*51fa3d41SBarry Smith   Level: intermediate
306*51fa3d41SBarry Smith 
307*51fa3d41SBarry Smith   Concepts: bar graph^setting axis
308*51fa3d41SBarry Smith @*/
309*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
310*51fa3d41SBarry Smith {
311*51fa3d41SBarry Smith   PetscFunctionBegin;
312*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
313*51fa3d41SBarry Smith   bar->ymin = y_min;
314*51fa3d41SBarry Smith   bar->ymax = y_max;
315*51fa3d41SBarry Smith   PetscFunctionReturn(0);
316*51fa3d41SBarry Smith }
317*51fa3d41SBarry Smith 
318*51fa3d41SBarry Smith #undef __FUNCT__
319*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis"
320*51fa3d41SBarry Smith /*@C
321*51fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
322*51fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
323*51fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
324*51fa3d41SBarry Smith   application code.
325*51fa3d41SBarry Smith 
326*51fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
327*51fa3d41SBarry Smith 
328*51fa3d41SBarry Smith   Input Parameter:
329*51fa3d41SBarry Smith . bar - The bar graph context
330*51fa3d41SBarry Smith 
331*51fa3d41SBarry Smith   Output Parameter:
332*51fa3d41SBarry Smith . axis - The axis context
333*51fa3d41SBarry Smith 
334*51fa3d41SBarry Smith   Level: intermediate
335*51fa3d41SBarry Smith 
336*51fa3d41SBarry Smith @*/
337*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
338*51fa3d41SBarry Smith {
339*51fa3d41SBarry Smith   PetscFunctionBegin;
340*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
341*51fa3d41SBarry Smith   PetscValidPointer(axis,2);
342*51fa3d41SBarry Smith   *axis = bar->axis;
343*51fa3d41SBarry Smith   PetscFunctionReturn(0);
344*51fa3d41SBarry Smith }
345*51fa3d41SBarry Smith 
346*51fa3d41SBarry Smith #undef __FUNCT__
347*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw"
348*51fa3d41SBarry Smith /*@C
349*51fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
350*51fa3d41SBarry Smith 
351*51fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
352*51fa3d41SBarry Smith 
353*51fa3d41SBarry Smith   Input Parameter:
354*51fa3d41SBarry Smith . bar - The bar graph context
355*51fa3d41SBarry Smith 
356*51fa3d41SBarry Smith   Output Parameter:
357*51fa3d41SBarry Smith . win  - The draw context
358*51fa3d41SBarry Smith 
359*51fa3d41SBarry Smith   Level: intermediate
360*51fa3d41SBarry Smith 
361*51fa3d41SBarry Smith @*/
362*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *win)
363*51fa3d41SBarry Smith {
364*51fa3d41SBarry Smith   PetscFunctionBegin;
365*51fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
366*51fa3d41SBarry Smith   PetscValidPointer(win,2);
367*51fa3d41SBarry Smith   *win = bar->win;
368*51fa3d41SBarry Smith   PetscFunctionReturn(0);
369*51fa3d41SBarry Smith }
370*51fa3d41SBarry Smith 
371*51fa3d41SBarry Smith #undef __FUNCT__
372*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions"
373*51fa3d41SBarry Smith /*@
374*51fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
375*51fa3d41SBarry Smith 
376*51fa3d41SBarry Smith     Collective over PetscDrawBar
377*51fa3d41SBarry Smith 
378*51fa3d41SBarry Smith     Options Database:
379*51fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
380*51fa3d41SBarry Smith 
381*51fa3d41SBarry Smith     Level: intermediate
382*51fa3d41SBarry Smith 
383*51fa3d41SBarry Smith 
384*51fa3d41SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate()
385*51fa3d41SBarry Smith @*/
386*51fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
387*51fa3d41SBarry Smith {
388*51fa3d41SBarry Smith   PetscErrorCode ierr;
389*51fa3d41SBarry Smith   PetscBool      set;
390*51fa3d41SBarry Smith   PetscReal      tol = bar->sorttolerance;
391*51fa3d41SBarry Smith 
392*51fa3d41SBarry Smith   PetscFunctionBegin;
393*51fa3d41SBarry Smith   ierr = PetscOptionsHasName(NULL,"-bar_sort",&set);CHKERRQ(ierr);
394*51fa3d41SBarry Smith   if (set) {
395*51fa3d41SBarry Smith     ierr = PetscOptionsGetReal(NULL,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
396*51fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
397*51fa3d41SBarry Smith   }
398*51fa3d41SBarry Smith   PetscFunctionReturn(0);
399*51fa3d41SBarry Smith }
400*51fa3d41SBarry Smith 
401