Date: 2022-03-31T04:46:02+00:00

Actual source code: lg.c

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

      4: /*@
      5:    PetscDrawLGAddCommonPoint - Adds another point to each of the line graphs. All the points share
      6:       the same new X coordinate.  The new point must have an X coordinate larger than the old points.

      8:    Logically Collective on PetscDrawLG

     10:    Input Parameters:
     11: +  lg - the LineGraph data structure
     12: .   x - the common x coordinate point
     13: -   y - the new y coordinate point for each curve.

     15:    Level: intermediate

     17:    Note: You must call PetscDrawLGDraw() to display any added points
     18:          Call PetscDrawLGReset() to remove all points

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

     28:   if (lg->loc+lg->dim >= lg->len) { /* allocate more space */
     29:     PetscReal *tmpx,*tmpy;
     30:     PetscMalloc2(lg->len+lg->dim*PETSC_DRAW_LG_CHUNK_SIZE,&tmpx,lg->len+lg->dim*PETSC_DRAW_LG_CHUNK_SIZE,&tmpy);
     31:     PetscLogObjectMemory((PetscObject)lg,2*lg->dim*PETSC_DRAW_LG_CHUNK_SIZE*sizeof(PetscReal));
     32:     PetscArraycpy(tmpx,lg->x,lg->len);
     33:     PetscArraycpy(tmpy,lg->y,lg->len);
     34:     PetscFree2(lg->x,lg->y);
     35:     lg->x    = tmpx;
     36:     lg->y    = tmpy;
     37:     lg->len += lg->dim*PETSC_DRAW_LG_CHUNK_SIZE;
     38:   }
     39:   for (i=0; i<lg->dim; i++) {
     40:     if (x > lg->xmax) lg->xmax = x;
     41:     if (x < lg->xmin) lg->xmin = x;
     42:     if (y[i] > lg->ymax) lg->ymax = y[i];
     43:     if (y[i] < lg->ymin) lg->ymin = y[i];

     45:     lg->x[lg->loc]   = x;
     46:     lg->y[lg->loc++] = y[i];
     47:   }
     48:   lg->nopts++;
     49:   return 0;
     50: }

     52: /*@
     53:    PetscDrawLGAddPoint - Adds another point to each of the line graphs.
     54:    The new point must have an X coordinate larger than the old points.

     56:    Logically Collective on PetscDrawLG

     58:    Input Parameters:
     59: +  lg - the LineGraph data structure
     60: -  x, y - the points to two arrays containing the new x and y
     61:           point for each curve.

     63:    Note: You must call PetscDrawLGDraw() to display any added points
     64:          Call PetscDrawLGReset() to remove all points

     66:    Level: intermediate

     68: .seealso: PetscDrawLGCreate(), PetscDrawLGAddPoints(), PetscDrawLGAddCommonPoint(), PetscDrawLGReset(), PetscDrawLGDraw()
     69: @*/
     70: PetscErrorCode  PetscDrawLGAddPoint(PetscDrawLG lg,const PetscReal *x,const PetscReal *y)
     71: {
     72:   PetscInt       i;
     73:   PetscReal      xx;

     77:   if (lg->loc+lg->dim >= lg->len) { /* allocate more space */
     78:     PetscReal *tmpx,*tmpy;
     79:     PetscMalloc2(lg->len+lg->dim*PETSC_DRAW_LG_CHUNK_SIZE,&tmpx,lg->len+lg->dim*PETSC_DRAW_LG_CHUNK_SIZE,&tmpy);
     80:     PetscLogObjectMemory((PetscObject)lg,2*lg->dim*PETSC_DRAW_LG_CHUNK_SIZE*sizeof(PetscReal));
     81:     PetscArraycpy(tmpx,lg->x,lg->len);
     82:     PetscArraycpy(tmpy,lg->y,lg->len);
     83:     PetscFree2(lg->x,lg->y);
     84:     lg->x    = tmpx;
     85:     lg->y    = tmpy;
     86:     lg->len += lg->dim*PETSC_DRAW_LG_CHUNK_SIZE;
     87:   }
     88:   for (i=0; i<lg->dim; i++) {
     89:     if (!x) {
     90:       xx = lg->nopts;
     91:     } else {
     92:       xx = x[i];
     93:     }
     94:     if (xx > lg->xmax) lg->xmax = xx;
     95:     if (xx < lg->xmin) lg->xmin = xx;
     96:     if (y[i] > lg->ymax) lg->ymax = y[i];
     97:     if (y[i] < lg->ymin) lg->ymin = y[i];

     99:     lg->x[lg->loc]   = xx;
    100:     lg->y[lg->loc++] = y[i];
    101:   }
    102:   lg->nopts++;
    103:   return 0;
    104: }

    106: /*@C
    107:    PetscDrawLGAddPoints - Adds several points to each of the line graphs.
    108:    The new points must have an X coordinate larger than the old points.

    110:    Logically Collective on PetscDrawLG

    112:    Input Parameters:
    113: +  lg - the LineGraph data structure
    114: .  xx,yy - points to two arrays of pointers that point to arrays
    115:            containing the new x and y points for each curve.
    116: -  n - number of points being added

    118:    Level: intermediate

    120:    Note: You must call PetscDrawLGDraw() to display any added points
    121:          Call PetscDrawLGReset() to remove all points

    123: .seealso: PetscDrawLGCreate(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGReset(), PetscDrawLGDraw()
    124: @*/
    125: PetscErrorCode  PetscDrawLGAddPoints(PetscDrawLG lg,PetscInt n,PetscReal **xx,PetscReal **yy)
    126: {
    127:   PetscInt       i,j,k;
    128:   PetscReal      *x,*y;

    132:   if (lg->loc+n*lg->dim >= lg->len) { /* allocate more space */
    133:     PetscReal *tmpx,*tmpy;
    134:     PetscInt  chunk = PETSC_DRAW_LG_CHUNK_SIZE;

    136:     if (n > chunk) chunk = n;
    137:     PetscMalloc2(lg->len+lg->dim*chunk,&tmpx,lg->len+lg->dim*chunk,&tmpy);
    138:     PetscLogObjectMemory((PetscObject)lg,2*lg->dim*chunk*sizeof(PetscReal));
    139:     PetscArraycpy(tmpx,lg->x,lg->len);
    140:     PetscArraycpy(tmpy,lg->y,lg->len);
    141:     PetscFree2(lg->x,lg->y);
    142:     lg->x    = tmpx;
    143:     lg->y    = tmpy;
    144:     lg->len += lg->dim*chunk;
    145:   }
    146:   for (j=0; j<lg->dim; j++) {
    147:     x = xx[j]; y = yy[j];
    148:     k = lg->loc + j;
    149:     for (i=0; i<n; i++) {
    150:       if (x[i] > lg->xmax) lg->xmax = x[i];
    151:       if (x[i] < lg->xmin) lg->xmin = x[i];
    152:       if (y[i] > lg->ymax) lg->ymax = y[i];
    153:       if (y[i] < lg->ymin) lg->ymin = y[i];

    155:       lg->x[k] = x[i];
    156:       lg->y[k] = y[i];
    157:       k       += lg->dim;
    158:     }
    159:   }
    160:   lg->loc   += n*lg->dim;
    161:   lg->nopts += n;
    162:   return 0;
    163: }