[petsc-users] Split vector with VecGetSubVector

Matthew Knepley knepley at gmail.com
Sun Nov 2 13:52:36 CST 2014


On Sun, Nov 2, 2014 at 7:19 AM, Massimiliano Leoni <
leoni.massimiliano1 at gmail.com> wrote:

> 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?
>

Run in the debugger with -start_in_debugger, and when it stops type 'where'
and
send all output.

  Thanks,

    Matt


> 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
>



-- 
What most experimenters take for granted before they begin their
experiments is infinitely more interesting than any results to which their
experiments lead.
-- Norbert Wiener
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20141102/f87618c5/attachment.html>


More information about the petsc-users mailing list