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