xref: /petsc/src/sys/classes/draw/utils/dscatter.c (revision 999739cf12618b36ac48ee4250964a76f927d80d)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith        Contains the data structure for drawing scatter plots
45c6c1daeSBarry Smith     graphs in a window with an axis. This is intended for scatter
55c6c1daeSBarry Smith     plots that change dynamically.
65c6c1daeSBarry Smith */
75c6c1daeSBarry Smith 
89804daf3SBarry Smith #include <petscdraw.h>              /*I "petscdraw.h" I*/
9*999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.h> /*I "petscsys.h" I*/
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith PetscClassId PETSC_DRAWSP_CLASSID = 0;
125c6c1daeSBarry Smith 
135c6c1daeSBarry Smith /*@C
145c6c1daeSBarry Smith     PetscDrawSPCreate - Creates a scatter plot data structure.
155c6c1daeSBarry Smith 
165b399a63SLisandro Dalcin     Collective on PetscDraw
175c6c1daeSBarry Smith 
185c6c1daeSBarry Smith     Input Parameters:
195c6c1daeSBarry Smith +   win - the window where the graph will be made.
205c6c1daeSBarry Smith -   dim - the number of sets of points which will be drawn
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith     Output Parameters:
235c6c1daeSBarry Smith .   drawsp - the scatter plot context
245c6c1daeSBarry Smith 
255c6c1daeSBarry Smith    Level: intermediate
265c6c1daeSBarry Smith 
2795452b02SPatrick Sanan    Notes:
2895452b02SPatrick Sanan     Add points to the plot with PetscDrawSPAddPoint() or PetscDrawSPAddPoints(); the new points are not displayed until PetscDrawSPDraw() is called.
290afdd333SBarry Smith 
300afdd333SBarry Smith    PetscDrawSPReset() removes all the points that have been added
310afdd333SBarry Smith 
327e25d57eSBarry 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
337e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawSPDraw() to display the updated graph.
347e25d57eSBarry Smith 
350afdd333SBarry Smith .seealso:  PetscDrawLGCreate(), PetscDrawLG, PetscDrawBarCreate(), PetscDrawBar, PetscDrawHGCreate(), PetscDrawHG, PetscDrawSPDestroy(), PetscDraw, PetscDrawSP, PetscDrawSPSetDimension(), PetscDrawSPReset(),
360afdd333SBarry Smith            PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw(), PetscDrawSPSave(), PetscDrawSPSetLimits(), PetscDrawSPGetAxis(),PetscDrawAxis, PetscDrawSPGetDraw()
375c6c1daeSBarry Smith @*/
385c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPCreate(PetscDraw draw,int dim,PetscDrawSP *drawsp)
395c6c1daeSBarry Smith {
405c6c1daeSBarry Smith   PetscDrawSP    sp;
41e118a51fSLisandro Dalcin   PetscErrorCode ierr;
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith   PetscFunctionBegin;
445c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
45e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
465c6c1daeSBarry Smith   PetscValidPointer(drawsp,3);
47e118a51fSLisandro Dalcin 
4871917b75SLisandro Dalcin   ierr = PetscHeaderCreate(sp,PETSC_DRAWSP_CLASSID,"DrawSP","Scatter Plot","Draw",PetscObjectComm((PetscObject)draw),PetscDrawSPDestroy,NULL);CHKERRQ(ierr);
49e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)sp);CHKERRQ(ierr);
50e118a51fSLisandro Dalcin 
51e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
525c6c1daeSBarry Smith   sp->win = draw;
53e118a51fSLisandro Dalcin 
54e118a51fSLisandro Dalcin   sp->view    = NULL;
55e118a51fSLisandro Dalcin   sp->destroy = NULL;
56e118a51fSLisandro Dalcin   sp->nopts   = 0;
575c6c1daeSBarry Smith   sp->dim     = dim;
585c6c1daeSBarry Smith   sp->xmin    = 1.e20;
595c6c1daeSBarry Smith   sp->ymin    = 1.e20;
605c6c1daeSBarry Smith   sp->xmax    = -1.e20;
615c6c1daeSBarry Smith   sp->ymax    = -1.e20;
62a297a907SKarl Rupp 
63*999739cfSJacob Faibussowitsch   ierr = PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y);CHKERRQ(ierr);
64*999739cfSJacob Faibussowitsch   ierr = PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
65a297a907SKarl Rupp 
66*999739cfSJacob Faibussowitsch   sp->len     = dim*PETSC_DRAW_SP_CHUNK_SIZE;
675c6c1daeSBarry Smith   sp->loc     = 0;
68a297a907SKarl Rupp 
695c6c1daeSBarry Smith   ierr = PetscDrawAxisCreate(draw,&sp->axis);CHKERRQ(ierr);
703bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)sp,(PetscObject)sp->axis);CHKERRQ(ierr);
71a297a907SKarl Rupp 
725c6c1daeSBarry Smith   *drawsp = sp;
735c6c1daeSBarry Smith   PetscFunctionReturn(0);
745c6c1daeSBarry Smith }
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith /*@
775c6c1daeSBarry Smith    PetscDrawSPSetDimension - Change the number of sets of points  that are to be drawn.
785c6c1daeSBarry Smith 
795b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
805c6c1daeSBarry Smith 
81d8d19677SJose E. Roman    Input Parameters:
825c6c1daeSBarry Smith +  sp - the line graph context.
835c6c1daeSBarry Smith -  dim - the number of curves.
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith    Level: intermediate
865c6c1daeSBarry Smith 
870afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints()
880afdd333SBarry Smith 
895c6c1daeSBarry Smith @*/
905c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPSetDimension(PetscDrawSP sp,int dim)
915c6c1daeSBarry Smith {
925c6c1daeSBarry Smith   PetscErrorCode ierr;
935c6c1daeSBarry Smith 
945c6c1daeSBarry Smith   PetscFunctionBegin;
955c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
96e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(sp,dim,2);
975c6c1daeSBarry Smith   if (sp->dim == dim) PetscFunctionReturn(0);
985c6c1daeSBarry Smith 
995c6c1daeSBarry Smith   ierr    = PetscFree2(sp->x,sp->y);CHKERRQ(ierr);
1005c6c1daeSBarry Smith   sp->dim = dim;
101*999739cfSJacob Faibussowitsch   ierr    = PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y);CHKERRQ(ierr);
102*999739cfSJacob Faibussowitsch   ierr    = PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
103*999739cfSJacob Faibussowitsch   sp->len = dim*PETSC_DRAW_SP_CHUNK_SIZE;
1045c6c1daeSBarry Smith   PetscFunctionReturn(0);
1055c6c1daeSBarry Smith }
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith /*@
1085c6c1daeSBarry Smith    PetscDrawSPReset - Clears line graph to allow for reuse with new data.
1095c6c1daeSBarry Smith 
1105b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
1115c6c1daeSBarry Smith 
1125c6c1daeSBarry Smith    Input Parameter:
1135c6c1daeSBarry Smith .  sp - the line graph context.
1145c6c1daeSBarry Smith 
1155c6c1daeSBarry Smith    Level: intermediate
1165c6c1daeSBarry Smith 
1170afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw()
1185c6c1daeSBarry Smith @*/
1195c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPReset(PetscDrawSP sp)
1205c6c1daeSBarry Smith {
1215c6c1daeSBarry Smith   PetscFunctionBegin;
1225c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
1235c6c1daeSBarry Smith   sp->xmin  = 1.e20;
1245c6c1daeSBarry Smith   sp->ymin  = 1.e20;
1255c6c1daeSBarry Smith   sp->xmax  = -1.e20;
1265c6c1daeSBarry Smith   sp->ymax  = -1.e20;
1275c6c1daeSBarry Smith   sp->loc   = 0;
1285c6c1daeSBarry Smith   sp->nopts = 0;
1295c6c1daeSBarry Smith   PetscFunctionReturn(0);
1305c6c1daeSBarry Smith }
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith /*@C
1335c6c1daeSBarry Smith    PetscDrawSPDestroy - Frees all space taken up by scatter plot data structure.
1345c6c1daeSBarry Smith 
1355b399a63SLisandro Dalcin    Collective on PetscDrawSP
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith    Input Parameter:
1385c6c1daeSBarry Smith .  sp - the line graph context
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith    Level: intermediate
1415c6c1daeSBarry Smith 
1420afdd333SBarry Smith .seealso:  PetscDrawSPCreate(), PetscDrawSP, PetscDrawSPReset()
1430afdd333SBarry Smith 
1445c6c1daeSBarry Smith @*/
1455c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPDestroy(PetscDrawSP *sp)
1465c6c1daeSBarry Smith {
1475c6c1daeSBarry Smith   PetscErrorCode ierr;
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith   PetscFunctionBegin;
1505c6c1daeSBarry Smith   if (!*sp) PetscFunctionReturn(0);
151e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*sp,PETSC_DRAWSP_CLASSID,1);
152e118a51fSLisandro Dalcin   if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);}
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith   ierr = PetscFree2((*sp)->x,(*sp)->y);CHKERRQ(ierr);
155e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*sp)->axis);CHKERRQ(ierr);
156e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*sp)->win);CHKERRQ(ierr);
1575c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(sp);CHKERRQ(ierr);
1585c6c1daeSBarry Smith   PetscFunctionReturn(0);
1595c6c1daeSBarry Smith }
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith /*@
1625c6c1daeSBarry Smith    PetscDrawSPAddPoint - Adds another point to each of the scatter plots.
1635c6c1daeSBarry Smith 
1645b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
1655c6c1daeSBarry Smith 
1665c6c1daeSBarry Smith    Input Parameters:
1675c6c1daeSBarry Smith +  sp - the scatter plot data structure
1685c6c1daeSBarry Smith -  x, y - the points to two vectors containing the new x and y
1695c6c1daeSBarry Smith           point for each curve.
1705c6c1daeSBarry Smith 
1715c6c1daeSBarry Smith    Level: intermediate
1725c6c1daeSBarry Smith 
17395452b02SPatrick Sanan    Notes:
17495452b02SPatrick Sanan     the new points will not be displayed until a call to PetscDrawSPDraw() is made
1750afdd333SBarry Smith 
1760afdd333SBarry Smith .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw()
1770afdd333SBarry Smith 
1785c6c1daeSBarry Smith @*/
1795c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPAddPoint(PetscDrawSP sp,PetscReal *x,PetscReal *y)
1805c6c1daeSBarry Smith {
1815c6c1daeSBarry Smith   PetscErrorCode ierr;
1825c6c1daeSBarry Smith   PetscInt       i;
1835c6c1daeSBarry Smith 
1845c6c1daeSBarry Smith   PetscFunctionBegin;
1855c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
186e118a51fSLisandro Dalcin 
1875c6c1daeSBarry Smith   if (sp->loc+sp->dim >= sp->len) { /* allocate more space */
1885c6c1daeSBarry Smith     PetscReal *tmpx,*tmpy;
189*999739cfSJacob Faibussowitsch     ierr     = PetscMalloc2(sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpx,sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpy);CHKERRQ(ierr);
190*999739cfSJacob Faibussowitsch     ierr     = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
191580bdb30SBarry Smith     ierr     = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr);
192580bdb30SBarry Smith     ierr     = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr);
1935c6c1daeSBarry Smith     ierr     = PetscFree2(sp->x,sp->y);CHKERRQ(ierr);
1945c6c1daeSBarry Smith     sp->x    = tmpx;
1955c6c1daeSBarry Smith     sp->y    = tmpy;
196*999739cfSJacob Faibussowitsch     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
1975c6c1daeSBarry Smith   }
1985c6c1daeSBarry Smith   for (i=0; i<sp->dim; i++) {
1995c6c1daeSBarry Smith     if (x[i] > sp->xmax) sp->xmax = x[i];
2005c6c1daeSBarry Smith     if (x[i] < sp->xmin) sp->xmin = x[i];
2015c6c1daeSBarry Smith     if (y[i] > sp->ymax) sp->ymax = y[i];
2025c6c1daeSBarry Smith     if (y[i] < sp->ymin) sp->ymin = y[i];
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith     sp->x[sp->loc]   = x[i];
2055c6c1daeSBarry Smith     sp->y[sp->loc++] = y[i];
2065c6c1daeSBarry Smith   }
2075c6c1daeSBarry Smith   sp->nopts++;
2085c6c1daeSBarry Smith   PetscFunctionReturn(0);
2095c6c1daeSBarry Smith }
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith /*@C
2125c6c1daeSBarry Smith    PetscDrawSPAddPoints - Adds several points to each of the scatter plots.
2135c6c1daeSBarry Smith 
2145b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith    Input Parameters:
2175c6c1daeSBarry Smith +  sp - the LineGraph data structure
2185c6c1daeSBarry Smith .  xx,yy - points to two arrays of pointers that point to arrays
2195c6c1daeSBarry Smith            containing the new x and y points for each curve.
2205c6c1daeSBarry Smith -  n - number of points being added
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith    Level: intermediate
2235c6c1daeSBarry Smith 
22495452b02SPatrick Sanan    Notes:
22595452b02SPatrick Sanan     the new points will not be displayed until a call to PetscDrawSPDraw() is made
2260afdd333SBarry Smith 
2270afdd333SBarry Smith .seealso: PetscDrawSPAddPoint(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw()
2285c6c1daeSBarry Smith @*/
2295c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPAddPoints(PetscDrawSP sp,int n,PetscReal **xx,PetscReal **yy)
2305c6c1daeSBarry Smith {
2315c6c1daeSBarry Smith   PetscErrorCode ierr;
2325c6c1daeSBarry Smith   PetscInt       i,j,k;
2335c6c1daeSBarry Smith   PetscReal      *x,*y;
2345c6c1daeSBarry Smith 
2355c6c1daeSBarry Smith   PetscFunctionBegin;
2365c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
2375c6c1daeSBarry Smith 
2385c6c1daeSBarry Smith   if (sp->loc+n*sp->dim >= sp->len) { /* allocate more space */
2395c6c1daeSBarry Smith     PetscReal *tmpx,*tmpy;
240*999739cfSJacob Faibussowitsch     PetscInt  chunk = PETSC_DRAW_SP_CHUNK_SIZE;
2415c6c1daeSBarry Smith     if (n > chunk) chunk = n;
242dcca6d9dSJed Brown     ierr = PetscMalloc2(sp->len+sp->dim*chunk,&tmpx,sp->len+sp->dim*chunk,&tmpy);CHKERRQ(ierr);
243*999739cfSJacob Faibussowitsch     ierr = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
244580bdb30SBarry Smith     ierr = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr);
245580bdb30SBarry Smith     ierr = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr);
2465c6c1daeSBarry Smith     ierr = PetscFree2(sp->x,sp->y);CHKERRQ(ierr);
247a297a907SKarl Rupp 
2485c6c1daeSBarry Smith     sp->x    = tmpx;
2495c6c1daeSBarry Smith     sp->y    = tmpy;
250*999739cfSJacob Faibussowitsch     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
2515c6c1daeSBarry Smith   }
2525c6c1daeSBarry Smith   for (j=0; j<sp->dim; j++) {
2535c6c1daeSBarry Smith     x = xx[j]; y = yy[j];
2545c6c1daeSBarry Smith     k = sp->loc + j;
2555c6c1daeSBarry Smith     for (i=0; i<n; i++) {
2565c6c1daeSBarry Smith       if (x[i] > sp->xmax) sp->xmax = x[i];
2575c6c1daeSBarry Smith       if (x[i] < sp->xmin) sp->xmin = x[i];
2585c6c1daeSBarry Smith       if (y[i] > sp->ymax) sp->ymax = y[i];
2595c6c1daeSBarry Smith       if (y[i] < sp->ymin) sp->ymin = y[i];
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith       sp->x[k] = x[i];
2625c6c1daeSBarry Smith       sp->y[k] = y[i];
2635c6c1daeSBarry Smith       k       += sp->dim;
2645c6c1daeSBarry Smith     }
2655c6c1daeSBarry Smith   }
2665c6c1daeSBarry Smith   sp->loc   += n*sp->dim;
2675c6c1daeSBarry Smith   sp->nopts += n;
2685c6c1daeSBarry Smith   PetscFunctionReturn(0);
2695c6c1daeSBarry Smith }
2705c6c1daeSBarry Smith 
2715c6c1daeSBarry Smith /*@
2725c6c1daeSBarry Smith    PetscDrawSPDraw - Redraws a scatter plot.
2735c6c1daeSBarry Smith 
2745b399a63SLisandro Dalcin    Collective on PetscDrawSP
2755c6c1daeSBarry Smith 
276d8d19677SJose E. Roman    Input Parameters:
2775c6c1daeSBarry Smith +  sp - the line graph context
2785c6c1daeSBarry Smith -  clear - clear the window before drawing the new plot
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith    Level: intermediate
2815c6c1daeSBarry Smith 
2820afdd333SBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawLGSPDraw(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints()
2835c6c1daeSBarry Smith 
2845c6c1daeSBarry Smith @*/
2855c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPDraw(PetscDrawSP sp, PetscBool clear)
2865c6c1daeSBarry Smith {
287e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
2885c6c1daeSBarry Smith   PetscErrorCode ierr;
2895c6c1daeSBarry Smith   PetscMPIInt    rank;
290e118a51fSLisandro Dalcin   PetscBool      isnull;
291e118a51fSLisandro Dalcin   PetscDraw      draw;
2925c6c1daeSBarry Smith 
2935c6c1daeSBarry Smith   PetscFunctionBegin;
2945c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
2958f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(sp->win,&isnull);CHKERRQ(ierr);
2968f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
297ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)sp),&rank);CHKERRMPI(ierr);
298e118a51fSLisandro Dalcin 
2995b399a63SLisandro Dalcin   if (sp->xmin > sp->xmax || sp->ymin > sp->ymax) PetscFunctionReturn(0);
3005b399a63SLisandro Dalcin   if (sp->nopts < 1) PetscFunctionReturn(0);
3015b399a63SLisandro Dalcin 
3025b399a63SLisandro Dalcin   draw = sp->win;
3035c6c1daeSBarry Smith   if (clear) {
3045c6c1daeSBarry Smith     ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
3055b399a63SLisandro Dalcin     ierr = PetscDrawClear(draw);CHKERRQ(ierr);
3065c6c1daeSBarry Smith   }
307e118a51fSLisandro Dalcin 
308e118a51fSLisandro Dalcin   xmin = sp->xmin; xmax = sp->xmax; ymin = sp->ymin; ymax = sp->ymax;
3095c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(sp->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
3105c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(sp->axis);CHKERRQ(ierr);
3115c6c1daeSBarry Smith 
3125b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
313dd400576SPatrick Sanan   if (rank == 0) {
314e118a51fSLisandro Dalcin     int i,j,dim=sp->dim,nopts=sp->nopts;
3155c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
3165c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
3175c6c1daeSBarry Smith         ierr = PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
3185c6c1daeSBarry Smith       }
3195c6c1daeSBarry Smith     }
3205c6c1daeSBarry Smith   }
321e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
3225b399a63SLisandro Dalcin 
3235b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
324e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
3255c6c1daeSBarry Smith   PetscFunctionReturn(0);
3265c6c1daeSBarry Smith }
3275c6c1daeSBarry Smith 
32857fd6651SLisandro Dalcin /*@
32957fd6651SLisandro Dalcin    PetscDrawSPSave - Saves a drawn image
33057fd6651SLisandro Dalcin 
33157fd6651SLisandro Dalcin    Collective on PetscDrawSP
33257fd6651SLisandro Dalcin 
33357fd6651SLisandro Dalcin    Input Parameter:
33457fd6651SLisandro Dalcin .  sp - the scatter plot context
33557fd6651SLisandro Dalcin 
33657fd6651SLisandro Dalcin    Level: intermediate
33757fd6651SLisandro Dalcin 
33857fd6651SLisandro Dalcin .seealso:  PetscDrawSPCreate(), PetscDrawSPGetDraw(), PetscDrawSetSave(), PetscDrawSave()
33957fd6651SLisandro Dalcin @*/
34057fd6651SLisandro Dalcin PetscErrorCode  PetscDrawSPSave(PetscDrawSP sp)
34157fd6651SLisandro Dalcin {
34257fd6651SLisandro Dalcin   PetscErrorCode ierr;
34357fd6651SLisandro Dalcin 
34457fd6651SLisandro Dalcin   PetscFunctionBegin;
34557fd6651SLisandro Dalcin   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
34657fd6651SLisandro Dalcin   ierr = PetscDrawSave(sp->win);CHKERRQ(ierr);
34757fd6651SLisandro Dalcin   PetscFunctionReturn(0);
34857fd6651SLisandro Dalcin }
34957fd6651SLisandro Dalcin 
3505c6c1daeSBarry Smith /*@
35134a5a0e3SBarry Smith    PetscDrawSPSetLimits - Sets the axis limits for a scatter plot If more
3525c6c1daeSBarry Smith    points are added after this call, the limits will be adjusted to
3535c6c1daeSBarry Smith    include those additional points.
3545c6c1daeSBarry Smith 
3555b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
3565c6c1daeSBarry Smith 
3575c6c1daeSBarry Smith    Input Parameters:
3585c6c1daeSBarry Smith +  xsp - the line graph context
3595c6c1daeSBarry Smith -  x_min,x_max,y_min,y_max - the limits
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith    Level: intermediate
3625c6c1daeSBarry Smith 
3630afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPGetAxis()
3645c6c1daeSBarry Smith @*/
3655c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPSetLimits(PetscDrawSP sp,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
3665c6c1daeSBarry Smith {
3675c6c1daeSBarry Smith   PetscFunctionBegin;
3685c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
3695c6c1daeSBarry Smith   sp->xmin = x_min;
3705c6c1daeSBarry Smith   sp->xmax = x_max;
3715c6c1daeSBarry Smith   sp->ymin = y_min;
3725c6c1daeSBarry Smith   sp->ymax = y_max;
3735c6c1daeSBarry Smith   PetscFunctionReturn(0);
3745c6c1daeSBarry Smith }
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith /*@C
3775c6c1daeSBarry Smith    PetscDrawSPGetAxis - Gets the axis context associated with a line graph.
3785c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
3795c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
3805c6c1daeSBarry Smith    application code.
3815c6c1daeSBarry Smith 
382e118a51fSLisandro Dalcin    Not Collective, if PetscDrawSP is parallel then PetscDrawAxis is parallel
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith    Input Parameter:
3855c6c1daeSBarry Smith .  sp - the line graph context
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith    Output Parameter:
3885c6c1daeSBarry Smith .  axis - the axis context
3895c6c1daeSBarry Smith 
3905c6c1daeSBarry Smith    Level: intermediate
3915c6c1daeSBarry Smith 
3920afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawAxis, PetscDrawAxisCreate()
3930afdd333SBarry Smith 
3945c6c1daeSBarry Smith @*/
3955c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPGetAxis(PetscDrawSP sp,PetscDrawAxis *axis)
3965c6c1daeSBarry Smith {
3975c6c1daeSBarry Smith   PetscFunctionBegin;
3985c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
39945f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
4005c6c1daeSBarry Smith   *axis = sp->axis;
4015c6c1daeSBarry Smith   PetscFunctionReturn(0);
4025c6c1daeSBarry Smith }
4035c6c1daeSBarry Smith 
4045c6c1daeSBarry Smith /*@C
4055c6c1daeSBarry Smith    PetscDrawSPGetDraw - Gets the draw context associated with a line graph.
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith    Not Collective, PetscDraw is parallel if PetscDrawSP is parallel
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith    Input Parameter:
4105c6c1daeSBarry Smith .  sp - the line graph context
4115c6c1daeSBarry Smith 
4125c6c1daeSBarry Smith    Output Parameter:
4135c6c1daeSBarry Smith .  draw - the draw context
4145c6c1daeSBarry Smith 
4155c6c1daeSBarry Smith    Level: intermediate
4165c6c1daeSBarry Smith 
4170afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDraw
4185c6c1daeSBarry Smith @*/
4195c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPGetDraw(PetscDrawSP sp,PetscDraw *draw)
4205c6c1daeSBarry Smith {
4215c6c1daeSBarry Smith   PetscFunctionBegin;
422e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
42345f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
424e118a51fSLisandro Dalcin   *draw = sp->win;
4255c6c1daeSBarry Smith   PetscFunctionReturn(0);
4265c6c1daeSBarry Smith }
427