Actual source code: wash.h

      1: #pragma once

      3: #include <petscdmnetwork.h>
      4: #include "pipe.h"

      6: typedef enum {
      7:   NONE,
      8:   JUNCTION  = 1,
      9:   RESERVOIR = 2,
     10:   VALVE     = 3,
     11:   DEMAND    = 4,
     12:   INFLOW    = 5,
     13:   STAGE     = 6,
     14:   TANK      = 7
     15: } VertexType;

     17: typedef struct {
     18:   PetscInt    rid;  /*reservoir id*/
     19:   PetscScalar hres; /*Reservoir water column*/
     20: } Reservoir;

     22: typedef struct {
     23:   PetscInt    vid; /*valve id*/
     24:   PetscScalar tau; /*valve aperture*/
     25:   PetscScalar cdag;
     26:   PetscScalar qout;
     27: } Valve;

     29: /* junction              */
     30: /*-----------------------*/
     31: struct _p_Junction {
     32:   PetscInt   id;  /* global index */
     33:   PetscInt   tag; /* external id */
     34:   VertexType type;
     35:   PetscInt   isEnd;                 /* -1: left end; 0: not an end; 1: right end */
     36:   PetscInt   nedges_in, nedges_out; /* number of connected in/out edges */
     37:   Mat       *jacobian;
     38:   PetscReal  latitude, longitude; /* GPS data */

     40:   /* boundary data structures */
     41:   Reservoir reservoir;
     42:   Valve     valve;
     43: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
     44: typedef struct _p_Junction *Junction;

     46: extern PetscErrorCode JunctionCreateJacobian(DM, PetscInt, Mat *, Mat *[]);
     47: extern PetscErrorCode JunctionDestroyJacobian(DM, PetscInt, Junction);

     49: /* wash                   */
     50: /*------------------------*/
     51: struct _p_Wash {
     52:   MPI_Comm  comm;
     53:   PetscInt  nedge, nvertex;    /* local number of components */
     54:   PetscInt  Nedge, Nvertex;    /* global number of components */
     55:   PetscInt *edgelist;          /* local edge list */
     56:   Vec       localX, localXdot; /* vectors used in local function evaluation */
     57:   PetscInt  nnodes_loc;        /* num of global and local nodes */

     59:   /* Junction */
     60:   Junction  junction;
     61:   PetscInt *vtype;

     63:   /* Pipe */
     64:   Pipe        pipe;
     65:   PetscScalar Q0, H0, QL, HL; /* left and right boundary conditions for wash-network (not individual pipe) */

     67:   /* Events */
     68:   PetscInt close_valve;
     69: } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar)));
     70: typedef struct _p_Wash *Wash;

     72: extern PetscErrorCode WashNetworkCreate(MPI_Comm, PetscInt, Wash *);
     73: extern PetscErrorCode WashNetworkCleanUp(Wash);