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