Actual source code: lg.c

      1: #include <petsc/private/drawimpl.h>

      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.

      7:   Logically Collective

      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.

     14:   Level: intermediate

     16:   Notes:
     17:   You must call `PetscDrawLGDraw()` to display any added points

     19:   Call `PetscDrawLGReset()` to remove all points

     21: .seealso: `PetscDrawLG`, `PetscDrawLGCreate()`, `PetscDrawLGAddPoints()`, `PetscDrawLGAddPoint()`, `PetscDrawLGReset()`, `PetscDrawLGDraw()`
     22: @*/
     23: PetscErrorCode PetscDrawLGAddCommonPoint(PetscDrawLG lg, const PetscReal x, const PetscReal *y)
     24: {
     25:   PetscInt i;

     27:   PetscFunctionBegin;

     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];

     46:     lg->x[lg->loc]   = x;
     47:     lg->y[lg->loc++] = y[i];
     48:   }
     49:   lg->nopts++;
     50:   PetscFunctionReturn(PETSC_SUCCESS);
     51: }

     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.

     57:   Logically Collective

     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

     64:   Level: intermediate

     66:   Notes:
     67:   You must call `PetscDrawLGDraw()` to display any added points

     69:   Call `PetscDrawLGReset()` to remove all points

     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;

     78:   PetscFunctionBegin;

     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];

    102:     lg->x[lg->loc]   = xx;
    103:     lg->y[lg->loc++] = y[i];
    104:   }
    105:   lg->nopts++;
    106:   PetscFunctionReturn(PETSC_SUCCESS);
    107: }

    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.

    113:   Logically Collective

    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

    121:   Level: intermediate

    123:   Notes:
    124:   You must call `PetscDrawLGDraw()` to display any added points

    126:   Call `PetscDrawLGReset()` to remove all points

    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;

    136:   PetscFunctionBegin;
    138:   PetscCall(PetscCIntCast(n, &in));

    140:   if (lg->loc + n * lg->dim >= lg->len) { /* allocate more space */
    141:     PetscReal *tmpx, *tmpy;
    142:     int        chunk = PETSC_DRAW_LG_CHUNK_SIZE;

    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];

    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: }