142dc13f1SHong Zhang #ifndef WASH_H 242dc13f1SHong Zhang #define WASH_H 342dc13f1SHong Zhang 442dc13f1SHong Zhang #include <petscdmnetwork.h> 542dc13f1SHong Zhang #include "pipe.h" 642dc13f1SHong Zhang 7*9371c9d4SSatish Balay typedef enum { 8*9371c9d4SSatish Balay NONE, 9*9371c9d4SSatish Balay JUNCTION = 1, 10*9371c9d4SSatish Balay RESERVOIR = 2, 11*9371c9d4SSatish Balay VALVE = 3, 12*9371c9d4SSatish Balay DEMAND = 4, 13*9371c9d4SSatish Balay INFLOW = 5, 14*9371c9d4SSatish Balay STAGE = 6, 15*9371c9d4SSatish Balay TANK = 7 16*9371c9d4SSatish 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 /*------------------------*/ 52*9371c9d4SSatish 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 */ 5742dc13f1SHong Zhang Vec localX, localXdot; /* vectors used in local function evalutation */ 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