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