xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 57fd6651ab79148613726b1854d7cdd389976ffe)
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);
5773107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
58e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
59e118a51fSLisandro Dalcin   if (isnull) {*bar = NULL; PetscFunctionReturn(0);}
60e118a51fSLisandro Dalcin 
6173107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "PetscDrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL);CHKERRQ(ierr);
62e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
63e118a51fSLisandro Dalcin 
64e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
65e118a51fSLisandro Dalcin   h->win = draw;
6651fa3d41SBarry Smith 
6751fa3d41SBarry Smith   h->view        = NULL;
6851fa3d41SBarry Smith   h->destroy     = NULL;
6951fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
7051fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
7151fa3d41SBarry Smith   h->ymax        = 0.;
7251fa3d41SBarry Smith   h->numBins     = 0;
7351fa3d41SBarry Smith 
7451fa3d41SBarry Smith   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
75e118a51fSLisandro Dalcin   if (h->axis) h->axis->xticks = NULL;
76e118a51fSLisandro Dalcin 
7751fa3d41SBarry Smith   *bar = h;
7851fa3d41SBarry Smith   PetscFunctionReturn(0);
7951fa3d41SBarry Smith }
8051fa3d41SBarry Smith 
8151fa3d41SBarry Smith #undef __FUNCT__
8251fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData"
8351fa3d41SBarry Smith /*@C
8451fa3d41SBarry Smith    PetscDrawBarSetData
8551fa3d41SBarry Smith 
865b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
8751fa3d41SBarry Smith 
8851fa3d41SBarry Smith    Input Parameter:
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 
9651fa3d41SBarry Smith 
9751fa3d41SBarry Smith @*/
9851fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins,const PetscReal data[],const char *const *labels)
9951fa3d41SBarry Smith {
10051fa3d41SBarry Smith   PetscErrorCode ierr;
10151fa3d41SBarry Smith 
10251fa3d41SBarry Smith   PetscFunctionBegin;
103e118a51fSLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
10451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
105e118a51fSLisandro Dalcin 
10651fa3d41SBarry Smith   if (bar->numBins != bins) {
10751fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
10851fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
10951fa3d41SBarry Smith     bar->numBins = bins;
11051fa3d41SBarry Smith   }
11151fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
11251fa3d41SBarry Smith   bar->numBins = bins;
11351fa3d41SBarry Smith   if (labels) {
11451fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
11551fa3d41SBarry Smith   }
11651fa3d41SBarry Smith   PetscFunctionReturn(0);
11751fa3d41SBarry Smith }
11851fa3d41SBarry Smith 
11951fa3d41SBarry Smith #undef __FUNCT__
12051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy"
12151fa3d41SBarry Smith /*@C
12251fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
12351fa3d41SBarry Smith 
12451fa3d41SBarry Smith   Collective over PetscDrawBar
12551fa3d41SBarry Smith 
12651fa3d41SBarry Smith   Input Parameter:
12751fa3d41SBarry Smith . bar - The bar graph context
12851fa3d41SBarry Smith 
12951fa3d41SBarry Smith   Level: intermediate
13051fa3d41SBarry Smith 
13151fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
13251fa3d41SBarry Smith @*/
13351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
13451fa3d41SBarry Smith {
13551fa3d41SBarry Smith   PetscErrorCode ierr;
13651fa3d41SBarry Smith 
13751fa3d41SBarry Smith   PetscFunctionBegin;
13851fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
139e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
14051fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
141e118a51fSLisandro Dalcin 
14251fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
14351fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
144e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
145e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
14651fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
14751fa3d41SBarry Smith   PetscFunctionReturn(0);
14851fa3d41SBarry Smith }
14951fa3d41SBarry Smith 
15051fa3d41SBarry Smith #undef __FUNCT__
15151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw"
15251fa3d41SBarry Smith /*@
15351fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
15451fa3d41SBarry Smith 
1555b399a63SLisandro Dalcin   Collective on PetscDrawBar
15651fa3d41SBarry Smith 
15751fa3d41SBarry Smith   Input Parameter:
15851fa3d41SBarry Smith . bar - The bar graph context
15951fa3d41SBarry Smith 
16051fa3d41SBarry Smith   Level: intermediate
16151fa3d41SBarry Smith 
16251fa3d41SBarry Smith @*/
16351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
16451fa3d41SBarry Smith {
165e118a51fSLisandro Dalcin   PetscDraw      draw;
16651fa3d41SBarry Smith   PetscBool      isnull;
16751fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
16851fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
169e118a51fSLisandro Dalcin   PetscMPIInt    rank;
17051fa3d41SBarry Smith   PetscErrorCode ierr;
17151fa3d41SBarry Smith   char           **labels;
17251fa3d41SBarry Smith 
17351fa3d41SBarry Smith   PetscFunctionBegin;
174e118a51fSLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
17551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1768f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1778f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
178e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr);
17951fa3d41SBarry Smith 
1805b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1815b399a63SLisandro Dalcin 
18251fa3d41SBarry Smith   color = bar->color;
18351fa3d41SBarry Smith   if (color == PETSC_DRAW_ROTATE) bcolor = 2;
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);
23951fa3d41SBarry Smith         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.2*h,bcolor,labels[idx]);CHKERRQ(ierr);
24051fa3d41SBarry Smith       }
24151fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
242e118a51fSLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = 2;
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 
25351fa3d41SBarry Smith #undef __FUNCT__
254*57fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave"
255*57fd6651SLisandro Dalcin /*@
256*57fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
257*57fd6651SLisandro Dalcin 
258*57fd6651SLisandro Dalcin   Collective on PetscDrawBar
259*57fd6651SLisandro Dalcin 
260*57fd6651SLisandro Dalcin   Input Parameters:
261*57fd6651SLisandro Dalcin . bar - The bar graph context
262*57fd6651SLisandro Dalcin 
263*57fd6651SLisandro Dalcin   Level: intermediate
264*57fd6651SLisandro Dalcin 
265*57fd6651SLisandro Dalcin   Concepts: bar graph^saving
266*57fd6651SLisandro Dalcin 
267*57fd6651SLisandro Dalcin .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave()
268*57fd6651SLisandro Dalcin @*/
269*57fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
270*57fd6651SLisandro Dalcin {
271*57fd6651SLisandro Dalcin   PetscErrorCode ierr;
272*57fd6651SLisandro Dalcin 
273*57fd6651SLisandro Dalcin   PetscFunctionBegin;
274*57fd6651SLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
275*57fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
276*57fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
277*57fd6651SLisandro Dalcin   PetscFunctionReturn(0);
278*57fd6651SLisandro Dalcin }
279*57fd6651SLisandro Dalcin 
280*57fd6651SLisandro Dalcin #undef __FUNCT__
28151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor"
28251fa3d41SBarry Smith /*@
28351fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
28451fa3d41SBarry Smith 
2855b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
28651fa3d41SBarry Smith 
28751fa3d41SBarry Smith   Input Parameters:
28851fa3d41SBarry Smith + bar - The bar graph context
28951fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
29051fa3d41SBarry Smith           different color
29151fa3d41SBarry Smith 
29251fa3d41SBarry Smith   Level: intermediate
29351fa3d41SBarry Smith 
29451fa3d41SBarry Smith @*/
29551fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
29651fa3d41SBarry Smith {
29751fa3d41SBarry Smith   PetscFunctionBegin;
298e118a51fSLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
29951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
30051fa3d41SBarry Smith   bar->color = color;
30151fa3d41SBarry Smith   PetscFunctionReturn(0);
30251fa3d41SBarry Smith }
30351fa3d41SBarry Smith 
30451fa3d41SBarry Smith #undef __FUNCT__
30551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort"
30651fa3d41SBarry Smith /*@
30751fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
30851fa3d41SBarry Smith 
3095b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
31051fa3d41SBarry Smith 
31151fa3d41SBarry Smith   Input Parameters:
31251fa3d41SBarry Smith + bar - The bar graph context
31351fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
31451fa3d41SBarry Smith . tolerance - discard values less than tolerance
31551fa3d41SBarry Smith 
31651fa3d41SBarry Smith   Level: intermediate
31751fa3d41SBarry Smith 
31851fa3d41SBarry Smith   Concepts: bar graph^setting axis
31951fa3d41SBarry Smith @*/
32051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
32151fa3d41SBarry Smith {
32251fa3d41SBarry Smith   PetscFunctionBegin;
323e118a51fSLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
32451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
32551fa3d41SBarry Smith   bar->sort          = sort;
32651fa3d41SBarry Smith   bar->sorttolerance = tolerance;
32751fa3d41SBarry Smith   PetscFunctionReturn(0);
32851fa3d41SBarry Smith }
32951fa3d41SBarry Smith 
33051fa3d41SBarry Smith #undef __FUNCT__
33151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits"
33251fa3d41SBarry Smith /*@
33351fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
33451fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
33551fa3d41SBarry Smith   include those additional points.
33651fa3d41SBarry Smith 
3375b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
33851fa3d41SBarry Smith 
33951fa3d41SBarry Smith   Input Parameters:
34051fa3d41SBarry Smith + bar - The bar graph context
34151fa3d41SBarry Smith - y_min,y_max - The limits
34251fa3d41SBarry Smith 
34351fa3d41SBarry Smith   Level: intermediate
34451fa3d41SBarry Smith 
34551fa3d41SBarry Smith   Concepts: bar graph^setting axis
34651fa3d41SBarry Smith @*/
34751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
34851fa3d41SBarry Smith {
34951fa3d41SBarry Smith   PetscFunctionBegin;
350e118a51fSLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
35151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
35251fa3d41SBarry Smith   bar->ymin = y_min;
35351fa3d41SBarry Smith   bar->ymax = y_max;
35451fa3d41SBarry Smith   PetscFunctionReturn(0);
35551fa3d41SBarry Smith }
35651fa3d41SBarry Smith 
35751fa3d41SBarry Smith #undef __FUNCT__
35851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis"
35951fa3d41SBarry Smith /*@C
36051fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
36151fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
36251fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
36351fa3d41SBarry Smith   application code.
36451fa3d41SBarry Smith 
3655b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
36651fa3d41SBarry Smith 
36751fa3d41SBarry Smith   Input Parameter:
36851fa3d41SBarry Smith . bar - The bar graph context
36951fa3d41SBarry Smith 
37051fa3d41SBarry Smith   Output Parameter:
37151fa3d41SBarry Smith . axis - The axis context
37251fa3d41SBarry Smith 
37351fa3d41SBarry Smith   Level: intermediate
37451fa3d41SBarry Smith 
37551fa3d41SBarry Smith @*/
37651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
37751fa3d41SBarry Smith {
37851fa3d41SBarry Smith   PetscFunctionBegin;
37951fa3d41SBarry Smith   PetscValidPointer(axis,2);
380e118a51fSLisandro Dalcin   if (!bar) {*axis = NULL; PetscFunctionReturn(0);}
381e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
38251fa3d41SBarry Smith   *axis = bar->axis;
38351fa3d41SBarry Smith   PetscFunctionReturn(0);
38451fa3d41SBarry Smith }
38551fa3d41SBarry Smith 
38651fa3d41SBarry Smith #undef __FUNCT__
38751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw"
38851fa3d41SBarry Smith /*@C
38951fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
39051fa3d41SBarry Smith 
39151fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
39251fa3d41SBarry Smith 
39351fa3d41SBarry Smith   Input Parameter:
39451fa3d41SBarry Smith . bar - The bar graph context
39551fa3d41SBarry Smith 
39651fa3d41SBarry Smith   Output Parameter:
397e118a51fSLisandro Dalcin . draw  - The draw context
39851fa3d41SBarry Smith 
39951fa3d41SBarry Smith   Level: intermediate
40051fa3d41SBarry Smith 
40151fa3d41SBarry Smith @*/
402e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw)
40351fa3d41SBarry Smith {
40451fa3d41SBarry Smith   PetscFunctionBegin;
405e118a51fSLisandro Dalcin   PetscValidPointer(draw,2);
406e118a51fSLisandro Dalcin   if (!bar) {*draw = NULL; PetscFunctionReturn(0);}
40751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
408e118a51fSLisandro Dalcin   *draw = bar->win;
40951fa3d41SBarry Smith   PetscFunctionReturn(0);
41051fa3d41SBarry Smith }
41151fa3d41SBarry Smith 
41251fa3d41SBarry Smith #undef __FUNCT__
41351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions"
41451fa3d41SBarry Smith /*@
41551fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
41651fa3d41SBarry Smith 
41751fa3d41SBarry Smith     Collective over PetscDrawBar
41851fa3d41SBarry Smith 
41951fa3d41SBarry Smith     Options Database:
42051fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
42151fa3d41SBarry Smith 
42251fa3d41SBarry Smith     Level: intermediate
42351fa3d41SBarry Smith 
42451fa3d41SBarry Smith 
42551fa3d41SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate()
42651fa3d41SBarry Smith @*/
42751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
42851fa3d41SBarry Smith {
42951fa3d41SBarry Smith   PetscErrorCode ierr;
43051fa3d41SBarry Smith   PetscBool      set;
43151fa3d41SBarry Smith 
43251fa3d41SBarry Smith   PetscFunctionBegin;
433e118a51fSLisandro Dalcin   if (!bar) PetscFunctionReturn(0);
434e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
435e118a51fSLisandro Dalcin 
436c5929fdfSBarry Smith   ierr = PetscOptionsHasName(((PetscObject)bar)->options,NULL,"-bar_sort",&set);CHKERRQ(ierr);
43751fa3d41SBarry Smith   if (set) {
438e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
439c5929fdfSBarry Smith     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,NULL,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
44051fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
44151fa3d41SBarry Smith   }
44251fa3d41SBarry Smith   PetscFunctionReturn(0);
44351fa3d41SBarry Smith }
44451fa3d41SBarry Smith 
445