xref: /petsc/src/sys/classes/draw/utils/bars.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
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 /*@C
3051fa3d41SBarry Smith    PetscDrawBarCreate - Creates a bar graph data structure.
3151fa3d41SBarry Smith 
3251fa3d41SBarry Smith    Collective over PetscDraw
3351fa3d41SBarry Smith 
3451fa3d41SBarry Smith    Input Parameters:
3551fa3d41SBarry Smith .  draw  - The window where the graph will be made
3651fa3d41SBarry Smith 
3751fa3d41SBarry Smith    Output Parameters:
3851fa3d41SBarry Smith .  bar - The bar graph context
3951fa3d41SBarry Smith 
4095452b02SPatrick Sanan    Notes:
4195452b02SPatrick Sanan     Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot
420afdd333SBarry Smith 
43a8d69d7bSBarry Smith   The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here https://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP
447e25d57eSBarry Smith 
457e25d57eSBarry 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
467e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph.
470afdd333SBarry Smith 
4851fa3d41SBarry Smith    Level: intermediate
4951fa3d41SBarry Smith 
500afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(),
510afdd333SBarry Smith           PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis,
520afdd333SBarry 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 /*@C
8451fa3d41SBarry Smith    PetscDrawBarSetData
8551fa3d41SBarry Smith 
865b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
8751fa3d41SBarry Smith 
88*d8d19677SJose E. Roman    Input Parameters:
8951fa3d41SBarry Smith +  bar - The bar graph context.
9051fa3d41SBarry Smith .  bins  - number of items
9151fa3d41SBarry Smith .  values - values of each item
9251fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
9351fa3d41SBarry Smith 
9451fa3d41SBarry Smith    Level: intermediate
9551fa3d41SBarry Smith 
9695452b02SPatrick Sanan    Notes:
9795452b02SPatrick Sanan     Call PetscDrawBarDraw() after this call to display the new plot
980afdd333SBarry Smith 
990afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw()
10051fa3d41SBarry Smith 
10151fa3d41SBarry Smith @*/
10251fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
10351fa3d41SBarry Smith {
10451fa3d41SBarry Smith   PetscErrorCode ierr;
10551fa3d41SBarry Smith 
10651fa3d41SBarry Smith   PetscFunctionBegin;
10751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
108e118a51fSLisandro Dalcin 
10951fa3d41SBarry Smith   if (bar->numBins != bins) {
11051fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
11151fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
11251fa3d41SBarry Smith     bar->numBins = bins;
11351fa3d41SBarry Smith   }
114580bdb30SBarry Smith   ierr = PetscArraycpy(bar->values,data,bins);CHKERRQ(ierr);
11551fa3d41SBarry Smith   bar->numBins = bins;
11651fa3d41SBarry Smith   if (labels) {
11751fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
11851fa3d41SBarry Smith   }
11951fa3d41SBarry Smith   PetscFunctionReturn(0);
12051fa3d41SBarry Smith }
12151fa3d41SBarry Smith 
12251fa3d41SBarry Smith /*@C
12351fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
12451fa3d41SBarry Smith 
12551fa3d41SBarry Smith   Collective over PetscDrawBar
12651fa3d41SBarry Smith 
12751fa3d41SBarry Smith   Input Parameter:
12851fa3d41SBarry Smith . bar - The bar graph context
12951fa3d41SBarry Smith 
13051fa3d41SBarry Smith   Level: intermediate
13151fa3d41SBarry Smith 
13251fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
13351fa3d41SBarry Smith @*/
13451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
13551fa3d41SBarry Smith {
13651fa3d41SBarry Smith   PetscErrorCode ierr;
13751fa3d41SBarry Smith 
13851fa3d41SBarry Smith   PetscFunctionBegin;
13951fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
140e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
14151fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
142e118a51fSLisandro Dalcin 
14351fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
14451fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
145e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
146e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
14751fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
14851fa3d41SBarry Smith   PetscFunctionReturn(0);
14951fa3d41SBarry Smith }
15051fa3d41SBarry Smith 
15151fa3d41SBarry Smith /*@
15251fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
15351fa3d41SBarry Smith 
1545b399a63SLisandro Dalcin   Collective on PetscDrawBar
15551fa3d41SBarry Smith 
15651fa3d41SBarry Smith   Input Parameter:
15751fa3d41SBarry Smith . bar - The bar graph context
15851fa3d41SBarry Smith 
15951fa3d41SBarry Smith   Level: intermediate
16051fa3d41SBarry Smith 
1610afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData()
1620afdd333SBarry Smith 
16351fa3d41SBarry Smith @*/
16451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
16551fa3d41SBarry Smith {
166e118a51fSLisandro Dalcin   PetscDraw      draw;
16751fa3d41SBarry Smith   PetscBool      isnull;
16851fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
16951fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
170e118a51fSLisandro Dalcin   PetscMPIInt    rank;
17151fa3d41SBarry Smith   PetscErrorCode ierr;
17251fa3d41SBarry Smith   char           **labels;
17351fa3d41SBarry Smith 
17451fa3d41SBarry Smith   PetscFunctionBegin;
17551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1768f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1778f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
178ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRMPI(ierr);
17951fa3d41SBarry Smith 
1805b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1815b399a63SLisandro Dalcin 
18251fa3d41SBarry Smith   color = bar->color;
18371917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
18451fa3d41SBarry Smith   else bcolor = color;
18551fa3d41SBarry Smith 
18651fa3d41SBarry Smith   numValues = bar->numBins;
18751fa3d41SBarry Smith   values    = bar->values;
18851fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
18951fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
19051fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
19151fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
19251fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
19351fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
19451fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
19551fa3d41SBarry Smith     }
19651fa3d41SBarry Smith   } else {
19751fa3d41SBarry Smith     ymin = bar->ymin;
19851fa3d41SBarry Smith     ymax = bar->ymax;
19951fa3d41SBarry Smith   }
20051fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
20151fa3d41SBarry Smith   xmin   = 0.0;
202e118a51fSLisandro Dalcin   xmax   = nplot;
20351fa3d41SBarry Smith   labels = bar->labels;
20451fa3d41SBarry Smith 
20551fa3d41SBarry Smith   if (bar->sort) {
20651fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
20751fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
20851fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
20951fa3d41SBarry Smith     if (bar->sorttolerance) {
21051fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
21151fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
21251fa3d41SBarry Smith           nplot = i;
21351fa3d41SBarry Smith           break;
21451fa3d41SBarry Smith         }
21551fa3d41SBarry Smith       }
21651fa3d41SBarry Smith     }
21751fa3d41SBarry Smith   }
21851fa3d41SBarry Smith 
2195b399a63SLisandro Dalcin   draw = bar->win;
220e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
2215b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
222e118a51fSLisandro Dalcin 
22351fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
22451fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
22551fa3d41SBarry Smith 
2265b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
227e118a51fSLisandro Dalcin   if (!rank) { /* Draw bins */
22851fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
22951fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
23051fa3d41SBarry Smith       binLeft  = xmin + i;
23151fa3d41SBarry Smith       binRight = xmin + i + 1;
23251fa3d41SBarry Smith       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
23351fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23451fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23551fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23651fa3d41SBarry Smith       if (labels) {
23751fa3d41SBarry Smith         PetscReal h;
23851fa3d41SBarry Smith         ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
23971917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr);
24051fa3d41SBarry Smith       }
24151fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
24271917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
24351fa3d41SBarry Smith     }
24451fa3d41SBarry Smith   }
2455b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
246e118a51fSLisandro Dalcin   if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);}
247e118a51fSLisandro Dalcin 
2485b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
24951fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
25051fa3d41SBarry Smith   PetscFunctionReturn(0);
25151fa3d41SBarry Smith }
25251fa3d41SBarry Smith 
25357fd6651SLisandro Dalcin /*@
25457fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
25557fd6651SLisandro Dalcin 
25657fd6651SLisandro Dalcin   Collective on PetscDrawBar
25757fd6651SLisandro Dalcin 
25857fd6651SLisandro Dalcin   Input Parameters:
25957fd6651SLisandro Dalcin . bar - The bar graph context
26057fd6651SLisandro Dalcin 
26157fd6651SLisandro Dalcin   Level: intermediate
26257fd6651SLisandro Dalcin 
2630afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
26457fd6651SLisandro Dalcin @*/
26557fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
26657fd6651SLisandro Dalcin {
26757fd6651SLisandro Dalcin   PetscErrorCode ierr;
26857fd6651SLisandro Dalcin 
26957fd6651SLisandro Dalcin   PetscFunctionBegin;
27057fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
27157fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
27257fd6651SLisandro Dalcin   PetscFunctionReturn(0);
27357fd6651SLisandro Dalcin }
27457fd6651SLisandro Dalcin 
27551fa3d41SBarry Smith /*@
27651fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
27751fa3d41SBarry Smith 
2785b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
27951fa3d41SBarry Smith 
28051fa3d41SBarry Smith   Input Parameters:
28151fa3d41SBarry Smith + bar - The bar graph context
28251fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
28351fa3d41SBarry Smith           different color
28451fa3d41SBarry Smith 
28551fa3d41SBarry Smith   Level: intermediate
28651fa3d41SBarry Smith 
2870afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
2880afdd333SBarry Smith 
28951fa3d41SBarry Smith @*/
29051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
29151fa3d41SBarry Smith {
29251fa3d41SBarry Smith   PetscFunctionBegin;
29351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
29451fa3d41SBarry Smith   bar->color = color;
29551fa3d41SBarry Smith   PetscFunctionReturn(0);
29651fa3d41SBarry Smith }
29751fa3d41SBarry Smith 
29851fa3d41SBarry Smith /*@
29951fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
30051fa3d41SBarry Smith 
3015b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
30251fa3d41SBarry Smith 
30351fa3d41SBarry Smith   Input Parameters:
30451fa3d41SBarry Smith + bar - The bar graph context
30551fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
306a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
30751fa3d41SBarry Smith 
30851fa3d41SBarry Smith   Level: intermediate
30951fa3d41SBarry Smith 
3100afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
31151fa3d41SBarry Smith @*/
31251fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
31351fa3d41SBarry Smith {
31451fa3d41SBarry Smith   PetscFunctionBegin;
31551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
31651fa3d41SBarry Smith   bar->sort          = sort;
31751fa3d41SBarry Smith   bar->sorttolerance = tolerance;
31851fa3d41SBarry Smith   PetscFunctionReturn(0);
31951fa3d41SBarry Smith }
32051fa3d41SBarry Smith 
32151fa3d41SBarry Smith /*@
32251fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
32351fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
32451fa3d41SBarry Smith   include those additional points.
32551fa3d41SBarry Smith 
3265b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
32751fa3d41SBarry Smith 
32851fa3d41SBarry Smith   Input Parameters:
32951fa3d41SBarry Smith + bar - The bar graph context
33051fa3d41SBarry Smith - y_min,y_max - The limits
33151fa3d41SBarry Smith 
33251fa3d41SBarry Smith   Level: intermediate
33351fa3d41SBarry Smith 
3340afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
33551fa3d41SBarry Smith @*/
33651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
33751fa3d41SBarry Smith {
33851fa3d41SBarry Smith   PetscFunctionBegin;
33951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
34051fa3d41SBarry Smith   bar->ymin = y_min;
34151fa3d41SBarry Smith   bar->ymax = y_max;
34251fa3d41SBarry Smith   PetscFunctionReturn(0);
34351fa3d41SBarry Smith }
34451fa3d41SBarry Smith 
34551fa3d41SBarry Smith /*@C
34651fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
34751fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
34851fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
34951fa3d41SBarry Smith   application code.
35051fa3d41SBarry Smith 
3515b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
35251fa3d41SBarry Smith 
35351fa3d41SBarry Smith   Input Parameter:
35451fa3d41SBarry Smith . bar - The bar graph context
35551fa3d41SBarry Smith 
35651fa3d41SBarry Smith   Output Parameter:
35751fa3d41SBarry Smith . axis - The axis context
35851fa3d41SBarry Smith 
35951fa3d41SBarry Smith   Level: intermediate
36051fa3d41SBarry Smith 
3610afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
36251fa3d41SBarry Smith @*/
36351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
36451fa3d41SBarry Smith {
36551fa3d41SBarry Smith   PetscFunctionBegin;
366e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
36745f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
36851fa3d41SBarry Smith   *axis = bar->axis;
36951fa3d41SBarry Smith   PetscFunctionReturn(0);
37051fa3d41SBarry Smith }
37151fa3d41SBarry Smith 
37251fa3d41SBarry Smith /*@C
37351fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
37451fa3d41SBarry Smith 
37551fa3d41SBarry Smith   Not Collective, PetscDraw 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:
381e118a51fSLisandro Dalcin . draw  - The draw context
38251fa3d41SBarry Smith 
38351fa3d41SBarry Smith   Level: intermediate
38451fa3d41SBarry Smith 
3850afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
38651fa3d41SBarry Smith @*/
387e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
38851fa3d41SBarry Smith {
38951fa3d41SBarry Smith   PetscFunctionBegin;
39051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
39145f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
392e118a51fSLisandro Dalcin   *draw = bar->win;
39351fa3d41SBarry Smith   PetscFunctionReturn(0);
39451fa3d41SBarry Smith }
39551fa3d41SBarry Smith 
39651fa3d41SBarry Smith /*@
39751fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
39851fa3d41SBarry Smith 
39951fa3d41SBarry Smith     Collective over PetscDrawBar
40051fa3d41SBarry Smith 
40151fa3d41SBarry Smith     Options Database:
40251fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
40351fa3d41SBarry Smith 
40451fa3d41SBarry Smith     Level: intermediate
40551fa3d41SBarry Smith 
4060afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
40751fa3d41SBarry Smith @*/
40851fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
40951fa3d41SBarry Smith {
41051fa3d41SBarry Smith   PetscErrorCode ierr;
41151fa3d41SBarry Smith   PetscBool      set;
41251fa3d41SBarry Smith 
41351fa3d41SBarry Smith   PetscFunctionBegin;
414e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
415e118a51fSLisandro Dalcin 
41671917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr);
41751fa3d41SBarry Smith   if (set) {
418e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
41971917b75SLisandro Dalcin     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
42051fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
42151fa3d41SBarry Smith   }
42251fa3d41SBarry Smith   PetscFunctionReturn(0);
42351fa3d41SBarry Smith }
424