xref: /petsc/src/ts/tutorials/network/wash.h (revision da81f9329be15cc55f054c8a00978087195c9247)
142dc13f1SHong Zhang #ifndef WASH_H
242dc13f1SHong Zhang #define WASH_H
342dc13f1SHong Zhang 
442dc13f1SHong Zhang #include <petscdmnetwork.h>
542dc13f1SHong Zhang #include "pipe.h"
642dc13f1SHong Zhang 
79371c9d4SSatish Balay typedef enum {
89371c9d4SSatish Balay   NONE,
99371c9d4SSatish Balay   JUNCTION  = 1,
109371c9d4SSatish Balay   RESERVOIR = 2,
119371c9d4SSatish Balay   VALVE     = 3,
129371c9d4SSatish Balay   DEMAND    = 4,
139371c9d4SSatish Balay   INFLOW    = 5,
149371c9d4SSatish Balay   STAGE     = 6,
159371c9d4SSatish Balay   TANK      = 7
169371c9d4SSatish Balay } VertexType;
1742dc13f1SHong Zhang 
1842dc13f1SHong Zhang typedef struct {
1942dc13f1SHong Zhang   PetscInt    rid;  /*reservoir id*/
2042dc13f1SHong Zhang   PetscScalar hres; /*Reservoir water column*/
2142dc13f1SHong Zhang } Reservoir;
2242dc13f1SHong Zhang 
2342dc13f1SHong Zhang typedef struct {
2442dc13f1SHong Zhang   PetscInt    vid; /*valve id*/
2542dc13f1SHong Zhang   PetscScalar tau; /*valve aperture*/
2642dc13f1SHong Zhang   PetscScalar cdag;
2742dc13f1SHong Zhang   PetscScalar qout;
2842dc13f1SHong Zhang } Valve;
2942dc13f1SHong Zhang 
3042dc13f1SHong Zhang /* junction              */
3142dc13f1SHong Zhang /*-----------------------*/
3242dc13f1SHong Zhang struct _p_Junction {
3342dc13f1SHong Zhang   PetscInt   id;  /* global index */
3442dc13f1SHong Zhang   PetscInt   tag; /* external id */
3542dc13f1SHong Zhang   VertexType type;
3642dc13f1SHong Zhang   PetscInt   isEnd;                 /* -1: left end; 0: not an end; 1: right end */
3742dc13f1SHong Zhang   PetscInt   nedges_in, nedges_out; /* number of connected in/out edges */
3842dc13f1SHong Zhang   Mat       *jacobian;
3942dc13f1SHong Zhang   PetscReal  latitude, longitude; /* GPS data */
4042dc13f1SHong Zhang 
4142dc13f1SHong Zhang   /* boundary data structures */
4242dc13f1SHong Zhang   Reservoir reservoir;
4342dc13f1SHong Zhang   Valve     valve;
4442dc13f1SHong Zhang } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
4542dc13f1SHong Zhang typedef struct _p_Junction *Junction;
4642dc13f1SHong Zhang 
4742dc13f1SHong Zhang extern PetscErrorCode JunctionCreateJacobian(DM, PetscInt, Mat *, Mat *[]);
4842dc13f1SHong Zhang extern PetscErrorCode JunctionDestroyJacobian(DM, PetscInt, Junction);
4942dc13f1SHong Zhang 
5042dc13f1SHong Zhang /* wash                   */
5142dc13f1SHong Zhang /*------------------------*/
529371c9d4SSatish Balay struct _p_Wash {
5342dc13f1SHong Zhang   MPI_Comm  comm;
5442dc13f1SHong Zhang   PetscInt  nedge, nvertex;    /* local number of components */
5542dc13f1SHong Zhang   PetscInt  Nedge, Nvertex;    /* global number of components */
5642dc13f1SHong Zhang   PetscInt *edgelist;          /* local edge list */
57*da81f932SPierre Jolivet   Vec       localX, localXdot; /* vectors used in local function evaluation */
5842dc13f1SHong Zhang   PetscInt  nnodes_loc;        /* num of global and local nodes */
5942dc13f1SHong Zhang 
6042dc13f1SHong Zhang   /* Junction */
6142dc13f1SHong Zhang   Junction  junction;
6242dc13f1SHong Zhang   PetscInt *vtype;
6342dc13f1SHong Zhang 
6442dc13f1SHong Zhang   /* Pipe */
6542dc13f1SHong Zhang   Pipe        pipe;
6642dc13f1SHong Zhang   PetscScalar Q0, H0, QL, HL; /* left and right boundary conditions for wash-network (not individual pipe) */
6742dc13f1SHong Zhang 
6842dc13f1SHong Zhang   /* Events */
6942dc13f1SHong Zhang   PetscInt close_valve;
7042dc13f1SHong Zhang } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
7142dc13f1SHong Zhang typedef struct _p_Wash *Wash;
7242dc13f1SHong Zhang 
7342dc13f1SHong Zhang extern PetscErrorCode WashNetworkCreate(MPI_Comm, PetscInt, Wash *);
7442dc13f1SHong Zhang extern PetscErrorCode WashNetworkCleanUp(Wash);
7542dc13f1SHong Zhang #endif
76