Actual source code: water.h

      1: #pragma once

      3: #include <petscsnes.h>
      4: #include <petscdmnetwork.h>

      6: #define MAXLINE               1000
      7: #define VERTEX_TYPE_RESERVOIR 0
      8: #define VERTEX_TYPE_JUNCTION  1
      9: #define VERTEX_TYPE_TANK      2
     10: #define EDGE_TYPE_PIPE        0
     11: #define EDGE_TYPE_PUMP        1
     12: #define PIPE_STATUS_OPEN      0
     13: #define PIPE_STATUS_CLOSED    1
     14: #define PIPE_STATUS_CV        2

     16: #define GPM_CFS 0.0022280023234587 /* Scaling constant for GPM to CFS conversion */

     18: typedef struct {
     19:   PetscInt compkey_edge;
     20:   PetscInt compkey_vtx;
     21: } AppCtx_Water;

     23: typedef struct {
     24:   PetscInt    id;         /* id */
     25:   PetscScalar elev;       /* elevation (ft) */
     26:   PetscScalar demand;     /* demand (gpm) */
     27:   PetscInt    dempattern; /* demand pattern id */
     28: } Junction;

     30: typedef struct {
     31:   PetscInt    id;          /* id */
     32:   PetscScalar head;        /* head (ft) */
     33:   PetscInt    headpattern; /* head pattern */
     34: } Reservoir;

     36: typedef struct {
     37:   PetscInt    id;          /* id */
     38:   PetscScalar elev;        /* elevation (ft) */
     39:   PetscScalar initlvl;     /* initial level (ft) */
     40:   PetscScalar minlvl;      /* minimum level (ft) */
     41:   PetscScalar maxlvl;      /* maximum level (ft) */
     42:   PetscScalar diam;        /* diameter (ft) */
     43:   PetscScalar minvolume;   /* minimum volume (ft^3) */
     44:   PetscInt    volumecurve; /* Volume curve id */
     45: } Tank;

     47: struct _p_VERTEX_Water {
     48:   PetscInt  id;   /* id */
     49:   PetscInt  type; /* vertex type (junction, reservoir) */
     50:   Junction  junc; /* junction data */
     51:   Reservoir res;  /* reservoir data */
     52:   Tank      tank; /* tank data */
     53: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
     54: typedef struct _p_VERTEX_Water *VERTEX_Water;

     56: typedef struct {
     57:   PetscInt    id;        /* id */
     58:   PetscInt    node1;     /* From node */
     59:   PetscInt    node2;     /* to node */
     60:   PetscScalar length;    /* length (ft) */
     61:   PetscScalar diam;      /* diameter (inches) */
     62:   PetscScalar roughness; /* roughness (dimensionless) */
     63:   PetscScalar minorloss; /* minor losses */
     64:   char        stat[16];  /* Status */
     65:   PetscInt    status;    /* Pipe status (see PIPE_STATUS_XXX definition on top) */
     66:   PetscScalar n;         /* Exponent for h = kQ^n */
     67:   PetscScalar k;
     68: } Pipe;

     70: typedef struct {
     71:   PetscInt id;           /* id */
     72:   PetscInt node1;        /* From node */
     73:   PetscInt node2;        /* to node */
     74:   char     param[16];    /* curve parameter (HEAD or ENERGY or EFFICIENCY) */
     75:   PetscInt paramid;      /* Id of the curve parameter in the CURVE data */
     76:   struct {               /* one point curve */
     77:     PetscScalar flow[3]; /* flow (gpm) */
     78:     PetscScalar head[3]; /* head (ft) */
     79:     PetscInt    npt;     /* Number of given points */
     80:   } headcurve;
     81:   /* Parameters for pump headloss equation hL = h0 - rQ^n */
     82:   PetscScalar h0;
     83:   PetscScalar r;
     84:   PetscScalar n;
     85: } Pump;

     87: struct _p_EDGE_Water {
     88:   PetscInt id;   /* id */
     89:   PetscInt type; /* edge type (pump, pipe) */
     90:   Pipe     pipe; /* pipe data */
     91:   Pump     pump; /* pump data */
     92: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
     93: typedef struct _p_EDGE_Water *EDGE_Water;

     95: /* EPANET top-level data structure */
     96: struct _p_WATERDATA {
     97:   PetscInt     nvertex;
     98:   PetscInt     nedge;
     99:   PetscInt     njunction;
    100:   PetscInt     nreservoir;
    101:   PetscInt     ntank;
    102:   PetscInt     npipe;
    103:   PetscInt     npump;
    104:   VERTEX_Water vertex;
    105:   EDGE_Water   edge;
    106: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
    107: typedef struct _p_WATERDATA WATERDATA;

    109: extern PetscErrorCode WaterReadData(WATERDATA *, char *);
    110: extern PetscErrorCode GetListofEdges_Water(WATERDATA *, PetscInt *);
    111: extern PetscErrorCode WaterSetInitialGuess(DM, Vec);
    112: extern PetscErrorCode WaterFormFunction(SNES, Vec, Vec, void *);
    113: extern PetscErrorCode FormFunction_Water(DM, Vec, Vec, PetscInt, PetscInt, const PetscInt *, const PetscInt *, void *);
    114: extern PetscErrorCode SetInitialGuess_Water(DM, Vec, PetscInt, PetscInt, const PetscInt *, const PetscInt *, void *);
    115: extern PetscScalar    Flow_Pipe(Pipe *, PetscScalar, PetscScalar);
    116: extern PetscScalar    Flow_Pump(Pump *, PetscScalar, PetscScalar);