1 #ifndef PIPE_H 2 #define PIPE_H 3 4 #define GRAV 9.806 5 #define PIPE_CHARACTERISTIC 10000000.0 6 7 #include <petsc.h> 8 9 typedef struct { 10 PetscScalar q; /* flow rate */ 11 PetscScalar h; /* pressure */ 12 } PipeField; 13 14 typedef struct { 15 PetscScalar Q0, H0; /* boundary values in upstream */ 16 PetscScalar QL, HL; /* boundary values in downstream */ 17 } PipeBoundary; 18 19 /* pipe */ 20 /*----------------------*/ 21 struct _p_Pipe { 22 /* identification variables */ 23 PetscInt id; 24 PetscInt networkid; /* which network this pipe belongs */ 25 26 /* solver objects */ 27 Vec x; 28 PipeField *xold; 29 PetscReal dt; 30 DM da; 31 PetscInt nnodes; /* number of nodes in da discretization */ 32 Mat *jacobian; 33 34 /* physics */ 35 PetscReal length; /* pipe length */ 36 PetscReal a; /* natural flow speed */ 37 PetscReal fric; /* friction */ 38 PetscReal D; /* diameter */ 39 PetscReal A; /* area of cross section */ 40 PetscReal R; 41 PetscReal rad; 42 PipeBoundary boundary; /* boundary conditions for H and Q */ 43 } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 44 45 typedef struct _p_Pipe *Pipe; 46 47 extern PetscErrorCode PipeCreate(MPI_Comm, Pipe *); 48 extern PetscErrorCode PipeDestroy(Pipe *); 49 extern PetscErrorCode PipeSetParameters(Pipe, PetscReal, PetscReal, PetscReal, PetscReal); 50 extern PetscErrorCode PipeSetUp(Pipe); 51 extern PetscErrorCode PipeCreateJacobian(Pipe, Mat *, Mat *[]); 52 extern PetscErrorCode PipeDestroyJacobian(Pipe); 53 54 extern PetscErrorCode PipeComputeSteadyState(Pipe, PetscScalar, PetscScalar); 55 extern PetscErrorCode PipeIFunctionLocal(DMDALocalInfo *, PetscReal, PipeField *, PipeField *, PipeField *, Pipe); 56 extern PetscErrorCode PipeIFunctionLocal_Lax(DMDALocalInfo *, PetscReal, PipeField *, PipeField *, PetscScalar *, Pipe); 57 extern PetscErrorCode PipeRHSFunctionLocal(DMDALocalInfo *, PetscReal, PipeField *, PetscScalar *, Pipe); 58 extern PetscErrorCode PipeMonitor(TS, PetscInt, PetscReal, Vec, void *); 59 60 extern PetscErrorCode PipeCreateJacobian(Pipe, Mat *, Mat *[]); 61 extern PetscErrorCode PipeDestroyJacobian(Pipe); 62 #endif 63