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