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