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 @*/
PetscDrawLGAddCommonPoint(PetscDrawLG lg,const PetscReal x,const PetscReal * y)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 @*/
PetscDrawLGAddPoint(PetscDrawLG lg,const PetscReal * x,const PetscReal * y)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 @*/
PetscDrawLGAddPoints(PetscDrawLG lg,PetscInt n,PetscReal * xx[],PetscReal * yy[])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