xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 0afdd333dc660388e4ea5471ad7cc0742c654171)
151fa3d41SBarry Smith 
251fa3d41SBarry Smith /*
351fa3d41SBarry Smith   Contains the data structure for plotting a bargraph in a window with an axis.
451fa3d41SBarry Smith */
551fa3d41SBarry Smith #include <petscdraw.h>                       /*I "petscdraw.h" I*/
6af0996ceSBarry Smith #include <petsc/private/petscimpl.h>         /*I "petscsys.h" I*/
751fa3d41SBarry Smith #include <petscviewer.h>                     /*I "petscviewer.h" I*/
851fa3d41SBarry Smith #include <../src/sys/classes/draw/utils/axisimpl.h>   /* so we can directly modify axis xticks */
951fa3d41SBarry Smith 
1051fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0;
1151fa3d41SBarry Smith 
1251fa3d41SBarry Smith struct _p_PetscDrawBar {
1351fa3d41SBarry Smith   PETSCHEADER(int);
1451fa3d41SBarry Smith   PetscErrorCode (*destroy)(PetscDrawSP);
1551fa3d41SBarry Smith   PetscErrorCode (*view)(PetscDrawSP,PetscViewer);
1651fa3d41SBarry Smith   PetscDraw      win;
1751fa3d41SBarry Smith   PetscDrawAxis  axis;
1851fa3d41SBarry Smith   PetscReal      ymin,ymax;
1951fa3d41SBarry Smith   int            numBins;
2051fa3d41SBarry Smith   PetscReal      *values;
2151fa3d41SBarry Smith   int            color;
2251fa3d41SBarry Smith   char           **labels;
2351fa3d41SBarry Smith   PetscBool      sort;
2451fa3d41SBarry Smith   PetscReal      sorttolerance;
2551fa3d41SBarry Smith };
2651fa3d41SBarry Smith 
2751fa3d41SBarry Smith #define CHUNKSIZE 100
2851fa3d41SBarry Smith 
2951fa3d41SBarry Smith #undef __FUNCT__
3051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarCreate"
3151fa3d41SBarry Smith /*@C
3251fa3d41SBarry Smith    PetscDrawBarCreate - Creates a bar graph data structure.
3351fa3d41SBarry Smith 
3451fa3d41SBarry Smith    Collective over PetscDraw
3551fa3d41SBarry Smith 
3651fa3d41SBarry Smith    Input Parameters:
3751fa3d41SBarry Smith .  draw  - The window where the graph will be made
3851fa3d41SBarry Smith 
3951fa3d41SBarry Smith    Output Parameters:
4051fa3d41SBarry Smith .  bar - The bar graph context
4151fa3d41SBarry Smith 
42*0afdd333SBarry Smith    Notes: Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot
43*0afdd333SBarry Smith 
44*0afdd333SBarry Smith          The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here http://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP
45*0afdd333SBarry Smith 
4651fa3d41SBarry Smith    Level: intermediate
4751fa3d41SBarry Smith 
4851fa3d41SBarry Smith    Concepts: bar graph^creating
4951fa3d41SBarry Smith 
50*0afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(),
51*0afdd333SBarry Smith           PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis,
52*0afdd333SBarry Smith           PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions()
5351fa3d41SBarry Smith @*/
5451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar)
5551fa3d41SBarry Smith {
5651fa3d41SBarry Smith   PetscDrawBar   h;
5751fa3d41SBarry Smith   PetscErrorCode ierr;
5851fa3d41SBarry Smith 
5951fa3d41SBarry Smith   PetscFunctionBegin;
6051fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
6173107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
62e118a51fSLisandro Dalcin 
6371917b75SLisandro Dalcin   ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr);
64e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
65e118a51fSLisandro Dalcin 
66e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
67e118a51fSLisandro Dalcin   h->win = draw;
6851fa3d41SBarry Smith 
6951fa3d41SBarry Smith   h->view        = NULL;
7051fa3d41SBarry Smith   h->destroy     = NULL;
7151fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
7251fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
7351fa3d41SBarry Smith   h->ymax        = 0.;
7451fa3d41SBarry Smith   h->numBins     = 0;
7551fa3d41SBarry Smith 
7651fa3d41SBarry Smith   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
7745f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
78e118a51fSLisandro Dalcin 
7951fa3d41SBarry Smith   *bar = h;
8051fa3d41SBarry Smith   PetscFunctionReturn(0);
8151fa3d41SBarry Smith }
8251fa3d41SBarry Smith 
8351fa3d41SBarry Smith #undef __FUNCT__
8451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData"
8551fa3d41SBarry Smith /*@C
8651fa3d41SBarry Smith    PetscDrawBarSetData
8751fa3d41SBarry Smith 
885b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
8951fa3d41SBarry Smith 
9051fa3d41SBarry Smith    Input Parameter:
9151fa3d41SBarry Smith +  bar - The bar graph context.
9251fa3d41SBarry Smith .  bins  - number of items
9351fa3d41SBarry Smith .  values - values of each item
9451fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
9551fa3d41SBarry Smith 
9651fa3d41SBarry Smith    Level: intermediate
9751fa3d41SBarry Smith 
98*0afdd333SBarry Smith    Notes: Call PetscDrawBarDraw() after this call to display the new plot
99*0afdd333SBarry Smith 
100*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw()
10151fa3d41SBarry Smith 
10251fa3d41SBarry Smith @*/
10351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
10451fa3d41SBarry Smith {
10551fa3d41SBarry Smith   PetscErrorCode ierr;
10651fa3d41SBarry Smith 
10751fa3d41SBarry Smith   PetscFunctionBegin;
10851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
109e118a51fSLisandro Dalcin 
11051fa3d41SBarry Smith   if (bar->numBins != bins) {
11151fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
11251fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
11351fa3d41SBarry Smith     bar->numBins = bins;
11451fa3d41SBarry Smith   }
11551fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
11651fa3d41SBarry Smith   bar->numBins = bins;
11751fa3d41SBarry Smith   if (labels) {
11851fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
11951fa3d41SBarry Smith   }
12051fa3d41SBarry Smith   PetscFunctionReturn(0);
12151fa3d41SBarry Smith }
12251fa3d41SBarry Smith 
12351fa3d41SBarry Smith #undef __FUNCT__
12451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy"
12551fa3d41SBarry Smith /*@C
12651fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
12751fa3d41SBarry Smith 
12851fa3d41SBarry Smith   Collective over PetscDrawBar
12951fa3d41SBarry Smith 
13051fa3d41SBarry Smith   Input Parameter:
13151fa3d41SBarry Smith . bar - The bar graph context
13251fa3d41SBarry Smith 
13351fa3d41SBarry Smith   Level: intermediate
13451fa3d41SBarry Smith 
13551fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
13651fa3d41SBarry Smith @*/
13751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
13851fa3d41SBarry Smith {
13951fa3d41SBarry Smith   PetscErrorCode ierr;
14051fa3d41SBarry Smith 
14151fa3d41SBarry Smith   PetscFunctionBegin;
14251fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
143e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
14451fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
145e118a51fSLisandro Dalcin 
14651fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
14751fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
148e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
149e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
15051fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
15151fa3d41SBarry Smith   PetscFunctionReturn(0);
15251fa3d41SBarry Smith }
15351fa3d41SBarry Smith 
15451fa3d41SBarry Smith #undef __FUNCT__
15551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw"
15651fa3d41SBarry Smith /*@
15751fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
15851fa3d41SBarry Smith 
1595b399a63SLisandro Dalcin   Collective on PetscDrawBar
16051fa3d41SBarry Smith 
16151fa3d41SBarry Smith   Input Parameter:
16251fa3d41SBarry Smith . bar - The bar graph context
16351fa3d41SBarry Smith 
16451fa3d41SBarry Smith   Level: intermediate
16551fa3d41SBarry Smith 
166*0afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData()
167*0afdd333SBarry Smith 
16851fa3d41SBarry Smith @*/
16951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
17051fa3d41SBarry Smith {
171e118a51fSLisandro Dalcin   PetscDraw      draw;
17251fa3d41SBarry Smith   PetscBool      isnull;
17351fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
17451fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
175e118a51fSLisandro Dalcin   PetscMPIInt    rank;
17651fa3d41SBarry Smith   PetscErrorCode ierr;
17751fa3d41SBarry Smith   char           **labels;
17851fa3d41SBarry Smith 
17951fa3d41SBarry Smith   PetscFunctionBegin;
18051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1818f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1828f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
183e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr);
18451fa3d41SBarry Smith 
1855b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1865b399a63SLisandro Dalcin 
18751fa3d41SBarry Smith   color = bar->color;
18871917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
18951fa3d41SBarry Smith   else bcolor = color;
19051fa3d41SBarry Smith 
19151fa3d41SBarry Smith   numValues = bar->numBins;
19251fa3d41SBarry Smith   values    = bar->values;
19351fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
19451fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
19551fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
19651fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
19751fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
19851fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
19951fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
20051fa3d41SBarry Smith     }
20151fa3d41SBarry Smith   } else {
20251fa3d41SBarry Smith     ymin = bar->ymin;
20351fa3d41SBarry Smith     ymax = bar->ymax;
20451fa3d41SBarry Smith   }
20551fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
20651fa3d41SBarry Smith   xmin   = 0.0;
207e118a51fSLisandro Dalcin   xmax   = nplot;
20851fa3d41SBarry Smith   labels = bar->labels;
20951fa3d41SBarry Smith 
21051fa3d41SBarry Smith   if (bar->sort) {
21151fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
21251fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
21351fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
21451fa3d41SBarry Smith     if (bar->sorttolerance) {
21551fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
21651fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
21751fa3d41SBarry Smith           nplot = i;
21851fa3d41SBarry Smith           break;
21951fa3d41SBarry Smith         }
22051fa3d41SBarry Smith       }
22151fa3d41SBarry Smith     }
22251fa3d41SBarry Smith   }
22351fa3d41SBarry Smith 
2245b399a63SLisandro Dalcin   draw = bar->win;
225e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
2265b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
227e118a51fSLisandro Dalcin 
22851fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
22951fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
23051fa3d41SBarry Smith 
2315b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
232e118a51fSLisandro Dalcin   if (!rank) { /* Draw bins */
23351fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
23451fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
23551fa3d41SBarry Smith       binLeft  = xmin + i;
23651fa3d41SBarry Smith       binRight = xmin + i + 1;
23751fa3d41SBarry Smith       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
23851fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23951fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
24051fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
24151fa3d41SBarry Smith       if (labels) {
24251fa3d41SBarry Smith         PetscReal h;
24351fa3d41SBarry Smith         ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
24471917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr);
24551fa3d41SBarry Smith       }
24651fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
24771917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
24851fa3d41SBarry Smith     }
24951fa3d41SBarry Smith   }
2505b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
251e118a51fSLisandro Dalcin   if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);}
252e118a51fSLisandro Dalcin 
2535b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
25451fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
25551fa3d41SBarry Smith   PetscFunctionReturn(0);
25651fa3d41SBarry Smith }
25751fa3d41SBarry Smith 
25851fa3d41SBarry Smith #undef __FUNCT__
25957fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave"
26057fd6651SLisandro Dalcin /*@
26157fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
26257fd6651SLisandro Dalcin 
26357fd6651SLisandro Dalcin   Collective on PetscDrawBar
26457fd6651SLisandro Dalcin 
26557fd6651SLisandro Dalcin   Input Parameters:
26657fd6651SLisandro Dalcin . bar - The bar graph context
26757fd6651SLisandro Dalcin 
26857fd6651SLisandro Dalcin   Level: intermediate
26957fd6651SLisandro Dalcin 
27057fd6651SLisandro Dalcin   Concepts: bar graph^saving
27157fd6651SLisandro Dalcin 
272*0afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
27357fd6651SLisandro Dalcin @*/
27457fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
27557fd6651SLisandro Dalcin {
27657fd6651SLisandro Dalcin   PetscErrorCode ierr;
27757fd6651SLisandro Dalcin 
27857fd6651SLisandro Dalcin   PetscFunctionBegin;
27957fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
28057fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
28157fd6651SLisandro Dalcin   PetscFunctionReturn(0);
28257fd6651SLisandro Dalcin }
28357fd6651SLisandro Dalcin 
28457fd6651SLisandro Dalcin #undef __FUNCT__
28551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor"
28651fa3d41SBarry Smith /*@
28751fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
28851fa3d41SBarry Smith 
2895b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
29051fa3d41SBarry Smith 
29151fa3d41SBarry Smith   Input Parameters:
29251fa3d41SBarry Smith + bar - The bar graph context
29351fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
29451fa3d41SBarry Smith           different color
29551fa3d41SBarry Smith 
29651fa3d41SBarry Smith   Level: intermediate
29751fa3d41SBarry Smith 
298*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
299*0afdd333SBarry Smith 
30051fa3d41SBarry Smith @*/
30151fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
30251fa3d41SBarry Smith {
30351fa3d41SBarry Smith   PetscFunctionBegin;
30451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
30551fa3d41SBarry Smith   bar->color = color;
30651fa3d41SBarry Smith   PetscFunctionReturn(0);
30751fa3d41SBarry Smith }
30851fa3d41SBarry Smith 
30951fa3d41SBarry Smith #undef __FUNCT__
31051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort"
31151fa3d41SBarry Smith /*@
31251fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
31351fa3d41SBarry Smith 
3145b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
31551fa3d41SBarry Smith 
31651fa3d41SBarry Smith   Input Parameters:
31751fa3d41SBarry Smith + bar - The bar graph context
31851fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
31951fa3d41SBarry Smith . tolerance - discard values less than tolerance
32051fa3d41SBarry Smith 
32151fa3d41SBarry Smith   Level: intermediate
32251fa3d41SBarry Smith 
32351fa3d41SBarry Smith   Concepts: bar graph^setting axis
324*0afdd333SBarry Smith 
325*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
32651fa3d41SBarry Smith @*/
32751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
32851fa3d41SBarry Smith {
32951fa3d41SBarry Smith   PetscFunctionBegin;
33051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
33151fa3d41SBarry Smith   bar->sort          = sort;
33251fa3d41SBarry Smith   bar->sorttolerance = tolerance;
33351fa3d41SBarry Smith   PetscFunctionReturn(0);
33451fa3d41SBarry Smith }
33551fa3d41SBarry Smith 
33651fa3d41SBarry Smith #undef __FUNCT__
33751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits"
33851fa3d41SBarry Smith /*@
33951fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
34051fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
34151fa3d41SBarry Smith   include those additional points.
34251fa3d41SBarry Smith 
3435b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
34451fa3d41SBarry Smith 
34551fa3d41SBarry Smith   Input Parameters:
34651fa3d41SBarry Smith + bar - The bar graph context
34751fa3d41SBarry Smith - y_min,y_max - The limits
34851fa3d41SBarry Smith 
34951fa3d41SBarry Smith   Level: intermediate
35051fa3d41SBarry Smith 
35151fa3d41SBarry Smith   Concepts: bar graph^setting axis
352*0afdd333SBarry Smith 
353*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
35451fa3d41SBarry Smith @*/
35551fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
35651fa3d41SBarry Smith {
35751fa3d41SBarry Smith   PetscFunctionBegin;
35851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
35951fa3d41SBarry Smith   bar->ymin = y_min;
36051fa3d41SBarry Smith   bar->ymax = y_max;
36151fa3d41SBarry Smith   PetscFunctionReturn(0);
36251fa3d41SBarry Smith }
36351fa3d41SBarry Smith 
36451fa3d41SBarry Smith #undef __FUNCT__
36551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis"
36651fa3d41SBarry Smith /*@C
36751fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
36851fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
36951fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
37051fa3d41SBarry Smith   application code.
37151fa3d41SBarry Smith 
3725b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
37351fa3d41SBarry Smith 
37451fa3d41SBarry Smith   Input Parameter:
37551fa3d41SBarry Smith . bar - The bar graph context
37651fa3d41SBarry Smith 
37751fa3d41SBarry Smith   Output Parameter:
37851fa3d41SBarry Smith . axis - The axis context
37951fa3d41SBarry Smith 
38051fa3d41SBarry Smith   Level: intermediate
38151fa3d41SBarry Smith 
382*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
38351fa3d41SBarry Smith @*/
38451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
38551fa3d41SBarry Smith {
38651fa3d41SBarry Smith   PetscFunctionBegin;
387e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
38845f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
38951fa3d41SBarry Smith   *axis = bar->axis;
39051fa3d41SBarry Smith   PetscFunctionReturn(0);
39151fa3d41SBarry Smith }
39251fa3d41SBarry Smith 
39351fa3d41SBarry Smith #undef __FUNCT__
39451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw"
39551fa3d41SBarry Smith /*@C
39651fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
39751fa3d41SBarry Smith 
39851fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
39951fa3d41SBarry Smith 
40051fa3d41SBarry Smith   Input Parameter:
40151fa3d41SBarry Smith . bar - The bar graph context
40251fa3d41SBarry Smith 
40351fa3d41SBarry Smith   Output Parameter:
404e118a51fSLisandro Dalcin . draw  - The draw context
40551fa3d41SBarry Smith 
40651fa3d41SBarry Smith   Level: intermediate
40751fa3d41SBarry Smith 
408*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
40951fa3d41SBarry Smith @*/
410e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
41151fa3d41SBarry Smith {
41251fa3d41SBarry Smith   PetscFunctionBegin;
41351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
41445f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
415e118a51fSLisandro Dalcin   *draw = bar->win;
41651fa3d41SBarry Smith   PetscFunctionReturn(0);
41751fa3d41SBarry Smith }
41851fa3d41SBarry Smith 
41951fa3d41SBarry Smith #undef __FUNCT__
42051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions"
42151fa3d41SBarry Smith /*@
42251fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
42351fa3d41SBarry Smith 
42451fa3d41SBarry Smith     Collective over PetscDrawBar
42551fa3d41SBarry Smith 
42651fa3d41SBarry Smith     Options Database:
42751fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
42851fa3d41SBarry Smith 
42951fa3d41SBarry Smith     Level: intermediate
43051fa3d41SBarry Smith 
43151fa3d41SBarry Smith 
432*0afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
43351fa3d41SBarry Smith @*/
43451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
43551fa3d41SBarry Smith {
43651fa3d41SBarry Smith   PetscErrorCode ierr;
43751fa3d41SBarry Smith   PetscBool      set;
43851fa3d41SBarry Smith 
43951fa3d41SBarry Smith   PetscFunctionBegin;
440e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
441e118a51fSLisandro Dalcin 
44271917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr);
44351fa3d41SBarry Smith   if (set) {
444e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
44571917b75SLisandro Dalcin     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
44651fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
44751fa3d41SBarry Smith   }
44851fa3d41SBarry Smith   PetscFunctionReturn(0);
44951fa3d41SBarry Smith }
45051fa3d41SBarry Smith 
451