xref: /petsc/src/sys/classes/draw/utils/hists.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed)
15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith   Contains the data structure for plotting a histogram in a window with an axis.
35c6c1daeSBarry Smith */
49804daf3SBarry Smith #include <petscdraw.h>               /*I "petscdraw.h" I*/
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/
634a5a0e3SBarry Smith #include <petscviewer.h>             /*I "petscviewer.h" I*/
75c6c1daeSBarry Smith 
85c6c1daeSBarry Smith PetscClassId PETSC_DRAWHG_CLASSID = 0;
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith struct _p_PetscDrawHG {
115c6c1daeSBarry Smith   PETSCHEADER(int);
125c6c1daeSBarry Smith   PetscErrorCode (*destroy)(PetscDrawSP);
135c6c1daeSBarry Smith   PetscErrorCode (*view)(PetscDrawSP, PetscViewer);
145c6c1daeSBarry Smith   PetscDraw     win;
155c6c1daeSBarry Smith   PetscDrawAxis axis;
165c6c1daeSBarry Smith   PetscReal     xmin, xmax;
175c6c1daeSBarry Smith   PetscReal     ymin, ymax;
185c6c1daeSBarry Smith   int           numBins;
195c6c1daeSBarry Smith   int           maxBins;
205c6c1daeSBarry Smith   PetscReal    *bins;
215c6c1daeSBarry Smith   int           numValues;
225c6c1daeSBarry Smith   int           maxValues;
235c6c1daeSBarry Smith   PetscReal    *values;
245c6c1daeSBarry Smith   int           color;
255c6c1daeSBarry Smith   PetscBool     calcStats;
265c6c1daeSBarry Smith   PetscBool     integerBins;
275c6c1daeSBarry Smith };
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith #define CHUNKSIZE 100
305c6c1daeSBarry Smith 
315c6c1daeSBarry Smith /*@C
325c6c1daeSBarry Smith   PetscDrawHGCreate - Creates a histogram data structure.
335c6c1daeSBarry Smith 
34c3339decSBarry Smith   Collective
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith   Input Parameters:
375c6c1daeSBarry Smith + draw - The window where the graph will be made
385c6c1daeSBarry Smith - bins - The number of bins to use
395c6c1daeSBarry Smith 
4020f4b53cSBarry Smith   Output Parameter:
415c6c1daeSBarry Smith . hist - The histogram context
425c6c1daeSBarry Smith 
4320f4b53cSBarry Smith   Level: intermediate
4420f4b53cSBarry Smith 
4595452b02SPatrick Sanan   Notes:
461d27aa22SBarry Smith   The difference between a bar chart, `PetscDrawBar`, and a histogram, `PetscDrawHG`, is explained here <https://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP>
470afdd333SBarry Smith 
48811af0c4SBarry Smith   The histogram is only displayed when `PetscDrawHGDraw()` is called.
490afdd333SBarry Smith 
50811af0c4SBarry Smith   The MPI communicator that owns the `PetscDraw` owns this `PetscDrawHG`, but the calls to set options and add data are ignored on all processes except the
511d27aa22SBarry Smith   zeroth MPI process in the communicator. All MPI processes in the communicator must call `PetscDrawHGDraw()` to display the updated graph.
527e25d57eSBarry Smith 
53db781477SPatrick Sanan .seealso: `PetscDrawHGDestroy()`, `PetscDrawHG`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawLGCreate()`, `PetscDrawLG`, `PetscDrawSPCreate()`, `PetscDrawSP`,
54db781477SPatrick Sanan           `PetscDrawHGSetNumberBins()`, `PetscDrawHGReset()`, `PetscDrawHGAddValue()`, `PetscDrawHGDraw()`, `PetscDrawHGSave()`, `PetscDrawHGView()`, `PetscDrawHGSetColor()`,
55db781477SPatrick Sanan           `PetscDrawHGSetLimits()`, `PetscDrawHGCalcStats()`, `PetscDrawHGIntegerBins()`, `PetscDrawHGGetAxis()`, `PetscDrawAxis`, `PetscDrawHGGetDraw()`
565c6c1daeSBarry Smith @*/
57d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGCreate(PetscDraw draw, int bins, PetscDrawHG *hist)
58d71ae5a4SJacob Faibussowitsch {
59e118a51fSLisandro Dalcin   PetscDrawHG h;
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   PetscFunctionBegin;
625c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
63e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw, bins, 2);
644f572ea9SToby Isaac   PetscAssertPointer(hist, 3);
65e118a51fSLisandro Dalcin 
669566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(h, PETSC_DRAWHG_CLASSID, "DrawHG", "Histogram", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawHGDestroy, NULL));
67e118a51fSLisandro Dalcin 
689566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
69e118a51fSLisandro Dalcin   h->win = draw;
70a297a907SKarl Rupp 
710298fd71SBarry Smith   h->view    = NULL;
720298fd71SBarry Smith   h->destroy = NULL;
735c6c1daeSBarry Smith   h->color   = PETSC_DRAW_GREEN;
745c6c1daeSBarry Smith   h->xmin    = PETSC_MAX_REAL;
755c6c1daeSBarry Smith   h->xmax    = PETSC_MIN_REAL;
765c6c1daeSBarry Smith   h->ymin    = 0.;
775c6c1daeSBarry Smith   h->ymax    = 1.;
785c6c1daeSBarry Smith   h->numBins = bins;
795c6c1daeSBarry Smith   h->maxBins = bins;
80a297a907SKarl Rupp 
819566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(h->maxBins, &h->bins));
82a297a907SKarl Rupp 
835c6c1daeSBarry Smith   h->numValues   = 0;
845c6c1daeSBarry Smith   h->maxValues   = CHUNKSIZE;
855c6c1daeSBarry Smith   h->calcStats   = PETSC_FALSE;
865c6c1daeSBarry Smith   h->integerBins = PETSC_FALSE;
87a297a907SKarl Rupp 
889566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(h->maxValues, &h->values));
899566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisCreate(draw, &h->axis));
90e118a51fSLisandro Dalcin 
915c6c1daeSBarry Smith   *hist = h;
923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
935c6c1daeSBarry Smith }
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith /*@
96811af0c4SBarry Smith   PetscDrawHGSetNumberBins - Change the number of bins that are to be drawn in the histogram
975c6c1daeSBarry Smith 
98c3339decSBarry Smith   Logically Collective
995c6c1daeSBarry Smith 
100d8d19677SJose E. Roman   Input Parameters:
1015c6c1daeSBarry Smith + hist - The histogram context.
102e118a51fSLisandro Dalcin - bins - The number of bins.
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith   Level: intermediate
1055c6c1daeSBarry Smith 
106db781477SPatrick Sanan .seealso: `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawHGDraw()`, `PetscDrawHGIntegerBins()`
1075c6c1daeSBarry Smith @*/
108d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGSetNumberBins(PetscDrawHG hist, int bins)
109d71ae5a4SJacob Faibussowitsch {
1105c6c1daeSBarry Smith   PetscFunctionBegin;
1115c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
112e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(hist, bins, 2);
113e118a51fSLisandro Dalcin 
1145c6c1daeSBarry Smith   if (hist->maxBins < bins) {
1159566063dSJacob Faibussowitsch     PetscCall(PetscFree(hist->bins));
1169566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(bins, &hist->bins));
1175c6c1daeSBarry Smith     hist->maxBins = bins;
1185c6c1daeSBarry Smith   }
1195c6c1daeSBarry Smith   hist->numBins = bins;
1203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1215c6c1daeSBarry Smith }
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith /*@
1245c6c1daeSBarry Smith   PetscDrawHGReset - Clears histogram to allow for reuse with new data.
1255c6c1daeSBarry Smith 
126c3339decSBarry Smith   Logically Collective
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith   Input Parameter:
1295c6c1daeSBarry Smith . hist - The histogram context.
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith   Level: intermediate
1325c6c1daeSBarry Smith 
133db781477SPatrick Sanan .seealso: `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawHGDraw()`, `PetscDrawHGAddValue()`
1345c6c1daeSBarry Smith @*/
135d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGReset(PetscDrawHG hist)
136d71ae5a4SJacob Faibussowitsch {
1375c6c1daeSBarry Smith   PetscFunctionBegin;
1385c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
139e118a51fSLisandro Dalcin 
1405c6c1daeSBarry Smith   hist->xmin      = PETSC_MAX_REAL;
1415c6c1daeSBarry Smith   hist->xmax      = PETSC_MIN_REAL;
1425c6c1daeSBarry Smith   hist->ymin      = 0.0;
14360e16b1bSMatthew G. Knepley   hist->ymax      = 1.0;
1445c6c1daeSBarry Smith   hist->numValues = 0;
1453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1465c6c1daeSBarry Smith }
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith /*@C
1495c6c1daeSBarry Smith   PetscDrawHGDestroy - Frees all space taken up by histogram data structure.
1505c6c1daeSBarry Smith 
151c3339decSBarry Smith   Collective
1525c6c1daeSBarry Smith 
1535c6c1daeSBarry Smith   Input Parameter:
1545c6c1daeSBarry Smith . hist - The histogram context
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith   Level: intermediate
1575c6c1daeSBarry Smith 
158db781477SPatrick Sanan .seealso: `PetscDrawHGCreate()`, `PetscDrawHG`
1595c6c1daeSBarry Smith @*/
160d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGDestroy(PetscDrawHG *hist)
161d71ae5a4SJacob Faibussowitsch {
1625c6c1daeSBarry Smith   PetscFunctionBegin;
1633ba16761SJacob Faibussowitsch   if (!*hist) PetscFunctionReturn(PETSC_SUCCESS);
164e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*hist, PETSC_DRAWHG_CLASSID, 1);
165*f4f49eeaSPierre Jolivet   if (--((PetscObject)*hist)->refct > 0) {
1669371c9d4SSatish Balay     *hist = NULL;
1673ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
1689371c9d4SSatish Balay   }
1695c6c1daeSBarry Smith 
1709566063dSJacob Faibussowitsch   PetscCall(PetscFree((*hist)->bins));
1719566063dSJacob Faibussowitsch   PetscCall(PetscFree((*hist)->values));
1729566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*hist)->axis));
1739566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*hist)->win));
1749566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(hist));
1753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1765c6c1daeSBarry Smith }
1775c6c1daeSBarry Smith 
1785c6c1daeSBarry Smith /*@
1795c6c1daeSBarry Smith   PetscDrawHGAddValue - Adds another value to the histogram.
1805c6c1daeSBarry Smith 
181c3339decSBarry Smith   Logically Collective
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith   Input Parameters:
1845c6c1daeSBarry Smith + hist  - The histogram
1855c6c1daeSBarry Smith - value - The value
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith   Level: intermediate
1885c6c1daeSBarry Smith 
18942747ad1SJacob Faibussowitsch .seealso: `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawHGDraw()`, `PetscDrawHGReset()`
1905c6c1daeSBarry Smith @*/
191d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGAddValue(PetscDrawHG hist, PetscReal value)
192d71ae5a4SJacob Faibussowitsch {
1935c6c1daeSBarry Smith   PetscFunctionBegin;
1945c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
195e118a51fSLisandro Dalcin 
1965c6c1daeSBarry Smith   /* Allocate more memory if necessary */
1975c6c1daeSBarry Smith   if (hist->numValues >= hist->maxValues) {
1985c6c1daeSBarry Smith     PetscReal *tmp;
1995c6c1daeSBarry Smith 
2009566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(hist->maxValues + CHUNKSIZE, &tmp));
2019566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(tmp, hist->values, hist->maxValues));
2029566063dSJacob Faibussowitsch     PetscCall(PetscFree(hist->values));
203a297a907SKarl Rupp 
2045c6c1daeSBarry Smith     hist->values = tmp;
2055c6c1daeSBarry Smith     hist->maxValues += CHUNKSIZE;
2065c6c1daeSBarry Smith   }
2075c6c1daeSBarry Smith   /* I disagree with the original Petsc implementation here. There should be no overshoot, but rather the
2085c6c1daeSBarry Smith      stated convention of using half-open intervals (always the way to go) */
209d0c080abSJoseph Pusztay   if (!hist->numValues && (hist->xmin == PETSC_MAX_REAL) && (hist->xmax == PETSC_MIN_REAL)) {
2105c6c1daeSBarry Smith     hist->xmin = value;
2115c6c1daeSBarry Smith     hist->xmax = value;
2125c6c1daeSBarry Smith #if 1
2135c6c1daeSBarry Smith   } else {
2145c6c1daeSBarry Smith     /* Update limits */
215a297a907SKarl Rupp     if (value > hist->xmax) hist->xmax = value;
216a297a907SKarl Rupp     if (value < hist->xmin) hist->xmin = value;
2175c6c1daeSBarry Smith #else
2185c6c1daeSBarry Smith   } else if (hist->numValues == 1) {
2195c6c1daeSBarry Smith     /* Update limits -- We need to overshoot the largest value somewhat */
220a297a907SKarl Rupp     if (value > hist->xmax) hist->xmax = value + 0.001 * (value - hist->xmin) / hist->numBins;
2215c6c1daeSBarry Smith     if (value < hist->xmin) {
2225c6c1daeSBarry Smith       hist->xmin = value;
2235c6c1daeSBarry Smith       hist->xmax = hist->xmax + 0.001 * (hist->xmax - hist->xmin) / hist->numBins;
2245c6c1daeSBarry Smith     }
2255c6c1daeSBarry Smith   } else {
2265c6c1daeSBarry Smith     /* Update limits -- We need to overshoot the largest value somewhat */
227a297a907SKarl Rupp     if (value > hist->xmax) hist->xmax = value + 0.001 * (hist->xmax - hist->xmin) / hist->numBins;
228a297a907SKarl Rupp     if (value < hist->xmin) hist->xmin = value;
2295c6c1daeSBarry Smith #endif
2305c6c1daeSBarry Smith   }
2315c6c1daeSBarry Smith 
2325c6c1daeSBarry Smith   hist->values[hist->numValues++] = value;
2333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2345c6c1daeSBarry Smith }
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith /*@
2375c6c1daeSBarry Smith   PetscDrawHGDraw - Redraws a histogram.
2385c6c1daeSBarry Smith 
239c3339decSBarry Smith   Collective
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith   Input Parameter:
2425c6c1daeSBarry Smith . hist - The histogram context
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith   Level: intermediate
2455c6c1daeSBarry Smith 
24642747ad1SJacob Faibussowitsch .seealso: `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawHGAddValue()`, `PetscDrawHGReset()`
2475c6c1daeSBarry Smith @*/
248d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGDraw(PetscDrawHG hist)
249d71ae5a4SJacob Faibussowitsch {
250e118a51fSLisandro Dalcin   PetscDraw   draw;
2515c6c1daeSBarry Smith   PetscBool   isnull;
2525c6c1daeSBarry Smith   PetscReal   xmin, xmax, ymin, ymax, *bins, *values, binSize, binLeft, binRight, maxHeight, mean, var;
2535c6c1daeSBarry Smith   char        title[256];
2545c6c1daeSBarry Smith   char        xlabel[256];
2555c6c1daeSBarry Smith   PetscInt    numBins, numBinsOld, numValues, initSize, i, p, bcolor, color;
256e118a51fSLisandro Dalcin   PetscMPIInt rank;
2575c6c1daeSBarry Smith 
2585c6c1daeSBarry Smith   PetscFunctionBegin;
2595c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
2609566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(hist->win, &isnull));
2613ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
2629566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)hist), &rank));
263e118a51fSLisandro Dalcin 
2643ba16761SJacob Faibussowitsch   if ((hist->xmin >= hist->xmax) || (hist->ymin >= hist->ymax)) PetscFunctionReturn(PETSC_SUCCESS);
2653ba16761SJacob Faibussowitsch   if (hist->numValues < 1) PetscFunctionReturn(PETSC_SUCCESS);
2665c6c1daeSBarry Smith 
2675c6c1daeSBarry Smith   color = hist->color;
26871917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1;
269a297a907SKarl Rupp   else bcolor = color;
270a297a907SKarl Rupp 
2715c6c1daeSBarry Smith   xmin      = hist->xmin;
2725c6c1daeSBarry Smith   xmax      = hist->xmax;
2735c6c1daeSBarry Smith   ymin      = hist->ymin;
2745c6c1daeSBarry Smith   ymax      = hist->ymax;
2755c6c1daeSBarry Smith   numValues = hist->numValues;
2765c6c1daeSBarry Smith   values    = hist->values;
2775c6c1daeSBarry Smith   mean      = 0.0;
2785c6c1daeSBarry Smith   var       = 0.0;
2795c6c1daeSBarry Smith 
2805b399a63SLisandro Dalcin   draw = hist->win;
2819566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
2829566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
283e118a51fSLisandro Dalcin 
2845c6c1daeSBarry Smith   if (xmin == xmax) {
2855c6c1daeSBarry Smith     /* Calculate number of points in each bin */
2865c6c1daeSBarry Smith     bins    = hist->bins;
2875c6c1daeSBarry Smith     bins[0] = 0.;
2885c6c1daeSBarry Smith     for (p = 0; p < numValues; p++) {
2895c6c1daeSBarry Smith       if (values[p] == xmin) bins[0]++;
2905c6c1daeSBarry Smith       mean += values[p];
2915c6c1daeSBarry Smith       var += values[p] * values[p];
2925c6c1daeSBarry Smith     }
2935c6c1daeSBarry Smith     maxHeight = bins[0];
2945c6c1daeSBarry Smith     if (maxHeight > ymax) ymax = hist->ymax = maxHeight;
2955c6c1daeSBarry Smith     xmax = xmin + 1;
2969566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisSetLimits(hist->axis, xmin, xmax, ymin, ymax));
2975c6c1daeSBarry Smith     if (hist->calcStats) {
2985c6c1daeSBarry Smith       mean /= numValues;
299a297a907SKarl Rupp       if (numValues > 1) var = (var - numValues * mean * mean) / (numValues - 1);
300a297a907SKarl Rupp       else var = 0.0;
3019566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(title, 256, "Mean: %g  Var: %g", (double)mean, (double)var));
3029566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(xlabel, 256, "Total: %" PetscInt_FMT, numValues));
3039566063dSJacob Faibussowitsch       PetscCall(PetscDrawAxisSetLabels(hist->axis, title, xlabel, NULL));
3045c6c1daeSBarry Smith     }
3059566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisDraw(hist->axis));
306d0609cedSBarry Smith     PetscDrawCollectiveBegin(draw);
307dd400576SPatrick Sanan     if (rank == 0) { /* Draw bins */
3085c6c1daeSBarry Smith       binLeft  = xmin;
3095c6c1daeSBarry Smith       binRight = xmax;
3109566063dSJacob Faibussowitsch       PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, bins[0], bcolor, bcolor, bcolor, bcolor));
3119566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, bins[0], PETSC_DRAW_BLACK));
3129566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, bins[0], PETSC_DRAW_BLACK));
3139566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, bins[0], binRight, bins[0], PETSC_DRAW_BLACK));
314e118a51fSLisandro Dalcin     }
315d0609cedSBarry Smith     PetscDrawCollectiveEnd(draw);
3165c6c1daeSBarry Smith   } else {
3175c6c1daeSBarry Smith     numBins    = hist->numBins;
3185c6c1daeSBarry Smith     numBinsOld = hist->numBins;
3195c6c1daeSBarry Smith     if (hist->integerBins && (((int)xmax - xmin) + 1.0e-05 > xmax - xmin)) {
3205c6c1daeSBarry Smith       initSize = (int)((int)xmax - xmin) / numBins;
3215c6c1daeSBarry Smith       while (initSize * numBins != (int)xmax - xmin) {
3225c6c1daeSBarry Smith         initSize = PetscMax(initSize - 1, 1);
3235c6c1daeSBarry Smith         numBins  = (int)((int)xmax - xmin) / initSize;
3249566063dSJacob Faibussowitsch         PetscCall(PetscDrawHGSetNumberBins(hist, numBins));
3255c6c1daeSBarry Smith       }
3265c6c1daeSBarry Smith     }
3275c6c1daeSBarry Smith     binSize = (xmax - xmin) / numBins;
3285c6c1daeSBarry Smith     bins    = hist->bins;
3295c6c1daeSBarry Smith 
3309566063dSJacob Faibussowitsch     PetscCall(PetscArrayzero(bins, numBins));
331a297a907SKarl Rupp 
3325c6c1daeSBarry Smith     maxHeight = 0.0;
3335c6c1daeSBarry Smith     for (i = 0; i < numBins; i++) {
3345c6c1daeSBarry Smith       binLeft  = xmin + binSize * i;
3355c6c1daeSBarry Smith       binRight = xmin + binSize * (i + 1);
3365c6c1daeSBarry Smith       for (p = 0; p < numValues; p++) {
3375c6c1daeSBarry Smith         if ((values[p] >= binLeft) && (values[p] < binRight)) bins[i]++;
3385c6c1daeSBarry Smith         /* Handle last bin separately */
3395c6c1daeSBarry Smith         if ((i == numBins - 1) && (values[p] == binRight)) bins[i]++;
3405c6c1daeSBarry Smith         if (!i) {
3415c6c1daeSBarry Smith           mean += values[p];
3425c6c1daeSBarry Smith           var += values[p] * values[p];
3435c6c1daeSBarry Smith         }
3445c6c1daeSBarry Smith       }
3455c6c1daeSBarry Smith       maxHeight = PetscMax(maxHeight, bins[i]);
3465c6c1daeSBarry Smith     }
3475c6c1daeSBarry Smith     if (maxHeight > ymax) ymax = hist->ymax = maxHeight;
3485c6c1daeSBarry Smith 
3499566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisSetLimits(hist->axis, xmin, xmax, ymin, ymax));
3505c6c1daeSBarry Smith     if (hist->calcStats) {
3515c6c1daeSBarry Smith       mean /= numValues;
352a297a907SKarl Rupp       if (numValues > 1) var = (var - numValues * mean * mean) / (numValues - 1);
353a297a907SKarl Rupp       else var = 0.0;
3549566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(title, 256, "Mean: %g  Var: %g", (double)mean, (double)var));
3559566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(xlabel, 256, "Total: %" PetscInt_FMT, numValues));
3569566063dSJacob Faibussowitsch       PetscCall(PetscDrawAxisSetLabels(hist->axis, title, xlabel, NULL));
3575c6c1daeSBarry Smith     }
3589566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisDraw(hist->axis));
359d0609cedSBarry Smith     PetscDrawCollectiveBegin(draw);
360dd400576SPatrick Sanan     if (rank == 0) { /* Draw bins */
3615c6c1daeSBarry Smith       for (i = 0; i < numBins; i++) {
3625c6c1daeSBarry Smith         binLeft  = xmin + binSize * i;
3635c6c1daeSBarry Smith         binRight = xmin + binSize * (i + 1);
3649566063dSJacob Faibussowitsch         PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, bins[i], bcolor, bcolor, bcolor, bcolor));
3659566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, bins[i], PETSC_DRAW_BLACK));
3669566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, bins[i], PETSC_DRAW_BLACK));
3679566063dSJacob Faibussowitsch         PetscCall(PetscDrawLine(draw, binLeft, bins[i], binRight, bins[i], PETSC_DRAW_BLACK));
368e118a51fSLisandro Dalcin         if (color == PETSC_DRAW_ROTATE && bins[i]) bcolor++;
36971917b75SLisandro Dalcin         if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1;
370e118a51fSLisandro Dalcin       }
3715c6c1daeSBarry Smith     }
372d0609cedSBarry Smith     PetscDrawCollectiveEnd(draw);
3739566063dSJacob Faibussowitsch     PetscCall(PetscDrawHGSetNumberBins(hist, numBinsOld));
3745c6c1daeSBarry Smith   }
375e118a51fSLisandro Dalcin 
3769566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
3779566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
3783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3795c6c1daeSBarry Smith }
3805c6c1daeSBarry Smith 
38157fd6651SLisandro Dalcin /*@
38257fd6651SLisandro Dalcin   PetscDrawHGSave - Saves a drawn image
38357fd6651SLisandro Dalcin 
384c3339decSBarry Smith   Collective
38557fd6651SLisandro Dalcin 
38657fd6651SLisandro Dalcin   Input Parameter:
387aec76313SJacob Faibussowitsch . hg - The histogram context
38857fd6651SLisandro Dalcin 
38957fd6651SLisandro Dalcin   Level: intermediate
39057fd6651SLisandro Dalcin 
391aec76313SJacob Faibussowitsch .seealso: `PetscDrawSave()`, `PetscDrawHGCreate()`, `PetscDrawHGGetDraw()`, `PetscDrawSetSave()`, `PetscDrawHGDraw()`
39257fd6651SLisandro Dalcin @*/
393d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGSave(PetscDrawHG hg)
394d71ae5a4SJacob Faibussowitsch {
39557fd6651SLisandro Dalcin   PetscFunctionBegin;
39657fd6651SLisandro Dalcin   PetscValidHeaderSpecific(hg, PETSC_DRAWHG_CLASSID, 1);
3979566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(hg->win));
3983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
39957fd6651SLisandro Dalcin }
40057fd6651SLisandro Dalcin 
4015c6c1daeSBarry Smith /*@
402811af0c4SBarry Smith   PetscDrawHGView - Prints the histogram information to a viewer
4035c6c1daeSBarry Smith 
40420f4b53cSBarry Smith   Not Collective
4055c6c1daeSBarry Smith 
40610450e9eSJacob Faibussowitsch   Input Parameters:
40710450e9eSJacob Faibussowitsch + hist   - The histogram context
40810450e9eSJacob Faibussowitsch - viewer - The viewer to view it with
4095c6c1daeSBarry Smith 
4105c6c1daeSBarry Smith   Level: beginner
4115c6c1daeSBarry Smith 
412811af0c4SBarry Smith .seealso: `PetscDrawHG`, `PetscViewer`, `PetscDrawHGCreate()`, `PetscDrawHGGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawHGDraw()`
4135c6c1daeSBarry Smith @*/
414d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGView(PetscDrawHG hist, PetscViewer viewer)
415d71ae5a4SJacob Faibussowitsch {
4165c6c1daeSBarry Smith   PetscReal xmax, xmin, *bins, *values, binSize, binLeft, binRight, mean, var;
4175c6c1daeSBarry Smith   PetscInt  numBins, numBinsOld, numValues, initSize, i, p;
4185c6c1daeSBarry Smith 
4195c6c1daeSBarry Smith   PetscFunctionBegin;
4205c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
421e118a51fSLisandro Dalcin 
4223ba16761SJacob Faibussowitsch   if ((hist->xmin > hist->xmax) || (hist->ymin >= hist->ymax)) PetscFunctionReturn(PETSC_SUCCESS);
4233ba16761SJacob Faibussowitsch   if (hist->numValues < 1) PetscFunctionReturn(PETSC_SUCCESS);
4245c6c1daeSBarry Smith 
42548a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)hist), &viewer));
4269566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)hist, viewer));
4275c6c1daeSBarry Smith   xmax      = hist->xmax;
4285c6c1daeSBarry Smith   xmin      = hist->xmin;
4295c6c1daeSBarry Smith   numValues = hist->numValues;
4305c6c1daeSBarry Smith   values    = hist->values;
4315c6c1daeSBarry Smith   mean      = 0.0;
4325c6c1daeSBarry Smith   var       = 0.0;
4335c6c1daeSBarry Smith   if (xmax == xmin) {
4345c6c1daeSBarry Smith     /* Calculate number of points in the bin */
4355c6c1daeSBarry Smith     bins    = hist->bins;
4365c6c1daeSBarry Smith     bins[0] = 0.;
4375c6c1daeSBarry Smith     for (p = 0; p < numValues; p++) {
4385c6c1daeSBarry Smith       if (values[p] == xmin) bins[0]++;
4395c6c1daeSBarry Smith       mean += values[p];
4405c6c1daeSBarry Smith       var += values[p] * values[p];
4415c6c1daeSBarry Smith     }
4425c6c1daeSBarry Smith     /* Draw bins */
4439566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Bin %2d (%6.2g - %6.2g): %.0g\n", 0, (double)xmin, (double)xmax, (double)bins[0]));
4445c6c1daeSBarry Smith   } else {
4455c6c1daeSBarry Smith     numBins    = hist->numBins;
4465c6c1daeSBarry Smith     numBinsOld = hist->numBins;
4475c6c1daeSBarry Smith     if (hist->integerBins && (((int)xmax - xmin) + 1.0e-05 > xmax - xmin)) {
4485c6c1daeSBarry Smith       initSize = (int)((int)xmax - xmin) / numBins;
4495c6c1daeSBarry Smith       while (initSize * numBins != (int)xmax - xmin) {
4505c6c1daeSBarry Smith         initSize = PetscMax(initSize - 1, 1);
4515c6c1daeSBarry Smith         numBins  = (int)((int)xmax - xmin) / initSize;
4529566063dSJacob Faibussowitsch         PetscCall(PetscDrawHGSetNumberBins(hist, numBins));
4535c6c1daeSBarry Smith       }
4545c6c1daeSBarry Smith     }
4555c6c1daeSBarry Smith     binSize = (xmax - xmin) / numBins;
4565c6c1daeSBarry Smith     bins    = hist->bins;
4575c6c1daeSBarry Smith 
4585c6c1daeSBarry Smith     /* Calculate number of points in each bin */
4599566063dSJacob Faibussowitsch     PetscCall(PetscArrayzero(bins, numBins));
4605c6c1daeSBarry Smith     for (i = 0; i < numBins; i++) {
4615c6c1daeSBarry Smith       binLeft  = xmin + binSize * i;
4625c6c1daeSBarry Smith       binRight = xmin + binSize * (i + 1);
4635c6c1daeSBarry Smith       for (p = 0; p < numValues; p++) {
4645c6c1daeSBarry Smith         if ((values[p] >= binLeft) && (values[p] < binRight)) bins[i]++;
4655c6c1daeSBarry Smith         /* Handle last bin separately */
4665c6c1daeSBarry Smith         if ((i == numBins - 1) && (values[p] == binRight)) bins[i]++;
4675c6c1daeSBarry Smith         if (!i) {
4685c6c1daeSBarry Smith           mean += values[p];
4695c6c1daeSBarry Smith           var += values[p] * values[p];
4705c6c1daeSBarry Smith         }
4715c6c1daeSBarry Smith       }
4725c6c1daeSBarry Smith     }
4735c6c1daeSBarry Smith     /* Draw bins */
4745c6c1daeSBarry Smith     for (i = 0; i < numBins; i++) {
4755c6c1daeSBarry Smith       binLeft  = xmin + binSize * i;
4765c6c1daeSBarry Smith       binRight = xmin + binSize * (i + 1);
4779566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "Bin %2d (%6.2g - %6.2g): %.0g\n", (int)i, (double)binLeft, (double)binRight, (double)bins[i]));
4785c6c1daeSBarry Smith     }
4799566063dSJacob Faibussowitsch     PetscCall(PetscDrawHGSetNumberBins(hist, numBinsOld));
4805c6c1daeSBarry Smith   }
4815c6c1daeSBarry Smith 
4825c6c1daeSBarry Smith   if (hist->calcStats) {
4835c6c1daeSBarry Smith     mean /= numValues;
484a297a907SKarl Rupp     if (numValues > 1) var = (var - numValues * mean * mean) / (numValues - 1);
485a297a907SKarl Rupp     else var = 0.0;
4869566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Mean: %g  Var: %g\n", (double)mean, (double)var));
4879566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Total: %" PetscInt_FMT "\n", numValues));
4885c6c1daeSBarry Smith   }
4893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4905c6c1daeSBarry Smith }
4915c6c1daeSBarry Smith 
4925c6c1daeSBarry Smith /*@
4935c6c1daeSBarry Smith   PetscDrawHGSetColor - Sets the color the bars will be drawn with.
4945c6c1daeSBarry Smith 
495c3339decSBarry Smith   Logically Collective
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith   Input Parameters:
4985c6c1daeSBarry Smith + hist  - The histogram context
4992fe279fdSBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a different color
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith   Level: intermediate
5025c6c1daeSBarry Smith 
503811af0c4SBarry Smith .seealso: `PetscDrawHG`, `PetscDrawHGCreate()`, `PetscDrawHGGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawHGDraw()`, `PetscDrawHGGetAxis()`
5045c6c1daeSBarry Smith @*/
505d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGSetColor(PetscDrawHG hist, int color)
506d71ae5a4SJacob Faibussowitsch {
5075c6c1daeSBarry Smith   PetscFunctionBegin;
5085c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
509e118a51fSLisandro Dalcin 
5105c6c1daeSBarry Smith   hist->color = color;
5113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5125c6c1daeSBarry Smith }
5135c6c1daeSBarry Smith 
5145c6c1daeSBarry Smith /*@
5155c6c1daeSBarry Smith   PetscDrawHGSetLimits - Sets the axis limits for a histogram. If more
5165c6c1daeSBarry Smith   points are added after this call, the limits will be adjusted to
5175c6c1daeSBarry Smith   include those additional points.
5185c6c1daeSBarry Smith 
519c3339decSBarry Smith   Logically Collective
5205c6c1daeSBarry Smith 
5215c6c1daeSBarry Smith   Input Parameters:
5225c6c1daeSBarry Smith + hist  - The histogram context
5232fe279fdSBarry Smith . x_min - the horizontal lower limit
524aaa8cc7dSPierre Jolivet . x_max - the horizontal upper limit
5252fe279fdSBarry Smith . y_min - the vertical lower limit
5262fe279fdSBarry Smith - y_max - the vertical upper limit
5275c6c1daeSBarry Smith 
5285c6c1daeSBarry Smith   Level: intermediate
5295c6c1daeSBarry Smith 
530811af0c4SBarry Smith .seealso: `PetscDrawHG`, `PetscDrawHGCreate()`, `PetscDrawHGGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawHGDraw()`, `PetscDrawHGGetAxis()`
5315c6c1daeSBarry Smith @*/
532d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGSetLimits(PetscDrawHG hist, PetscReal x_min, PetscReal x_max, int y_min, int y_max)
533d71ae5a4SJacob Faibussowitsch {
5345c6c1daeSBarry Smith   PetscFunctionBegin;
5355c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
536e118a51fSLisandro Dalcin 
5375c6c1daeSBarry Smith   hist->xmin = x_min;
5385c6c1daeSBarry Smith   hist->xmax = x_max;
5395c6c1daeSBarry Smith   hist->ymin = y_min;
5405c6c1daeSBarry Smith   hist->ymax = y_max;
5413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5425c6c1daeSBarry Smith }
5435c6c1daeSBarry Smith 
5445c6c1daeSBarry Smith /*@
545811af0c4SBarry Smith   PetscDrawHGCalcStats - Turns on calculation of descriptive statistics associated with the histogram
5465c6c1daeSBarry Smith 
54720f4b53cSBarry Smith   Not Collective
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith   Input Parameters:
5505c6c1daeSBarry Smith + hist - The histogram context
5515c6c1daeSBarry Smith - calc - Flag for calculation
5525c6c1daeSBarry Smith 
5535c6c1daeSBarry Smith   Level: intermediate
5545c6c1daeSBarry Smith 
555811af0c4SBarry Smith .seealso: `PetscDrawHG`, `PetscDrawHGCreate()`, `PetscDrawHGAddValue()`, `PetscDrawHGView()`, `PetscDrawHGDraw()`
5565c6c1daeSBarry Smith @*/
557d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGCalcStats(PetscDrawHG hist, PetscBool calc)
558d71ae5a4SJacob Faibussowitsch {
5595c6c1daeSBarry Smith   PetscFunctionBegin;
5605c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
561e118a51fSLisandro Dalcin 
5625c6c1daeSBarry Smith   hist->calcStats = calc;
5633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5645c6c1daeSBarry Smith }
5655c6c1daeSBarry Smith 
5665c6c1daeSBarry Smith /*@
5675c6c1daeSBarry Smith   PetscDrawHGIntegerBins - Turns on integer width bins
5685c6c1daeSBarry Smith 
56920f4b53cSBarry Smith   Not Collective
5705c6c1daeSBarry Smith 
5715c6c1daeSBarry Smith   Input Parameters:
5725c6c1daeSBarry Smith + hist - The histogram context
5735c6c1daeSBarry Smith - ints - Flag for integer width bins
5745c6c1daeSBarry Smith 
5755c6c1daeSBarry Smith   Level: intermediate
5765c6c1daeSBarry Smith 
577811af0c4SBarry Smith .seealso: `PetscDrawHG`, `PetscDrawHGCreate()`, `PetscDrawHGAddValue()`, `PetscDrawHGView()`, `PetscDrawHGDraw()`, `PetscDrawHGSetColor()`
5785c6c1daeSBarry Smith @*/
579d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGIntegerBins(PetscDrawHG hist, PetscBool ints)
580d71ae5a4SJacob Faibussowitsch {
5815c6c1daeSBarry Smith   PetscFunctionBegin;
5825c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
583e118a51fSLisandro Dalcin 
5845c6c1daeSBarry Smith   hist->integerBins = ints;
5853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5865c6c1daeSBarry Smith }
5875c6c1daeSBarry Smith 
5885c6c1daeSBarry Smith /*@C
5895c6c1daeSBarry Smith   PetscDrawHGGetAxis - Gets the axis context associated with a histogram.
5905c6c1daeSBarry Smith   This is useful if one wants to change some axis property, such as
5915c6c1daeSBarry Smith   labels, color, etc. The axis context should not be destroyed by the
5925c6c1daeSBarry Smith   application code.
5935c6c1daeSBarry Smith 
594811af0c4SBarry Smith   Not Collective, axis is parallel if hist is parallel
5955c6c1daeSBarry Smith 
5965c6c1daeSBarry Smith   Input Parameter:
5975c6c1daeSBarry Smith . hist - The histogram context
5985c6c1daeSBarry Smith 
5995c6c1daeSBarry Smith   Output Parameter:
6005c6c1daeSBarry Smith . axis - The axis context
6015c6c1daeSBarry Smith 
6025c6c1daeSBarry Smith   Level: intermediate
6035c6c1daeSBarry Smith 
604aec76313SJacob Faibussowitsch .seealso: `PetscDrawHG`, `PetscDrawAxis`, `PetscDrawHGCreate()`, `PetscDrawHGAddValue()`, `PetscDrawHGView()`, `PetscDrawHGDraw()`, `PetscDrawHGSetColor()`, `PetscDrawHGSetLimits()`
6055c6c1daeSBarry Smith @*/
606d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGGetAxis(PetscDrawHG hist, PetscDrawAxis *axis)
607d71ae5a4SJacob Faibussowitsch {
6085c6c1daeSBarry Smith   PetscFunctionBegin;
609e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
6104f572ea9SToby Isaac   PetscAssertPointer(axis, 2);
6115c6c1daeSBarry Smith   *axis = hist->axis;
6123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6135c6c1daeSBarry Smith }
6145c6c1daeSBarry Smith 
6155c6c1daeSBarry Smith /*@C
6165c6c1daeSBarry Smith   PetscDrawHGGetDraw - Gets the draw context associated with a histogram.
6175c6c1daeSBarry Smith 
618811af0c4SBarry Smith   Not Collective, draw is parallel if hist is parallel
6195c6c1daeSBarry Smith 
6205c6c1daeSBarry Smith   Input Parameter:
6215c6c1daeSBarry Smith . hist - The histogram context
6225c6c1daeSBarry Smith 
6235c6c1daeSBarry Smith   Output Parameter:
624e118a51fSLisandro Dalcin . draw - The draw context
6255c6c1daeSBarry Smith 
6265c6c1daeSBarry Smith   Level: intermediate
6275c6c1daeSBarry Smith 
628811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawHG`, `PetscDrawHGCreate()`, `PetscDrawHGAddValue()`, `PetscDrawHGView()`, `PetscDrawHGDraw()`, `PetscDrawHGSetColor()`, `PetscDrawAxis`, `PetscDrawHGSetLimits()`
6295c6c1daeSBarry Smith @*/
630d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawHGGetDraw(PetscDrawHG hist, PetscDraw *draw)
631d71ae5a4SJacob Faibussowitsch {
6325c6c1daeSBarry Smith   PetscFunctionBegin;
6335c6c1daeSBarry Smith   PetscValidHeaderSpecific(hist, PETSC_DRAWHG_CLASSID, 1);
6344f572ea9SToby Isaac   PetscAssertPointer(draw, 2);
635e118a51fSLisandro Dalcin   *draw = hist->win;
6363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6375c6c1daeSBarry Smith }
638