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);