xref: /petsc/src/ts/tutorials/network/wash.h (revision 42dc13f1996c8f6746c8928e761baf2885968c5a)
1*42dc13f1SHong Zhang #ifndef WASH_H
2*42dc13f1SHong Zhang #define WASH_H
3*42dc13f1SHong Zhang 
4*42dc13f1SHong Zhang #include <petscdmnetwork.h>
5*42dc13f1SHong Zhang #include "pipe.h"
6*42dc13f1SHong Zhang 
7*42dc13f1SHong Zhang typedef enum {NONE,JUNCTION=1,RESERVOIR=2,VALVE=3,DEMAND=4,INFLOW=5,STAGE=6,TANK=7} VertexType;
8*42dc13f1SHong Zhang 
9*42dc13f1SHong Zhang typedef struct {
10*42dc13f1SHong Zhang   PetscInt    rid;  /*reservoir id*/
11*42dc13f1SHong Zhang   PetscScalar hres; /*Reservoir water column*/
12*42dc13f1SHong Zhang } Reservoir;
13*42dc13f1SHong Zhang 
14*42dc13f1SHong Zhang typedef struct {
15*42dc13f1SHong Zhang   PetscInt    vid;  /*valve id*/
16*42dc13f1SHong Zhang   PetscScalar tau;  /*valve aperture*/
17*42dc13f1SHong Zhang   PetscScalar cdag;
18*42dc13f1SHong Zhang   PetscScalar qout;
19*42dc13f1SHong Zhang } Valve;
20*42dc13f1SHong Zhang 
21*42dc13f1SHong Zhang /* junction              */
22*42dc13f1SHong Zhang /*-----------------------*/
23*42dc13f1SHong Zhang struct _p_Junction{
24*42dc13f1SHong Zhang   PetscInt      id;        /* global index */
25*42dc13f1SHong Zhang   PetscInt      tag;       /* external id */
26*42dc13f1SHong Zhang   VertexType    type;
27*42dc13f1SHong Zhang   PetscInt      isEnd;                /* -1: left end; 0: not an end; 1: right end */
28*42dc13f1SHong Zhang   PetscInt      nedges_in,nedges_out; /* number of connected in/out edges */
29*42dc13f1SHong Zhang   Mat           *jacobian;
30*42dc13f1SHong Zhang   PetscReal     latitude, longitude;  /* GPS data */
31*42dc13f1SHong Zhang 
32*42dc13f1SHong Zhang   /* boundary data structures */
33*42dc13f1SHong Zhang   Reservoir     reservoir;
34*42dc13f1SHong Zhang   Valve         valve;
35*42dc13f1SHong Zhang } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));
36*42dc13f1SHong Zhang typedef struct _p_Junction *Junction;
37*42dc13f1SHong Zhang 
38*42dc13f1SHong Zhang extern PetscErrorCode JunctionCreateJacobian(DM,PetscInt,Mat*,Mat*[]);
39*42dc13f1SHong Zhang extern PetscErrorCode JunctionDestroyJacobian(DM,PetscInt,Junction);
40*42dc13f1SHong Zhang 
41*42dc13f1SHong Zhang /* wash                   */
42*42dc13f1SHong Zhang /*------------------------*/
43*42dc13f1SHong Zhang struct _p_Wash
44*42dc13f1SHong Zhang {
45*42dc13f1SHong Zhang   MPI_Comm    comm;
46*42dc13f1SHong Zhang   PetscInt    nedge,nvertex;           /* local number of components */
47*42dc13f1SHong Zhang   PetscInt    Nedge,Nvertex;           /* global number of components */
48*42dc13f1SHong Zhang   PetscInt    *edgelist;               /* local edge list */
49*42dc13f1SHong Zhang   Vec         localX,localXdot;        /* vectors used in local function evalutation */
50*42dc13f1SHong Zhang   PetscInt    nnodes_loc;              /* num of global and local nodes */
51*42dc13f1SHong Zhang 
52*42dc13f1SHong Zhang   /* Junction */
53*42dc13f1SHong Zhang   Junction    junction;
54*42dc13f1SHong Zhang   PetscInt    *vtype;
55*42dc13f1SHong Zhang 
56*42dc13f1SHong Zhang   /* Pipe */
57*42dc13f1SHong Zhang   Pipe        pipe;
58*42dc13f1SHong Zhang   PetscScalar Q0,H0,QL,HL;    /* left and right boundary conditions for wash-network (not individual pipe) */
59*42dc13f1SHong Zhang 
60*42dc13f1SHong Zhang   /* Events */
61*42dc13f1SHong Zhang   PetscInt    close_valve;
62*42dc13f1SHong Zhang } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double),sizeof(PetscScalar)));
63*42dc13f1SHong Zhang typedef struct _p_Wash *Wash;
64*42dc13f1SHong Zhang 
65*42dc13f1SHong Zhang extern PetscErrorCode WashNetworkCreate(MPI_Comm,PetscInt,Wash*);
66*42dc13f1SHong Zhang extern PetscErrorCode WashNetworkCleanUp(Wash);
67*42dc13f1SHong Zhang #endif
68