15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith Contains the data structure for drawing scatter plots
35c6c1daeSBarry Smith graphs in a window with an axis. This is intended for scatter
45c6c1daeSBarry Smith plots that change dynamically.
55c6c1daeSBarry Smith */
65c6c1daeSBarry Smith
79804daf3SBarry Smith #include <petscdraw.h> /*I "petscdraw.h" I*/
8999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.h> /*I "petscsys.h" I*/
95c6c1daeSBarry Smith
105c6c1daeSBarry Smith PetscClassId PETSC_DRAWSP_CLASSID = 0;
115c6c1daeSBarry Smith
12cc4c1da9SBarry Smith /*@
135c6c1daeSBarry Smith PetscDrawSPCreate - Creates a scatter plot data structure.
145c6c1daeSBarry Smith
15c3339decSBarry Smith Collective
165c6c1daeSBarry Smith
175c6c1daeSBarry Smith Input Parameters:
18aec76313SJacob Faibussowitsch + draw - the window where the graph will be made.
195c6c1daeSBarry Smith - dim - the number of sets of points which will be drawn
205c6c1daeSBarry Smith
2120f4b53cSBarry Smith Output Parameter:
225c6c1daeSBarry Smith . drawsp - the scatter plot context
235c6c1daeSBarry Smith
245c6c1daeSBarry Smith Level: intermediate
255c6c1daeSBarry Smith
2695452b02SPatrick Sanan Notes:
27811af0c4SBarry Smith Add points to the plot with `PetscDrawSPAddPoint()` or `PetscDrawSPAddPoints()`; the new points are not displayed until `PetscDrawSPDraw()` is called.
280afdd333SBarry Smith
29811af0c4SBarry Smith `PetscDrawSPReset()` removes all the points that have been added
300afdd333SBarry Smith
31811af0c4SBarry Smith `PetscDrawSPSetDimension()` determines how many point curves are being plotted.
32811af0c4SBarry Smith
33811af0c4SBarry Smith The MPI communicator that owns the `PetscDraw` owns this `PetscDrawSP`, and each process can add points. All MPI ranks in the communicator must call `PetscDrawSPDraw()` to display the updated graph.
347e25d57eSBarry Smith
35db781477SPatrick Sanan .seealso: `PetscDrawLGCreate()`, `PetscDrawLG`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawSPDestroy()`, `PetscDraw`, `PetscDrawSP`, `PetscDrawSPSetDimension()`, `PetscDrawSPReset()`,
36c2e3fba1SPatrick Sanan `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`, `PetscDrawSPDraw()`, `PetscDrawSPSave()`, `PetscDrawSPSetLimits()`, `PetscDrawSPGetAxis()`, `PetscDrawAxis`, `PetscDrawSPGetDraw()`
375c6c1daeSBarry Smith @*/
PetscDrawSPCreate(PetscDraw draw,int dim,PetscDrawSP * drawsp)38d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPCreate(PetscDraw draw, int dim, PetscDrawSP *drawsp)
39d71ae5a4SJacob Faibussowitsch {
405c6c1daeSBarry Smith PetscDrawSP sp;
415c6c1daeSBarry Smith
425c6c1daeSBarry Smith PetscFunctionBegin;
435c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
444f572ea9SToby Isaac PetscAssertPointer(drawsp, 3);
45e118a51fSLisandro Dalcin
469566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(sp, PETSC_DRAWSP_CLASSID, "DrawSP", "Scatter Plot", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawSPDestroy, NULL));
479566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw));
485c6c1daeSBarry Smith sp->win = draw;
49e118a51fSLisandro Dalcin sp->view = NULL;
50e118a51fSLisandro Dalcin sp->destroy = NULL;
51e118a51fSLisandro Dalcin sp->nopts = 0;
52f98b2f00SMatthew G. Knepley sp->dim = -1;
536497c311SBarry Smith sp->xmin = (PetscReal)1.e20;
546497c311SBarry Smith sp->ymin = (PetscReal)1.e20;
556497c311SBarry Smith sp->zmin = (PetscReal)1.e20;
566497c311SBarry Smith sp->xmax = (PetscReal)-1.e20;
576497c311SBarry Smith sp->ymax = (PetscReal)-1.e20;
586497c311SBarry Smith sp->zmax = (PetscReal)-1.e20;
598c87cf4dSdanfinn sp->colorized = PETSC_FALSE;
605c6c1daeSBarry Smith sp->loc = 0;
61a297a907SKarl Rupp
62f98b2f00SMatthew G. Knepley PetscCall(PetscDrawSPSetDimension(sp, dim));
639566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisCreate(draw, &sp->axis));
64a297a907SKarl Rupp
655c6c1daeSBarry Smith *drawsp = sp;
663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
675c6c1daeSBarry Smith }
685c6c1daeSBarry Smith
695c6c1daeSBarry Smith /*@
70811af0c4SBarry Smith PetscDrawSPSetDimension - Change the number of points that are added at each `PetscDrawSPAddPoint()`
715c6c1daeSBarry Smith
7220f4b53cSBarry Smith Not Collective
735c6c1daeSBarry Smith
74d8d19677SJose E. Roman Input Parameters:
75811af0c4SBarry Smith + sp - the scatter plot context.
76811af0c4SBarry Smith - dim - the number of point curves on this process
775c6c1daeSBarry Smith
785c6c1daeSBarry Smith Level: intermediate
795c6c1daeSBarry Smith
80db781477SPatrick Sanan .seealso: `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`
815c6c1daeSBarry Smith @*/
PetscDrawSPSetDimension(PetscDrawSP sp,int dim)82d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPSetDimension(PetscDrawSP sp, int dim)
83d71ae5a4SJacob Faibussowitsch {
845c6c1daeSBarry Smith PetscFunctionBegin;
855c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
863ba16761SJacob Faibussowitsch if (sp->dim == dim) PetscFunctionReturn(PETSC_SUCCESS);
875c6c1daeSBarry Smith sp->dim = dim;
88f98b2f00SMatthew G. Knepley PetscCall(PetscFree3(sp->x, sp->y, sp->z));
89f98b2f00SMatthew G. Knepley PetscCall(PetscMalloc3(dim * PETSC_DRAW_SP_CHUNK_SIZE, &sp->x, dim * PETSC_DRAW_SP_CHUNK_SIZE, &sp->y, dim * PETSC_DRAW_SP_CHUNK_SIZE, &sp->z));
90999739cfSJacob Faibussowitsch sp->len = dim * PETSC_DRAW_SP_CHUNK_SIZE;
913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
925c6c1daeSBarry Smith }
935c6c1daeSBarry Smith
945c6c1daeSBarry Smith /*@
95811af0c4SBarry Smith PetscDrawSPGetDimension - Get the number of sets of points that are to be drawn at each `PetscDrawSPAddPoint()`
96f98b2f00SMatthew G. Knepley
9720f4b53cSBarry Smith Not Collective
98f98b2f00SMatthew G. Knepley
9920f4b53cSBarry Smith Input Parameter:
100811af0c4SBarry Smith . sp - the scatter plot context.
101f98b2f00SMatthew G. Knepley
102f98b2f00SMatthew G. Knepley Output Parameter:
103811af0c4SBarry Smith . dim - the number of point curves on this process
104f98b2f00SMatthew G. Knepley
105f98b2f00SMatthew G. Knepley Level: intermediate
106f98b2f00SMatthew G. Knepley
107db781477SPatrick Sanan .seealso: `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`
108f98b2f00SMatthew G. Knepley @*/
PetscDrawSPGetDimension(PetscDrawSP sp,int * dim)109d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPGetDimension(PetscDrawSP sp, int *dim)
110d71ae5a4SJacob Faibussowitsch {
111f98b2f00SMatthew G. Knepley PetscFunctionBegin;
112f98b2f00SMatthew G. Knepley PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
1134f572ea9SToby Isaac PetscAssertPointer(dim, 2);
114f98b2f00SMatthew G. Knepley *dim = sp->dim;
1153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
116f98b2f00SMatthew G. Knepley }
117f98b2f00SMatthew G. Knepley
118f98b2f00SMatthew G. Knepley /*@
119811af0c4SBarry Smith PetscDrawSPReset - Clears scatter plot to allow for reuse with new data.
1205c6c1daeSBarry Smith
12120f4b53cSBarry Smith Not Collective
1225c6c1daeSBarry Smith
1235c6c1daeSBarry Smith Input Parameter:
124811af0c4SBarry Smith . sp - the scatter plot context.
1255c6c1daeSBarry Smith
1265c6c1daeSBarry Smith Level: intermediate
1275c6c1daeSBarry Smith
128db781477SPatrick Sanan .seealso: `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`, `PetscDrawSPDraw()`
1295c6c1daeSBarry Smith @*/
PetscDrawSPReset(PetscDrawSP sp)130d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPReset(PetscDrawSP sp)
131d71ae5a4SJacob Faibussowitsch {
1325c6c1daeSBarry Smith PetscFunctionBegin;
1335c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
1346497c311SBarry Smith sp->xmin = (PetscReal)1.e20;
1356497c311SBarry Smith sp->ymin = (PetscReal)1.e20;
1366497c311SBarry Smith sp->zmin = (PetscReal)1.e20;
1376497c311SBarry Smith sp->xmax = (PetscReal)-1.e20;
1386497c311SBarry Smith sp->ymax = (PetscReal)-1.e20;
1396497c311SBarry Smith sp->zmax = (PetscReal)-1.e20;
1405c6c1daeSBarry Smith sp->loc = 0;
1415c6c1daeSBarry Smith sp->nopts = 0;
1423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1435c6c1daeSBarry Smith }
1445c6c1daeSBarry Smith
145f98b2f00SMatthew G. Knepley /*@
1465c6c1daeSBarry Smith PetscDrawSPDestroy - Frees all space taken up by scatter plot data structure.
1475c6c1daeSBarry Smith
148c3339decSBarry Smith Collective
1495c6c1daeSBarry Smith
1505c6c1daeSBarry Smith Input Parameter:
151811af0c4SBarry Smith . sp - the scatter plot context
1525c6c1daeSBarry Smith
1535c6c1daeSBarry Smith Level: intermediate
1545c6c1daeSBarry Smith
155db781477SPatrick Sanan .seealso: `PetscDrawSPCreate()`, `PetscDrawSP`, `PetscDrawSPReset()`
1565c6c1daeSBarry Smith @*/
PetscDrawSPDestroy(PetscDrawSP * sp)157d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPDestroy(PetscDrawSP *sp)
158d71ae5a4SJacob Faibussowitsch {
1595c6c1daeSBarry Smith PetscFunctionBegin;
1603ba16761SJacob Faibussowitsch if (!*sp) PetscFunctionReturn(PETSC_SUCCESS);
161e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*sp, PETSC_DRAWSP_CLASSID, 1);
162f4f49eeaSPierre Jolivet if (--((PetscObject)*sp)->refct > 0) {
1639371c9d4SSatish Balay *sp = NULL;
1643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1659371c9d4SSatish Balay }
1665c6c1daeSBarry Smith
1679566063dSJacob Faibussowitsch PetscCall(PetscFree3((*sp)->x, (*sp)->y, (*sp)->z));
1689566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&(*sp)->axis));
1699566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*sp)->win));
1709566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(sp));
1713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1725c6c1daeSBarry Smith }
1735c6c1daeSBarry Smith
1745c6c1daeSBarry Smith /*@
175811af0c4SBarry Smith PetscDrawSPAddPoint - Adds another point to each of the scatter plot point curves.
1765c6c1daeSBarry Smith
17720f4b53cSBarry Smith Not Collective
1785c6c1daeSBarry Smith
1795c6c1daeSBarry Smith Input Parameters:
1805c6c1daeSBarry Smith + sp - the scatter plot data structure
18110450e9eSJacob Faibussowitsch . x - the x coordinate values (of length dim) for the points of the curve
18210450e9eSJacob Faibussowitsch - y - the y coordinate values (of length dim) for the points of the curve
1835c6c1daeSBarry Smith
1845c6c1daeSBarry Smith Level: intermediate
1855c6c1daeSBarry Smith
186811af0c4SBarry Smith Note:
18710450e9eSJacob Faibussowitsch Here dim is the number of point curves passed to `PetscDrawSPCreate()`. The new points will
18810450e9eSJacob Faibussowitsch not be displayed until a call to `PetscDrawSPDraw()` is made.
1890afdd333SBarry Smith
190db781477SPatrick Sanan .seealso: `PetscDrawSPAddPoints()`, `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPReset()`, `PetscDrawSPDraw()`, `PetscDrawSPAddPointColorized()`
1915c6c1daeSBarry Smith @*/
PetscDrawSPAddPoint(PetscDrawSP sp,PetscReal * x,PetscReal * y)192d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPAddPoint(PetscDrawSP sp, PetscReal *x, PetscReal *y)
193d71ae5a4SJacob Faibussowitsch {
1945c6c1daeSBarry Smith PetscInt i;
1955c6c1daeSBarry Smith
1965c6c1daeSBarry Smith PetscFunctionBegin;
1975c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
198e118a51fSLisandro Dalcin
1995c6c1daeSBarry Smith if (sp->loc + sp->dim >= sp->len) { /* allocate more space */
200f98b2f00SMatthew G. Knepley PetscReal *tmpx, *tmpy, *tmpz;
201f98b2f00SMatthew G. Knepley PetscCall(PetscMalloc3(sp->len + sp->dim * PETSC_DRAW_SP_CHUNK_SIZE, &tmpx, sp->len + sp->dim * PETSC_DRAW_SP_CHUNK_SIZE, &tmpy, sp->len + sp->dim * PETSC_DRAW_SP_CHUNK_SIZE, &tmpz));
2029566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpx, sp->x, sp->len));
2039566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpy, sp->y, sp->len));
204f98b2f00SMatthew G. Knepley PetscCall(PetscArraycpy(tmpz, sp->z, sp->len));
205f98b2f00SMatthew G. Knepley PetscCall(PetscFree3(sp->x, sp->y, sp->z));
2065c6c1daeSBarry Smith sp->x = tmpx;
2075c6c1daeSBarry Smith sp->y = tmpy;
208f98b2f00SMatthew G. Knepley sp->z = tmpz;
209999739cfSJacob Faibussowitsch sp->len += sp->dim * PETSC_DRAW_SP_CHUNK_SIZE;
2105c6c1daeSBarry Smith }
211f98b2f00SMatthew G. Knepley for (i = 0; i < sp->dim; ++i) {
2125c6c1daeSBarry Smith if (x[i] > sp->xmax) sp->xmax = x[i];
2135c6c1daeSBarry Smith if (x[i] < sp->xmin) sp->xmin = x[i];
2145c6c1daeSBarry Smith if (y[i] > sp->ymax) sp->ymax = y[i];
2155c6c1daeSBarry Smith if (y[i] < sp->ymin) sp->ymin = y[i];
2165c6c1daeSBarry Smith
2175c6c1daeSBarry Smith sp->x[sp->loc] = x[i];
2185c6c1daeSBarry Smith sp->y[sp->loc++] = y[i];
2195c6c1daeSBarry Smith }
220f98b2f00SMatthew G. Knepley ++sp->nopts;
2213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2225c6c1daeSBarry Smith }
2235c6c1daeSBarry Smith
2245c6c1daeSBarry Smith /*@C
225811af0c4SBarry Smith PetscDrawSPAddPoints - Adds several points to each of the scatter plot point curves.
2265c6c1daeSBarry Smith
22720f4b53cSBarry Smith Not Collective
2285c6c1daeSBarry Smith
2295c6c1daeSBarry Smith Input Parameters:
230811af0c4SBarry Smith + sp - the scatter plot context
2312fe279fdSBarry Smith . xx - array of pointers that point to arrays containing the new x coordinates for each curve.
2322fe279fdSBarry Smith . yy - array of pointers that point to arrays containing the new y points for each curve.
233811af0c4SBarry Smith - n - number of points being added, each represents a subarray of length dim where dim is the value from `PetscDrawSPGetDimension()`
2345c6c1daeSBarry Smith
2355c6c1daeSBarry Smith Level: intermediate
2365c6c1daeSBarry Smith
237811af0c4SBarry Smith Note:
238811af0c4SBarry Smith The new points will not be displayed until a call to `PetscDrawSPDraw()` is made
2390afdd333SBarry Smith
240db781477SPatrick Sanan .seealso: `PetscDrawSPAddPoint()`, `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPReset()`, `PetscDrawSPDraw()`, `PetscDrawSPAddPointColorized()`
2415c6c1daeSBarry Smith @*/
PetscDrawSPAddPoints(PetscDrawSP sp,int n,PetscReal * xx[],PetscReal * yy[])242cc4c1da9SBarry Smith PetscErrorCode PetscDrawSPAddPoints(PetscDrawSP sp, int n, PetscReal *xx[], PetscReal *yy[])
243d71ae5a4SJacob Faibussowitsch {
2445c6c1daeSBarry Smith PetscInt i, j, k;
2455c6c1daeSBarry Smith PetscReal *x, *y;
2465c6c1daeSBarry Smith
2475c6c1daeSBarry Smith PetscFunctionBegin;
2485c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
2495c6c1daeSBarry Smith
2505c6c1daeSBarry Smith if (sp->loc + n * sp->dim >= sp->len) { /* allocate more space */
251f98b2f00SMatthew G. Knepley PetscReal *tmpx, *tmpy, *tmpz;
252999739cfSJacob Faibussowitsch PetscInt chunk = PETSC_DRAW_SP_CHUNK_SIZE;
2535c6c1daeSBarry Smith if (n > chunk) chunk = n;
254f98b2f00SMatthew G. Knepley PetscCall(PetscMalloc3(sp->len + sp->dim * chunk, &tmpx, sp->len + sp->dim * chunk, &tmpy, sp->len + sp->dim * chunk, &tmpz));
2559566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpx, sp->x, sp->len));
2569566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpy, sp->y, sp->len));
257f98b2f00SMatthew G. Knepley PetscCall(PetscArraycpy(tmpz, sp->z, sp->len));
258f98b2f00SMatthew G. Knepley PetscCall(PetscFree3(sp->x, sp->y, sp->z));
259a297a907SKarl Rupp
2605c6c1daeSBarry Smith sp->x = tmpx;
2615c6c1daeSBarry Smith sp->y = tmpy;
262f98b2f00SMatthew G. Knepley sp->z = tmpz;
263999739cfSJacob Faibussowitsch sp->len += sp->dim * PETSC_DRAW_SP_CHUNK_SIZE;
2645c6c1daeSBarry Smith }
265f98b2f00SMatthew G. Knepley for (j = 0; j < sp->dim; ++j) {
2669371c9d4SSatish Balay x = xx[j];
2679371c9d4SSatish Balay y = yy[j];
2685c6c1daeSBarry Smith k = sp->loc + j;
269f98b2f00SMatthew G. Knepley for (i = 0; i < n; ++i) {
2705c6c1daeSBarry Smith if (x[i] > sp->xmax) sp->xmax = x[i];
2715c6c1daeSBarry Smith if (x[i] < sp->xmin) sp->xmin = x[i];
2725c6c1daeSBarry Smith if (y[i] > sp->ymax) sp->ymax = y[i];
2735c6c1daeSBarry Smith if (y[i] < sp->ymin) sp->ymin = y[i];
2745c6c1daeSBarry Smith
2755c6c1daeSBarry Smith sp->x[k] = x[i];
2765c6c1daeSBarry Smith sp->y[k] = y[i];
2775c6c1daeSBarry Smith k += sp->dim;
2785c6c1daeSBarry Smith }
2795c6c1daeSBarry Smith }
2805c6c1daeSBarry Smith sp->loc += n * sp->dim;
2815c6c1daeSBarry Smith sp->nopts += n;
2823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2835c6c1daeSBarry Smith }
2845c6c1daeSBarry Smith
2855c6c1daeSBarry Smith /*@
2868c87cf4dSdanfinn PetscDrawSPAddPointColorized - Adds another point to each of the scatter plots as well as a numeric value to be used to colorize the scatter point.
2878c87cf4dSdanfinn
28820f4b53cSBarry Smith Not Collective
2898c87cf4dSdanfinn
2908c87cf4dSdanfinn Input Parameters:
2918c87cf4dSdanfinn + sp - the scatter plot data structure
2922fe279fdSBarry Smith . x - array of length dim containing the new x coordinate values for each of the point curves.
2932fe279fdSBarry Smith . y - array of length dim containing the new y coordinate values for each of the point curves.
2948c87cf4dSdanfinn - z - array of length dim containing the numeric values that will be mapped to [0,255] and used for scatter point colors.
2958c87cf4dSdanfinn
2968c87cf4dSdanfinn Level: intermediate
2978c87cf4dSdanfinn
298811af0c4SBarry Smith Note:
2992fe279fdSBarry Smith The dimensions of the arrays is the number of point curves passed to `PetscDrawSPCreate()`.
300811af0c4SBarry Smith The new points will not be displayed until a call to `PetscDrawSPDraw()` is made
3018c87cf4dSdanfinn
302db781477SPatrick Sanan .seealso: `PetscDrawSPAddPoints()`, `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPReset()`, `PetscDrawSPDraw()`, `PetscDrawSPAddPoint()`
3038c87cf4dSdanfinn @*/
PetscDrawSPAddPointColorized(PetscDrawSP sp,PetscReal * x,PetscReal * y,PetscReal * z)304d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPAddPointColorized(PetscDrawSP sp, PetscReal *x, PetscReal *y, PetscReal *z)
305d71ae5a4SJacob Faibussowitsch {
3068c87cf4dSdanfinn PetscInt i;
3078c87cf4dSdanfinn
3088c87cf4dSdanfinn PetscFunctionBegin;
3098c87cf4dSdanfinn PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
3108c87cf4dSdanfinn sp->colorized = PETSC_TRUE;
3118c87cf4dSdanfinn if (sp->loc + sp->dim >= sp->len) { /* allocate more space */
3128c87cf4dSdanfinn PetscReal *tmpx, *tmpy, *tmpz;
3139566063dSJacob Faibussowitsch PetscCall(PetscMalloc3(sp->len + sp->dim * PETSC_DRAW_SP_CHUNK_SIZE, &tmpx, sp->len + sp->dim * PETSC_DRAW_SP_CHUNK_SIZE, &tmpy, sp->len + sp->dim * PETSC_DRAW_SP_CHUNK_SIZE, &tmpz));
3149566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpx, sp->x, sp->len));
3159566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpy, sp->y, sp->len));
3169566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(tmpz, sp->z, sp->len));
3179566063dSJacob Faibussowitsch PetscCall(PetscFree3(sp->x, sp->y, sp->z));
3188c87cf4dSdanfinn sp->x = tmpx;
3198c87cf4dSdanfinn sp->y = tmpy;
3208c87cf4dSdanfinn sp->z = tmpz;
3218c87cf4dSdanfinn sp->len += sp->dim * PETSC_DRAW_SP_CHUNK_SIZE;
3228c87cf4dSdanfinn }
323f98b2f00SMatthew G. Knepley for (i = 0; i < sp->dim; ++i) {
3248c87cf4dSdanfinn if (x[i] > sp->xmax) sp->xmax = x[i];
3258c87cf4dSdanfinn if (x[i] < sp->xmin) sp->xmin = x[i];
3268c87cf4dSdanfinn if (y[i] > sp->ymax) sp->ymax = y[i];
3278c87cf4dSdanfinn if (y[i] < sp->ymin) sp->ymin = y[i];
3288c87cf4dSdanfinn if (z[i] < sp->zmin) sp->zmin = z[i];
3298c87cf4dSdanfinn if (z[i] > sp->zmax) sp->zmax = z[i];
3308c87cf4dSdanfinn // if (z[i] > sp->zmax && z[i] < 5.) sp->zmax = z[i];
3318c87cf4dSdanfinn
3328c87cf4dSdanfinn sp->x[sp->loc] = x[i];
3338c87cf4dSdanfinn sp->y[sp->loc] = y[i];
3348c87cf4dSdanfinn sp->z[sp->loc++] = z[i];
3358c87cf4dSdanfinn }
336f98b2f00SMatthew G. Knepley ++sp->nopts;
3373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3388c87cf4dSdanfinn }
3398c87cf4dSdanfinn
3408c87cf4dSdanfinn /*@
3415c6c1daeSBarry Smith PetscDrawSPDraw - Redraws a scatter plot.
3425c6c1daeSBarry Smith
343c3339decSBarry Smith Collective
3445c6c1daeSBarry Smith
345d8d19677SJose E. Roman Input Parameters:
346811af0c4SBarry Smith + sp - the scatter plot context
3475c6c1daeSBarry Smith - clear - clear the window before drawing the new plot
3485c6c1daeSBarry Smith
3495c6c1daeSBarry Smith Level: intermediate
3505c6c1daeSBarry Smith
351db781477SPatrick Sanan .seealso: `PetscDrawLGDraw()`, `PetscDrawLGSPDraw()`, `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPReset()`, `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`
3525c6c1daeSBarry Smith @*/
PetscDrawSPDraw(PetscDrawSP sp,PetscBool clear)353d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPDraw(PetscDrawSP sp, PetscBool clear)
354d71ae5a4SJacob Faibussowitsch {
355e118a51fSLisandro Dalcin PetscDraw draw;
356f98b2f00SMatthew G. Knepley PetscBool isnull;
357f98b2f00SMatthew G. Knepley PetscMPIInt rank, size;
3585c6c1daeSBarry Smith
3595c6c1daeSBarry Smith PetscFunctionBegin;
3605c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
361f98b2f00SMatthew G. Knepley draw = sp->win;
362f98b2f00SMatthew G. Knepley PetscCall(PetscDrawIsNull(draw, &isnull));
3633ba16761SJacob Faibussowitsch if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
3649566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)sp), &rank));
365f98b2f00SMatthew G. Knepley PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)sp), &size));
366e118a51fSLisandro Dalcin
3675c6c1daeSBarry Smith if (clear) {
3689566063dSJacob Faibussowitsch PetscCall(PetscDrawCheckResizedWindow(draw));
3699566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw));
3705c6c1daeSBarry Smith }
371f98b2f00SMatthew G. Knepley {
372f98b2f00SMatthew G. Knepley PetscReal lower[2] = {sp->xmin, sp->ymin}, glower[2];
373f98b2f00SMatthew G. Knepley PetscReal upper[2] = {sp->xmax, sp->ymax}, gupper[2];
374*462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(lower, glower, 2, MPIU_REAL, MPIU_MIN, PetscObjectComm((PetscObject)sp)));
375*462c564dSBarry Smith PetscCallMPI(MPIU_Allreduce(upper, gupper, 2, MPIU_REAL, MPIU_MAX, PetscObjectComm((PetscObject)sp)));
376f98b2f00SMatthew G. Knepley PetscCall(PetscDrawAxisSetLimits(sp->axis, glower[0], gupper[0], glower[1], gupper[1]));
3779566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDraw(sp->axis));
378f98b2f00SMatthew G. Knepley }
3795c6c1daeSBarry Smith
380d0609cedSBarry Smith PetscDrawCollectiveBegin(draw);
381f98b2f00SMatthew G. Knepley {
382f98b2f00SMatthew G. Knepley const int dim = sp->dim, nopts = sp->nopts;
383f98b2f00SMatthew G. Knepley
384f98b2f00SMatthew G. Knepley for (int i = 0; i < dim; ++i) {
385f98b2f00SMatthew G. Knepley for (int p = 0; p < nopts; ++p) {
3866497c311SBarry Smith int color = sp->colorized ? PetscDrawRealToColor(sp->z[p * dim], sp->zmin, sp->zmax) : (size > 1 ? PetscDrawRealToColor(rank, 0, size - 1) : PETSC_DRAW_RED);
387f98b2f00SMatthew G. Knepley
388f98b2f00SMatthew G. Knepley PetscCall(PetscDrawPoint(draw, sp->x[p * dim + i], sp->y[p * dim + i], color));
3895c6c1daeSBarry Smith }
3905c6c1daeSBarry Smith }
3918c87cf4dSdanfinn }
392d0609cedSBarry Smith PetscDrawCollectiveEnd(draw);
3935b399a63SLisandro Dalcin
3949566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw));
3959566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(draw));
3963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3975c6c1daeSBarry Smith }
3985c6c1daeSBarry Smith
39957fd6651SLisandro Dalcin /*@
40057fd6651SLisandro Dalcin PetscDrawSPSave - Saves a drawn image
40157fd6651SLisandro Dalcin
402c3339decSBarry Smith Collective
40357fd6651SLisandro Dalcin
40457fd6651SLisandro Dalcin Input Parameter:
40557fd6651SLisandro Dalcin . sp - the scatter plot context
40657fd6651SLisandro Dalcin
40757fd6651SLisandro Dalcin Level: intermediate
40857fd6651SLisandro Dalcin
40942747ad1SJacob Faibussowitsch .seealso: `PetscDrawSPCreate()`, `PetscDrawSPGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`
41057fd6651SLisandro Dalcin @*/
PetscDrawSPSave(PetscDrawSP sp)411d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPSave(PetscDrawSP sp)
412d71ae5a4SJacob Faibussowitsch {
41357fd6651SLisandro Dalcin PetscFunctionBegin;
41457fd6651SLisandro Dalcin PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
4159566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(sp->win));
4163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
41757fd6651SLisandro Dalcin }
41857fd6651SLisandro Dalcin
4195c6c1daeSBarry Smith /*@
420f98b2f00SMatthew G. Knepley PetscDrawSPSetLimits - Sets the axis limits for a scatter plot. If more points are added after this call, the limits will be adjusted to include those additional points.
4215c6c1daeSBarry Smith
42220f4b53cSBarry Smith Not Collective
4235c6c1daeSBarry Smith
4245c6c1daeSBarry Smith Input Parameters:
425aec76313SJacob Faibussowitsch + sp - the line graph context
4262fe279fdSBarry Smith . x_min - the horizontal lower limit
427aaa8cc7dSPierre Jolivet . x_max - the horizontal upper limit
4282fe279fdSBarry Smith . y_min - the vertical lower limit
4292fe279fdSBarry Smith - y_max - the vertical upper limit
4305c6c1daeSBarry Smith
4315c6c1daeSBarry Smith Level: intermediate
4325c6c1daeSBarry Smith
433811af0c4SBarry Smith .seealso: `PetscDrawSP`, `PetscDrawAxis`, `PetscDrawSPCreate()`, `PetscDrawSPDraw()`, `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`, `PetscDrawSPGetAxis()`
4345c6c1daeSBarry Smith @*/
PetscDrawSPSetLimits(PetscDrawSP sp,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)435d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPSetLimits(PetscDrawSP sp, PetscReal x_min, PetscReal x_max, PetscReal y_min, PetscReal y_max)
436d71ae5a4SJacob Faibussowitsch {
4375c6c1daeSBarry Smith PetscFunctionBegin;
4385c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
4395c6c1daeSBarry Smith sp->xmin = x_min;
4405c6c1daeSBarry Smith sp->xmax = x_max;
4415c6c1daeSBarry Smith sp->ymin = y_min;
4425c6c1daeSBarry Smith sp->ymax = y_max;
4433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4445c6c1daeSBarry Smith }
4455c6c1daeSBarry Smith
446f98b2f00SMatthew G. Knepley /*@
447811af0c4SBarry Smith PetscDrawSPGetAxis - Gets the axis context associated with a scatter plot
4485c6c1daeSBarry Smith
449f98b2f00SMatthew G. Knepley Not Collective
4505c6c1daeSBarry Smith
4515c6c1daeSBarry Smith Input Parameter:
452811af0c4SBarry Smith . sp - the scatter plot context
4535c6c1daeSBarry Smith
4545c6c1daeSBarry Smith Output Parameter:
4555c6c1daeSBarry Smith . axis - the axis context
4565c6c1daeSBarry Smith
45720f4b53cSBarry Smith Level: intermediate
45820f4b53cSBarry Smith
459f98b2f00SMatthew G. Knepley Note:
460f98b2f00SMatthew G. Knepley This is useful if one wants to change some axis property, such as labels, color, etc. The axis context should not be destroyed by the application code.
461f98b2f00SMatthew G. Knepley
462db781477SPatrick Sanan .seealso: `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPDraw()`, `PetscDrawSPAddPoint()`, `PetscDrawSPAddPoints()`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
4635c6c1daeSBarry Smith @*/
PetscDrawSPGetAxis(PetscDrawSP sp,PetscDrawAxis * axis)464d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPGetAxis(PetscDrawSP sp, PetscDrawAxis *axis)
465d71ae5a4SJacob Faibussowitsch {
4665c6c1daeSBarry Smith PetscFunctionBegin;
4675c6c1daeSBarry Smith PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
4684f572ea9SToby Isaac PetscAssertPointer(axis, 2);
4695c6c1daeSBarry Smith *axis = sp->axis;
4703ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4715c6c1daeSBarry Smith }
4725c6c1daeSBarry Smith
473f98b2f00SMatthew G. Knepley /*@
474811af0c4SBarry Smith PetscDrawSPGetDraw - Gets the draw context associated with a scatter plot
4755c6c1daeSBarry Smith
476f98b2f00SMatthew G. Knepley Not Collective
4775c6c1daeSBarry Smith
4785c6c1daeSBarry Smith Input Parameter:
479811af0c4SBarry Smith . sp - the scatter plot context
4805c6c1daeSBarry Smith
4815c6c1daeSBarry Smith Output Parameter:
4825c6c1daeSBarry Smith . draw - the draw context
4835c6c1daeSBarry Smith
4845c6c1daeSBarry Smith Level: intermediate
4855c6c1daeSBarry Smith
486db781477SPatrick Sanan .seealso: `PetscDrawSP`, `PetscDrawSPCreate()`, `PetscDrawSPDraw()`, `PetscDraw`
4875c6c1daeSBarry Smith @*/
PetscDrawSPGetDraw(PetscDrawSP sp,PetscDraw * draw)488d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawSPGetDraw(PetscDrawSP sp, PetscDraw *draw)
489d71ae5a4SJacob Faibussowitsch {
4905c6c1daeSBarry Smith PetscFunctionBegin;
491e118a51fSLisandro Dalcin PetscValidHeaderSpecific(sp, PETSC_DRAWSP_CLASSID, 1);
4924f572ea9SToby Isaac PetscAssertPointer(draw, 2);
493e118a51fSLisandro Dalcin *draw = sp->win;
4943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4955c6c1daeSBarry Smith }
496