[petsc-users] Split vector with VecGetSubVector
Massimiliano Leoni
leoni.massimiliano1 at gmail.com
Sun Nov 2 07:19:10 CST 2014
Hi everyone,
this is my first email so I'll use this sentence to say hello from Milan,
Italy :)
I am very new to PETSc, I always "used" it through another library, FEniCS,
but now I need to use its interface directly.
Straight to my problem, I have this working code:
// PETScVector is a FEniCS container for a PETSc Vec, which can be retrieved
// with vec() method; similarly P->mat().
void solve(PETScVector& x, const PETScVector& b)
{
Mat Pr(P->mat());
KSP ksp;
KSPCreate(PETSC_COMM_WORLD,&ksp);
KSPSetOperators(ksp,Pr,Pr,DIFFERENT_NONZERO_PATTERN);
KSPSolve(ksp,b.vec(),x.vec());
KSPDestroy(&ksp);
}
which simply solves with a linear system.
Now I want to do the same, but separating the system [the matrix is block
diagonal] into two parts [velocity and pressure, that's Stokes!].
My try, basing on my basic understanding of the documentation
void solve(PETScVector& x, const PETScVector& b)
{
// I understand I need these Index Sets to split a vector
IS isu;
int Nu = Mv->size(0); // number of components of velocity
ISCreateStride(PETSC_COMM_SELF,Nu,0,1,&isu);
Vec buv; // to contain velocity rhs
VecCreate(PETSC_COMM_WORLD,&buv); // I am not sure when to use
VecSetSizes(buv,PETSC_DECIDE,Nu); // VecCreate and VecSetSizes
VecGetSubVector(b.vec(),isu,&buv);
Mat Mvp(Mv->mat()); // again, retrieve a Mat
Vec xuv; // to contain velocity solution
VecCreate(PETSC_COMM_WORLD,&xuv);
VecSetSizes(xuv,PETSC_DECIDE,Nu);
KSP ksp;
KSPCreate(PETSC_COMM_WORLD,&ksp);
KSPSetOperators(ksp,Mvp,Mvp,DIFFERENT_NONZERO_PATTERN);
KSPSolve(ksp,buv,xuv); [** segfault! **]
KSPDestroy(&ksp);
[pressure part is analogous]
Vec finalVec; // to re-assemble whole vector
VecCreate(PETSC_COMM_WORLD,&finalVec);
VecSetSizes(finalVec,PETSC_DECIDE,Nu+Np);
IS iss[2] = {isu,isp};
Vec vecs[2] = {xuv,xpv};
VecCreateNest(PETSC_COMM_SELF, 2, iss, vecs, &finalVec);
VecCopy(finalVec,x.vec());
}
The problem is that it segfaults at KSPSolve.
Since the structure is not too far from my working code above, I would guess I
am missing something when extracting the subvectors, maybe some initializing
procedure?
I read the tutorial code http://www.mcs.anl.gov/petsc/petsc-current/src/snes/examples/tutorials/ex70.c.html in which this is used, but
it's a little too complicated for me now.
I am using petsc 3.4.2 [debian testing].
Thanks for help!
Massimiliano
More information about the petsc-users
mailing list