xref: /petsc/src/snes/tutorials/network/water/water.h (revision c4762a1b19cd2af06abeed90e8f9d34fb975dd94)
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