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