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