Hello PetSc users,
I request suggestions on how to do a coupled problem, in my case coupling
between multiphase flow in porous media and deformation of porous media.I have
successfully written and validated the flow code with 3 degrees of freedom
(S-saturation, P-pressure, T-Temperature)
which uses SNES solver inside a time loop. I have to use KSP solve for the
deformation problem which has 1 degree of freedom (u-displacement).
For the coupled problem, the flow part now requires the displacement vector and
the deformation part requires
the pressure field.
I have written a pseudo-code below.
My idea is to use the second solution vector (displacement) in
FormFunctionLocal belonging to SNES.
Since the DM used by SNES can be used for only one problem, a clone is made to
be used for KSP.
Is this approach the correct way to solve this coupled problem.
typedef struct {
PetscScalar s; // Saturation
PetscScalar p; // Pressure
PetscScalar T; // Temperature
} Field;
typedef struct {
PetscScalar u; // Displacement
} Field2;
FormFunctionLocal(DMDALocalInfo *info, Field *sol, Field2 *sol2, Field *f,
AppCtx *user)
{
........................
}
main()
{
DM da, newda;
Vec sol;
Vec sol2;
SNES snes;
KSP ksp;
SNESCreate(......, &snes);
DMDACreate1d(........,&da);
.
.
SNESSetDM(snes, da);
DMClone(da, &newda);
KSPCreate(.........,&ksp);
KSPSetDM(ksp, newda);
.
.
DMDASetUniformCoordinates(da,...........);
DMDASNESSetFunctionLocal(da,...........,FormFunctionLocal);
.
DMCreateGlobalVector(da, &sol);
DMCreateGlobalVector(newda, &sol2); // This sol2 of type Field2 is
passed to FormFunctionLocal.
.
do { // Time loop
SNESSolve(snes,....);
.
.
KSPSolve(ksp,......);
.
.
}while(criteria);
}
Thank you,Rahul.