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