xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 7e25d57eb54699967dd470a5d26171ae4cb7a45d)
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 
420afdd333SBarry Smith    Notes: Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot
430afdd333SBarry Smith 
440afdd333SBarry 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*7e25d57eSBarry Smith 
46*7e25d57eSBarry 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
47*7e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph.
480afdd333SBarry Smith 
4951fa3d41SBarry Smith    Level: intermediate
5051fa3d41SBarry Smith 
5151fa3d41SBarry Smith    Concepts: bar graph^creating
5251fa3d41SBarry Smith 
530afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(),
540afdd333SBarry Smith           PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis,
550afdd333SBarry Smith           PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions()
5651fa3d41SBarry Smith @*/
5751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar)
5851fa3d41SBarry Smith {
5951fa3d41SBarry Smith   PetscDrawBar   h;
6051fa3d41SBarry Smith   PetscErrorCode ierr;
6151fa3d41SBarry Smith 
6251fa3d41SBarry Smith   PetscFunctionBegin;
6351fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
6473107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
65e118a51fSLisandro Dalcin 
6671917b75SLisandro Dalcin   ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr);
67e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
68e118a51fSLisandro Dalcin 
69e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
70e118a51fSLisandro Dalcin   h->win = draw;
7151fa3d41SBarry Smith 
7251fa3d41SBarry Smith   h->view        = NULL;
7351fa3d41SBarry Smith   h->destroy     = NULL;
7451fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
7551fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
7651fa3d41SBarry Smith   h->ymax        = 0.;
7751fa3d41SBarry Smith   h->numBins     = 0;
7851fa3d41SBarry Smith 
7951fa3d41SBarry Smith   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
8045f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
81e118a51fSLisandro Dalcin 
8251fa3d41SBarry Smith   *bar = h;
8351fa3d41SBarry Smith   PetscFunctionReturn(0);
8451fa3d41SBarry Smith }
8551fa3d41SBarry Smith 
8651fa3d41SBarry Smith #undef __FUNCT__
8751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData"
8851fa3d41SBarry Smith /*@C
8951fa3d41SBarry Smith    PetscDrawBarSetData
9051fa3d41SBarry Smith 
915b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
9251fa3d41SBarry Smith 
9351fa3d41SBarry Smith    Input Parameter:
9451fa3d41SBarry Smith +  bar - The bar graph context.
9551fa3d41SBarry Smith .  bins  - number of items
9651fa3d41SBarry Smith .  values - values of each item
9751fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
9851fa3d41SBarry Smith 
9951fa3d41SBarry Smith    Level: intermediate
10051fa3d41SBarry Smith 
1010afdd333SBarry Smith    Notes: Call PetscDrawBarDraw() after this call to display the new plot
1020afdd333SBarry Smith 
1030afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw()
10451fa3d41SBarry Smith 
10551fa3d41SBarry Smith @*/
10651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
10751fa3d41SBarry Smith {
10851fa3d41SBarry Smith   PetscErrorCode ierr;
10951fa3d41SBarry Smith 
11051fa3d41SBarry Smith   PetscFunctionBegin;
11151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
112e118a51fSLisandro Dalcin 
11351fa3d41SBarry Smith   if (bar->numBins != bins) {
11451fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
11551fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
11651fa3d41SBarry Smith     bar->numBins = bins;
11751fa3d41SBarry Smith   }
11851fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
11951fa3d41SBarry Smith   bar->numBins = bins;
12051fa3d41SBarry Smith   if (labels) {
12151fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
12251fa3d41SBarry Smith   }
12351fa3d41SBarry Smith   PetscFunctionReturn(0);
12451fa3d41SBarry Smith }
12551fa3d41SBarry Smith 
12651fa3d41SBarry Smith #undef __FUNCT__
12751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy"
12851fa3d41SBarry Smith /*@C
12951fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
13051fa3d41SBarry Smith 
13151fa3d41SBarry Smith   Collective over PetscDrawBar
13251fa3d41SBarry Smith 
13351fa3d41SBarry Smith   Input Parameter:
13451fa3d41SBarry Smith . bar - The bar graph context
13551fa3d41SBarry Smith 
13651fa3d41SBarry Smith   Level: intermediate
13751fa3d41SBarry Smith 
13851fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
13951fa3d41SBarry Smith @*/
14051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
14151fa3d41SBarry Smith {
14251fa3d41SBarry Smith   PetscErrorCode ierr;
14351fa3d41SBarry Smith 
14451fa3d41SBarry Smith   PetscFunctionBegin;
14551fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
146e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
14751fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
148e118a51fSLisandro Dalcin 
14951fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
15051fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
151e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
152e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
15351fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
15451fa3d41SBarry Smith   PetscFunctionReturn(0);
15551fa3d41SBarry Smith }
15651fa3d41SBarry Smith 
15751fa3d41SBarry Smith #undef __FUNCT__
15851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw"
15951fa3d41SBarry Smith /*@
16051fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
16151fa3d41SBarry Smith 
1625b399a63SLisandro Dalcin   Collective on PetscDrawBar
16351fa3d41SBarry Smith 
16451fa3d41SBarry Smith   Input Parameter:
16551fa3d41SBarry Smith . bar - The bar graph context
16651fa3d41SBarry Smith 
16751fa3d41SBarry Smith   Level: intermediate
16851fa3d41SBarry Smith 
1690afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData()
1700afdd333SBarry Smith 
17151fa3d41SBarry Smith @*/
17251fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
17351fa3d41SBarry Smith {
174e118a51fSLisandro Dalcin   PetscDraw      draw;
17551fa3d41SBarry Smith   PetscBool      isnull;
17651fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
17751fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
178e118a51fSLisandro Dalcin   PetscMPIInt    rank;
17951fa3d41SBarry Smith   PetscErrorCode ierr;
18051fa3d41SBarry Smith   char           **labels;
18151fa3d41SBarry Smith 
18251fa3d41SBarry Smith   PetscFunctionBegin;
18351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1848f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1858f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
186e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr);
18751fa3d41SBarry Smith 
1885b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1895b399a63SLisandro Dalcin 
19051fa3d41SBarry Smith   color = bar->color;
19171917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
19251fa3d41SBarry Smith   else bcolor = color;
19351fa3d41SBarry Smith 
19451fa3d41SBarry Smith   numValues = bar->numBins;
19551fa3d41SBarry Smith   values    = bar->values;
19651fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
19751fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
19851fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
19951fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
20051fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
20151fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
20251fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
20351fa3d41SBarry Smith     }
20451fa3d41SBarry Smith   } else {
20551fa3d41SBarry Smith     ymin = bar->ymin;
20651fa3d41SBarry Smith     ymax = bar->ymax;
20751fa3d41SBarry Smith   }
20851fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
20951fa3d41SBarry Smith   xmin   = 0.0;
210e118a51fSLisandro Dalcin   xmax   = nplot;
21151fa3d41SBarry Smith   labels = bar->labels;
21251fa3d41SBarry Smith 
21351fa3d41SBarry Smith   if (bar->sort) {
21451fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
21551fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
21651fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
21751fa3d41SBarry Smith     if (bar->sorttolerance) {
21851fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
21951fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
22051fa3d41SBarry Smith           nplot = i;
22151fa3d41SBarry Smith           break;
22251fa3d41SBarry Smith         }
22351fa3d41SBarry Smith       }
22451fa3d41SBarry Smith     }
22551fa3d41SBarry Smith   }
22651fa3d41SBarry Smith 
2275b399a63SLisandro Dalcin   draw = bar->win;
228e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
2295b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
230e118a51fSLisandro Dalcin 
23151fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
23251fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
23351fa3d41SBarry Smith 
2345b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
235e118a51fSLisandro Dalcin   if (!rank) { /* Draw bins */
23651fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
23751fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
23851fa3d41SBarry Smith       binLeft  = xmin + i;
23951fa3d41SBarry Smith       binRight = xmin + i + 1;
24051fa3d41SBarry Smith       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
24151fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
24251fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
24351fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
24451fa3d41SBarry Smith       if (labels) {
24551fa3d41SBarry Smith         PetscReal h;
24651fa3d41SBarry Smith         ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
24771917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr);
24851fa3d41SBarry Smith       }
24951fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
25071917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
25151fa3d41SBarry Smith     }
25251fa3d41SBarry Smith   }
2535b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
254e118a51fSLisandro Dalcin   if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);}
255e118a51fSLisandro Dalcin 
2565b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
25751fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
25851fa3d41SBarry Smith   PetscFunctionReturn(0);
25951fa3d41SBarry Smith }
26051fa3d41SBarry Smith 
26151fa3d41SBarry Smith #undef __FUNCT__
26257fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave"
26357fd6651SLisandro Dalcin /*@
26457fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
26557fd6651SLisandro Dalcin 
26657fd6651SLisandro Dalcin   Collective on PetscDrawBar
26757fd6651SLisandro Dalcin 
26857fd6651SLisandro Dalcin   Input Parameters:
26957fd6651SLisandro Dalcin . bar - The bar graph context
27057fd6651SLisandro Dalcin 
27157fd6651SLisandro Dalcin   Level: intermediate
27257fd6651SLisandro Dalcin 
27357fd6651SLisandro Dalcin   Concepts: bar graph^saving
27457fd6651SLisandro Dalcin 
2750afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
27657fd6651SLisandro Dalcin @*/
27757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
27857fd6651SLisandro Dalcin {
27957fd6651SLisandro Dalcin   PetscErrorCode ierr;
28057fd6651SLisandro Dalcin 
28157fd6651SLisandro Dalcin   PetscFunctionBegin;
28257fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
28357fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
28457fd6651SLisandro Dalcin   PetscFunctionReturn(0);
28557fd6651SLisandro Dalcin }
28657fd6651SLisandro Dalcin 
28757fd6651SLisandro Dalcin #undef __FUNCT__
28851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor"
28951fa3d41SBarry Smith /*@
29051fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
29151fa3d41SBarry Smith 
2925b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
29351fa3d41SBarry Smith 
29451fa3d41SBarry Smith   Input Parameters:
29551fa3d41SBarry Smith + bar - The bar graph context
29651fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
29751fa3d41SBarry Smith           different color
29851fa3d41SBarry Smith 
29951fa3d41SBarry Smith   Level: intermediate
30051fa3d41SBarry Smith 
3010afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
3020afdd333SBarry Smith 
30351fa3d41SBarry Smith @*/
30451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
30551fa3d41SBarry Smith {
30651fa3d41SBarry Smith   PetscFunctionBegin;
30751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
30851fa3d41SBarry Smith   bar->color = color;
30951fa3d41SBarry Smith   PetscFunctionReturn(0);
31051fa3d41SBarry Smith }
31151fa3d41SBarry Smith 
31251fa3d41SBarry Smith #undef __FUNCT__
31351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort"
31451fa3d41SBarry Smith /*@
31551fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
31651fa3d41SBarry Smith 
3175b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
31851fa3d41SBarry Smith 
31951fa3d41SBarry Smith   Input Parameters:
32051fa3d41SBarry Smith + bar - The bar graph context
32151fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
32251fa3d41SBarry Smith . tolerance - discard values less than tolerance
32351fa3d41SBarry Smith 
32451fa3d41SBarry Smith   Level: intermediate
32551fa3d41SBarry Smith 
32651fa3d41SBarry Smith   Concepts: bar graph^setting axis
3270afdd333SBarry Smith 
3280afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
32951fa3d41SBarry Smith @*/
33051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
33151fa3d41SBarry Smith {
33251fa3d41SBarry Smith   PetscFunctionBegin;
33351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
33451fa3d41SBarry Smith   bar->sort          = sort;
33551fa3d41SBarry Smith   bar->sorttolerance = tolerance;
33651fa3d41SBarry Smith   PetscFunctionReturn(0);
33751fa3d41SBarry Smith }
33851fa3d41SBarry Smith 
33951fa3d41SBarry Smith #undef __FUNCT__
34051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits"
34151fa3d41SBarry Smith /*@
34251fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
34351fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
34451fa3d41SBarry Smith   include those additional points.
34551fa3d41SBarry Smith 
3465b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
34751fa3d41SBarry Smith 
34851fa3d41SBarry Smith   Input Parameters:
34951fa3d41SBarry Smith + bar - The bar graph context
35051fa3d41SBarry Smith - y_min,y_max - The limits
35151fa3d41SBarry Smith 
35251fa3d41SBarry Smith   Level: intermediate
35351fa3d41SBarry Smith 
35451fa3d41SBarry Smith   Concepts: bar graph^setting axis
3550afdd333SBarry Smith 
3560afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
35751fa3d41SBarry Smith @*/
35851fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
35951fa3d41SBarry Smith {
36051fa3d41SBarry Smith   PetscFunctionBegin;
36151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
36251fa3d41SBarry Smith   bar->ymin = y_min;
36351fa3d41SBarry Smith   bar->ymax = y_max;
36451fa3d41SBarry Smith   PetscFunctionReturn(0);
36551fa3d41SBarry Smith }
36651fa3d41SBarry Smith 
36751fa3d41SBarry Smith #undef __FUNCT__
36851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis"
36951fa3d41SBarry Smith /*@C
37051fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
37151fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
37251fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
37351fa3d41SBarry Smith   application code.
37451fa3d41SBarry Smith 
3755b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
37651fa3d41SBarry Smith 
37751fa3d41SBarry Smith   Input Parameter:
37851fa3d41SBarry Smith . bar - The bar graph context
37951fa3d41SBarry Smith 
38051fa3d41SBarry Smith   Output Parameter:
38151fa3d41SBarry Smith . axis - The axis context
38251fa3d41SBarry Smith 
38351fa3d41SBarry Smith   Level: intermediate
38451fa3d41SBarry Smith 
3850afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
38651fa3d41SBarry Smith @*/
38751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
38851fa3d41SBarry Smith {
38951fa3d41SBarry Smith   PetscFunctionBegin;
390e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
39145f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
39251fa3d41SBarry Smith   *axis = bar->axis;
39351fa3d41SBarry Smith   PetscFunctionReturn(0);
39451fa3d41SBarry Smith }
39551fa3d41SBarry Smith 
39651fa3d41SBarry Smith #undef __FUNCT__
39751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw"
39851fa3d41SBarry Smith /*@C
39951fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
40051fa3d41SBarry Smith 
40151fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
40251fa3d41SBarry Smith 
40351fa3d41SBarry Smith   Input Parameter:
40451fa3d41SBarry Smith . bar - The bar graph context
40551fa3d41SBarry Smith 
40651fa3d41SBarry Smith   Output Parameter:
407e118a51fSLisandro Dalcin . draw  - The draw context
40851fa3d41SBarry Smith 
40951fa3d41SBarry Smith   Level: intermediate
41051fa3d41SBarry Smith 
4110afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
41251fa3d41SBarry Smith @*/
413e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
41451fa3d41SBarry Smith {
41551fa3d41SBarry Smith   PetscFunctionBegin;
41651fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
41745f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
418e118a51fSLisandro Dalcin   *draw = bar->win;
41951fa3d41SBarry Smith   PetscFunctionReturn(0);
42051fa3d41SBarry Smith }
42151fa3d41SBarry Smith 
42251fa3d41SBarry Smith #undef __FUNCT__
42351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions"
42451fa3d41SBarry Smith /*@
42551fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
42651fa3d41SBarry Smith 
42751fa3d41SBarry Smith     Collective over PetscDrawBar
42851fa3d41SBarry Smith 
42951fa3d41SBarry Smith     Options Database:
43051fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
43151fa3d41SBarry Smith 
43251fa3d41SBarry Smith     Level: intermediate
43351fa3d41SBarry Smith 
43451fa3d41SBarry Smith 
4350afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
43651fa3d41SBarry Smith @*/
43751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
43851fa3d41SBarry Smith {
43951fa3d41SBarry Smith   PetscErrorCode ierr;
44051fa3d41SBarry Smith   PetscBool      set;
44151fa3d41SBarry Smith 
44251fa3d41SBarry Smith   PetscFunctionBegin;
443e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
444e118a51fSLisandro Dalcin 
44571917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr);
44651fa3d41SBarry Smith   if (set) {
447e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
44871917b75SLisandro Dalcin     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
44951fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
45051fa3d41SBarry Smith   }
45151fa3d41SBarry Smith   PetscFunctionReturn(0);
45251fa3d41SBarry Smith }
45351fa3d41SBarry Smith 
454