1*a4963045SJacob Faibussowitsch #pragma once 242dc13f1SHong Zhang 342dc13f1SHong Zhang #define GRAV 9.806 442dc13f1SHong Zhang #define PIPE_CHARACTERISTIC 10000000.0 542dc13f1SHong Zhang 642dc13f1SHong Zhang #include <petsc.h> 742dc13f1SHong Zhang 842dc13f1SHong Zhang typedef struct { 942dc13f1SHong Zhang PetscScalar q; /* flow rate */ 1042dc13f1SHong Zhang PetscScalar h; /* pressure */ 1142dc13f1SHong Zhang } PipeField; 1242dc13f1SHong Zhang 1342dc13f1SHong Zhang typedef struct { 1442dc13f1SHong Zhang PetscScalar Q0, H0; /* boundary values in upstream */ 1542dc13f1SHong Zhang PetscScalar QL, HL; /* boundary values in downstream */ 1642dc13f1SHong Zhang } PipeBoundary; 1742dc13f1SHong Zhang 1842dc13f1SHong Zhang /* pipe */ 1942dc13f1SHong Zhang /*----------------------*/ 209371c9d4SSatish Balay struct _p_Pipe { 2142dc13f1SHong Zhang /* identification variables */ 2242dc13f1SHong Zhang PetscInt id; 2342dc13f1SHong Zhang PetscInt networkid; /* which network this pipe belongs */ 2442dc13f1SHong Zhang 2542dc13f1SHong Zhang /* solver objects */ 2642dc13f1SHong Zhang Vec x; 2742dc13f1SHong Zhang PipeField *xold; 2842dc13f1SHong Zhang PetscReal dt; 2942dc13f1SHong Zhang DM da; 3042dc13f1SHong Zhang PetscInt nnodes; /* number of nodes in da discretization */ 3142dc13f1SHong Zhang Mat *jacobian; 3242dc13f1SHong Zhang 3342dc13f1SHong Zhang /* physics */ 3442dc13f1SHong Zhang PetscReal length; /* pipe length */ 3542dc13f1SHong Zhang PetscReal a; /* natural flow speed */ 3642dc13f1SHong Zhang PetscReal fric; /* friction */ 3742dc13f1SHong Zhang PetscReal D; /* diameter */ 3842dc13f1SHong Zhang PetscReal A; /* area of cross section */ 3942dc13f1SHong Zhang PetscReal R; 4042dc13f1SHong Zhang PetscReal rad; 4142dc13f1SHong Zhang PipeBoundary boundary; /* boundary conditions for H and Q */ 4242dc13f1SHong Zhang } PETSC_ATTRIBUTEALIGNED(PetscMax(sizeof(double), sizeof(PetscScalar))); 4342dc13f1SHong Zhang 4442dc13f1SHong Zhang typedef struct _p_Pipe *Pipe; 4542dc13f1SHong Zhang 4642dc13f1SHong Zhang extern PetscErrorCode PipeCreate(MPI_Comm, Pipe *); 4742dc13f1SHong Zhang extern PetscErrorCode PipeDestroy(Pipe *); 4842dc13f1SHong Zhang extern PetscErrorCode PipeSetParameters(Pipe, PetscReal, PetscReal, PetscReal, PetscReal); 4942dc13f1SHong Zhang extern PetscErrorCode PipeSetUp(Pipe); 5042dc13f1SHong Zhang extern PetscErrorCode PipeCreateJacobian(Pipe, Mat *, Mat *[]); 5142dc13f1SHong Zhang extern PetscErrorCode PipeDestroyJacobian(Pipe); 5242dc13f1SHong Zhang 5342dc13f1SHong Zhang extern PetscErrorCode PipeComputeSteadyState(Pipe, PetscScalar, PetscScalar); 5442dc13f1SHong Zhang extern PetscErrorCode PipeIFunctionLocal(DMDALocalInfo *, PetscReal, PipeField *, PipeField *, PipeField *, Pipe); 5542dc13f1SHong Zhang extern PetscErrorCode PipeIFunctionLocal_Lax(DMDALocalInfo *, PetscReal, PipeField *, PipeField *, PetscScalar *, Pipe); 5642dc13f1SHong Zhang extern PetscErrorCode PipeRHSFunctionLocal(DMDALocalInfo *, PetscReal, PipeField *, PetscScalar *, Pipe); 5742dc13f1SHong Zhang extern PetscErrorCode PipeMonitor(TS, PetscInt, PetscReal, Vec, void *); 5842dc13f1SHong Zhang 5942dc13f1SHong Zhang extern PetscErrorCode PipeCreateJacobian(Pipe, Mat *, Mat *[]); 6042dc13f1SHong Zhang extern PetscErrorCode PipeDestroyJacobian(Pipe); 61