15c6c1daeSBarry Smith /* 25c6c1daeSBarry Smith Contains the data structure for drawing scatter plots 35c6c1daeSBarry Smith graphs in a window with an axis. This is intended for scatter 45c6c1daeSBarry Smith plots that change dynamically. 55c6c1daeSBarry Smith */ 65c6c1daeSBarry Smith 79804daf3SBarry Smith #include <petscdraw.h> /*I "petscdraw.h" I*/ 8999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.h> /*I "petscsys.h" I*/ 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith PetscClassId PETSC_DRAWSP_CLASSID = 0; 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith /*@C 135c6c1daeSBarry Smith PetscDrawSPCreate - Creates a scatter plot data structure. 145c6c1daeSBarry Smith 155b399a63SLisandro Dalcin Collective on PetscDraw 165c6c1daeSBarry Smith 175c6c1daeSBarry Smith Input Parameters: 185c6c1daeSBarry Smith + win - the window where the graph will be made. 195c6c1daeSBarry Smith - dim - the number of sets of points which will be drawn 205c6c1daeSBarry Smith 215c6c1daeSBarry Smith Output Parameters: 225c6c1daeSBarry Smith . drawsp - the scatter plot context 235c6c1daeSBarry Smith 245c6c1daeSBarry Smith Level: intermediate 255c6c1daeSBarry Smith 2695452b02SPatrick Sanan Notes: 2795452b02SPatrick Sanan Add points to the plot with PetscDrawSPAddPoint() or PetscDrawSPAddPoints(); the new points are not displayed until PetscDrawSPDraw() is called. 280afdd333SBarry Smith 290afdd333SBarry Smith PetscDrawSPReset() removes all the points that have been added 300afdd333SBarry Smith 317e25d57eSBarry Smith The MPI communicator that owns the PetscDraw owns this PetscDrawSP, but the calls to set options and add points are ignored on all processes except the 327e25d57eSBarry Smith zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawSPDraw() to display the updated graph. 337e25d57eSBarry Smith 340afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawBarCreate(), PetscDrawBar, PetscDrawHGCreate(), PetscDrawHG, PetscDrawSPDestroy(), PetscDraw, PetscDrawSP, PetscDrawSPSetDimension(), PetscDrawSPReset(), 350afdd333SBarry Smith PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw(), PetscDrawSPSave(), PetscDrawSPSetLimits(), PetscDrawSPGetAxis(),PetscDrawAxis, PetscDrawSPGetDraw() 365c6c1daeSBarry Smith @*/ 375c6c1daeSBarry Smith PetscErrorCode PetscDrawSPCreate(PetscDraw draw,int dim,PetscDrawSP *drawsp) 385c6c1daeSBarry Smith { 395c6c1daeSBarry Smith PetscDrawSP sp; 40e118a51fSLisandro Dalcin PetscErrorCode ierr; 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith PetscFunctionBegin; 435c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 44e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(draw,dim,2); 455c6c1daeSBarry Smith PetscValidPointer(drawsp,3); 46e118a51fSLisandro Dalcin 4771917b75SLisandro Dalcin ierr = PetscHeaderCreate(sp,PETSC_DRAWSP_CLASSID,"DrawSP","Scatter Plot","Draw",PetscObjectComm((PetscObject)draw),PetscDrawSPDestroy,NULL);CHKERRQ(ierr); 48e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)sp);CHKERRQ(ierr); 49e118a51fSLisandro Dalcin 50e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 515c6c1daeSBarry Smith sp->win = draw; 52e118a51fSLisandro Dalcin 53e118a51fSLisandro Dalcin sp->view = NULL; 54e118a51fSLisandro Dalcin sp->destroy = NULL; 55e118a51fSLisandro Dalcin sp->nopts = 0; 565c6c1daeSBarry Smith sp->dim = dim; 575c6c1daeSBarry Smith sp->xmin = 1.e20; 585c6c1daeSBarry Smith sp->ymin = 1.e20; 595c6c1daeSBarry Smith sp->xmax = -1.e20; 605c6c1daeSBarry Smith sp->ymax = -1.e20; 61*8c87cf4dSdanfinn sp->zmax = 1.; 62*8c87cf4dSdanfinn sp->zmin = 1.e20; 63*8c87cf4dSdanfinn sp->colorized = PETSC_FALSE; 64a297a907SKarl Rupp 65*8c87cf4dSdanfinn ierr = PetscMalloc3(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->z);CHKERRQ(ierr); 66999739cfSJacob Faibussowitsch ierr = PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr); 67a297a907SKarl Rupp 68999739cfSJacob Faibussowitsch sp->len = dim*PETSC_DRAW_SP_CHUNK_SIZE; 695c6c1daeSBarry Smith sp->loc = 0; 70a297a907SKarl Rupp 715c6c1daeSBarry Smith ierr = PetscDrawAxisCreate(draw,&sp->axis);CHKERRQ(ierr); 723bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)sp,(PetscObject)sp->axis);CHKERRQ(ierr); 73a297a907SKarl Rupp 745c6c1daeSBarry Smith *drawsp = sp; 755c6c1daeSBarry Smith PetscFunctionReturn(0); 765c6c1daeSBarry Smith } 775c6c1daeSBarry Smith 785c6c1daeSBarry Smith /*@ 795c6c1daeSBarry Smith PetscDrawSPSetDimension - Change the number of sets of points that are to be drawn. 805c6c1daeSBarry Smith 815b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 825c6c1daeSBarry Smith 83d8d19677SJose E. Roman Input Parameters: 845c6c1daeSBarry Smith + sp - the line graph context. 855c6c1daeSBarry Smith - dim - the number of curves. 865c6c1daeSBarry Smith 875c6c1daeSBarry Smith Level: intermediate 885c6c1daeSBarry Smith 890afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints() 900afdd333SBarry Smith 915c6c1daeSBarry Smith @*/ 925c6c1daeSBarry Smith PetscErrorCode PetscDrawSPSetDimension(PetscDrawSP sp,int dim) 935c6c1daeSBarry Smith { 945c6c1daeSBarry Smith PetscErrorCode ierr; 955c6c1daeSBarry Smith 965c6c1daeSBarry Smith PetscFunctionBegin; 975c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 98e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(sp,dim,2); 995c6c1daeSBarry Smith if (sp->dim == dim) PetscFunctionReturn(0); 1005c6c1daeSBarry Smith 1015c6c1daeSBarry Smith ierr = PetscFree2(sp->x,sp->y);CHKERRQ(ierr); 1025c6c1daeSBarry Smith sp->dim = dim; 103999739cfSJacob Faibussowitsch ierr = PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y);CHKERRQ(ierr); 104999739cfSJacob Faibussowitsch ierr = PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr); 105999739cfSJacob Faibussowitsch sp->len = dim*PETSC_DRAW_SP_CHUNK_SIZE; 1065c6c1daeSBarry Smith PetscFunctionReturn(0); 1075c6c1daeSBarry Smith } 1085c6c1daeSBarry Smith 1095c6c1daeSBarry Smith /*@ 1105c6c1daeSBarry Smith PetscDrawSPReset - Clears line graph to allow for reuse with new data. 1115c6c1daeSBarry Smith 1125b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 1135c6c1daeSBarry Smith 1145c6c1daeSBarry Smith Input Parameter: 1155c6c1daeSBarry Smith . sp - the line graph context. 1165c6c1daeSBarry Smith 1175c6c1daeSBarry Smith Level: intermediate 1185c6c1daeSBarry Smith 1190afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw() 1205c6c1daeSBarry Smith @*/ 1215c6c1daeSBarry Smith PetscErrorCode PetscDrawSPReset(PetscDrawSP sp) 1225c6c1daeSBarry Smith { 1235c6c1daeSBarry Smith PetscFunctionBegin; 1245c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 1255c6c1daeSBarry Smith sp->xmin = 1.e20; 1265c6c1daeSBarry Smith sp->ymin = 1.e20; 127*8c87cf4dSdanfinn sp->zmin = 1.e20; 1285c6c1daeSBarry Smith sp->xmax = -1.e20; 1295c6c1daeSBarry Smith sp->ymax = -1.e20; 130*8c87cf4dSdanfinn sp->zmax = -1.e20; 1315c6c1daeSBarry Smith sp->loc = 0; 1325c6c1daeSBarry Smith sp->nopts = 0; 1335c6c1daeSBarry Smith PetscFunctionReturn(0); 1345c6c1daeSBarry Smith } 1355c6c1daeSBarry Smith 1365c6c1daeSBarry Smith /*@C 1375c6c1daeSBarry Smith PetscDrawSPDestroy - Frees all space taken up by scatter plot data structure. 1385c6c1daeSBarry Smith 1395b399a63SLisandro Dalcin Collective on PetscDrawSP 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith Input Parameter: 1425c6c1daeSBarry Smith . sp - the line graph context 1435c6c1daeSBarry Smith 1445c6c1daeSBarry Smith Level: intermediate 1455c6c1daeSBarry Smith 1460afdd333SBarry Smith .seealso: PetscDrawSPCreate(), PetscDrawSP, PetscDrawSPReset() 1470afdd333SBarry Smith 1485c6c1daeSBarry Smith @*/ 1495c6c1daeSBarry Smith PetscErrorCode PetscDrawSPDestroy(PetscDrawSP *sp) 1505c6c1daeSBarry Smith { 1515c6c1daeSBarry Smith PetscErrorCode ierr; 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith PetscFunctionBegin; 1545c6c1daeSBarry Smith if (!*sp) PetscFunctionReturn(0); 155e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*sp,PETSC_DRAWSP_CLASSID,1); 156e118a51fSLisandro Dalcin if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);} 1575c6c1daeSBarry Smith 158*8c87cf4dSdanfinn ierr = PetscFree3((*sp)->x,(*sp)->y,(*sp)->z);CHKERRQ(ierr); 159e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*sp)->axis);CHKERRQ(ierr); 160e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*sp)->win);CHKERRQ(ierr); 1615c6c1daeSBarry Smith ierr = PetscHeaderDestroy(sp);CHKERRQ(ierr); 1625c6c1daeSBarry Smith PetscFunctionReturn(0); 1635c6c1daeSBarry Smith } 1645c6c1daeSBarry Smith 1655c6c1daeSBarry Smith /*@ 1665c6c1daeSBarry Smith PetscDrawSPAddPoint - Adds another point to each of the scatter plots. 1675c6c1daeSBarry Smith 1685b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith Input Parameters: 1715c6c1daeSBarry Smith + sp - the scatter plot data structure 1722cf5aabcSBarry 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() 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith Level: intermediate 1755c6c1daeSBarry Smith 17695452b02SPatrick Sanan Notes: 17795452b02SPatrick Sanan the new points will not be displayed until a call to PetscDrawSPDraw() is made 1780afdd333SBarry Smith 179*8c87cf4dSdanfinn .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPointColorized() 1800afdd333SBarry Smith 1815c6c1daeSBarry Smith @*/ 1825c6c1daeSBarry Smith PetscErrorCode PetscDrawSPAddPoint(PetscDrawSP sp,PetscReal *x,PetscReal *y) 1835c6c1daeSBarry Smith { 1845c6c1daeSBarry Smith PetscErrorCode ierr; 1855c6c1daeSBarry Smith PetscInt i; 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith PetscFunctionBegin; 1885c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 189e118a51fSLisandro Dalcin 1905c6c1daeSBarry Smith if (sp->loc+sp->dim >= sp->len) { /* allocate more space */ 1915c6c1daeSBarry Smith PetscReal *tmpx,*tmpy; 192999739cfSJacob 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); 193999739cfSJacob Faibussowitsch ierr = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr); 194580bdb30SBarry Smith ierr = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr); 195580bdb30SBarry Smith ierr = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr); 1965c6c1daeSBarry Smith ierr = PetscFree2(sp->x,sp->y);CHKERRQ(ierr); 1975c6c1daeSBarry Smith sp->x = tmpx; 1985c6c1daeSBarry Smith sp->y = tmpy; 199999739cfSJacob Faibussowitsch sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE; 2005c6c1daeSBarry Smith } 2015c6c1daeSBarry Smith for (i=0; i<sp->dim; i++) { 2025c6c1daeSBarry Smith if (x[i] > sp->xmax) sp->xmax = x[i]; 2035c6c1daeSBarry Smith if (x[i] < sp->xmin) sp->xmin = x[i]; 2045c6c1daeSBarry Smith if (y[i] > sp->ymax) sp->ymax = y[i]; 2055c6c1daeSBarry Smith if (y[i] < sp->ymin) sp->ymin = y[i]; 2065c6c1daeSBarry Smith 2075c6c1daeSBarry Smith sp->x[sp->loc] = x[i]; 2085c6c1daeSBarry Smith sp->y[sp->loc++] = y[i]; 2095c6c1daeSBarry Smith } 2105c6c1daeSBarry Smith sp->nopts++; 2115c6c1daeSBarry Smith PetscFunctionReturn(0); 2125c6c1daeSBarry Smith } 2135c6c1daeSBarry Smith 2145c6c1daeSBarry Smith /*@C 2155c6c1daeSBarry Smith PetscDrawSPAddPoints - Adds several points to each of the scatter plots. 2165c6c1daeSBarry Smith 2175b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith Input Parameters: 2205c6c1daeSBarry Smith + sp - the LineGraph data structure 2215c6c1daeSBarry Smith . xx,yy - points to two arrays of pointers that point to arrays 2225c6c1daeSBarry Smith containing the new x and y points for each curve. 2235c6c1daeSBarry Smith - n - number of points being added 2245c6c1daeSBarry Smith 2255c6c1daeSBarry Smith Level: intermediate 2265c6c1daeSBarry Smith 22795452b02SPatrick Sanan Notes: 22895452b02SPatrick Sanan the new points will not be displayed until a call to PetscDrawSPDraw() is made 2290afdd333SBarry Smith 230*8c87cf4dSdanfinn .seealso: PetscDrawSPAddPoint(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPointColorized() 2315c6c1daeSBarry Smith @*/ 2325c6c1daeSBarry Smith PetscErrorCode PetscDrawSPAddPoints(PetscDrawSP sp,int n,PetscReal **xx,PetscReal **yy) 2335c6c1daeSBarry Smith { 2345c6c1daeSBarry Smith PetscErrorCode ierr; 2355c6c1daeSBarry Smith PetscInt i,j,k; 2365c6c1daeSBarry Smith PetscReal *x,*y; 2375c6c1daeSBarry Smith 2385c6c1daeSBarry Smith PetscFunctionBegin; 2395c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 2405c6c1daeSBarry Smith 2415c6c1daeSBarry Smith if (sp->loc+n*sp->dim >= sp->len) { /* allocate more space */ 2425c6c1daeSBarry Smith PetscReal *tmpx,*tmpy; 243999739cfSJacob Faibussowitsch PetscInt chunk = PETSC_DRAW_SP_CHUNK_SIZE; 2445c6c1daeSBarry Smith if (n > chunk) chunk = n; 245dcca6d9dSJed Brown ierr = PetscMalloc2(sp->len+sp->dim*chunk,&tmpx,sp->len+sp->dim*chunk,&tmpy);CHKERRQ(ierr); 246999739cfSJacob Faibussowitsch ierr = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr); 247580bdb30SBarry Smith ierr = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr); 248580bdb30SBarry Smith ierr = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr); 2495c6c1daeSBarry Smith ierr = PetscFree2(sp->x,sp->y);CHKERRQ(ierr); 250a297a907SKarl Rupp 2515c6c1daeSBarry Smith sp->x = tmpx; 2525c6c1daeSBarry Smith sp->y = tmpy; 253999739cfSJacob Faibussowitsch sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE; 2545c6c1daeSBarry Smith } 2555c6c1daeSBarry Smith for (j=0; j<sp->dim; j++) { 2565c6c1daeSBarry Smith x = xx[j]; y = yy[j]; 2575c6c1daeSBarry Smith k = sp->loc + j; 2585c6c1daeSBarry Smith for (i=0; i<n; i++) { 2595c6c1daeSBarry Smith if (x[i] > sp->xmax) sp->xmax = x[i]; 2605c6c1daeSBarry Smith if (x[i] < sp->xmin) sp->xmin = x[i]; 2615c6c1daeSBarry Smith if (y[i] > sp->ymax) sp->ymax = y[i]; 2625c6c1daeSBarry Smith if (y[i] < sp->ymin) sp->ymin = y[i]; 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith sp->x[k] = x[i]; 2655c6c1daeSBarry Smith sp->y[k] = y[i]; 2665c6c1daeSBarry Smith k += sp->dim; 2675c6c1daeSBarry Smith } 2685c6c1daeSBarry Smith } 2695c6c1daeSBarry Smith sp->loc += n*sp->dim; 2705c6c1daeSBarry Smith sp->nopts += n; 2715c6c1daeSBarry Smith PetscFunctionReturn(0); 2725c6c1daeSBarry Smith } 2735c6c1daeSBarry Smith 2745c6c1daeSBarry Smith /*@ 275*8c87cf4dSdanfinn PetscDrawSPAddPointColorized - Adds another point to each of the scatter plots as well as a numeric value to be used to colorize the scatter point. 276*8c87cf4dSdanfinn 277*8c87cf4dSdanfinn Logically Collective on PetscDrawSP 278*8c87cf4dSdanfinn 279*8c87cf4dSdanfinn Input Parameters: 280*8c87cf4dSdanfinn + sp - the scatter plot data structure 281*8c87cf4dSdanfinn . 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() 282*8c87cf4dSdanfinn - z - array of length dim containing the numeric values that will be mapped to [0,255] and used for scatter point colors. 283*8c87cf4dSdanfinn 284*8c87cf4dSdanfinn Level: intermediate 285*8c87cf4dSdanfinn 286*8c87cf4dSdanfinn Notes: 287*8c87cf4dSdanfinn the new points will not be displayed until a call to PetscDrawSPDraw() is made 288*8c87cf4dSdanfinn 289*8c87cf4dSdanfinn .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPoint() 290*8c87cf4dSdanfinn 291*8c87cf4dSdanfinn @*/ 292*8c87cf4dSdanfinn PetscErrorCode PetscDrawSPAddPointColorized(PetscDrawSP sp,PetscReal *x,PetscReal *y,PetscReal *z) 293*8c87cf4dSdanfinn { 294*8c87cf4dSdanfinn PetscErrorCode ierr; 295*8c87cf4dSdanfinn PetscInt i; 296*8c87cf4dSdanfinn 297*8c87cf4dSdanfinn PetscFunctionBegin; 298*8c87cf4dSdanfinn PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 299*8c87cf4dSdanfinn sp->colorized = PETSC_TRUE; 300*8c87cf4dSdanfinn if (sp->loc+sp->dim >= sp->len) { /* allocate more space */ 301*8c87cf4dSdanfinn PetscReal *tmpx,*tmpy,*tmpz; 302*8c87cf4dSdanfinn ierr = PetscMalloc3(sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpx,sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpy,sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpz);CHKERRQ(ierr); 303*8c87cf4dSdanfinn ierr = PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal));CHKERRQ(ierr); 304*8c87cf4dSdanfinn ierr = PetscArraycpy(tmpx,sp->x,sp->len);CHKERRQ(ierr); 305*8c87cf4dSdanfinn ierr = PetscArraycpy(tmpy,sp->y,sp->len);CHKERRQ(ierr); 306*8c87cf4dSdanfinn ierr = PetscArraycpy(tmpz,sp->z,sp->len);CHKERRQ(ierr); 307*8c87cf4dSdanfinn ierr = PetscFree3(sp->x,sp->y,sp->z);CHKERRQ(ierr); 308*8c87cf4dSdanfinn sp->x = tmpx; 309*8c87cf4dSdanfinn sp->y = tmpy; 310*8c87cf4dSdanfinn sp->z = tmpz; 311*8c87cf4dSdanfinn sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE; 312*8c87cf4dSdanfinn } 313*8c87cf4dSdanfinn for (i=0; i<sp->dim; i++) { 314*8c87cf4dSdanfinn if (x[i] > sp->xmax) sp->xmax = x[i]; 315*8c87cf4dSdanfinn if (x[i] < sp->xmin) sp->xmin = x[i]; 316*8c87cf4dSdanfinn if (y[i] > sp->ymax) sp->ymax = y[i]; 317*8c87cf4dSdanfinn if (y[i] < sp->ymin) sp->ymin = y[i]; 318*8c87cf4dSdanfinn if (z[i] < sp->zmin) sp->zmin = z[i]; 319*8c87cf4dSdanfinn if (z[i] > sp->zmax) sp->zmax = z[i]; 320*8c87cf4dSdanfinn // if (z[i] > sp->zmax && z[i] < 5.) sp->zmax = z[i]; 321*8c87cf4dSdanfinn 322*8c87cf4dSdanfinn sp->x[sp->loc] = x[i]; 323*8c87cf4dSdanfinn sp->y[sp->loc] = y[i]; 324*8c87cf4dSdanfinn sp->z[sp->loc++] = z[i]; 325*8c87cf4dSdanfinn } 326*8c87cf4dSdanfinn sp->nopts++; 327*8c87cf4dSdanfinn PetscFunctionReturn(0); 328*8c87cf4dSdanfinn } 329*8c87cf4dSdanfinn 330*8c87cf4dSdanfinn /*@ 3315c6c1daeSBarry Smith PetscDrawSPDraw - Redraws a scatter plot. 3325c6c1daeSBarry Smith 3335b399a63SLisandro Dalcin Collective on PetscDrawSP 3345c6c1daeSBarry Smith 335d8d19677SJose E. Roman Input Parameters: 3365c6c1daeSBarry Smith + sp - the line graph context 3375c6c1daeSBarry Smith - clear - clear the window before drawing the new plot 3385c6c1daeSBarry Smith 3395c6c1daeSBarry Smith Level: intermediate 3405c6c1daeSBarry Smith 3410afdd333SBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawLGSPDraw(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints() 3425c6c1daeSBarry Smith 3435c6c1daeSBarry Smith @*/ 3445c6c1daeSBarry Smith PetscErrorCode PetscDrawSPDraw(PetscDrawSP sp, PetscBool clear) 3455c6c1daeSBarry Smith { 346e118a51fSLisandro Dalcin PetscReal xmin,xmax,ymin,ymax; 3475c6c1daeSBarry Smith PetscErrorCode ierr; 3485c6c1daeSBarry Smith PetscMPIInt rank; 349*8c87cf4dSdanfinn PetscInt color; 350e118a51fSLisandro Dalcin PetscBool isnull; 351e118a51fSLisandro Dalcin PetscDraw draw; 3525c6c1daeSBarry Smith 3535c6c1daeSBarry Smith PetscFunctionBegin; 3545c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 3558f69470aSLisandro Dalcin ierr = PetscDrawIsNull(sp->win,&isnull);CHKERRQ(ierr); 3568f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 357ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)sp),&rank);CHKERRMPI(ierr); 358e118a51fSLisandro Dalcin 3595b399a63SLisandro Dalcin if (sp->xmin > sp->xmax || sp->ymin > sp->ymax) PetscFunctionReturn(0); 3605b399a63SLisandro Dalcin if (sp->nopts < 1) PetscFunctionReturn(0); 3615b399a63SLisandro Dalcin 3625b399a63SLisandro Dalcin draw = sp->win; 3635c6c1daeSBarry Smith if (clear) { 3645c6c1daeSBarry Smith ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 3655b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 3665c6c1daeSBarry Smith } 367e118a51fSLisandro Dalcin 368e118a51fSLisandro Dalcin xmin = sp->xmin; xmax = sp->xmax; ymin = sp->ymin; ymax = sp->ymax; 3695c6c1daeSBarry Smith ierr = PetscDrawAxisSetLimits(sp->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 3705c6c1daeSBarry Smith ierr = PetscDrawAxisDraw(sp->axis);CHKERRQ(ierr); 3715c6c1daeSBarry Smith 3725b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 373dd400576SPatrick Sanan if (rank == 0) { 374e118a51fSLisandro Dalcin int i,j,dim=sp->dim,nopts=sp->nopts; 3755c6c1daeSBarry Smith for (i=0; i<dim; i++) { 3765c6c1daeSBarry Smith for (j=0; j<nopts; j++) { 377*8c87cf4dSdanfinn if (sp->colorized) { 378*8c87cf4dSdanfinn color = PetscDrawRealToColor(sp->z[j*dim],sp->zmin,sp->zmax); 379*8c87cf4dSdanfinn ierr = PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],color);CHKERRQ(ierr); 380*8c87cf4dSdanfinn } else { 3815c6c1daeSBarry Smith ierr = PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr); 3825c6c1daeSBarry Smith } 3835c6c1daeSBarry Smith } 3845c6c1daeSBarry Smith } 385*8c87cf4dSdanfinn } 386e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 3875b399a63SLisandro Dalcin 3885b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 389e118a51fSLisandro Dalcin ierr = PetscDrawPause(draw);CHKERRQ(ierr); 3905c6c1daeSBarry Smith PetscFunctionReturn(0); 3915c6c1daeSBarry Smith } 3925c6c1daeSBarry Smith 39357fd6651SLisandro Dalcin /*@ 39457fd6651SLisandro Dalcin PetscDrawSPSave - Saves a drawn image 39557fd6651SLisandro Dalcin 39657fd6651SLisandro Dalcin Collective on PetscDrawSP 39757fd6651SLisandro Dalcin 39857fd6651SLisandro Dalcin Input Parameter: 39957fd6651SLisandro Dalcin . sp - the scatter plot context 40057fd6651SLisandro Dalcin 40157fd6651SLisandro Dalcin Level: intermediate 40257fd6651SLisandro Dalcin 40357fd6651SLisandro Dalcin .seealso: PetscDrawSPCreate(), PetscDrawSPGetDraw(), PetscDrawSetSave(), PetscDrawSave() 40457fd6651SLisandro Dalcin @*/ 40557fd6651SLisandro Dalcin PetscErrorCode PetscDrawSPSave(PetscDrawSP sp) 40657fd6651SLisandro Dalcin { 40757fd6651SLisandro Dalcin PetscErrorCode ierr; 40857fd6651SLisandro Dalcin 40957fd6651SLisandro Dalcin PetscFunctionBegin; 41057fd6651SLisandro Dalcin PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 41157fd6651SLisandro Dalcin ierr = PetscDrawSave(sp->win);CHKERRQ(ierr); 41257fd6651SLisandro Dalcin PetscFunctionReturn(0); 41357fd6651SLisandro Dalcin } 41457fd6651SLisandro Dalcin 4155c6c1daeSBarry Smith /*@ 41634a5a0e3SBarry Smith PetscDrawSPSetLimits - Sets the axis limits for a scatter plot If more 4175c6c1daeSBarry Smith points are added after this call, the limits will be adjusted to 4185c6c1daeSBarry Smith include those additional points. 4195c6c1daeSBarry Smith 4205b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 4215c6c1daeSBarry Smith 4225c6c1daeSBarry Smith Input Parameters: 4235c6c1daeSBarry Smith + xsp - the line graph context 4245c6c1daeSBarry Smith - x_min,x_max,y_min,y_max - the limits 4255c6c1daeSBarry Smith 4265c6c1daeSBarry Smith Level: intermediate 4275c6c1daeSBarry Smith 4280afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPGetAxis() 4295c6c1daeSBarry Smith @*/ 4305c6c1daeSBarry Smith PetscErrorCode PetscDrawSPSetLimits(PetscDrawSP sp,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max) 4315c6c1daeSBarry Smith { 4325c6c1daeSBarry Smith PetscFunctionBegin; 4335c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 4345c6c1daeSBarry Smith sp->xmin = x_min; 4355c6c1daeSBarry Smith sp->xmax = x_max; 4365c6c1daeSBarry Smith sp->ymin = y_min; 4375c6c1daeSBarry Smith sp->ymax = y_max; 4385c6c1daeSBarry Smith PetscFunctionReturn(0); 4395c6c1daeSBarry Smith } 4405c6c1daeSBarry Smith 4415c6c1daeSBarry Smith /*@C 4425c6c1daeSBarry Smith PetscDrawSPGetAxis - Gets the axis context associated with a line graph. 4435c6c1daeSBarry Smith This is useful if one wants to change some axis property, such as 4445c6c1daeSBarry Smith labels, color, etc. The axis context should not be destroyed by the 4455c6c1daeSBarry Smith application code. 4465c6c1daeSBarry Smith 447e118a51fSLisandro Dalcin Not Collective, if PetscDrawSP is parallel then PetscDrawAxis is parallel 4485c6c1daeSBarry Smith 4495c6c1daeSBarry Smith Input Parameter: 4505c6c1daeSBarry Smith . sp - the line graph context 4515c6c1daeSBarry Smith 4525c6c1daeSBarry Smith Output Parameter: 4535c6c1daeSBarry Smith . axis - the axis context 4545c6c1daeSBarry Smith 4555c6c1daeSBarry Smith Level: intermediate 4565c6c1daeSBarry Smith 4570afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawAxis, PetscDrawAxisCreate() 4580afdd333SBarry Smith 4595c6c1daeSBarry Smith @*/ 4605c6c1daeSBarry Smith PetscErrorCode PetscDrawSPGetAxis(PetscDrawSP sp,PetscDrawAxis *axis) 4615c6c1daeSBarry Smith { 4625c6c1daeSBarry Smith PetscFunctionBegin; 4635c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 46445f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 4655c6c1daeSBarry Smith *axis = sp->axis; 4665c6c1daeSBarry Smith PetscFunctionReturn(0); 4675c6c1daeSBarry Smith } 4685c6c1daeSBarry Smith 4695c6c1daeSBarry Smith /*@C 4705c6c1daeSBarry Smith PetscDrawSPGetDraw - Gets the draw context associated with a line graph. 4715c6c1daeSBarry Smith 4725c6c1daeSBarry Smith Not Collective, PetscDraw is parallel if PetscDrawSP is parallel 4735c6c1daeSBarry Smith 4745c6c1daeSBarry Smith Input Parameter: 4755c6c1daeSBarry Smith . sp - the line graph context 4765c6c1daeSBarry Smith 4775c6c1daeSBarry Smith Output Parameter: 4785c6c1daeSBarry Smith . draw - the draw context 4795c6c1daeSBarry Smith 4805c6c1daeSBarry Smith Level: intermediate 4815c6c1daeSBarry Smith 4820afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDraw 4835c6c1daeSBarry Smith @*/ 4845c6c1daeSBarry Smith PetscErrorCode PetscDrawSPGetDraw(PetscDrawSP sp,PetscDraw *draw) 4855c6c1daeSBarry Smith { 4865c6c1daeSBarry Smith PetscFunctionBegin; 487e118a51fSLisandro Dalcin PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 48845f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 489e118a51fSLisandro Dalcin *draw = sp->win; 4905c6c1daeSBarry Smith PetscFunctionReturn(0); 4915c6c1daeSBarry Smith } 492