xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 71917b759519de482e858f2e8a03b977bf09ff31)
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 
4251fa3d41SBarry Smith    Level: intermediate
4351fa3d41SBarry Smith 
4451fa3d41SBarry Smith    Concepts: bar graph^creating
4551fa3d41SBarry Smith 
4651fa3d41SBarry Smith .seealso: PetscDrawBarDestroy()
4751fa3d41SBarry Smith 
4851fa3d41SBarry Smith @*/
4951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar)
5051fa3d41SBarry Smith {
5151fa3d41SBarry Smith   PetscDrawBar   h;
5251fa3d41SBarry Smith   PetscErrorCode ierr;
5351fa3d41SBarry Smith 
5451fa3d41SBarry Smith   PetscFunctionBegin;
5551fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
5673107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
57e118a51fSLisandro Dalcin 
58*71917b75SLisandro Dalcin   ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr);
59e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
60e118a51fSLisandro Dalcin 
61e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
62e118a51fSLisandro Dalcin   h->win = draw;
6351fa3d41SBarry Smith 
6451fa3d41SBarry Smith   h->view        = NULL;
6551fa3d41SBarry Smith   h->destroy     = NULL;
6651fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
6751fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
6851fa3d41SBarry Smith   h->ymax        = 0.;
6951fa3d41SBarry Smith   h->numBins     = 0;
7051fa3d41SBarry Smith 
7151fa3d41SBarry Smith   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
7245f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
73e118a51fSLisandro Dalcin 
7451fa3d41SBarry Smith   *bar = h;
7551fa3d41SBarry Smith   PetscFunctionReturn(0);
7651fa3d41SBarry Smith }
7751fa3d41SBarry Smith 
7851fa3d41SBarry Smith #undef __FUNCT__
7951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData"
8051fa3d41SBarry Smith /*@C
8151fa3d41SBarry Smith    PetscDrawBarSetData
8251fa3d41SBarry Smith 
835b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
8451fa3d41SBarry Smith 
8551fa3d41SBarry Smith    Input Parameter:
8651fa3d41SBarry Smith +  bar - The bar graph context.
8751fa3d41SBarry Smith .  bins  - number of items
8851fa3d41SBarry Smith .  values - values of each item
8951fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
9051fa3d41SBarry Smith 
9151fa3d41SBarry Smith    Level: intermediate
9251fa3d41SBarry Smith 
9351fa3d41SBarry Smith 
9451fa3d41SBarry Smith @*/
9551fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
9651fa3d41SBarry Smith {
9751fa3d41SBarry Smith   PetscErrorCode ierr;
9851fa3d41SBarry Smith 
9951fa3d41SBarry Smith   PetscFunctionBegin;
10051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
101e118a51fSLisandro Dalcin 
10251fa3d41SBarry Smith   if (bar->numBins != bins) {
10351fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
10451fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
10551fa3d41SBarry Smith     bar->numBins = bins;
10651fa3d41SBarry Smith   }
10751fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
10851fa3d41SBarry Smith   bar->numBins = bins;
10951fa3d41SBarry Smith   if (labels) {
11051fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
11151fa3d41SBarry Smith   }
11251fa3d41SBarry Smith   PetscFunctionReturn(0);
11351fa3d41SBarry Smith }
11451fa3d41SBarry Smith 
11551fa3d41SBarry Smith #undef __FUNCT__
11651fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy"
11751fa3d41SBarry Smith /*@C
11851fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
11951fa3d41SBarry Smith 
12051fa3d41SBarry Smith   Collective over PetscDrawBar
12151fa3d41SBarry Smith 
12251fa3d41SBarry Smith   Input Parameter:
12351fa3d41SBarry Smith . bar - The bar graph context
12451fa3d41SBarry Smith 
12551fa3d41SBarry Smith   Level: intermediate
12651fa3d41SBarry Smith 
12751fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
12851fa3d41SBarry Smith @*/
12951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
13051fa3d41SBarry Smith {
13151fa3d41SBarry Smith   PetscErrorCode ierr;
13251fa3d41SBarry Smith 
13351fa3d41SBarry Smith   PetscFunctionBegin;
13451fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
135e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
13651fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
137e118a51fSLisandro Dalcin 
13851fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
13951fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
140e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
141e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
14251fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
14351fa3d41SBarry Smith   PetscFunctionReturn(0);
14451fa3d41SBarry Smith }
14551fa3d41SBarry Smith 
14651fa3d41SBarry Smith #undef __FUNCT__
14751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw"
14851fa3d41SBarry Smith /*@
14951fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
15051fa3d41SBarry Smith 
1515b399a63SLisandro Dalcin   Collective on PetscDrawBar
15251fa3d41SBarry Smith 
15351fa3d41SBarry Smith   Input Parameter:
15451fa3d41SBarry Smith . bar - The bar graph context
15551fa3d41SBarry Smith 
15651fa3d41SBarry Smith   Level: intermediate
15751fa3d41SBarry Smith 
15851fa3d41SBarry Smith @*/
15951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
16051fa3d41SBarry Smith {
161e118a51fSLisandro Dalcin   PetscDraw      draw;
16251fa3d41SBarry Smith   PetscBool      isnull;
16351fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
16451fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
165e118a51fSLisandro Dalcin   PetscMPIInt    rank;
16651fa3d41SBarry Smith   PetscErrorCode ierr;
16751fa3d41SBarry Smith   char           **labels;
16851fa3d41SBarry Smith 
16951fa3d41SBarry Smith   PetscFunctionBegin;
17051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1718f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1728f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
173e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr);
17451fa3d41SBarry Smith 
1755b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1765b399a63SLisandro Dalcin 
17751fa3d41SBarry Smith   color = bar->color;
178*71917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
17951fa3d41SBarry Smith   else bcolor = color;
18051fa3d41SBarry Smith 
18151fa3d41SBarry Smith   numValues = bar->numBins;
18251fa3d41SBarry Smith   values    = bar->values;
18351fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
18451fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
18551fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
18651fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
18751fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
18851fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
18951fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
19051fa3d41SBarry Smith     }
19151fa3d41SBarry Smith   } else {
19251fa3d41SBarry Smith     ymin = bar->ymin;
19351fa3d41SBarry Smith     ymax = bar->ymax;
19451fa3d41SBarry Smith   }
19551fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
19651fa3d41SBarry Smith   xmin   = 0.0;
197e118a51fSLisandro Dalcin   xmax   = nplot;
19851fa3d41SBarry Smith   labels = bar->labels;
19951fa3d41SBarry Smith 
20051fa3d41SBarry Smith   if (bar->sort) {
20151fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
20251fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
20351fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
20451fa3d41SBarry Smith     if (bar->sorttolerance) {
20551fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
20651fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
20751fa3d41SBarry Smith           nplot = i;
20851fa3d41SBarry Smith           break;
20951fa3d41SBarry Smith         }
21051fa3d41SBarry Smith       }
21151fa3d41SBarry Smith     }
21251fa3d41SBarry Smith   }
21351fa3d41SBarry Smith 
2145b399a63SLisandro Dalcin   draw = bar->win;
215e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
2165b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
217e118a51fSLisandro Dalcin 
21851fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
21951fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
22051fa3d41SBarry Smith 
2215b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
222e118a51fSLisandro Dalcin   if (!rank) { /* Draw bins */
22351fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
22451fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
22551fa3d41SBarry Smith       binLeft  = xmin + i;
22651fa3d41SBarry Smith       binRight = xmin + i + 1;
22751fa3d41SBarry Smith       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
22851fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
22951fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23051fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23151fa3d41SBarry Smith       if (labels) {
23251fa3d41SBarry Smith         PetscReal h;
23351fa3d41SBarry Smith         ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
234*71917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr);
23551fa3d41SBarry Smith       }
23651fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
237*71917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
23851fa3d41SBarry Smith     }
23951fa3d41SBarry Smith   }
2405b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
241e118a51fSLisandro Dalcin   if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);}
242e118a51fSLisandro Dalcin 
2435b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
24451fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
24551fa3d41SBarry Smith   PetscFunctionReturn(0);
24651fa3d41SBarry Smith }
24751fa3d41SBarry Smith 
24851fa3d41SBarry Smith #undef __FUNCT__
24957fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave"
25057fd6651SLisandro Dalcin /*@
25157fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
25257fd6651SLisandro Dalcin 
25357fd6651SLisandro Dalcin   Collective on PetscDrawBar
25457fd6651SLisandro Dalcin 
25557fd6651SLisandro Dalcin   Input Parameters:
25657fd6651SLisandro Dalcin . bar - The bar graph context
25757fd6651SLisandro Dalcin 
25857fd6651SLisandro Dalcin   Level: intermediate
25957fd6651SLisandro Dalcin 
26057fd6651SLisandro Dalcin   Concepts: bar graph^saving
26157fd6651SLisandro Dalcin 
26257fd6651SLisandro Dalcin .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave()
26357fd6651SLisandro Dalcin @*/
26457fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
26557fd6651SLisandro Dalcin {
26657fd6651SLisandro Dalcin   PetscErrorCode ierr;
26757fd6651SLisandro Dalcin 
26857fd6651SLisandro Dalcin   PetscFunctionBegin;
26957fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
27057fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
27157fd6651SLisandro Dalcin   PetscFunctionReturn(0);
27257fd6651SLisandro Dalcin }
27357fd6651SLisandro Dalcin 
27457fd6651SLisandro Dalcin #undef __FUNCT__
27551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor"
27651fa3d41SBarry Smith /*@
27751fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
27851fa3d41SBarry Smith 
2795b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
28051fa3d41SBarry Smith 
28151fa3d41SBarry Smith   Input Parameters:
28251fa3d41SBarry Smith + bar - The bar graph context
28351fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
28451fa3d41SBarry Smith           different color
28551fa3d41SBarry Smith 
28651fa3d41SBarry Smith   Level: intermediate
28751fa3d41SBarry Smith 
28851fa3d41SBarry Smith @*/
28951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
29051fa3d41SBarry Smith {
29151fa3d41SBarry Smith   PetscFunctionBegin;
29251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
29351fa3d41SBarry Smith   bar->color = color;
29451fa3d41SBarry Smith   PetscFunctionReturn(0);
29551fa3d41SBarry Smith }
29651fa3d41SBarry Smith 
29751fa3d41SBarry Smith #undef __FUNCT__
29851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort"
29951fa3d41SBarry Smith /*@
30051fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
30151fa3d41SBarry Smith 
3025b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
30351fa3d41SBarry Smith 
30451fa3d41SBarry Smith   Input Parameters:
30551fa3d41SBarry Smith + bar - The bar graph context
30651fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
30751fa3d41SBarry Smith . tolerance - discard values less than tolerance
30851fa3d41SBarry Smith 
30951fa3d41SBarry Smith   Level: intermediate
31051fa3d41SBarry Smith 
31151fa3d41SBarry Smith   Concepts: bar graph^setting axis
31251fa3d41SBarry Smith @*/
31351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
31451fa3d41SBarry Smith {
31551fa3d41SBarry Smith   PetscFunctionBegin;
31651fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
31751fa3d41SBarry Smith   bar->sort          = sort;
31851fa3d41SBarry Smith   bar->sorttolerance = tolerance;
31951fa3d41SBarry Smith   PetscFunctionReturn(0);
32051fa3d41SBarry Smith }
32151fa3d41SBarry Smith 
32251fa3d41SBarry Smith #undef __FUNCT__
32351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits"
32451fa3d41SBarry Smith /*@
32551fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
32651fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
32751fa3d41SBarry Smith   include those additional points.
32851fa3d41SBarry Smith 
3295b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
33051fa3d41SBarry Smith 
33151fa3d41SBarry Smith   Input Parameters:
33251fa3d41SBarry Smith + bar - The bar graph context
33351fa3d41SBarry Smith - y_min,y_max - The limits
33451fa3d41SBarry Smith 
33551fa3d41SBarry Smith   Level: intermediate
33651fa3d41SBarry Smith 
33751fa3d41SBarry Smith   Concepts: bar graph^setting axis
33851fa3d41SBarry Smith @*/
33951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
34051fa3d41SBarry Smith {
34151fa3d41SBarry Smith   PetscFunctionBegin;
34251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
34351fa3d41SBarry Smith   bar->ymin = y_min;
34451fa3d41SBarry Smith   bar->ymax = y_max;
34551fa3d41SBarry Smith   PetscFunctionReturn(0);
34651fa3d41SBarry Smith }
34751fa3d41SBarry Smith 
34851fa3d41SBarry Smith #undef __FUNCT__
34951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis"
35051fa3d41SBarry Smith /*@C
35151fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
35251fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
35351fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
35451fa3d41SBarry Smith   application code.
35551fa3d41SBarry Smith 
3565b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
35751fa3d41SBarry Smith 
35851fa3d41SBarry Smith   Input Parameter:
35951fa3d41SBarry Smith . bar - The bar graph context
36051fa3d41SBarry Smith 
36151fa3d41SBarry Smith   Output Parameter:
36251fa3d41SBarry Smith . axis - The axis context
36351fa3d41SBarry Smith 
36451fa3d41SBarry Smith   Level: intermediate
36551fa3d41SBarry Smith 
36651fa3d41SBarry Smith @*/
36751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
36851fa3d41SBarry Smith {
36951fa3d41SBarry Smith   PetscFunctionBegin;
370e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
37145f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
37251fa3d41SBarry Smith   *axis = bar->axis;
37351fa3d41SBarry Smith   PetscFunctionReturn(0);
37451fa3d41SBarry Smith }
37551fa3d41SBarry Smith 
37651fa3d41SBarry Smith #undef __FUNCT__
37751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw"
37851fa3d41SBarry Smith /*@C
37951fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
38051fa3d41SBarry Smith 
38151fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
38251fa3d41SBarry Smith 
38351fa3d41SBarry Smith   Input Parameter:
38451fa3d41SBarry Smith . bar - The bar graph context
38551fa3d41SBarry Smith 
38651fa3d41SBarry Smith   Output Parameter:
387e118a51fSLisandro Dalcin . draw  - The draw context
38851fa3d41SBarry Smith 
38951fa3d41SBarry Smith   Level: intermediate
39051fa3d41SBarry Smith 
39151fa3d41SBarry Smith @*/
392e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
39351fa3d41SBarry Smith {
39451fa3d41SBarry Smith   PetscFunctionBegin;
39551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
39645f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
397e118a51fSLisandro Dalcin   *draw = bar->win;
39851fa3d41SBarry Smith   PetscFunctionReturn(0);
39951fa3d41SBarry Smith }
40051fa3d41SBarry Smith 
40151fa3d41SBarry Smith #undef __FUNCT__
40251fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions"
40351fa3d41SBarry Smith /*@
40451fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
40551fa3d41SBarry Smith 
40651fa3d41SBarry Smith     Collective over PetscDrawBar
40751fa3d41SBarry Smith 
40851fa3d41SBarry Smith     Options Database:
40951fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
41051fa3d41SBarry Smith 
41151fa3d41SBarry Smith     Level: intermediate
41251fa3d41SBarry Smith 
41351fa3d41SBarry Smith 
41451fa3d41SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate()
41551fa3d41SBarry Smith @*/
41651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
41751fa3d41SBarry Smith {
41851fa3d41SBarry Smith   PetscErrorCode ierr;
41951fa3d41SBarry Smith   PetscBool      set;
42051fa3d41SBarry Smith 
42151fa3d41SBarry Smith   PetscFunctionBegin;
422e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
423e118a51fSLisandro Dalcin 
424*71917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr);
42551fa3d41SBarry Smith   if (set) {
426e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
427*71917b75SLisandro Dalcin     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
42851fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
42951fa3d41SBarry Smith   }
43051fa3d41SBarry Smith   PetscFunctionReturn(0);
43151fa3d41SBarry Smith }
43251fa3d41SBarry Smith 
433