xref: /petsc/src/ts/tutorials/network/pipe.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
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