1c4762a1bSJed Brown static char help[] = "Solves DAE with integrator only on non-algebraic terms \n";
2c4762a1bSJed Brown
3c4762a1bSJed Brown #include <petscts.h>
4c4762a1bSJed Brown
5c4762a1bSJed Brown /*
6c4762a1bSJed Brown \dot{U} = f(U,V)
7c4762a1bSJed Brown F(U,V) = 0
8c4762a1bSJed Brown
9c4762a1bSJed Brown Same as ex6.c and ex7.c except calls the ARKIMEX integrator on the entire DAE
10c4762a1bSJed Brown */
11c4762a1bSJed Brown
12c4762a1bSJed Brown /*
13c4762a1bSJed Brown f(U,V) = U + V
14c4762a1bSJed Brown
15c4762a1bSJed Brown */
f(PetscReal t,Vec U,Vec V,Vec F)16d71ae5a4SJacob Faibussowitsch PetscErrorCode f(PetscReal t, Vec U, Vec V, Vec F)
17d71ae5a4SJacob Faibussowitsch {
18c4762a1bSJed Brown PetscFunctionBeginUser;
199566063dSJacob Faibussowitsch PetscCall(VecWAXPY(F, 1.0, U, V));
203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
21c4762a1bSJed Brown }
22c4762a1bSJed Brown
23c4762a1bSJed Brown /*
24c4762a1bSJed Brown F(U,V) = U - V
25c4762a1bSJed Brown
26c4762a1bSJed Brown */
F(PetscReal t,Vec U,Vec V,Vec F)27d71ae5a4SJacob Faibussowitsch PetscErrorCode F(PetscReal t, Vec U, Vec V, Vec F)
28d71ae5a4SJacob Faibussowitsch {
29c4762a1bSJed Brown PetscFunctionBeginUser;
309566063dSJacob Faibussowitsch PetscCall(VecWAXPY(F, -1.0, V, U));
313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
32c4762a1bSJed Brown }
33c4762a1bSJed Brown
34c4762a1bSJed Brown typedef struct {
35c4762a1bSJed Brown Vec U, V;
36c4762a1bSJed Brown Vec UF, VF;
37c4762a1bSJed Brown VecScatter scatterU, scatterV;
38c4762a1bSJed Brown PetscErrorCode (*f)(PetscReal, Vec, Vec, Vec);
39c4762a1bSJed Brown PetscErrorCode (*F)(PetscReal, Vec, Vec, Vec);
40c4762a1bSJed Brown } AppCtx;
41c4762a1bSJed Brown
42c4762a1bSJed Brown extern PetscErrorCode TSFunctionRHS(TS, PetscReal, Vec, Vec, void *);
43c4762a1bSJed Brown extern PetscErrorCode TSFunctionI(TS, PetscReal, Vec, Vec, Vec, void *);
44c4762a1bSJed Brown
main(int argc,char ** argv)45d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
46d71ae5a4SJacob Faibussowitsch {
47c4762a1bSJed Brown AppCtx ctx;
48c4762a1bSJed Brown TS ts;
49c4762a1bSJed Brown Vec tsrhs, UV;
50c4762a1bSJed Brown IS is;
51c4762a1bSJed Brown PetscInt I;
52c4762a1bSJed Brown PetscMPIInt rank;
53c4762a1bSJed Brown
54327415f7SBarry Smith PetscFunctionBeginUser;
55*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help));
569566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
579566063dSJacob Faibussowitsch PetscCall(TSCreate(PETSC_COMM_WORLD, &ts));
589566063dSJacob Faibussowitsch PetscCall(TSSetProblemType(ts, TS_NONLINEAR));
599566063dSJacob Faibussowitsch PetscCall(TSSetType(ts, TSROSW));
609566063dSJacob Faibussowitsch PetscCall(TSSetFromOptions(ts));
619566063dSJacob Faibussowitsch PetscCall(VecCreateMPI(PETSC_COMM_WORLD, 2, PETSC_DETERMINE, &tsrhs));
629566063dSJacob Faibussowitsch PetscCall(VecCreateMPI(PETSC_COMM_WORLD, 2, PETSC_DETERMINE, &UV));
639566063dSJacob Faibussowitsch PetscCall(TSSetRHSFunction(ts, tsrhs, TSFunctionRHS, &ctx));
649566063dSJacob Faibussowitsch PetscCall(TSSetIFunction(ts, NULL, TSFunctionI, &ctx));
65c4762a1bSJed Brown ctx.f = f;
66c4762a1bSJed Brown ctx.F = F;
67c4762a1bSJed Brown
689566063dSJacob Faibussowitsch PetscCall(VecCreateMPI(PETSC_COMM_WORLD, 1, PETSC_DETERMINE, &ctx.U));
699566063dSJacob Faibussowitsch PetscCall(VecCreateMPI(PETSC_COMM_WORLD, 1, PETSC_DETERMINE, &ctx.V));
709566063dSJacob Faibussowitsch PetscCall(VecCreateMPI(PETSC_COMM_WORLD, 1, PETSC_DETERMINE, &ctx.UF));
719566063dSJacob Faibussowitsch PetscCall(VecCreateMPI(PETSC_COMM_WORLD, 1, PETSC_DETERMINE, &ctx.VF));
72c4762a1bSJed Brown I = 2 * rank;
739566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, &I, PETSC_COPY_VALUES, &is));
749566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(ctx.U, NULL, UV, is, &ctx.scatterU));
759566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is));
76c4762a1bSJed Brown I = 2 * rank + 1;
779566063dSJacob Faibussowitsch PetscCall(ISCreateGeneral(PETSC_COMM_WORLD, 1, &I, PETSC_COPY_VALUES, &is));
789566063dSJacob Faibussowitsch PetscCall(VecScatterCreate(ctx.V, NULL, UV, is, &ctx.scatterV));
799566063dSJacob Faibussowitsch PetscCall(ISDestroy(&is));
80c4762a1bSJed Brown
819566063dSJacob Faibussowitsch PetscCall(VecSet(UV, 1.0));
829566063dSJacob Faibussowitsch PetscCall(TSSolve(ts, UV));
839566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tsrhs));
849566063dSJacob Faibussowitsch PetscCall(VecDestroy(&UV));
859566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ctx.U));
869566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ctx.V));
879566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ctx.UF));
889566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ctx.VF));
899566063dSJacob Faibussowitsch PetscCall(VecScatterDestroy(&ctx.scatterU));
909566063dSJacob Faibussowitsch PetscCall(VecScatterDestroy(&ctx.scatterV));
919566063dSJacob Faibussowitsch PetscCall(TSDestroy(&ts));
929566063dSJacob Faibussowitsch PetscCall(PetscFinalize());
93b122ec5aSJacob Faibussowitsch return 0;
94c4762a1bSJed Brown }
95c4762a1bSJed Brown
96c4762a1bSJed Brown /*
97c4762a1bSJed Brown Defines the RHS function that is passed to the time-integrator.
98c4762a1bSJed Brown
99c4762a1bSJed Brown */
TSFunctionRHS(TS ts,PetscReal t,Vec UV,Vec F,void * actx)100d71ae5a4SJacob Faibussowitsch PetscErrorCode TSFunctionRHS(TS ts, PetscReal t, Vec UV, Vec F, void *actx)
101d71ae5a4SJacob Faibussowitsch {
102c4762a1bSJed Brown AppCtx *ctx = (AppCtx *)actx;
103c4762a1bSJed Brown
104c4762a1bSJed Brown PetscFunctionBeginUser;
1059566063dSJacob Faibussowitsch PetscCall(VecSet(F, 0.0));
1069566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(ctx->scatterU, UV, ctx->U, INSERT_VALUES, SCATTER_REVERSE));
1079566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(ctx->scatterU, UV, ctx->U, INSERT_VALUES, SCATTER_REVERSE));
1089566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(ctx->scatterV, UV, ctx->V, INSERT_VALUES, SCATTER_REVERSE));
1099566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(ctx->scatterV, UV, ctx->V, INSERT_VALUES, SCATTER_REVERSE));
1109566063dSJacob Faibussowitsch PetscCall((*ctx->f)(t, ctx->U, ctx->V, ctx->UF));
1119566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(ctx->scatterU, ctx->UF, F, INSERT_VALUES, SCATTER_FORWARD));
1129566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(ctx->scatterU, ctx->UF, F, INSERT_VALUES, SCATTER_FORWARD));
1133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
114c4762a1bSJed Brown }
115c4762a1bSJed Brown
116c4762a1bSJed Brown /*
117c4762a1bSJed Brown Defines the nonlinear function that is passed to the time-integrator
118c4762a1bSJed Brown
119c4762a1bSJed Brown */
TSFunctionI(TS ts,PetscReal t,Vec UV,Vec UVdot,Vec F,void * actx)120d71ae5a4SJacob Faibussowitsch PetscErrorCode TSFunctionI(TS ts, PetscReal t, Vec UV, Vec UVdot, Vec F, void *actx)
121d71ae5a4SJacob Faibussowitsch {
122c4762a1bSJed Brown AppCtx *ctx = (AppCtx *)actx;
123c4762a1bSJed Brown
124c4762a1bSJed Brown PetscFunctionBeginUser;
1259566063dSJacob Faibussowitsch PetscCall(VecCopy(UVdot, F));
1269566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(ctx->scatterU, UV, ctx->U, INSERT_VALUES, SCATTER_REVERSE));
1279566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(ctx->scatterU, UV, ctx->U, INSERT_VALUES, SCATTER_REVERSE));
1289566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(ctx->scatterV, UV, ctx->V, INSERT_VALUES, SCATTER_REVERSE));
1299566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(ctx->scatterV, UV, ctx->V, INSERT_VALUES, SCATTER_REVERSE));
1309566063dSJacob Faibussowitsch PetscCall((*ctx->F)(t, ctx->U, ctx->V, ctx->VF));
1319566063dSJacob Faibussowitsch PetscCall(VecScatterBegin(ctx->scatterV, ctx->VF, F, INSERT_VALUES, SCATTER_FORWARD));
1329566063dSJacob Faibussowitsch PetscCall(VecScatterEnd(ctx->scatterV, ctx->VF, F, INSERT_VALUES, SCATTER_FORWARD));
1333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
134c4762a1bSJed Brown }
135