1c4762a1bSJed Brown #ifndef WATER_H 2c4762a1bSJed Brown #define WATER_H 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscsnes.h> 5c4762a1bSJed Brown #include <petscdmnetwork.h> 6c4762a1bSJed Brown 7c4762a1bSJed Brown # define MAXLINE 1000 8c4762a1bSJed Brown #define VERTEX_TYPE_RESERVOIR 0 9c4762a1bSJed Brown #define VERTEX_TYPE_JUNCTION 1 10c4762a1bSJed Brown #define VERTEX_TYPE_TANK 2 11c4762a1bSJed Brown #define EDGE_TYPE_PIPE 0 12c4762a1bSJed Brown #define EDGE_TYPE_PUMP 1 13c4762a1bSJed Brown #define PIPE_STATUS_OPEN 0 14c4762a1bSJed Brown #define PIPE_STATUS_CLOSED 1 15c4762a1bSJed Brown #define PIPE_STATUS_CV 2 16c4762a1bSJed Brown 17c4762a1bSJed Brown #define GPM_CFS 0.0022280023234587 /* Scaling constant for GPM to CFS conversion */ 18c4762a1bSJed Brown 19c4762a1bSJed Brown typedef struct{ 20c4762a1bSJed Brown PetscInt compkey_edge; 21c4762a1bSJed Brown PetscInt compkey_vtx; 22c4762a1bSJed Brown } AppCtx_Water; 23c4762a1bSJed Brown 24c4762a1bSJed Brown typedef struct { 25c4762a1bSJed Brown PetscInt id; /* id */ 26c4762a1bSJed Brown PetscScalar elev; /* elevation (ft) */ 27c4762a1bSJed Brown PetscScalar demand; /* demand (gpm) */ 28c4762a1bSJed Brown PetscInt dempattern; /* demand pattern id */ 29c4762a1bSJed Brown } Junction; 30c4762a1bSJed Brown 31c4762a1bSJed Brown typedef struct { 32c4762a1bSJed Brown PetscInt id; /* id */ 33c4762a1bSJed Brown PetscScalar head; /* head (ft) */ 34c4762a1bSJed Brown PetscInt headpattern; /* head pattern */ 35c4762a1bSJed Brown } Reservoir; 36c4762a1bSJed Brown 37c4762a1bSJed Brown typedef struct { 38c4762a1bSJed Brown PetscInt id; /* id */ 39c4762a1bSJed Brown PetscScalar elev; /* elevation (ft) */ 40c4762a1bSJed Brown PetscScalar initlvl; /* initial level (ft) */ 41c4762a1bSJed Brown PetscScalar minlvl; /* minimum level (ft) */ 42c4762a1bSJed Brown PetscScalar maxlvl; /* maximum level (ft) */ 43c4762a1bSJed Brown PetscScalar diam; /* diameter (ft) */ 44c4762a1bSJed Brown PetscScalar minvolume; /* minimum volume (ft^3) */ 45c4762a1bSJed Brown PetscInt volumecurve; /* Volume curve id */ 46c4762a1bSJed Brown } Tank; 47c4762a1bSJed Brown 48c4762a1bSJed Brown struct _p_VERTEX_Water{ 49c4762a1bSJed Brown PetscInt id; /* id */ 50c4762a1bSJed Brown PetscInt type; /* vertex type (junction, reservoir) */ 51c4762a1bSJed Brown Junction junc; /* junction data */ 52c4762a1bSJed Brown Reservoir res; /* reservoir data */ 53c4762a1bSJed Brown Tank tank; /* tank data */ 54*b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar))); 55c4762a1bSJed Brown typedef struct _p_VERTEX_Water *VERTEX_Water; 56c4762a1bSJed Brown 57c4762a1bSJed Brown typedef struct { 58c4762a1bSJed Brown PetscInt id; /* id */ 59c4762a1bSJed Brown PetscInt node1; /* From node */ 60c4762a1bSJed Brown PetscInt node2; /* to node */ 61c4762a1bSJed Brown PetscScalar length; /* length (ft) */ 62c4762a1bSJed Brown PetscScalar diam; /* diameter (inches) */ 63c4762a1bSJed Brown PetscScalar roughness; /* roughness (dimensionless) */ 64c4762a1bSJed Brown PetscScalar minorloss; /* minor losses */ 65c4762a1bSJed Brown char stat[16]; /* Status */ 66c4762a1bSJed Brown PetscInt status; /* Pipe status (see PIPE_STATUS_XXX definition on top) */ 67c4762a1bSJed Brown PetscScalar n; /* Exponent for h = kQ^n */ 68c4762a1bSJed Brown PetscScalar k; 69c4762a1bSJed Brown } Pipe; 70c4762a1bSJed Brown 71c4762a1bSJed Brown typedef struct { 72c4762a1bSJed Brown PetscInt id; /* id */ 73c4762a1bSJed Brown PetscInt node1; /* From node */ 74c4762a1bSJed Brown PetscInt node2; /* to node */ 75c4762a1bSJed Brown char param[16]; /* curve parameter (HEAD or ENERGY or EFFICIENCY) */ 76c4762a1bSJed Brown PetscInt paramid; /* Id of the curve parameter in the CURVE data */ 77c4762a1bSJed Brown struct { /* one point curve */ 78c4762a1bSJed Brown PetscScalar flow[3]; /* flow (gpm) */ 79c4762a1bSJed Brown PetscScalar head[3]; /* head (ft) */ 80c4762a1bSJed Brown PetscInt npt; /* Number of given points */ 81c4762a1bSJed Brown }headcurve; 82c4762a1bSJed Brown /* Parameters for pump headloss equation hL = h0 - rQ^n */ 83c4762a1bSJed Brown PetscScalar h0; 84c4762a1bSJed Brown PetscScalar r; 85c4762a1bSJed Brown PetscScalar n; 86c4762a1bSJed Brown } Pump; 87c4762a1bSJed Brown 88c4762a1bSJed Brown struct _p_EDGE_Water{ 89c4762a1bSJed Brown PetscInt id; /* id */ 90c4762a1bSJed Brown PetscInt type; /* edge type (pump, pipe) */ 91c4762a1bSJed Brown Pipe pipe; /* pipe data */ 92c4762a1bSJed Brown Pump pump; /* pump data */ 93*b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar))); 94c4762a1bSJed Brown typedef struct _p_EDGE_Water *EDGE_Water; 95c4762a1bSJed Brown 96c4762a1bSJed Brown /* EPANET top-level data structure */ 97c4762a1bSJed Brown struct _p_WATERDATA{ 98c4762a1bSJed Brown PetscInt nvertex; 99c4762a1bSJed Brown PetscInt nedge; 100c4762a1bSJed Brown PetscInt njunction; 101c4762a1bSJed Brown PetscInt nreservoir; 102c4762a1bSJed Brown PetscInt ntank; 103c4762a1bSJed Brown PetscInt npipe; 104c4762a1bSJed Brown PetscInt npump; 105c4762a1bSJed Brown VERTEX_Water vertex; 106c4762a1bSJed Brown EDGE_Water edge; 107*b8582c7cSSatish Balay } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar))); 108c4762a1bSJed Brown typedef struct _p_WATERDATA WATERDATA; 109c4762a1bSJed Brown 110c4762a1bSJed Brown extern PetscErrorCode WaterReadData(WATERDATA*,char*); 111c4762a1bSJed Brown extern PetscErrorCode GetListofEdges_Water(WATERDATA*,PetscInt*); 112c4762a1bSJed Brown extern PetscErrorCode WaterSetInitialGuess(DM,Vec); 113c4762a1bSJed Brown extern PetscErrorCode WaterFormFunction(SNES,Vec,Vec,void*); 114c4762a1bSJed Brown extern PetscErrorCode FormFunction_Water(DM,Vec,Vec,PetscInt,PetscInt,const PetscInt*,const PetscInt*,void*); 115c4762a1bSJed Brown extern PetscErrorCode SetInitialGuess_Water(DM,Vec,PetscInt,PetscInt,const PetscInt*, const PetscInt*,void*); 116c4762a1bSJed Brown extern PetscScalar Flow_Pipe(Pipe*,PetscScalar,PetscScalar); 117c4762a1bSJed Brown extern PetscScalar Flow_Pump(Pump*,PetscScalar,PetscScalar); 118c4762a1bSJed Brown #endif 119