1 #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 2 3 /*@ 4 PetscDrawLGAddCommonPoint - Adds another point to each of the line graphs. All the points share 5 the same new X coordinate. The new point must have an X coordinate larger than the old points. 6 7 Logically Collective 8 9 Input Parameters: 10 + lg - the line graph context 11 . x - the common x coordinate point 12 - y - the new y coordinate point for each curve. 13 14 Level: intermediate 15 16 Notes: 17 You must call `PetscDrawLGDraw()` to display any added points 18 19 Call `PetscDrawLGReset()` to remove all points 20 21 .seealso: `PetscDrawLG`, `PetscDrawLGCreate()`, `PetscDrawLGAddPoints()`, `PetscDrawLGAddPoint()`, `PetscDrawLGReset()`, `PetscDrawLGDraw()` 22 @*/ 23 PetscErrorCode PetscDrawLGAddCommonPoint(PetscDrawLG lg, const PetscReal x, const PetscReal *y) 24 { 25 PetscInt i; 26 27 PetscFunctionBegin; 28 PetscValidHeaderSpecific(lg, PETSC_DRAWLG_CLASSID, 1); 29 30 if (lg->loc + lg->dim >= lg->len) { /* allocate more space */ 31 PetscReal *tmpx, *tmpy; 32 PetscCall(PetscMalloc2(lg->len + lg->dim * PETSC_DRAW_LG_CHUNK_SIZE, &tmpx, lg->len + lg->dim * PETSC_DRAW_LG_CHUNK_SIZE, &tmpy)); 33 PetscCall(PetscArraycpy(tmpx, lg->x, lg->len)); 34 PetscCall(PetscArraycpy(tmpy, lg->y, lg->len)); 35 PetscCall(PetscFree2(lg->x, lg->y)); 36 lg->x = tmpx; 37 lg->y = tmpy; 38 lg->len += lg->dim * PETSC_DRAW_LG_CHUNK_SIZE; 39 } 40 for (i = 0; i < lg->dim; i++) { 41 if (x > lg->xmax) lg->xmax = x; 42 if (x < lg->xmin) lg->xmin = x; 43 if (y[i] > lg->ymax) lg->ymax = y[i]; 44 if (y[i] < lg->ymin) lg->ymin = y[i]; 45 46 lg->x[lg->loc] = x; 47 lg->y[lg->loc++] = y[i]; 48 } 49 lg->nopts++; 50 PetscFunctionReturn(PETSC_SUCCESS); 51 } 52 53 /*@ 54 PetscDrawLGAddPoint - Adds another point to each of the line graphs. 55 The new point must have an X coordinate larger than the old points. 56 57 Logically Collective 58 59 Input Parameters: 60 + lg - the line graph context 61 . x - array containing the x coordinate for the point on each curve 62 - y - array containing the y coordinate for the point on each curve 63 64 Level: intermediate 65 66 Notes: 67 You must call `PetscDrawLGDraw()` to display any added points 68 69 Call `PetscDrawLGReset()` to remove all points 70 71 .seealso: `PetscDrawLG`, `PetscDrawLGCreate()`, `PetscDrawLGAddPoints()`, `PetscDrawLGAddCommonPoint()`, `PetscDrawLGReset()`, `PetscDrawLGDraw()` 72 @*/ 73 PetscErrorCode PetscDrawLGAddPoint(PetscDrawLG lg, const PetscReal *x, const PetscReal *y) 74 { 75 PetscInt i; 76 PetscReal xx; 77 78 PetscFunctionBegin; 79 PetscValidHeaderSpecific(lg, PETSC_DRAWLG_CLASSID, 1); 80 81 if (lg->loc + lg->dim >= lg->len) { /* allocate more space */ 82 PetscReal *tmpx, *tmpy; 83 PetscCall(PetscMalloc2(lg->len + lg->dim * PETSC_DRAW_LG_CHUNK_SIZE, &tmpx, lg->len + lg->dim * PETSC_DRAW_LG_CHUNK_SIZE, &tmpy)); 84 PetscCall(PetscArraycpy(tmpx, lg->x, lg->len)); 85 PetscCall(PetscArraycpy(tmpy, lg->y, lg->len)); 86 PetscCall(PetscFree2(lg->x, lg->y)); 87 lg->x = tmpx; 88 lg->y = tmpy; 89 lg->len += lg->dim * PETSC_DRAW_LG_CHUNK_SIZE; 90 } 91 for (i = 0; i < lg->dim; i++) { 92 if (!x) { 93 xx = (PetscReal)lg->nopts; 94 } else { 95 xx = x[i]; 96 } 97 if (xx > lg->xmax) lg->xmax = xx; 98 if (xx < lg->xmin) lg->xmin = xx; 99 if (y[i] > lg->ymax) lg->ymax = y[i]; 100 if (y[i] < lg->ymin) lg->ymin = y[i]; 101 102 lg->x[lg->loc] = xx; 103 lg->y[lg->loc++] = y[i]; 104 } 105 lg->nopts++; 106 PetscFunctionReturn(PETSC_SUCCESS); 107 } 108 109 /*@C 110 PetscDrawLGAddPoints - Adds several points to each of the line graphs. 111 The new points must have an X coordinate larger than the old points. 112 113 Logically Collective 114 115 Input Parameters: 116 + lg - the line graph context 117 . xx - array of pointers that point to arrays containing the new x coordinates for each curve. 118 . yy - array of pointers that point to arrays containing the new y points for each curve. 119 - n - number of points being added 120 121 Level: intermediate 122 123 Notes: 124 You must call `PetscDrawLGDraw()` to display any added points 125 126 Call `PetscDrawLGReset()` to remove all points 127 128 .seealso: `PetscDrawLG`, `PetscDrawLGCreate()`, `PetscDrawLGAddPoint()`, `PetscDrawLGAddCommonPoint()`, `PetscDrawLGReset()`, `PetscDrawLGDraw()` 129 @*/ 130 PetscErrorCode PetscDrawLGAddPoints(PetscDrawLG lg, PetscInt n, PetscReal *xx[], PetscReal *yy[]) 131 { 132 PetscInt i, j, k; 133 PetscReal *x, *y; 134 int in; 135 136 PetscFunctionBegin; 137 PetscValidHeaderSpecific(lg, PETSC_DRAWLG_CLASSID, 1); 138 PetscCall(PetscCIntCast(n, &in)); 139 140 if (lg->loc + n * lg->dim >= lg->len) { /* allocate more space */ 141 PetscReal *tmpx, *tmpy; 142 int chunk = PETSC_DRAW_LG_CHUNK_SIZE; 143 144 if (in > chunk) chunk = in; 145 PetscCall(PetscMalloc2(lg->len + lg->dim * chunk, &tmpx, lg->len + lg->dim * chunk, &tmpy)); 146 PetscCall(PetscArraycpy(tmpx, lg->x, lg->len)); 147 PetscCall(PetscArraycpy(tmpy, lg->y, lg->len)); 148 PetscCall(PetscFree2(lg->x, lg->y)); 149 lg->x = tmpx; 150 lg->y = tmpy; 151 lg->len += lg->dim * chunk; 152 } 153 for (j = 0; j < lg->dim; j++) { 154 x = xx[j]; 155 y = yy[j]; 156 k = lg->loc + j; 157 for (i = 0; i < n; i++) { 158 if (x[i] > lg->xmax) lg->xmax = x[i]; 159 if (x[i] < lg->xmin) lg->xmin = x[i]; 160 if (y[i] > lg->ymax) lg->ymax = y[i]; 161 if (y[i] < lg->ymin) lg->ymin = y[i]; 162 163 lg->x[k] = x[i]; 164 lg->y[k] = y[i]; 165 k += lg->dim; 166 } 167 } 168 lg->loc += in * lg->dim; 169 lg->nopts += in; 170 PetscFunctionReturn(PETSC_SUCCESS); 171 } 172