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