xref: /petsc/src/sys/classes/draw/utils/dscatter.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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 
125c6c1daeSBarry Smith /*@C
135c6c1daeSBarry Smith     PetscDrawSPCreate - Creates a scatter plot data structure.
145c6c1daeSBarry Smith 
155b399a63SLisandro Dalcin     Collective on PetscDraw
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith     Input Parameters:
185c6c1daeSBarry Smith +   win - the window where the graph will be made.
195c6c1daeSBarry Smith -   dim - the number of sets of points which will be drawn
205c6c1daeSBarry Smith 
215c6c1daeSBarry Smith     Output Parameters:
225c6c1daeSBarry Smith .   drawsp - the scatter plot context
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith    Level: intermediate
255c6c1daeSBarry Smith 
2695452b02SPatrick Sanan    Notes:
2795452b02SPatrick Sanan     Add points to the plot with PetscDrawSPAddPoint() or PetscDrawSPAddPoints(); the new points are not displayed until PetscDrawSPDraw() is called.
280afdd333SBarry Smith 
290afdd333SBarry Smith    PetscDrawSPReset() removes all the points that have been added
300afdd333SBarry Smith 
317e25d57eSBarry Smith    The MPI communicator that owns the PetscDraw owns this PetscDrawSP, but the calls to set options and add points are ignored on all processes except the
327e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawSPDraw() to display the updated graph.
337e25d57eSBarry Smith 
340afdd333SBarry Smith .seealso:  PetscDrawLGCreate(), PetscDrawLG, PetscDrawBarCreate(), PetscDrawBar, PetscDrawHGCreate(), PetscDrawHG, PetscDrawSPDestroy(), PetscDraw, PetscDrawSP, PetscDrawSPSetDimension(), PetscDrawSPReset(),
350afdd333SBarry Smith            PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw(), PetscDrawSPSave(), PetscDrawSPSetLimits(), PetscDrawSPGetAxis(),PetscDrawAxis, PetscDrawSPGetDraw()
365c6c1daeSBarry Smith @*/
375c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPCreate(PetscDraw draw,int dim,PetscDrawSP *drawsp)
385c6c1daeSBarry Smith {
395c6c1daeSBarry Smith   PetscDrawSP    sp;
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith   PetscFunctionBegin;
425c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
43e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
445c6c1daeSBarry Smith   PetscValidPointer(drawsp,3);
45e118a51fSLisandro Dalcin 
46*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(sp,PETSC_DRAWSP_CLASSID,"DrawSP","Scatter Plot","Draw",PetscObjectComm((PetscObject)draw),PetscDrawSPDestroy,NULL));
47*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogObjectParent((PetscObject)draw,(PetscObject)sp));
48e118a51fSLisandro Dalcin 
49*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectReference((PetscObject)draw));
505c6c1daeSBarry Smith   sp->win = draw;
51e118a51fSLisandro Dalcin 
52e118a51fSLisandro Dalcin   sp->view      = NULL;
53e118a51fSLisandro Dalcin   sp->destroy   = NULL;
54e118a51fSLisandro Dalcin   sp->nopts     = 0;
555c6c1daeSBarry Smith   sp->dim       = dim;
565c6c1daeSBarry Smith   sp->xmin      = 1.e20;
575c6c1daeSBarry Smith   sp->ymin      = 1.e20;
585c6c1daeSBarry Smith   sp->xmax      = -1.e20;
595c6c1daeSBarry Smith   sp->ymax      = -1.e20;
608c87cf4dSdanfinn   sp->zmax      = 1.;
618c87cf4dSdanfinn   sp->zmin      = 1.e20;
628c87cf4dSdanfinn   sp->colorized = PETSC_FALSE;
63a297a907SKarl Rupp 
64*5f80ce2aSJacob Faibussowitsch   CHKERRQ(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));
65*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal)));
66a297a907SKarl Rupp 
67999739cfSJacob Faibussowitsch   sp->len     = dim*PETSC_DRAW_SP_CHUNK_SIZE;
685c6c1daeSBarry Smith   sp->loc     = 0;
69a297a907SKarl Rupp 
70*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisCreate(draw,&sp->axis));
71*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogObjectParent((PetscObject)sp,(PetscObject)sp->axis));
72a297a907SKarl Rupp 
735c6c1daeSBarry Smith   *drawsp = sp;
745c6c1daeSBarry Smith   PetscFunctionReturn(0);
755c6c1daeSBarry Smith }
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith /*@
785c6c1daeSBarry Smith    PetscDrawSPSetDimension - Change the number of sets of points  that are to be drawn.
795c6c1daeSBarry Smith 
805b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
815c6c1daeSBarry Smith 
82d8d19677SJose E. Roman    Input Parameters:
835c6c1daeSBarry Smith +  sp - the line graph context.
845c6c1daeSBarry Smith -  dim - the number of curves.
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith    Level: intermediate
875c6c1daeSBarry Smith 
880afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints()
890afdd333SBarry Smith 
905c6c1daeSBarry Smith @*/
915c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPSetDimension(PetscDrawSP sp,int dim)
925c6c1daeSBarry Smith {
935c6c1daeSBarry Smith   PetscFunctionBegin;
945c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
95e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(sp,dim,2);
965c6c1daeSBarry Smith   if (sp->dim == dim) PetscFunctionReturn(0);
975c6c1daeSBarry Smith 
98*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree2(sp->x,sp->y));
995c6c1daeSBarry Smith   sp->dim = dim;
100*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y));
101*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal)));
102999739cfSJacob Faibussowitsch   sp->len = dim*PETSC_DRAW_SP_CHUNK_SIZE;
1035c6c1daeSBarry Smith   PetscFunctionReturn(0);
1045c6c1daeSBarry Smith }
1055c6c1daeSBarry Smith 
1065c6c1daeSBarry Smith /*@
1075c6c1daeSBarry Smith    PetscDrawSPReset - Clears line graph to allow for reuse with new data.
1085c6c1daeSBarry Smith 
1095b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith    Input Parameter:
1125c6c1daeSBarry Smith .  sp - the line graph context.
1135c6c1daeSBarry Smith 
1145c6c1daeSBarry Smith    Level: intermediate
1155c6c1daeSBarry Smith 
1160afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw()
1175c6c1daeSBarry Smith @*/
1185c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPReset(PetscDrawSP sp)
1195c6c1daeSBarry Smith {
1205c6c1daeSBarry Smith   PetscFunctionBegin;
1215c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
1225c6c1daeSBarry Smith   sp->xmin  = 1.e20;
1235c6c1daeSBarry Smith   sp->ymin  = 1.e20;
1248c87cf4dSdanfinn   sp->zmin  = 1.e20;
1255c6c1daeSBarry Smith   sp->xmax  = -1.e20;
1265c6c1daeSBarry Smith   sp->ymax  = -1.e20;
1278c87cf4dSdanfinn   sp->zmax  = -1.e20;
1285c6c1daeSBarry Smith   sp->loc   = 0;
1295c6c1daeSBarry Smith   sp->nopts = 0;
1305c6c1daeSBarry Smith   PetscFunctionReturn(0);
1315c6c1daeSBarry Smith }
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith /*@C
1345c6c1daeSBarry Smith    PetscDrawSPDestroy - Frees all space taken up by scatter plot data structure.
1355c6c1daeSBarry Smith 
1365b399a63SLisandro Dalcin    Collective on PetscDrawSP
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith    Input Parameter:
1395c6c1daeSBarry Smith .  sp - the line graph context
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith    Level: intermediate
1425c6c1daeSBarry Smith 
1430afdd333SBarry Smith .seealso:  PetscDrawSPCreate(), PetscDrawSP, PetscDrawSPReset()
1440afdd333SBarry Smith 
1455c6c1daeSBarry Smith @*/
1465c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPDestroy(PetscDrawSP *sp)
1475c6c1daeSBarry Smith {
1485c6c1daeSBarry Smith   PetscFunctionBegin;
1495c6c1daeSBarry Smith   if (!*sp) PetscFunctionReturn(0);
150e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*sp,PETSC_DRAWSP_CLASSID,1);
151e118a51fSLisandro Dalcin   if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);}
1525c6c1daeSBarry Smith 
153*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree3((*sp)->x,(*sp)->y,(*sp)->z));
154*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisDestroy(&(*sp)->axis));
155*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawDestroy(&(*sp)->win));
156*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(sp));
1575c6c1daeSBarry Smith   PetscFunctionReturn(0);
1585c6c1daeSBarry Smith }
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith /*@
1615c6c1daeSBarry Smith    PetscDrawSPAddPoint - Adds another point to each of the scatter plots.
1625c6c1daeSBarry Smith 
1635b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
1645c6c1daeSBarry Smith 
1655c6c1daeSBarry Smith    Input Parameters:
1665c6c1daeSBarry Smith +  sp - the scatter plot data structure
1672cf5aabcSBarry Smith -  x, y - two arrays of length dim containing the new x and y coordinate values for each of the curves. Here  dim is the number of curves passed to PetscDrawSPCreate()
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith    Level: intermediate
1705c6c1daeSBarry Smith 
17195452b02SPatrick Sanan    Notes:
17295452b02SPatrick Sanan     the new points will not be displayed until a call to PetscDrawSPDraw() is made
1730afdd333SBarry Smith 
1748c87cf4dSdanfinn .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPointColorized()
1750afdd333SBarry Smith 
1765c6c1daeSBarry Smith @*/
1775c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPAddPoint(PetscDrawSP sp,PetscReal *x,PetscReal *y)
1785c6c1daeSBarry Smith {
1795c6c1daeSBarry Smith   PetscInt       i;
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   PetscFunctionBegin;
1825c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
183e118a51fSLisandro Dalcin 
1845c6c1daeSBarry Smith   if (sp->loc+sp->dim >= sp->len) { /* allocate more space */
1855c6c1daeSBarry Smith     PetscReal *tmpx,*tmpy;
186*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc2(sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpx,sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpy));
187*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal)));
188*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpx,sp->x,sp->len));
189*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpy,sp->y,sp->len));
190*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree2(sp->x,sp->y));
1915c6c1daeSBarry Smith     sp->x    = tmpx;
1925c6c1daeSBarry Smith     sp->y    = tmpy;
193999739cfSJacob Faibussowitsch     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
1945c6c1daeSBarry Smith   }
1955c6c1daeSBarry Smith   for (i=0; i<sp->dim; i++) {
1965c6c1daeSBarry Smith     if (x[i] > sp->xmax) sp->xmax = x[i];
1975c6c1daeSBarry Smith     if (x[i] < sp->xmin) sp->xmin = x[i];
1985c6c1daeSBarry Smith     if (y[i] > sp->ymax) sp->ymax = y[i];
1995c6c1daeSBarry Smith     if (y[i] < sp->ymin) sp->ymin = y[i];
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith     sp->x[sp->loc]   = x[i];
2025c6c1daeSBarry Smith     sp->y[sp->loc++] = y[i];
2035c6c1daeSBarry Smith   }
2045c6c1daeSBarry Smith   sp->nopts++;
2055c6c1daeSBarry Smith   PetscFunctionReturn(0);
2065c6c1daeSBarry Smith }
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith /*@C
2095c6c1daeSBarry Smith    PetscDrawSPAddPoints - Adds several points to each of the scatter plots.
2105c6c1daeSBarry Smith 
2115b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith    Input Parameters:
2145c6c1daeSBarry Smith +  sp - the LineGraph data structure
2155c6c1daeSBarry Smith .  xx,yy - points to two arrays of pointers that point to arrays
2165c6c1daeSBarry Smith            containing the new x and y points for each curve.
2175c6c1daeSBarry Smith -  n - number of points being added
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith    Level: intermediate
2205c6c1daeSBarry Smith 
22195452b02SPatrick Sanan    Notes:
22295452b02SPatrick Sanan     the new points will not be displayed until a call to PetscDrawSPDraw() is made
2230afdd333SBarry Smith 
2248c87cf4dSdanfinn .seealso: PetscDrawSPAddPoint(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPointColorized()
2255c6c1daeSBarry Smith @*/
2265c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPAddPoints(PetscDrawSP sp,int n,PetscReal **xx,PetscReal **yy)
2275c6c1daeSBarry Smith {
2285c6c1daeSBarry Smith   PetscInt       i,j,k;
2295c6c1daeSBarry Smith   PetscReal      *x,*y;
2305c6c1daeSBarry Smith 
2315c6c1daeSBarry Smith   PetscFunctionBegin;
2325c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith   if (sp->loc+n*sp->dim >= sp->len) { /* allocate more space */
2355c6c1daeSBarry Smith     PetscReal *tmpx,*tmpy;
236999739cfSJacob Faibussowitsch     PetscInt  chunk = PETSC_DRAW_SP_CHUNK_SIZE;
2375c6c1daeSBarry Smith     if (n > chunk) chunk = n;
238*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc2(sp->len+sp->dim*chunk,&tmpx,sp->len+sp->dim*chunk,&tmpy));
239*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal)));
240*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpx,sp->x,sp->len));
241*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpy,sp->y,sp->len));
242*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree2(sp->x,sp->y));
243a297a907SKarl Rupp 
2445c6c1daeSBarry Smith     sp->x    = tmpx;
2455c6c1daeSBarry Smith     sp->y    = tmpy;
246999739cfSJacob Faibussowitsch     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
2475c6c1daeSBarry Smith   }
2485c6c1daeSBarry Smith   for (j=0; j<sp->dim; j++) {
2495c6c1daeSBarry Smith     x = xx[j]; y = yy[j];
2505c6c1daeSBarry Smith     k = sp->loc + j;
2515c6c1daeSBarry Smith     for (i=0; i<n; i++) {
2525c6c1daeSBarry Smith       if (x[i] > sp->xmax) sp->xmax = x[i];
2535c6c1daeSBarry Smith       if (x[i] < sp->xmin) sp->xmin = x[i];
2545c6c1daeSBarry Smith       if (y[i] > sp->ymax) sp->ymax = y[i];
2555c6c1daeSBarry Smith       if (y[i] < sp->ymin) sp->ymin = y[i];
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith       sp->x[k] = x[i];
2585c6c1daeSBarry Smith       sp->y[k] = y[i];
2595c6c1daeSBarry Smith       k       += sp->dim;
2605c6c1daeSBarry Smith     }
2615c6c1daeSBarry Smith   }
2625c6c1daeSBarry Smith   sp->loc   += n*sp->dim;
2635c6c1daeSBarry Smith   sp->nopts += n;
2645c6c1daeSBarry Smith   PetscFunctionReturn(0);
2655c6c1daeSBarry Smith }
2665c6c1daeSBarry Smith 
2675c6c1daeSBarry Smith /*@
2688c87cf4dSdanfinn    PetscDrawSPAddPointColorized - Adds another point to each of the scatter plots as well as a numeric value to be used to colorize the scatter point.
2698c87cf4dSdanfinn 
2708c87cf4dSdanfinn    Logically Collective on PetscDrawSP
2718c87cf4dSdanfinn 
2728c87cf4dSdanfinn    Input Parameters:
2738c87cf4dSdanfinn +  sp - the scatter plot data structure
2748c87cf4dSdanfinn . x, y - two arrays of length dim containing the new x and y coordinate values for each of the curves. Here  dim is the number of curves passed to PetscDrawSPCreate()
2758c87cf4dSdanfinn - z - array of length dim containing the numeric values that will be mapped to [0,255] and used for scatter point colors.
2768c87cf4dSdanfinn 
2778c87cf4dSdanfinn    Level: intermediate
2788c87cf4dSdanfinn 
2798c87cf4dSdanfinn    Notes:
2808c87cf4dSdanfinn     the new points will not be displayed until a call to PetscDrawSPDraw() is made
2818c87cf4dSdanfinn 
2828c87cf4dSdanfinn .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPoint()
2838c87cf4dSdanfinn 
2848c87cf4dSdanfinn @*/
2858c87cf4dSdanfinn PetscErrorCode  PetscDrawSPAddPointColorized(PetscDrawSP sp,PetscReal *x,PetscReal *y,PetscReal *z)
2868c87cf4dSdanfinn {
2878c87cf4dSdanfinn   PetscInt       i;
2888c87cf4dSdanfinn 
2898c87cf4dSdanfinn   PetscFunctionBegin;
2908c87cf4dSdanfinn   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
2918c87cf4dSdanfinn   sp->colorized = PETSC_TRUE;
2928c87cf4dSdanfinn   if (sp->loc+sp->dim >= sp->len) { /* allocate more space */
2938c87cf4dSdanfinn     PetscReal *tmpx,*tmpy,*tmpz;
294*5f80ce2aSJacob Faibussowitsch     CHKERRQ(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));
295*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal)));
296*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpx,sp->x,sp->len));
297*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpy,sp->y,sp->len));
298*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscArraycpy(tmpz,sp->z,sp->len));
299*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree3(sp->x,sp->y,sp->z));
3008c87cf4dSdanfinn     sp->x    = tmpx;
3018c87cf4dSdanfinn     sp->y    = tmpy;
3028c87cf4dSdanfinn     sp->z    = tmpz;
3038c87cf4dSdanfinn     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
3048c87cf4dSdanfinn   }
3058c87cf4dSdanfinn   for (i=0; i<sp->dim; i++) {
3068c87cf4dSdanfinn     if (x[i] > sp->xmax) sp->xmax = x[i];
3078c87cf4dSdanfinn     if (x[i] < sp->xmin) sp->xmin = x[i];
3088c87cf4dSdanfinn     if (y[i] > sp->ymax) sp->ymax = y[i];
3098c87cf4dSdanfinn     if (y[i] < sp->ymin) sp->ymin = y[i];
3108c87cf4dSdanfinn     if (z[i] < sp->zmin) sp->zmin = z[i];
3118c87cf4dSdanfinn     if (z[i] > sp->zmax) sp->zmax = z[i];
3128c87cf4dSdanfinn     // if (z[i] > sp->zmax && z[i] < 5.) sp->zmax = z[i];
3138c87cf4dSdanfinn 
3148c87cf4dSdanfinn     sp->x[sp->loc]   = x[i];
3158c87cf4dSdanfinn     sp->y[sp->loc]   = y[i];
3168c87cf4dSdanfinn     sp->z[sp->loc++] = z[i];
3178c87cf4dSdanfinn   }
3188c87cf4dSdanfinn   sp->nopts++;
3198c87cf4dSdanfinn   PetscFunctionReturn(0);
3208c87cf4dSdanfinn }
3218c87cf4dSdanfinn 
3228c87cf4dSdanfinn /*@
3235c6c1daeSBarry Smith    PetscDrawSPDraw - Redraws a scatter plot.
3245c6c1daeSBarry Smith 
3255b399a63SLisandro Dalcin    Collective on PetscDrawSP
3265c6c1daeSBarry Smith 
327d8d19677SJose E. Roman    Input Parameters:
3285c6c1daeSBarry Smith +  sp - the line graph context
3295c6c1daeSBarry Smith -  clear - clear the window before drawing the new plot
3305c6c1daeSBarry Smith 
3315c6c1daeSBarry Smith    Level: intermediate
3325c6c1daeSBarry Smith 
3330afdd333SBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawLGSPDraw(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints()
3345c6c1daeSBarry Smith 
3355c6c1daeSBarry Smith @*/
3365c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPDraw(PetscDrawSP sp, PetscBool clear)
3375c6c1daeSBarry Smith {
338e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
3395c6c1daeSBarry Smith   PetscMPIInt    rank;
3408c87cf4dSdanfinn   PetscInt       color;
341e118a51fSLisandro Dalcin   PetscBool      isnull;
342e118a51fSLisandro Dalcin   PetscDraw      draw;
343*5f80ce2aSJacob Faibussowitsch   PetscErrorCode ierr;
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith   PetscFunctionBegin;
3465c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
347*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawIsNull(sp->win,&isnull));
3488f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
349*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)sp),&rank));
350e118a51fSLisandro Dalcin 
3515b399a63SLisandro Dalcin   if (sp->xmin > sp->xmax || sp->ymin > sp->ymax) PetscFunctionReturn(0);
3525b399a63SLisandro Dalcin   if (sp->nopts < 1) PetscFunctionReturn(0);
3535b399a63SLisandro Dalcin 
3545b399a63SLisandro Dalcin   draw = sp->win;
3555c6c1daeSBarry Smith   if (clear) {
356*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawCheckResizedWindow(draw));
357*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawClear(draw));
3585c6c1daeSBarry Smith   }
359e118a51fSLisandro Dalcin 
360e118a51fSLisandro Dalcin   xmin = sp->xmin; xmax = sp->xmax; ymin = sp->ymin; ymax = sp->ymax;
361*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisSetLimits(sp->axis,xmin,xmax,ymin,ymax));
362*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisDraw(sp->axis));
3635c6c1daeSBarry Smith 
3645b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
365dd400576SPatrick Sanan   if (rank == 0) {
366e118a51fSLisandro Dalcin     int i,j,dim=sp->dim,nopts=sp->nopts;
3675c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
3685c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
3698c87cf4dSdanfinn         if (sp->colorized) {
3708c87cf4dSdanfinn           color = PetscDrawRealToColor(sp->z[j*dim],sp->zmin,sp->zmax);
371*5f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],color));
3728c87cf4dSdanfinn         } else {
373*5f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED));
3745c6c1daeSBarry Smith         }
3755c6c1daeSBarry Smith       }
3765c6c1daeSBarry Smith     }
3778c87cf4dSdanfinn   }
378e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
3795b399a63SLisandro Dalcin 
380*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawFlush(draw));
381*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawPause(draw));
3825c6c1daeSBarry Smith   PetscFunctionReturn(0);
3835c6c1daeSBarry Smith }
3845c6c1daeSBarry Smith 
38557fd6651SLisandro Dalcin /*@
38657fd6651SLisandro Dalcin    PetscDrawSPSave - Saves a drawn image
38757fd6651SLisandro Dalcin 
38857fd6651SLisandro Dalcin    Collective on PetscDrawSP
38957fd6651SLisandro Dalcin 
39057fd6651SLisandro Dalcin    Input Parameter:
39157fd6651SLisandro Dalcin .  sp - the scatter plot context
39257fd6651SLisandro Dalcin 
39357fd6651SLisandro Dalcin    Level: intermediate
39457fd6651SLisandro Dalcin 
39557fd6651SLisandro Dalcin .seealso:  PetscDrawSPCreate(), PetscDrawSPGetDraw(), PetscDrawSetSave(), PetscDrawSave()
39657fd6651SLisandro Dalcin @*/
39757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawSPSave(PetscDrawSP sp)
39857fd6651SLisandro Dalcin {
39957fd6651SLisandro Dalcin   PetscFunctionBegin;
40057fd6651SLisandro Dalcin   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
401*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSave(sp->win));
40257fd6651SLisandro Dalcin   PetscFunctionReturn(0);
40357fd6651SLisandro Dalcin }
40457fd6651SLisandro Dalcin 
4055c6c1daeSBarry Smith /*@
40634a5a0e3SBarry Smith    PetscDrawSPSetLimits - Sets the axis limits for a scatter plot If more
4075c6c1daeSBarry Smith    points are added after this call, the limits will be adjusted to
4085c6c1daeSBarry Smith    include those additional points.
4095c6c1daeSBarry Smith 
4105b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
4115c6c1daeSBarry Smith 
4125c6c1daeSBarry Smith    Input Parameters:
4135c6c1daeSBarry Smith +  xsp - the line graph context
4145c6c1daeSBarry Smith -  x_min,x_max,y_min,y_max - the limits
4155c6c1daeSBarry Smith 
4165c6c1daeSBarry Smith    Level: intermediate
4175c6c1daeSBarry Smith 
4180afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPGetAxis()
4195c6c1daeSBarry Smith @*/
4205c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPSetLimits(PetscDrawSP sp,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
4215c6c1daeSBarry Smith {
4225c6c1daeSBarry Smith   PetscFunctionBegin;
4235c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
4245c6c1daeSBarry Smith   sp->xmin = x_min;
4255c6c1daeSBarry Smith   sp->xmax = x_max;
4265c6c1daeSBarry Smith   sp->ymin = y_min;
4275c6c1daeSBarry Smith   sp->ymax = y_max;
4285c6c1daeSBarry Smith   PetscFunctionReturn(0);
4295c6c1daeSBarry Smith }
4305c6c1daeSBarry Smith 
4315c6c1daeSBarry Smith /*@C
4325c6c1daeSBarry Smith    PetscDrawSPGetAxis - Gets the axis context associated with a line graph.
4335c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
4345c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
4355c6c1daeSBarry Smith    application code.
4365c6c1daeSBarry Smith 
437e118a51fSLisandro Dalcin    Not Collective, if PetscDrawSP is parallel then PetscDrawAxis is parallel
4385c6c1daeSBarry Smith 
4395c6c1daeSBarry Smith    Input Parameter:
4405c6c1daeSBarry Smith .  sp - the line graph context
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith    Output Parameter:
4435c6c1daeSBarry Smith .  axis - the axis context
4445c6c1daeSBarry Smith 
4455c6c1daeSBarry Smith    Level: intermediate
4465c6c1daeSBarry Smith 
4470afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawAxis, PetscDrawAxisCreate()
4480afdd333SBarry Smith 
4495c6c1daeSBarry Smith @*/
4505c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPGetAxis(PetscDrawSP sp,PetscDrawAxis *axis)
4515c6c1daeSBarry Smith {
4525c6c1daeSBarry Smith   PetscFunctionBegin;
4535c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
45445f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
4555c6c1daeSBarry Smith   *axis = sp->axis;
4565c6c1daeSBarry Smith   PetscFunctionReturn(0);
4575c6c1daeSBarry Smith }
4585c6c1daeSBarry Smith 
4595c6c1daeSBarry Smith /*@C
4605c6c1daeSBarry Smith    PetscDrawSPGetDraw - Gets the draw context associated with a line graph.
4615c6c1daeSBarry Smith 
4625c6c1daeSBarry Smith    Not Collective, PetscDraw is parallel if PetscDrawSP is parallel
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith    Input Parameter:
4655c6c1daeSBarry Smith .  sp - the line graph context
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith    Output Parameter:
4685c6c1daeSBarry Smith .  draw - the draw context
4695c6c1daeSBarry Smith 
4705c6c1daeSBarry Smith    Level: intermediate
4715c6c1daeSBarry Smith 
4720afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDraw
4735c6c1daeSBarry Smith @*/
4745c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPGetDraw(PetscDrawSP sp,PetscDraw *draw)
4755c6c1daeSBarry Smith {
4765c6c1daeSBarry Smith   PetscFunctionBegin;
477e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
47845f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
479e118a51fSLisandro Dalcin   *draw = sp->win;
4805c6c1daeSBarry Smith   PetscFunctionReturn(0);
4815c6c1daeSBarry Smith }
482