xref: /petsc/src/sys/classes/draw/utils/dscatter.c (revision 2cf5aabc426dcedfaf8346422880b98b77869311)
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*/
9999739cfSJacob 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 
63999739cfSJacob Faibussowitsch   ierr = PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y);CHKERRQ(ierr);
64999739cfSJacob Faibussowitsch   ierr = PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
65a297a907SKarl Rupp 
66999739cfSJacob 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;
101999739cfSJacob Faibussowitsch   ierr    = PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y);CHKERRQ(ierr);
102999739cfSJacob Faibussowitsch   ierr    = PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
103999739cfSJacob 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
168*2cf5aabcSBarry 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()
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith    Level: intermediate
1715c6c1daeSBarry Smith 
17295452b02SPatrick Sanan    Notes:
17395452b02SPatrick Sanan     the new points will not be displayed until a call to PetscDrawSPDraw() is made
1740afdd333SBarry Smith 
1750afdd333SBarry Smith .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw()
1760afdd333SBarry Smith 
1775c6c1daeSBarry Smith @*/
1785c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPAddPoint(PetscDrawSP sp,PetscReal *x,PetscReal *y)
1795c6c1daeSBarry Smith {
1805c6c1daeSBarry Smith   PetscErrorCode ierr;
1815c6c1daeSBarry Smith   PetscInt       i;
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith   PetscFunctionBegin;
1845c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
185e118a51fSLisandro Dalcin 
1865c6c1daeSBarry Smith   if (sp->loc+sp->dim >= sp->len) { /* allocate more space */
1875c6c1daeSBarry Smith     PetscReal *tmpx,*tmpy;
188999739cfSJacob 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);
189999739cfSJacob Faibussowitsch     ierr     = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
190580bdb30SBarry Smith     ierr     = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr);
191580bdb30SBarry Smith     ierr     = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr);
1925c6c1daeSBarry Smith     ierr     = PetscFree2(sp->x,sp->y);CHKERRQ(ierr);
1935c6c1daeSBarry Smith     sp->x    = tmpx;
1945c6c1daeSBarry Smith     sp->y    = tmpy;
195999739cfSJacob Faibussowitsch     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
1965c6c1daeSBarry Smith   }
1975c6c1daeSBarry Smith   for (i=0; i<sp->dim; i++) {
1985c6c1daeSBarry Smith     if (x[i] > sp->xmax) sp->xmax = x[i];
1995c6c1daeSBarry Smith     if (x[i] < sp->xmin) sp->xmin = x[i];
2005c6c1daeSBarry Smith     if (y[i] > sp->ymax) sp->ymax = y[i];
2015c6c1daeSBarry Smith     if (y[i] < sp->ymin) sp->ymin = y[i];
2025c6c1daeSBarry Smith 
2035c6c1daeSBarry Smith     sp->x[sp->loc]   = x[i];
2045c6c1daeSBarry Smith     sp->y[sp->loc++] = y[i];
2055c6c1daeSBarry Smith   }
2065c6c1daeSBarry Smith   sp->nopts++;
2075c6c1daeSBarry Smith   PetscFunctionReturn(0);
2085c6c1daeSBarry Smith }
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith /*@C
2115c6c1daeSBarry Smith    PetscDrawSPAddPoints - Adds several points to each of the scatter plots.
2125c6c1daeSBarry Smith 
2135b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith    Input Parameters:
2165c6c1daeSBarry Smith +  sp - the LineGraph data structure
2175c6c1daeSBarry Smith .  xx,yy - points to two arrays of pointers that point to arrays
2185c6c1daeSBarry Smith            containing the new x and y points for each curve.
2195c6c1daeSBarry Smith -  n - number of points being added
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith    Level: intermediate
2225c6c1daeSBarry Smith 
22395452b02SPatrick Sanan    Notes:
22495452b02SPatrick Sanan     the new points will not be displayed until a call to PetscDrawSPDraw() is made
2250afdd333SBarry Smith 
2260afdd333SBarry Smith .seealso: PetscDrawSPAddPoint(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw()
2275c6c1daeSBarry Smith @*/
2285c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPAddPoints(PetscDrawSP sp,int n,PetscReal **xx,PetscReal **yy)
2295c6c1daeSBarry Smith {
2305c6c1daeSBarry Smith   PetscErrorCode ierr;
2315c6c1daeSBarry Smith   PetscInt       i,j,k;
2325c6c1daeSBarry Smith   PetscReal      *x,*y;
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith   PetscFunctionBegin;
2355c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith   if (sp->loc+n*sp->dim >= sp->len) { /* allocate more space */
2385c6c1daeSBarry Smith     PetscReal *tmpx,*tmpy;
239999739cfSJacob Faibussowitsch     PetscInt  chunk = PETSC_DRAW_SP_CHUNK_SIZE;
2405c6c1daeSBarry Smith     if (n > chunk) chunk = n;
241dcca6d9dSJed Brown     ierr = PetscMalloc2(sp->len+sp->dim*chunk,&tmpx,sp->len+sp->dim*chunk,&tmpy);CHKERRQ(ierr);
242999739cfSJacob Faibussowitsch     ierr = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr);
243580bdb30SBarry Smith     ierr = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr);
244580bdb30SBarry Smith     ierr = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr);
2455c6c1daeSBarry Smith     ierr = PetscFree2(sp->x,sp->y);CHKERRQ(ierr);
246a297a907SKarl Rupp 
2475c6c1daeSBarry Smith     sp->x    = tmpx;
2485c6c1daeSBarry Smith     sp->y    = tmpy;
249999739cfSJacob Faibussowitsch     sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE;
2505c6c1daeSBarry Smith   }
2515c6c1daeSBarry Smith   for (j=0; j<sp->dim; j++) {
2525c6c1daeSBarry Smith     x = xx[j]; y = yy[j];
2535c6c1daeSBarry Smith     k = sp->loc + j;
2545c6c1daeSBarry Smith     for (i=0; i<n; i++) {
2555c6c1daeSBarry Smith       if (x[i] > sp->xmax) sp->xmax = x[i];
2565c6c1daeSBarry Smith       if (x[i] < sp->xmin) sp->xmin = x[i];
2575c6c1daeSBarry Smith       if (y[i] > sp->ymax) sp->ymax = y[i];
2585c6c1daeSBarry Smith       if (y[i] < sp->ymin) sp->ymin = y[i];
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith       sp->x[k] = x[i];
2615c6c1daeSBarry Smith       sp->y[k] = y[i];
2625c6c1daeSBarry Smith       k       += sp->dim;
2635c6c1daeSBarry Smith     }
2645c6c1daeSBarry Smith   }
2655c6c1daeSBarry Smith   sp->loc   += n*sp->dim;
2665c6c1daeSBarry Smith   sp->nopts += n;
2675c6c1daeSBarry Smith   PetscFunctionReturn(0);
2685c6c1daeSBarry Smith }
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith /*@
2715c6c1daeSBarry Smith    PetscDrawSPDraw - Redraws a scatter plot.
2725c6c1daeSBarry Smith 
2735b399a63SLisandro Dalcin    Collective on PetscDrawSP
2745c6c1daeSBarry Smith 
275d8d19677SJose E. Roman    Input Parameters:
2765c6c1daeSBarry Smith +  sp - the line graph context
2775c6c1daeSBarry Smith -  clear - clear the window before drawing the new plot
2785c6c1daeSBarry Smith 
2795c6c1daeSBarry Smith    Level: intermediate
2805c6c1daeSBarry Smith 
2810afdd333SBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawLGSPDraw(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints()
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith @*/
2845c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPDraw(PetscDrawSP sp, PetscBool clear)
2855c6c1daeSBarry Smith {
286e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
2875c6c1daeSBarry Smith   PetscErrorCode ierr;
2885c6c1daeSBarry Smith   PetscMPIInt    rank;
289e118a51fSLisandro Dalcin   PetscBool      isnull;
290e118a51fSLisandro Dalcin   PetscDraw      draw;
2915c6c1daeSBarry Smith 
2925c6c1daeSBarry Smith   PetscFunctionBegin;
2935c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
2948f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(sp->win,&isnull);CHKERRQ(ierr);
2958f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
296ffc4695bSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)sp),&rank);CHKERRMPI(ierr);
297e118a51fSLisandro Dalcin 
2985b399a63SLisandro Dalcin   if (sp->xmin > sp->xmax || sp->ymin > sp->ymax) PetscFunctionReturn(0);
2995b399a63SLisandro Dalcin   if (sp->nopts < 1) PetscFunctionReturn(0);
3005b399a63SLisandro Dalcin 
3015b399a63SLisandro Dalcin   draw = sp->win;
3025c6c1daeSBarry Smith   if (clear) {
3035c6c1daeSBarry Smith     ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
3045b399a63SLisandro Dalcin     ierr = PetscDrawClear(draw);CHKERRQ(ierr);
3055c6c1daeSBarry Smith   }
306e118a51fSLisandro Dalcin 
307e118a51fSLisandro Dalcin   xmin = sp->xmin; xmax = sp->xmax; ymin = sp->ymin; ymax = sp->ymax;
3085c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(sp->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
3095c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(sp->axis);CHKERRQ(ierr);
3105c6c1daeSBarry Smith 
3115b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
312dd400576SPatrick Sanan   if (rank == 0) {
313e118a51fSLisandro Dalcin     int i,j,dim=sp->dim,nopts=sp->nopts;
3145c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
3155c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
3165c6c1daeSBarry Smith         ierr = PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
3175c6c1daeSBarry Smith       }
3185c6c1daeSBarry Smith     }
3195c6c1daeSBarry Smith   }
320e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
3215b399a63SLisandro Dalcin 
3225b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
323e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
3245c6c1daeSBarry Smith   PetscFunctionReturn(0);
3255c6c1daeSBarry Smith }
3265c6c1daeSBarry Smith 
32757fd6651SLisandro Dalcin /*@
32857fd6651SLisandro Dalcin    PetscDrawSPSave - Saves a drawn image
32957fd6651SLisandro Dalcin 
33057fd6651SLisandro Dalcin    Collective on PetscDrawSP
33157fd6651SLisandro Dalcin 
33257fd6651SLisandro Dalcin    Input Parameter:
33357fd6651SLisandro Dalcin .  sp - the scatter plot context
33457fd6651SLisandro Dalcin 
33557fd6651SLisandro Dalcin    Level: intermediate
33657fd6651SLisandro Dalcin 
33757fd6651SLisandro Dalcin .seealso:  PetscDrawSPCreate(), PetscDrawSPGetDraw(), PetscDrawSetSave(), PetscDrawSave()
33857fd6651SLisandro Dalcin @*/
33957fd6651SLisandro Dalcin PetscErrorCode  PetscDrawSPSave(PetscDrawSP sp)
34057fd6651SLisandro Dalcin {
34157fd6651SLisandro Dalcin   PetscErrorCode ierr;
34257fd6651SLisandro Dalcin 
34357fd6651SLisandro Dalcin   PetscFunctionBegin;
34457fd6651SLisandro Dalcin   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
34557fd6651SLisandro Dalcin   ierr = PetscDrawSave(sp->win);CHKERRQ(ierr);
34657fd6651SLisandro Dalcin   PetscFunctionReturn(0);
34757fd6651SLisandro Dalcin }
34857fd6651SLisandro Dalcin 
3495c6c1daeSBarry Smith /*@
35034a5a0e3SBarry Smith    PetscDrawSPSetLimits - Sets the axis limits for a scatter plot If more
3515c6c1daeSBarry Smith    points are added after this call, the limits will be adjusted to
3525c6c1daeSBarry Smith    include those additional points.
3535c6c1daeSBarry Smith 
3545b399a63SLisandro Dalcin    Logically Collective on PetscDrawSP
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith    Input Parameters:
3575c6c1daeSBarry Smith +  xsp - the line graph context
3585c6c1daeSBarry Smith -  x_min,x_max,y_min,y_max - the limits
3595c6c1daeSBarry Smith 
3605c6c1daeSBarry Smith    Level: intermediate
3615c6c1daeSBarry Smith 
3620afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPGetAxis()
3635c6c1daeSBarry Smith @*/
3645c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPSetLimits(PetscDrawSP sp,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
3655c6c1daeSBarry Smith {
3665c6c1daeSBarry Smith   PetscFunctionBegin;
3675c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
3685c6c1daeSBarry Smith   sp->xmin = x_min;
3695c6c1daeSBarry Smith   sp->xmax = x_max;
3705c6c1daeSBarry Smith   sp->ymin = y_min;
3715c6c1daeSBarry Smith   sp->ymax = y_max;
3725c6c1daeSBarry Smith   PetscFunctionReturn(0);
3735c6c1daeSBarry Smith }
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith /*@C
3765c6c1daeSBarry Smith    PetscDrawSPGetAxis - Gets the axis context associated with a line graph.
3775c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
3785c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
3795c6c1daeSBarry Smith    application code.
3805c6c1daeSBarry Smith 
381e118a51fSLisandro Dalcin    Not Collective, if PetscDrawSP is parallel then PetscDrawAxis is parallel
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith    Input Parameter:
3845c6c1daeSBarry Smith .  sp - the line graph context
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith    Output Parameter:
3875c6c1daeSBarry Smith .  axis - the axis context
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith    Level: intermediate
3905c6c1daeSBarry Smith 
3910afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawAxis, PetscDrawAxisCreate()
3920afdd333SBarry Smith 
3935c6c1daeSBarry Smith @*/
3945c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPGetAxis(PetscDrawSP sp,PetscDrawAxis *axis)
3955c6c1daeSBarry Smith {
3965c6c1daeSBarry Smith   PetscFunctionBegin;
3975c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
39845f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
3995c6c1daeSBarry Smith   *axis = sp->axis;
4005c6c1daeSBarry Smith   PetscFunctionReturn(0);
4015c6c1daeSBarry Smith }
4025c6c1daeSBarry Smith 
4035c6c1daeSBarry Smith /*@C
4045c6c1daeSBarry Smith    PetscDrawSPGetDraw - Gets the draw context associated with a line graph.
4055c6c1daeSBarry Smith 
4065c6c1daeSBarry Smith    Not Collective, PetscDraw is parallel if PetscDrawSP is parallel
4075c6c1daeSBarry Smith 
4085c6c1daeSBarry Smith    Input Parameter:
4095c6c1daeSBarry Smith .  sp - the line graph context
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith    Output Parameter:
4125c6c1daeSBarry Smith .  draw - the draw context
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith    Level: intermediate
4155c6c1daeSBarry Smith 
4160afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDraw
4175c6c1daeSBarry Smith @*/
4185c6c1daeSBarry Smith PetscErrorCode  PetscDrawSPGetDraw(PetscDrawSP sp,PetscDraw *draw)
4195c6c1daeSBarry Smith {
4205c6c1daeSBarry Smith   PetscFunctionBegin;
421e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1);
42245f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
423e118a51fSLisandro Dalcin   *draw = sp->win;
4245c6c1daeSBarry Smith   PetscFunctionReturn(0);
4255c6c1daeSBarry Smith }
426