xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 73107ff1babc248481eafc1deee82c9703b7a0a0)
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   PetscBool      isnull;
5351fa3d41SBarry Smith   PetscErrorCode ierr;
5451fa3d41SBarry Smith 
5551fa3d41SBarry Smith   PetscFunctionBegin;
5651fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
57*73107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
58*73107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "PetscDrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL);CHKERRQ(ierr);
5951fa3d41SBarry Smith 
6051fa3d41SBarry Smith   h->view        = NULL;
6151fa3d41SBarry Smith   h->destroy     = NULL;
6251fa3d41SBarry Smith   h->win         = draw;
6351fa3d41SBarry Smith 
6451fa3d41SBarry Smith   ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr);
6551fa3d41SBarry Smith 
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 = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr);
7251fa3d41SBarry Smith   if (!isnull) {
7351fa3d41SBarry Smith     ierr = PetscDrawAxisCreate(draw, &h->axis);CHKERRQ(ierr);
7451fa3d41SBarry Smith     h->axis->xticks = NULL;
7551fa3d41SBarry Smith   } else h->axis = NULL;
7651fa3d41SBarry Smith   *bar = h;
7751fa3d41SBarry Smith   PetscFunctionReturn(0);
7851fa3d41SBarry Smith }
7951fa3d41SBarry Smith 
8051fa3d41SBarry Smith #undef __FUNCT__
8151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData"
8251fa3d41SBarry Smith /*@C
8351fa3d41SBarry Smith    PetscDrawBarSetData
8451fa3d41SBarry Smith 
8551fa3d41SBarry Smith    Not Collective (ignored except on processor 0 of PetscDrawBar)
8651fa3d41SBarry Smith 
8751fa3d41SBarry Smith    Input Parameter:
8851fa3d41SBarry Smith +  bar - The bar graph context.
8951fa3d41SBarry Smith .  bins  - number of items
9051fa3d41SBarry Smith .  values - values of each item
9151fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
9251fa3d41SBarry Smith 
9351fa3d41SBarry Smith    Level: intermediate
9451fa3d41SBarry Smith 
9551fa3d41SBarry Smith 
9651fa3d41SBarry Smith @*/
9751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins,const PetscReal data[],const char *const *labels)
9851fa3d41SBarry Smith {
9951fa3d41SBarry Smith   PetscErrorCode ierr;
10051fa3d41SBarry Smith 
10151fa3d41SBarry Smith   PetscFunctionBegin;
10251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
10351fa3d41SBarry Smith   if (bar->numBins != bins) {
10451fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
10551fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
10651fa3d41SBarry Smith     bar->numBins = bins;
10751fa3d41SBarry Smith   }
10851fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
10951fa3d41SBarry Smith   bar->numBins = bins;
11051fa3d41SBarry Smith   if (labels) {
11151fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
11251fa3d41SBarry Smith   }
11351fa3d41SBarry Smith   PetscFunctionReturn(0);
11451fa3d41SBarry Smith }
11551fa3d41SBarry Smith 
11651fa3d41SBarry Smith #undef __FUNCT__
11751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy"
11851fa3d41SBarry Smith /*@C
11951fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
12051fa3d41SBarry Smith 
12151fa3d41SBarry Smith   Collective over PetscDrawBar
12251fa3d41SBarry Smith 
12351fa3d41SBarry Smith   Input Parameter:
12451fa3d41SBarry Smith . bar - The bar graph context
12551fa3d41SBarry Smith 
12651fa3d41SBarry Smith   Level: intermediate
12751fa3d41SBarry Smith 
12851fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
12951fa3d41SBarry Smith @*/
13051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
13151fa3d41SBarry Smith {
13251fa3d41SBarry Smith   PetscErrorCode ierr;
13351fa3d41SBarry Smith 
13451fa3d41SBarry Smith   PetscFunctionBegin;
13551fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
13651fa3d41SBarry Smith   PetscValidHeader(*bar,1);
13751fa3d41SBarry Smith 
13851fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
13951fa3d41SBarry Smith   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
14051fa3d41SBarry Smith   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
14151fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
14251fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
14351fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
14451fa3d41SBarry Smith   PetscFunctionReturn(0);
14551fa3d41SBarry Smith }
14651fa3d41SBarry Smith 
14751fa3d41SBarry Smith #undef __FUNCT__
14851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw"
14951fa3d41SBarry Smith /*@
15051fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
15151fa3d41SBarry Smith 
15251fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
15351fa3d41SBarry Smith 
15451fa3d41SBarry Smith   Input Parameter:
15551fa3d41SBarry Smith . bar - The bar graph context
15651fa3d41SBarry Smith 
15751fa3d41SBarry Smith   Level: intermediate
15851fa3d41SBarry Smith 
15951fa3d41SBarry Smith @*/
16051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
16151fa3d41SBarry Smith {
16251fa3d41SBarry Smith   PetscDraw      draw = bar->win;
16351fa3d41SBarry Smith   PetscBool      isnull;
16451fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
16551fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
16651fa3d41SBarry Smith   PetscErrorCode ierr;
16751fa3d41SBarry Smith   char           **labels;
16851fa3d41SBarry Smith 
16951fa3d41SBarry Smith   PetscFunctionBegin;
17051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
17151fa3d41SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr);
17251fa3d41SBarry Smith   if (isnull) PetscFunctionReturn(0);
17351fa3d41SBarry Smith   if (bar->numBins < 1) PetscFunctionReturn(0);
17451fa3d41SBarry Smith 
17551fa3d41SBarry Smith   color = bar->color;
17651fa3d41SBarry Smith   if (color == PETSC_DRAW_ROTATE) bcolor = 2;
17751fa3d41SBarry Smith   else bcolor = color;
17851fa3d41SBarry Smith 
17951fa3d41SBarry Smith   numValues = bar->numBins;
18051fa3d41SBarry Smith   values    = bar->values;
18151fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
18251fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
18351fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
18451fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
18551fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
18651fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
18751fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
18851fa3d41SBarry Smith     }
18951fa3d41SBarry Smith   } else {
19051fa3d41SBarry Smith     ymin      = bar->ymin;
19151fa3d41SBarry Smith     ymax      = bar->ymax;
19251fa3d41SBarry Smith   }
19351fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
19451fa3d41SBarry Smith   xmin   = 0.0;
19551fa3d41SBarry Smith   labels = bar->labels;
19651fa3d41SBarry Smith 
19751fa3d41SBarry Smith   if (bar->sort) {
19851fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
19951fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
20051fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
20151fa3d41SBarry Smith     if (bar->sorttolerance) {
20251fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
20351fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
20451fa3d41SBarry Smith           nplot = i;
20551fa3d41SBarry Smith           break;
20651fa3d41SBarry Smith         }
20751fa3d41SBarry Smith       }
20851fa3d41SBarry Smith     }
20951fa3d41SBarry Smith   }
21051fa3d41SBarry Smith 
21151fa3d41SBarry Smith   xmax   = nplot;
21251fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax);CHKERRQ(ierr);
21351fa3d41SBarry Smith   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
21451fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
21551fa3d41SBarry Smith 
21651fa3d41SBarry Smith   /* Draw bins */
21751fa3d41SBarry Smith   for (i = 0; i < nplot; i++) {
21851fa3d41SBarry Smith     idx = (bar->sort ? perm[numValues - i - 1] : i);
21951fa3d41SBarry Smith     binLeft  = xmin + i;
22051fa3d41SBarry Smith     binRight = xmin + i + 1;
22151fa3d41SBarry Smith     ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
22251fa3d41SBarry Smith     ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
22351fa3d41SBarry Smith     ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
22451fa3d41SBarry Smith     ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
22551fa3d41SBarry Smith     if (labels) {
22651fa3d41SBarry Smith       PetscReal h;
22751fa3d41SBarry Smith       ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
22851fa3d41SBarry Smith       ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.2*h,bcolor,labels[idx]);CHKERRQ(ierr);
22951fa3d41SBarry Smith     }
23051fa3d41SBarry Smith     if (color == PETSC_DRAW_ROTATE) bcolor++;
23151fa3d41SBarry Smith     if (bcolor > 31) bcolor = 2;
23251fa3d41SBarry Smith   }
23351fa3d41SBarry Smith   if (bar->sort) {
23451fa3d41SBarry Smith     ierr = PetscFree(perm);CHKERRQ(ierr);
23551fa3d41SBarry Smith   }
23651fa3d41SBarry Smith   ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr);
23751fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
23851fa3d41SBarry Smith   PetscFunctionReturn(0);
23951fa3d41SBarry Smith }
24051fa3d41SBarry Smith 
24151fa3d41SBarry Smith #undef __FUNCT__
24251fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor"
24351fa3d41SBarry Smith /*@
24451fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
24551fa3d41SBarry Smith 
24651fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
24751fa3d41SBarry Smith 
24851fa3d41SBarry Smith   Input Parameters:
24951fa3d41SBarry Smith + bar - The bar graph context
25051fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
25151fa3d41SBarry Smith           different color
25251fa3d41SBarry Smith 
25351fa3d41SBarry Smith   Level: intermediate
25451fa3d41SBarry Smith 
25551fa3d41SBarry Smith @*/
25651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
25751fa3d41SBarry Smith {
25851fa3d41SBarry Smith   PetscFunctionBegin;
25951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
26051fa3d41SBarry Smith   bar->color = color;
26151fa3d41SBarry Smith   PetscFunctionReturn(0);
26251fa3d41SBarry Smith }
26351fa3d41SBarry Smith 
26451fa3d41SBarry Smith #undef __FUNCT__
26551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort"
26651fa3d41SBarry Smith /*@
26751fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
26851fa3d41SBarry Smith 
26951fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
27051fa3d41SBarry Smith 
27151fa3d41SBarry Smith   Input Parameters:
27251fa3d41SBarry Smith + bar - The bar graph context
27351fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
27451fa3d41SBarry Smith . tolerance - discard values less than tolerance
27551fa3d41SBarry Smith 
27651fa3d41SBarry Smith   Level: intermediate
27751fa3d41SBarry Smith 
27851fa3d41SBarry Smith   Concepts: bar graph^setting axis
27951fa3d41SBarry Smith @*/
28051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
28151fa3d41SBarry Smith {
28251fa3d41SBarry Smith   PetscFunctionBegin;
28351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
28451fa3d41SBarry Smith   bar->sort          = sort;
28551fa3d41SBarry Smith   bar->sorttolerance = tolerance;
28651fa3d41SBarry Smith   PetscFunctionReturn(0);
28751fa3d41SBarry Smith }
28851fa3d41SBarry Smith 
28951fa3d41SBarry Smith #undef __FUNCT__
29051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits"
29151fa3d41SBarry Smith /*@
29251fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
29351fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
29451fa3d41SBarry Smith   include those additional points.
29551fa3d41SBarry Smith 
29651fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
29751fa3d41SBarry Smith 
29851fa3d41SBarry Smith   Input Parameters:
29951fa3d41SBarry Smith + bar - The bar graph context
30051fa3d41SBarry Smith - y_min,y_max - The limits
30151fa3d41SBarry Smith 
30251fa3d41SBarry Smith   Level: intermediate
30351fa3d41SBarry Smith 
30451fa3d41SBarry Smith   Concepts: bar graph^setting axis
30551fa3d41SBarry Smith @*/
30651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
30751fa3d41SBarry Smith {
30851fa3d41SBarry Smith   PetscFunctionBegin;
30951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
31051fa3d41SBarry Smith   bar->ymin = y_min;
31151fa3d41SBarry Smith   bar->ymax = y_max;
31251fa3d41SBarry Smith   PetscFunctionReturn(0);
31351fa3d41SBarry Smith }
31451fa3d41SBarry Smith 
31551fa3d41SBarry Smith #undef __FUNCT__
31651fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis"
31751fa3d41SBarry Smith /*@C
31851fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31951fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
32051fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
32151fa3d41SBarry Smith   application code.
32251fa3d41SBarry Smith 
32351fa3d41SBarry Smith   Not Collective (ignored except on processor 0 of PetscDrawBar)
32451fa3d41SBarry Smith 
32551fa3d41SBarry Smith   Input Parameter:
32651fa3d41SBarry Smith . bar - The bar graph context
32751fa3d41SBarry Smith 
32851fa3d41SBarry Smith   Output Parameter:
32951fa3d41SBarry Smith . axis - The axis context
33051fa3d41SBarry Smith 
33151fa3d41SBarry Smith   Level: intermediate
33251fa3d41SBarry Smith 
33351fa3d41SBarry Smith @*/
33451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
33551fa3d41SBarry Smith {
33651fa3d41SBarry Smith   PetscFunctionBegin;
33751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
33851fa3d41SBarry Smith   PetscValidPointer(axis,2);
33951fa3d41SBarry Smith   *axis = bar->axis;
34051fa3d41SBarry Smith   PetscFunctionReturn(0);
34151fa3d41SBarry Smith }
34251fa3d41SBarry Smith 
34351fa3d41SBarry Smith #undef __FUNCT__
34451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw"
34551fa3d41SBarry Smith /*@C
34651fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34751fa3d41SBarry Smith 
34851fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
34951fa3d41SBarry Smith 
35051fa3d41SBarry Smith   Input Parameter:
35151fa3d41SBarry Smith . bar - The bar graph context
35251fa3d41SBarry Smith 
35351fa3d41SBarry Smith   Output Parameter:
35451fa3d41SBarry Smith . win  - The draw context
35551fa3d41SBarry Smith 
35651fa3d41SBarry Smith   Level: intermediate
35751fa3d41SBarry Smith 
35851fa3d41SBarry Smith @*/
35951fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *win)
36051fa3d41SBarry Smith {
36151fa3d41SBarry Smith   PetscFunctionBegin;
36251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
36351fa3d41SBarry Smith   PetscValidPointer(win,2);
36451fa3d41SBarry Smith   *win = bar->win;
36551fa3d41SBarry Smith   PetscFunctionReturn(0);
36651fa3d41SBarry Smith }
36751fa3d41SBarry Smith 
36851fa3d41SBarry Smith #undef __FUNCT__
36951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions"
37051fa3d41SBarry Smith /*@
37151fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
37251fa3d41SBarry Smith 
37351fa3d41SBarry Smith     Collective over PetscDrawBar
37451fa3d41SBarry Smith 
37551fa3d41SBarry Smith     Options Database:
37651fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
37751fa3d41SBarry Smith 
37851fa3d41SBarry Smith     Level: intermediate
37951fa3d41SBarry Smith 
38051fa3d41SBarry Smith 
38151fa3d41SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate()
38251fa3d41SBarry Smith @*/
38351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
38451fa3d41SBarry Smith {
38551fa3d41SBarry Smith   PetscErrorCode ierr;
38651fa3d41SBarry Smith   PetscBool      set;
38751fa3d41SBarry Smith   PetscReal      tol = bar->sorttolerance;
38851fa3d41SBarry Smith 
38951fa3d41SBarry Smith   PetscFunctionBegin;
39051fa3d41SBarry Smith   ierr = PetscOptionsHasName(NULL,"-bar_sort",&set);CHKERRQ(ierr);
39151fa3d41SBarry Smith   if (set) {
39251fa3d41SBarry Smith     ierr = PetscOptionsGetReal(NULL,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
39351fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
39451fa3d41SBarry Smith   }
39551fa3d41SBarry Smith   PetscFunctionReturn(0);
39651fa3d41SBarry Smith }
39751fa3d41SBarry Smith 
398