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; 405c6c1daeSBarry Smith 415c6c1daeSBarry Smith PetscFunctionBegin; 425c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 43e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(draw,dim,2); 445c6c1daeSBarry Smith PetscValidPointer(drawsp,3); 45e118a51fSLisandro Dalcin 46*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(sp,PETSC_DRAWSP_CLASSID,"DrawSP","Scatter Plot","Draw",PetscObjectComm((PetscObject)draw),PetscDrawSPDestroy,NULL)); 47*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectParent((PetscObject)draw,(PetscObject)sp)); 48e118a51fSLisandro Dalcin 49*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectReference((PetscObject)draw)); 505c6c1daeSBarry Smith sp->win = draw; 51e118a51fSLisandro Dalcin 52e118a51fSLisandro Dalcin sp->view = NULL; 53e118a51fSLisandro Dalcin sp->destroy = NULL; 54e118a51fSLisandro Dalcin sp->nopts = 0; 555c6c1daeSBarry Smith sp->dim = dim; 565c6c1daeSBarry Smith sp->xmin = 1.e20; 575c6c1daeSBarry Smith sp->ymin = 1.e20; 585c6c1daeSBarry Smith sp->xmax = -1.e20; 595c6c1daeSBarry Smith sp->ymax = -1.e20; 608c87cf4dSdanfinn sp->zmax = 1.; 618c87cf4dSdanfinn sp->zmin = 1.e20; 628c87cf4dSdanfinn sp->colorized = PETSC_FALSE; 63a297a907SKarl Rupp 64*5f80ce2aSJacob Faibussowitsch CHKERRQ(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)); 65*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal))); 66a297a907SKarl Rupp 67999739cfSJacob Faibussowitsch sp->len = dim*PETSC_DRAW_SP_CHUNK_SIZE; 685c6c1daeSBarry Smith sp->loc = 0; 69a297a907SKarl Rupp 70*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisCreate(draw,&sp->axis)); 71*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectParent((PetscObject)sp,(PetscObject)sp->axis)); 72a297a907SKarl Rupp 735c6c1daeSBarry Smith *drawsp = sp; 745c6c1daeSBarry Smith PetscFunctionReturn(0); 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith /*@ 785c6c1daeSBarry Smith PetscDrawSPSetDimension - Change the number of sets of points that are to be drawn. 795c6c1daeSBarry Smith 805b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 815c6c1daeSBarry Smith 82d8d19677SJose E. Roman Input Parameters: 835c6c1daeSBarry Smith + sp - the line graph context. 845c6c1daeSBarry Smith - dim - the number of curves. 855c6c1daeSBarry Smith 865c6c1daeSBarry Smith Level: intermediate 875c6c1daeSBarry Smith 880afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints() 890afdd333SBarry Smith 905c6c1daeSBarry Smith @*/ 915c6c1daeSBarry Smith PetscErrorCode PetscDrawSPSetDimension(PetscDrawSP sp,int dim) 925c6c1daeSBarry Smith { 935c6c1daeSBarry Smith PetscFunctionBegin; 945c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 95e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(sp,dim,2); 965c6c1daeSBarry Smith if (sp->dim == dim) PetscFunctionReturn(0); 975c6c1daeSBarry Smith 98*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree2(sp->x,sp->y)); 995c6c1daeSBarry Smith sp->dim = dim; 100*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc2(dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->x,dim*PETSC_DRAW_SP_CHUNK_SIZE,&sp->y)); 101*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal))); 102999739cfSJacob Faibussowitsch sp->len = dim*PETSC_DRAW_SP_CHUNK_SIZE; 1035c6c1daeSBarry Smith PetscFunctionReturn(0); 1045c6c1daeSBarry Smith } 1055c6c1daeSBarry Smith 1065c6c1daeSBarry Smith /*@ 1075c6c1daeSBarry Smith PetscDrawSPReset - Clears line graph to allow for reuse with new data. 1085c6c1daeSBarry Smith 1095b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 1105c6c1daeSBarry Smith 1115c6c1daeSBarry Smith Input Parameter: 1125c6c1daeSBarry Smith . sp - the line graph context. 1135c6c1daeSBarry Smith 1145c6c1daeSBarry Smith Level: intermediate 1155c6c1daeSBarry Smith 1160afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPDraw() 1175c6c1daeSBarry Smith @*/ 1185c6c1daeSBarry Smith PetscErrorCode PetscDrawSPReset(PetscDrawSP sp) 1195c6c1daeSBarry Smith { 1205c6c1daeSBarry Smith PetscFunctionBegin; 1215c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 1225c6c1daeSBarry Smith sp->xmin = 1.e20; 1235c6c1daeSBarry Smith sp->ymin = 1.e20; 1248c87cf4dSdanfinn sp->zmin = 1.e20; 1255c6c1daeSBarry Smith sp->xmax = -1.e20; 1265c6c1daeSBarry Smith sp->ymax = -1.e20; 1278c87cf4dSdanfinn sp->zmax = -1.e20; 1285c6c1daeSBarry Smith sp->loc = 0; 1295c6c1daeSBarry Smith sp->nopts = 0; 1305c6c1daeSBarry Smith PetscFunctionReturn(0); 1315c6c1daeSBarry Smith } 1325c6c1daeSBarry Smith 1335c6c1daeSBarry Smith /*@C 1345c6c1daeSBarry Smith PetscDrawSPDestroy - Frees all space taken up by scatter plot data structure. 1355c6c1daeSBarry Smith 1365b399a63SLisandro Dalcin Collective on PetscDrawSP 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith Input Parameter: 1395c6c1daeSBarry Smith . sp - the line graph context 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith Level: intermediate 1425c6c1daeSBarry Smith 1430afdd333SBarry Smith .seealso: PetscDrawSPCreate(), PetscDrawSP, PetscDrawSPReset() 1440afdd333SBarry Smith 1455c6c1daeSBarry Smith @*/ 1465c6c1daeSBarry Smith PetscErrorCode PetscDrawSPDestroy(PetscDrawSP *sp) 1475c6c1daeSBarry Smith { 1485c6c1daeSBarry Smith PetscFunctionBegin; 1495c6c1daeSBarry Smith if (!*sp) PetscFunctionReturn(0); 150e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*sp,PETSC_DRAWSP_CLASSID,1); 151e118a51fSLisandro Dalcin if (--((PetscObject)(*sp))->refct > 0) {*sp = NULL; PetscFunctionReturn(0);} 1525c6c1daeSBarry Smith 153*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree3((*sp)->x,(*sp)->y,(*sp)->z)); 154*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDestroy(&(*sp)->axis)); 155*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawDestroy(&(*sp)->win)); 156*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(sp)); 1575c6c1daeSBarry Smith PetscFunctionReturn(0); 1585c6c1daeSBarry Smith } 1595c6c1daeSBarry Smith 1605c6c1daeSBarry Smith /*@ 1615c6c1daeSBarry Smith PetscDrawSPAddPoint - Adds another point to each of the scatter plots. 1625c6c1daeSBarry Smith 1635b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 1645c6c1daeSBarry Smith 1655c6c1daeSBarry Smith Input Parameters: 1665c6c1daeSBarry Smith + sp - the scatter plot data structure 1672cf5aabcSBarry 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() 1685c6c1daeSBarry Smith 1695c6c1daeSBarry Smith Level: intermediate 1705c6c1daeSBarry Smith 17195452b02SPatrick Sanan Notes: 17295452b02SPatrick Sanan the new points will not be displayed until a call to PetscDrawSPDraw() is made 1730afdd333SBarry Smith 1748c87cf4dSdanfinn .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPointColorized() 1750afdd333SBarry Smith 1765c6c1daeSBarry Smith @*/ 1775c6c1daeSBarry Smith PetscErrorCode PetscDrawSPAddPoint(PetscDrawSP sp,PetscReal *x,PetscReal *y) 1785c6c1daeSBarry Smith { 1795c6c1daeSBarry Smith PetscInt i; 1805c6c1daeSBarry Smith 1815c6c1daeSBarry Smith PetscFunctionBegin; 1825c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 183e118a51fSLisandro Dalcin 1845c6c1daeSBarry Smith if (sp->loc+sp->dim >= sp->len) { /* allocate more space */ 1855c6c1daeSBarry Smith PetscReal *tmpx,*tmpy; 186*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc2(sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpx,sp->len+sp->dim*PETSC_DRAW_SP_CHUNK_SIZE,&tmpy)); 187*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal))); 188*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpx,sp->x,sp->len)); 189*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpy,sp->y,sp->len)); 190*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree2(sp->x,sp->y)); 1915c6c1daeSBarry Smith sp->x = tmpx; 1925c6c1daeSBarry Smith sp->y = tmpy; 193999739cfSJacob Faibussowitsch sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE; 1945c6c1daeSBarry Smith } 1955c6c1daeSBarry Smith for (i=0; i<sp->dim; i++) { 1965c6c1daeSBarry Smith if (x[i] > sp->xmax) sp->xmax = x[i]; 1975c6c1daeSBarry Smith if (x[i] < sp->xmin) sp->xmin = x[i]; 1985c6c1daeSBarry Smith if (y[i] > sp->ymax) sp->ymax = y[i]; 1995c6c1daeSBarry Smith if (y[i] < sp->ymin) sp->ymin = y[i]; 2005c6c1daeSBarry Smith 2015c6c1daeSBarry Smith sp->x[sp->loc] = x[i]; 2025c6c1daeSBarry Smith sp->y[sp->loc++] = y[i]; 2035c6c1daeSBarry Smith } 2045c6c1daeSBarry Smith sp->nopts++; 2055c6c1daeSBarry Smith PetscFunctionReturn(0); 2065c6c1daeSBarry Smith } 2075c6c1daeSBarry Smith 2085c6c1daeSBarry Smith /*@C 2095c6c1daeSBarry Smith PetscDrawSPAddPoints - Adds several points to each of the scatter plots. 2105c6c1daeSBarry Smith 2115b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 2125c6c1daeSBarry Smith 2135c6c1daeSBarry Smith Input Parameters: 2145c6c1daeSBarry Smith + sp - the LineGraph data structure 2155c6c1daeSBarry Smith . xx,yy - points to two arrays of pointers that point to arrays 2165c6c1daeSBarry Smith containing the new x and y points for each curve. 2175c6c1daeSBarry Smith - n - number of points being added 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith Level: intermediate 2205c6c1daeSBarry Smith 22195452b02SPatrick Sanan Notes: 22295452b02SPatrick Sanan the new points will not be displayed until a call to PetscDrawSPDraw() is made 2230afdd333SBarry Smith 2248c87cf4dSdanfinn .seealso: PetscDrawSPAddPoint(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPointColorized() 2255c6c1daeSBarry Smith @*/ 2265c6c1daeSBarry Smith PetscErrorCode PetscDrawSPAddPoints(PetscDrawSP sp,int n,PetscReal **xx,PetscReal **yy) 2275c6c1daeSBarry Smith { 2285c6c1daeSBarry Smith PetscInt i,j,k; 2295c6c1daeSBarry Smith PetscReal *x,*y; 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith PetscFunctionBegin; 2325c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 2335c6c1daeSBarry Smith 2345c6c1daeSBarry Smith if (sp->loc+n*sp->dim >= sp->len) { /* allocate more space */ 2355c6c1daeSBarry Smith PetscReal *tmpx,*tmpy; 236999739cfSJacob Faibussowitsch PetscInt chunk = PETSC_DRAW_SP_CHUNK_SIZE; 2375c6c1daeSBarry Smith if (n > chunk) chunk = n; 238*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc2(sp->len+sp->dim*chunk,&tmpx,sp->len+sp->dim*chunk,&tmpy)); 239*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal))); 240*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpx,sp->x,sp->len)); 241*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpy,sp->y,sp->len)); 242*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree2(sp->x,sp->y)); 243a297a907SKarl Rupp 2445c6c1daeSBarry Smith sp->x = tmpx; 2455c6c1daeSBarry Smith sp->y = tmpy; 246999739cfSJacob Faibussowitsch sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE; 2475c6c1daeSBarry Smith } 2485c6c1daeSBarry Smith for (j=0; j<sp->dim; j++) { 2495c6c1daeSBarry Smith x = xx[j]; y = yy[j]; 2505c6c1daeSBarry Smith k = sp->loc + j; 2515c6c1daeSBarry Smith for (i=0; i<n; i++) { 2525c6c1daeSBarry Smith if (x[i] > sp->xmax) sp->xmax = x[i]; 2535c6c1daeSBarry Smith if (x[i] < sp->xmin) sp->xmin = x[i]; 2545c6c1daeSBarry Smith if (y[i] > sp->ymax) sp->ymax = y[i]; 2555c6c1daeSBarry Smith if (y[i] < sp->ymin) sp->ymin = y[i]; 2565c6c1daeSBarry Smith 2575c6c1daeSBarry Smith sp->x[k] = x[i]; 2585c6c1daeSBarry Smith sp->y[k] = y[i]; 2595c6c1daeSBarry Smith k += sp->dim; 2605c6c1daeSBarry Smith } 2615c6c1daeSBarry Smith } 2625c6c1daeSBarry Smith sp->loc += n*sp->dim; 2635c6c1daeSBarry Smith sp->nopts += n; 2645c6c1daeSBarry Smith PetscFunctionReturn(0); 2655c6c1daeSBarry Smith } 2665c6c1daeSBarry Smith 2675c6c1daeSBarry Smith /*@ 2688c87cf4dSdanfinn PetscDrawSPAddPointColorized - Adds another point to each of the scatter plots as well as a numeric value to be used to colorize the scatter point. 2698c87cf4dSdanfinn 2708c87cf4dSdanfinn Logically Collective on PetscDrawSP 2718c87cf4dSdanfinn 2728c87cf4dSdanfinn Input Parameters: 2738c87cf4dSdanfinn + sp - the scatter plot data structure 2748c87cf4dSdanfinn . 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() 2758c87cf4dSdanfinn - z - array of length dim containing the numeric values that will be mapped to [0,255] and used for scatter point colors. 2768c87cf4dSdanfinn 2778c87cf4dSdanfinn Level: intermediate 2788c87cf4dSdanfinn 2798c87cf4dSdanfinn Notes: 2808c87cf4dSdanfinn the new points will not be displayed until a call to PetscDrawSPDraw() is made 2818c87cf4dSdanfinn 2828c87cf4dSdanfinn .seealso: PetscDrawSPAddPoints(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPDraw(), PetscDrawSPAddPoint() 2838c87cf4dSdanfinn 2848c87cf4dSdanfinn @*/ 2858c87cf4dSdanfinn PetscErrorCode PetscDrawSPAddPointColorized(PetscDrawSP sp,PetscReal *x,PetscReal *y,PetscReal *z) 2868c87cf4dSdanfinn { 2878c87cf4dSdanfinn PetscInt i; 2888c87cf4dSdanfinn 2898c87cf4dSdanfinn PetscFunctionBegin; 2908c87cf4dSdanfinn PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 2918c87cf4dSdanfinn sp->colorized = PETSC_TRUE; 2928c87cf4dSdanfinn if (sp->loc+sp->dim >= sp->len) { /* allocate more space */ 2938c87cf4dSdanfinn PetscReal *tmpx,*tmpy,*tmpz; 294*5f80ce2aSJacob Faibussowitsch CHKERRQ(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)); 295*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)sp,2*sp->dim*PETSC_DRAW_SP_CHUNK_SIZE*sizeof(PetscReal))); 296*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpx,sp->x,sp->len)); 297*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpy,sp->y,sp->len)); 298*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(tmpz,sp->z,sp->len)); 299*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree3(sp->x,sp->y,sp->z)); 3008c87cf4dSdanfinn sp->x = tmpx; 3018c87cf4dSdanfinn sp->y = tmpy; 3028c87cf4dSdanfinn sp->z = tmpz; 3038c87cf4dSdanfinn sp->len += sp->dim*PETSC_DRAW_SP_CHUNK_SIZE; 3048c87cf4dSdanfinn } 3058c87cf4dSdanfinn for (i=0; i<sp->dim; i++) { 3068c87cf4dSdanfinn if (x[i] > sp->xmax) sp->xmax = x[i]; 3078c87cf4dSdanfinn if (x[i] < sp->xmin) sp->xmin = x[i]; 3088c87cf4dSdanfinn if (y[i] > sp->ymax) sp->ymax = y[i]; 3098c87cf4dSdanfinn if (y[i] < sp->ymin) sp->ymin = y[i]; 3108c87cf4dSdanfinn if (z[i] < sp->zmin) sp->zmin = z[i]; 3118c87cf4dSdanfinn if (z[i] > sp->zmax) sp->zmax = z[i]; 3128c87cf4dSdanfinn // if (z[i] > sp->zmax && z[i] < 5.) sp->zmax = z[i]; 3138c87cf4dSdanfinn 3148c87cf4dSdanfinn sp->x[sp->loc] = x[i]; 3158c87cf4dSdanfinn sp->y[sp->loc] = y[i]; 3168c87cf4dSdanfinn sp->z[sp->loc++] = z[i]; 3178c87cf4dSdanfinn } 3188c87cf4dSdanfinn sp->nopts++; 3198c87cf4dSdanfinn PetscFunctionReturn(0); 3208c87cf4dSdanfinn } 3218c87cf4dSdanfinn 3228c87cf4dSdanfinn /*@ 3235c6c1daeSBarry Smith PetscDrawSPDraw - Redraws a scatter plot. 3245c6c1daeSBarry Smith 3255b399a63SLisandro Dalcin Collective on PetscDrawSP 3265c6c1daeSBarry Smith 327d8d19677SJose E. Roman Input Parameters: 3285c6c1daeSBarry Smith + sp - the line graph context 3295c6c1daeSBarry Smith - clear - clear the window before drawing the new plot 3305c6c1daeSBarry Smith 3315c6c1daeSBarry Smith Level: intermediate 3325c6c1daeSBarry Smith 3330afdd333SBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawLGSPDraw(), PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPReset(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints() 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith @*/ 3365c6c1daeSBarry Smith PetscErrorCode PetscDrawSPDraw(PetscDrawSP sp, PetscBool clear) 3375c6c1daeSBarry Smith { 338e118a51fSLisandro Dalcin PetscReal xmin,xmax,ymin,ymax; 3395c6c1daeSBarry Smith PetscMPIInt rank; 3408c87cf4dSdanfinn PetscInt color; 341e118a51fSLisandro Dalcin PetscBool isnull; 342e118a51fSLisandro Dalcin PetscDraw draw; 343*5f80ce2aSJacob Faibussowitsch PetscErrorCode ierr; 3445c6c1daeSBarry Smith 3455c6c1daeSBarry Smith PetscFunctionBegin; 3465c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 347*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawIsNull(sp->win,&isnull)); 3488f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 349*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)sp),&rank)); 350e118a51fSLisandro Dalcin 3515b399a63SLisandro Dalcin if (sp->xmin > sp->xmax || sp->ymin > sp->ymax) PetscFunctionReturn(0); 3525b399a63SLisandro Dalcin if (sp->nopts < 1) PetscFunctionReturn(0); 3535b399a63SLisandro Dalcin 3545b399a63SLisandro Dalcin draw = sp->win; 3555c6c1daeSBarry Smith if (clear) { 356*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawCheckResizedWindow(draw)); 357*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawClear(draw)); 3585c6c1daeSBarry Smith } 359e118a51fSLisandro Dalcin 360e118a51fSLisandro Dalcin xmin = sp->xmin; xmax = sp->xmax; ymin = sp->ymin; ymax = sp->ymax; 361*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisSetLimits(sp->axis,xmin,xmax,ymin,ymax)); 362*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDraw(sp->axis)); 3635c6c1daeSBarry Smith 3645b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 365dd400576SPatrick Sanan if (rank == 0) { 366e118a51fSLisandro Dalcin int i,j,dim=sp->dim,nopts=sp->nopts; 3675c6c1daeSBarry Smith for (i=0; i<dim; i++) { 3685c6c1daeSBarry Smith for (j=0; j<nopts; j++) { 3698c87cf4dSdanfinn if (sp->colorized) { 3708c87cf4dSdanfinn color = PetscDrawRealToColor(sp->z[j*dim],sp->zmin,sp->zmax); 371*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],color)); 3728c87cf4dSdanfinn } else { 373*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawPoint(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED)); 3745c6c1daeSBarry Smith } 3755c6c1daeSBarry Smith } 3765c6c1daeSBarry Smith } 3778c87cf4dSdanfinn } 378e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 3795b399a63SLisandro Dalcin 380*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawFlush(draw)); 381*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawPause(draw)); 3825c6c1daeSBarry Smith PetscFunctionReturn(0); 3835c6c1daeSBarry Smith } 3845c6c1daeSBarry Smith 38557fd6651SLisandro Dalcin /*@ 38657fd6651SLisandro Dalcin PetscDrawSPSave - Saves a drawn image 38757fd6651SLisandro Dalcin 38857fd6651SLisandro Dalcin Collective on PetscDrawSP 38957fd6651SLisandro Dalcin 39057fd6651SLisandro Dalcin Input Parameter: 39157fd6651SLisandro Dalcin . sp - the scatter plot context 39257fd6651SLisandro Dalcin 39357fd6651SLisandro Dalcin Level: intermediate 39457fd6651SLisandro Dalcin 39557fd6651SLisandro Dalcin .seealso: PetscDrawSPCreate(), PetscDrawSPGetDraw(), PetscDrawSetSave(), PetscDrawSave() 39657fd6651SLisandro Dalcin @*/ 39757fd6651SLisandro Dalcin PetscErrorCode PetscDrawSPSave(PetscDrawSP sp) 39857fd6651SLisandro Dalcin { 39957fd6651SLisandro Dalcin PetscFunctionBegin; 40057fd6651SLisandro Dalcin PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 401*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawSave(sp->win)); 40257fd6651SLisandro Dalcin PetscFunctionReturn(0); 40357fd6651SLisandro Dalcin } 40457fd6651SLisandro Dalcin 4055c6c1daeSBarry Smith /*@ 40634a5a0e3SBarry Smith PetscDrawSPSetLimits - Sets the axis limits for a scatter plot If more 4075c6c1daeSBarry Smith points are added after this call, the limits will be adjusted to 4085c6c1daeSBarry Smith include those additional points. 4095c6c1daeSBarry Smith 4105b399a63SLisandro Dalcin Logically Collective on PetscDrawSP 4115c6c1daeSBarry Smith 4125c6c1daeSBarry Smith Input Parameters: 4135c6c1daeSBarry Smith + xsp - the line graph context 4145c6c1daeSBarry Smith - x_min,x_max,y_min,y_max - the limits 4155c6c1daeSBarry Smith 4165c6c1daeSBarry Smith Level: intermediate 4175c6c1daeSBarry Smith 4180afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawSPGetAxis() 4195c6c1daeSBarry Smith @*/ 4205c6c1daeSBarry Smith PetscErrorCode PetscDrawSPSetLimits(PetscDrawSP sp,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max) 4215c6c1daeSBarry Smith { 4225c6c1daeSBarry Smith PetscFunctionBegin; 4235c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 4245c6c1daeSBarry Smith sp->xmin = x_min; 4255c6c1daeSBarry Smith sp->xmax = x_max; 4265c6c1daeSBarry Smith sp->ymin = y_min; 4275c6c1daeSBarry Smith sp->ymax = y_max; 4285c6c1daeSBarry Smith PetscFunctionReturn(0); 4295c6c1daeSBarry Smith } 4305c6c1daeSBarry Smith 4315c6c1daeSBarry Smith /*@C 4325c6c1daeSBarry Smith PetscDrawSPGetAxis - Gets the axis context associated with a line graph. 4335c6c1daeSBarry Smith This is useful if one wants to change some axis property, such as 4345c6c1daeSBarry Smith labels, color, etc. The axis context should not be destroyed by the 4355c6c1daeSBarry Smith application code. 4365c6c1daeSBarry Smith 437e118a51fSLisandro Dalcin Not Collective, if PetscDrawSP is parallel then PetscDrawAxis is parallel 4385c6c1daeSBarry Smith 4395c6c1daeSBarry Smith Input Parameter: 4405c6c1daeSBarry Smith . sp - the line graph context 4415c6c1daeSBarry Smith 4425c6c1daeSBarry Smith Output Parameter: 4435c6c1daeSBarry Smith . axis - the axis context 4445c6c1daeSBarry Smith 4455c6c1daeSBarry Smith Level: intermediate 4465c6c1daeSBarry Smith 4470afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDrawSPAddPoint(), PetscDrawSPAddPoints(), PetscDrawAxis, PetscDrawAxisCreate() 4480afdd333SBarry Smith 4495c6c1daeSBarry Smith @*/ 4505c6c1daeSBarry Smith PetscErrorCode PetscDrawSPGetAxis(PetscDrawSP sp,PetscDrawAxis *axis) 4515c6c1daeSBarry Smith { 4525c6c1daeSBarry Smith PetscFunctionBegin; 4535c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 45445f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 4555c6c1daeSBarry Smith *axis = sp->axis; 4565c6c1daeSBarry Smith PetscFunctionReturn(0); 4575c6c1daeSBarry Smith } 4585c6c1daeSBarry Smith 4595c6c1daeSBarry Smith /*@C 4605c6c1daeSBarry Smith PetscDrawSPGetDraw - Gets the draw context associated with a line graph. 4615c6c1daeSBarry Smith 4625c6c1daeSBarry Smith Not Collective, PetscDraw is parallel if PetscDrawSP is parallel 4635c6c1daeSBarry Smith 4645c6c1daeSBarry Smith Input Parameter: 4655c6c1daeSBarry Smith . sp - the line graph context 4665c6c1daeSBarry Smith 4675c6c1daeSBarry Smith Output Parameter: 4685c6c1daeSBarry Smith . draw - the draw context 4695c6c1daeSBarry Smith 4705c6c1daeSBarry Smith Level: intermediate 4715c6c1daeSBarry Smith 4720afdd333SBarry Smith .seealso: PetscDrawSP, PetscDrawSPCreate(), PetscDrawSPDraw(), PetscDraw 4735c6c1daeSBarry Smith @*/ 4745c6c1daeSBarry Smith PetscErrorCode PetscDrawSPGetDraw(PetscDrawSP sp,PetscDraw *draw) 4755c6c1daeSBarry Smith { 4765c6c1daeSBarry Smith PetscFunctionBegin; 477e118a51fSLisandro Dalcin PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,1); 47845f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 479e118a51fSLisandro Dalcin *draw = sp->win; 4805c6c1daeSBarry Smith PetscFunctionReturn(0); 4815c6c1daeSBarry Smith } 482