xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 999739cf12618b36ac48ee4250964a76f927d80d)
151fa3d41SBarry Smith 
251fa3d41SBarry Smith /*
351fa3d41SBarry Smith   Contains the data structure for plotting a bargraph in a window with an axis.
451fa3d41SBarry Smith */
5*999739cfSJacob Faibussowitsch 
6*999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
751fa3d41SBarry Smith #include <petscviewer.h>            /*I "petscviewer.h" I*/
851fa3d41SBarry Smith 
951fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0;
1051fa3d41SBarry Smith 
1151fa3d41SBarry Smith /*@C
1251fa3d41SBarry Smith    PetscDrawBarCreate - Creates a bar graph data structure.
1351fa3d41SBarry Smith 
1451fa3d41SBarry Smith    Collective over PetscDraw
1551fa3d41SBarry Smith 
1651fa3d41SBarry Smith    Input Parameters:
1751fa3d41SBarry Smith .  draw  - The window where the graph will be made
1851fa3d41SBarry Smith 
1951fa3d41SBarry Smith    Output Parameters:
2051fa3d41SBarry Smith .  bar - The bar graph context
2151fa3d41SBarry Smith 
2295452b02SPatrick Sanan    Notes:
2395452b02SPatrick Sanan     Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot
240afdd333SBarry Smith 
25a8d69d7bSBarry Smith   The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here https://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP
267e25d57eSBarry Smith 
277e25d57eSBarry Smith    The MPI communicator that owns the PetscDraw owns this PetscDrawBar, but the calls to set options and add data are ignored on all processes except the
287e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph.
290afdd333SBarry Smith 
3051fa3d41SBarry Smith    Level: intermediate
3151fa3d41SBarry Smith 
320afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(),
330afdd333SBarry Smith           PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis,
340afdd333SBarry Smith           PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions()
3551fa3d41SBarry Smith @*/
3651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar)
3751fa3d41SBarry Smith {
3851fa3d41SBarry Smith   PetscDrawBar   h;
3951fa3d41SBarry Smith   PetscErrorCode ierr;
4051fa3d41SBarry Smith 
4151fa3d41SBarry Smith   PetscFunctionBegin;
4251fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4373107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
44e118a51fSLisandro Dalcin 
4571917b75SLisandro Dalcin   ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr);
46e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
47e118a51fSLisandro Dalcin 
48e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
49e118a51fSLisandro Dalcin   h->win = draw;
5051fa3d41SBarry Smith 
5151fa3d41SBarry Smith   h->view        = NULL;
5251fa3d41SBarry Smith   h->destroy     = NULL;
5351fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
5451fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
5551fa3d41SBarry Smith   h->ymax        = 0.;
5651fa3d41SBarry Smith   h->numBins     = 0;
5751fa3d41SBarry Smith 
5851fa3d41SBarry Smith   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
5945f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
60e118a51fSLisandro Dalcin 
6151fa3d41SBarry Smith   *bar = h;
6251fa3d41SBarry Smith   PetscFunctionReturn(0);
6351fa3d41SBarry Smith }
6451fa3d41SBarry Smith 
6551fa3d41SBarry Smith /*@C
6651fa3d41SBarry Smith    PetscDrawBarSetData
6751fa3d41SBarry Smith 
685b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
6951fa3d41SBarry Smith 
70d8d19677SJose E. Roman    Input Parameters:
7151fa3d41SBarry Smith +  bar - The bar graph context.
7251fa3d41SBarry Smith .  bins  - number of items
7351fa3d41SBarry Smith .  values - values of each item
7451fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
7551fa3d41SBarry Smith 
7651fa3d41SBarry Smith    Level: intermediate
7751fa3d41SBarry Smith 
7895452b02SPatrick Sanan    Notes:
7995452b02SPatrick Sanan     Call PetscDrawBarDraw() after this call to display the new plot
800afdd333SBarry Smith 
810afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw()
8251fa3d41SBarry Smith 
8351fa3d41SBarry Smith @*/
8451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
8551fa3d41SBarry Smith {
8651fa3d41SBarry Smith   PetscErrorCode ierr;
8751fa3d41SBarry Smith 
8851fa3d41SBarry Smith   PetscFunctionBegin;
8951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
90e118a51fSLisandro Dalcin 
9151fa3d41SBarry Smith   if (bar->numBins != bins) {
9251fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
9351fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
9451fa3d41SBarry Smith     bar->numBins = bins;
9551fa3d41SBarry Smith   }
96580bdb30SBarry Smith   ierr = PetscArraycpy(bar->values,data,bins);CHKERRQ(ierr);
9751fa3d41SBarry Smith   bar->numBins = bins;
9851fa3d41SBarry Smith   if (labels) {
9951fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
10051fa3d41SBarry Smith   }
10151fa3d41SBarry Smith   PetscFunctionReturn(0);
10251fa3d41SBarry Smith }
10351fa3d41SBarry Smith 
10451fa3d41SBarry Smith /*@C
10551fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
10651fa3d41SBarry Smith 
10751fa3d41SBarry Smith   Collective over PetscDrawBar
10851fa3d41SBarry Smith 
10951fa3d41SBarry Smith   Input Parameter:
11051fa3d41SBarry Smith . bar - The bar graph context
11151fa3d41SBarry Smith 
11251fa3d41SBarry Smith   Level: intermediate
11351fa3d41SBarry Smith 
11451fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
11551fa3d41SBarry Smith @*/
11651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
11751fa3d41SBarry Smith {
11851fa3d41SBarry Smith   PetscErrorCode ierr;
11951fa3d41SBarry Smith 
12051fa3d41SBarry Smith   PetscFunctionBegin;
12151fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
122e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
12351fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
124e118a51fSLisandro Dalcin 
12551fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
12651fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
127e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
128e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
12951fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
13051fa3d41SBarry Smith   PetscFunctionReturn(0);
13151fa3d41SBarry Smith }
13251fa3d41SBarry Smith 
13351fa3d41SBarry Smith /*@
13451fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
13551fa3d41SBarry Smith 
1365b399a63SLisandro Dalcin   Collective on PetscDrawBar
13751fa3d41SBarry Smith 
13851fa3d41SBarry Smith   Input Parameter:
13951fa3d41SBarry Smith . bar - The bar graph context
14051fa3d41SBarry Smith 
14151fa3d41SBarry Smith   Level: intermediate
14251fa3d41SBarry Smith 
1430afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData()
1440afdd333SBarry Smith 
14551fa3d41SBarry Smith @*/
14651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
14751fa3d41SBarry Smith {
148e118a51fSLisandro Dalcin   PetscDraw      draw;
14951fa3d41SBarry Smith   PetscBool      isnull;
15051fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
15151fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
152e118a51fSLisandro Dalcin   PetscMPIInt    rank;
15351fa3d41SBarry Smith   PetscErrorCode ierr;
15451fa3d41SBarry Smith   char           **labels;
15551fa3d41SBarry Smith 
15651fa3d41SBarry Smith   PetscFunctionBegin;
15751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1588f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1598f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
160ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRMPI(ierr);
16151fa3d41SBarry Smith 
1625b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1635b399a63SLisandro Dalcin 
16451fa3d41SBarry Smith   color = bar->color;
16571917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
16651fa3d41SBarry Smith   else bcolor = color;
16751fa3d41SBarry Smith 
16851fa3d41SBarry Smith   numValues = bar->numBins;
16951fa3d41SBarry Smith   values    = bar->values;
17051fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
17151fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
17251fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
17351fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
17451fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
17551fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
17651fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
17751fa3d41SBarry Smith     }
17851fa3d41SBarry Smith   } else {
17951fa3d41SBarry Smith     ymin = bar->ymin;
18051fa3d41SBarry Smith     ymax = bar->ymax;
18151fa3d41SBarry Smith   }
18251fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
18351fa3d41SBarry Smith   xmin   = 0.0;
184e118a51fSLisandro Dalcin   xmax   = nplot;
18551fa3d41SBarry Smith   labels = bar->labels;
18651fa3d41SBarry Smith 
18751fa3d41SBarry Smith   if (bar->sort) {
18851fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
18951fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
19051fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
19151fa3d41SBarry Smith     if (bar->sorttolerance) {
19251fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
19351fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
19451fa3d41SBarry Smith           nplot = i;
19551fa3d41SBarry Smith           break;
19651fa3d41SBarry Smith         }
19751fa3d41SBarry Smith       }
19851fa3d41SBarry Smith     }
19951fa3d41SBarry Smith   }
20051fa3d41SBarry Smith 
2015b399a63SLisandro Dalcin   draw = bar->win;
202e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
2035b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
204e118a51fSLisandro Dalcin 
20551fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
20651fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
20751fa3d41SBarry Smith 
2085b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
209dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
21051fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
21151fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
21251fa3d41SBarry Smith       binLeft  = xmin + i;
21351fa3d41SBarry Smith       binRight = xmin + i + 1;
21451fa3d41SBarry Smith       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
21551fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
21651fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
21751fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
21851fa3d41SBarry Smith       if (labels) {
21951fa3d41SBarry Smith         PetscReal h;
22051fa3d41SBarry Smith         ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
22171917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr);
22251fa3d41SBarry Smith       }
22351fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
22471917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
22551fa3d41SBarry Smith     }
22651fa3d41SBarry Smith   }
2275b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
228e118a51fSLisandro Dalcin   if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);}
229e118a51fSLisandro Dalcin 
2305b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
23151fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
23251fa3d41SBarry Smith   PetscFunctionReturn(0);
23351fa3d41SBarry Smith }
23451fa3d41SBarry Smith 
23557fd6651SLisandro Dalcin /*@
23657fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
23757fd6651SLisandro Dalcin 
23857fd6651SLisandro Dalcin   Collective on PetscDrawBar
23957fd6651SLisandro Dalcin 
24057fd6651SLisandro Dalcin   Input Parameters:
24157fd6651SLisandro Dalcin . bar - The bar graph context
24257fd6651SLisandro Dalcin 
24357fd6651SLisandro Dalcin   Level: intermediate
24457fd6651SLisandro Dalcin 
2450afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
24657fd6651SLisandro Dalcin @*/
24757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
24857fd6651SLisandro Dalcin {
24957fd6651SLisandro Dalcin   PetscErrorCode ierr;
25057fd6651SLisandro Dalcin 
25157fd6651SLisandro Dalcin   PetscFunctionBegin;
25257fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
25357fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
25457fd6651SLisandro Dalcin   PetscFunctionReturn(0);
25557fd6651SLisandro Dalcin }
25657fd6651SLisandro Dalcin 
25751fa3d41SBarry Smith /*@
25851fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
25951fa3d41SBarry Smith 
2605b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
26151fa3d41SBarry Smith 
26251fa3d41SBarry Smith   Input Parameters:
26351fa3d41SBarry Smith + bar - The bar graph context
26451fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
26551fa3d41SBarry Smith           different color
26651fa3d41SBarry Smith 
26751fa3d41SBarry Smith   Level: intermediate
26851fa3d41SBarry Smith 
2690afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
2700afdd333SBarry Smith 
27151fa3d41SBarry Smith @*/
27251fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
27351fa3d41SBarry Smith {
27451fa3d41SBarry Smith   PetscFunctionBegin;
27551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
27651fa3d41SBarry Smith   bar->color = color;
27751fa3d41SBarry Smith   PetscFunctionReturn(0);
27851fa3d41SBarry Smith }
27951fa3d41SBarry Smith 
28051fa3d41SBarry Smith /*@
28151fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
28251fa3d41SBarry Smith 
2835b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
28451fa3d41SBarry Smith 
28551fa3d41SBarry Smith   Input Parameters:
28651fa3d41SBarry Smith + bar - The bar graph context
28751fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
288a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
28951fa3d41SBarry Smith 
29051fa3d41SBarry Smith   Level: intermediate
29151fa3d41SBarry Smith 
2920afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
29351fa3d41SBarry Smith @*/
29451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
29551fa3d41SBarry Smith {
29651fa3d41SBarry Smith   PetscFunctionBegin;
29751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
29851fa3d41SBarry Smith   bar->sort          = sort;
29951fa3d41SBarry Smith   bar->sorttolerance = tolerance;
30051fa3d41SBarry Smith   PetscFunctionReturn(0);
30151fa3d41SBarry Smith }
30251fa3d41SBarry Smith 
30351fa3d41SBarry Smith /*@
30451fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
30551fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
30651fa3d41SBarry Smith   include those additional points.
30751fa3d41SBarry Smith 
3085b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
30951fa3d41SBarry Smith 
31051fa3d41SBarry Smith   Input Parameters:
31151fa3d41SBarry Smith + bar - The bar graph context
31251fa3d41SBarry Smith - y_min,y_max - The limits
31351fa3d41SBarry Smith 
31451fa3d41SBarry Smith   Level: intermediate
31551fa3d41SBarry Smith 
3160afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
31751fa3d41SBarry Smith @*/
31851fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
31951fa3d41SBarry Smith {
32051fa3d41SBarry Smith   PetscFunctionBegin;
32151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
32251fa3d41SBarry Smith   bar->ymin = y_min;
32351fa3d41SBarry Smith   bar->ymax = y_max;
32451fa3d41SBarry Smith   PetscFunctionReturn(0);
32551fa3d41SBarry Smith }
32651fa3d41SBarry Smith 
32751fa3d41SBarry Smith /*@C
32851fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
32951fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
33051fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
33151fa3d41SBarry Smith   application code.
33251fa3d41SBarry Smith 
3335b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
33451fa3d41SBarry Smith 
33551fa3d41SBarry Smith   Input Parameter:
33651fa3d41SBarry Smith . bar - The bar graph context
33751fa3d41SBarry Smith 
33851fa3d41SBarry Smith   Output Parameter:
33951fa3d41SBarry Smith . axis - The axis context
34051fa3d41SBarry Smith 
34151fa3d41SBarry Smith   Level: intermediate
34251fa3d41SBarry Smith 
3430afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
34451fa3d41SBarry Smith @*/
34551fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
34651fa3d41SBarry Smith {
34751fa3d41SBarry Smith   PetscFunctionBegin;
348e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
34945f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
35051fa3d41SBarry Smith   *axis = bar->axis;
35151fa3d41SBarry Smith   PetscFunctionReturn(0);
35251fa3d41SBarry Smith }
35351fa3d41SBarry Smith 
35451fa3d41SBarry Smith /*@C
35551fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
35651fa3d41SBarry Smith 
35751fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
35851fa3d41SBarry Smith 
35951fa3d41SBarry Smith   Input Parameter:
36051fa3d41SBarry Smith . bar - The bar graph context
36151fa3d41SBarry Smith 
36251fa3d41SBarry Smith   Output Parameter:
363e118a51fSLisandro Dalcin . draw  - The draw context
36451fa3d41SBarry Smith 
36551fa3d41SBarry Smith   Level: intermediate
36651fa3d41SBarry Smith 
3670afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
36851fa3d41SBarry Smith @*/
369e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
37051fa3d41SBarry Smith {
37151fa3d41SBarry Smith   PetscFunctionBegin;
37251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
37345f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
374e118a51fSLisandro Dalcin   *draw = bar->win;
37551fa3d41SBarry Smith   PetscFunctionReturn(0);
37651fa3d41SBarry Smith }
37751fa3d41SBarry Smith 
37851fa3d41SBarry Smith /*@
37951fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
38051fa3d41SBarry Smith 
38151fa3d41SBarry Smith     Collective over PetscDrawBar
38251fa3d41SBarry Smith 
38351fa3d41SBarry Smith     Options Database:
38451fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
38551fa3d41SBarry Smith 
38651fa3d41SBarry Smith     Level: intermediate
38751fa3d41SBarry Smith 
3880afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
38951fa3d41SBarry Smith @*/
39051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
39151fa3d41SBarry Smith {
39251fa3d41SBarry Smith   PetscErrorCode ierr;
39351fa3d41SBarry Smith   PetscBool      set;
39451fa3d41SBarry Smith 
39551fa3d41SBarry Smith   PetscFunctionBegin;
396e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
397e118a51fSLisandro Dalcin 
39871917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr);
39951fa3d41SBarry Smith   if (set) {
400e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
40171917b75SLisandro Dalcin     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
40251fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
40351fa3d41SBarry Smith   }
40451fa3d41SBarry Smith   PetscFunctionReturn(0);
40551fa3d41SBarry Smith }
406