#ifndef PIPE_H #define PIPE_H #define GRAV 9.806 #define PIPE_CHARACTERISTIC 10000000.0 #include typedef struct { PetscScalar q; /* flow rate */ PetscScalar h; /* pressure */ } PipeField; typedef struct { PetscScalar Q0, H0; /* boundary values in upstream */ PetscScalar QL, HL; /* boundary values in downstream */ } PipeBoundary; /* pipe */ /*----------------------*/ struct _p_Pipe { /* identification variables */ PetscInt id; PetscInt networkid; /* which network this pipe belongs */ /* solver objects */ Vec x; PipeField *xold; PetscReal dt; DM da; PetscInt nnodes; /* number of nodes in da discretization */ Mat *jacobian; /* physics */ PetscReal length; /* pipe length */ PetscReal a; /* natural flow speed */ PetscReal fric; /* friction */ PetscReal D; /* diameter */ PetscReal A; /* area of cross section */ PetscReal R; PetscReal rad; PipeBoundary boundary; /* boundary conditions for H and Q */ } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); typedef struct _p_Pipe *Pipe; extern PetscErrorCode PipeCreate(MPI_Comm, Pipe *); extern PetscErrorCode PipeDestroy(Pipe *); extern PetscErrorCode PipeSetParameters(Pipe, PetscReal, PetscReal, PetscReal, PetscReal); extern PetscErrorCode PipeSetUp(Pipe); extern PetscErrorCode PipeCreateJacobian(Pipe, Mat *, Mat *[]); extern PetscErrorCode PipeDestroyJacobian(Pipe); extern PetscErrorCode PipeComputeSteadyState(Pipe, PetscScalar, PetscScalar); extern PetscErrorCode PipeIFunctionLocal(DMDALocalInfo *, PetscReal, PipeField *, PipeField *, PipeField *, Pipe); extern PetscErrorCode PipeIFunctionLocal_Lax(DMDALocalInfo *, PetscReal, PipeField *, PipeField *, PetscScalar *, Pipe); extern PetscErrorCode PipeRHSFunctionLocal(DMDALocalInfo *, PetscReal, PipeField *, PetscScalar *, Pipe); extern PetscErrorCode PipeMonitor(TS, PetscInt, PetscReal, Vec, void *); extern PetscErrorCode PipeCreateJacobian(Pipe, Mat *, Mat *[]); extern PetscErrorCode PipeDestroyJacobian(Pipe); #endif