[petsc-dev] Can I modify x on SampleShellPCApply callback ?

Franck Houssen franck.houssen at inria.fr
Sun Jul 16 09:19:30 CDT 2017


The pc (shell) I try to write is made of 2 levels. 
I use y to "store" the contribution of the 1st level as I possibly need to reuse y for the 2nd level. 
I wanted to use x to "store" the contribution of the 2nd level (for that, need possibly to reuse y), to finally return y += x. 
This would have made less code (create, destroy, data in context, ...) to deal with. 

Not such a big deal anyway 

Franck 

----- Mail original -----

> De: "Matthew Knepley" <knepley at gmail.com>
> À: "Franck Houssen" <franck.houssen at inria.fr>
> Cc: "petsc-dev" <petsc-dev at mcs.anl.gov>
> Envoyé: Dimanche 16 Juillet 2017 16:09:34
> Objet: Re: [petsc-dev] Can I modify x on SampleShellPCApply callback ?

> On Sun, Jul 16, 2017 at 9:07 AM, Franck Houssen < franck.houssen at inria.fr >
> wrote:

> > OK, so I need to create a new x. Thanks for the quick answer.
> 

> Why would you create a new x. There is some misunderstanding about this
> routine. You
> should never need to create a "new x".

> Matt

> > Franck
> 

> > > De: "Matthew Knepley" < knepley at gmail.com >
> > 
> 
> > > À: "Franck Houssen" < franck.houssen at inria.fr >
> > 
> 
> > > Cc: "petsc-dev" < petsc-dev at mcs.anl.gov >
> > 
> 
> > > Envoyé: Dimanche 16 Juillet 2017 15:59:09
> > 
> 
> > > Objet: Re: [petsc-dev] Can I modify x on SampleShellPCApply callback ?
> > 
> 

> > > On Sun, Jul 16, 2017 at 8:51 AM, Franck Houssen < franck.houssen at inria.fr
> > > >
> > > wrote:
> > 
> 

> > > > Can I modify x on SampleShellPCApply callback ?
> > > 
> > 
> 

> > > > I am running debian (gcc-6.4), using petsc-dev synchronized on:
> > > 
> > 
> 
> > > > >> git log
> > > 
> > 
> 
> > > > commit f9d5775f43f69cbce5a7014a6ce3b24cc0e1214a (HEAD -> master,
> > > > origin/master, origin/HEAD)
> > > 
> > 
> 

> > > > when I run petsc/src/ksp/ksp/examples/tutorials/ex15.c, I get:
> > > 
> > 
> 
> > > > >> mpirun -n 2 ./ex15.exe -user_defined_pc
> > > 
> > 
> 
> > > > Norm of error 5.90715e-08 iterations 15
> > > 
> > 
> 

> > > > OK, so far, so good.
> > > 
> > 
> 

> > > > Now, I just modify x in SampleShellPCApply (reset to 0. at the end =
> > > > doing
> > > > nothing):
> > > 
> > 
> 
> > > > >> git diff
> > > 
> > 
> 
> > > > diff --git a/src/ksp/ksp/examples/tutorials/ex15.c
> > > > b/src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 
> > > > index badccd93b5..482e5ae6b5 100644
> > > 
> > 
> 
> > > > --- a/src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 
> > > > +++ b/src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 
> > > > @@ -296,6 +296,7 @@ PetscErrorCode SampleShellPCApply(PC pc,Vec x,Vec
> > > > y)
> > > 
> > 
> 

> > > > ierr = PCShellGetContext(pc,(void**)&shell);CHKERRQ(ierr);
> > > 
> > 
> 
> > > > ierr = VecPointwiseMult(y,x,shell->diag);CHKERRQ(ierr);
> > > 
> > 
> 
> > > > + ierr = VecSet(x, 0.);CHKERRQ(ierr);
> > > 
> > 
> 

> > > > return 0;
> > > 
> > 
> 
> > > > }
> > > 
> > 
> 
> > > > >> mpirun -n 2 ./ex15.exe -user_defined_pc
> > > 
> > 
> 
> > > > [0]PETSC ERROR: --------------------- Error Message
> > > > --------------------------------------------------------------
> > > 
> > 
> 
> > > > [0]PETSC ERROR: Object is in wrong state
> > > 
> > 
> 
> > > > [0]PETSC ERROR: Vec is locked read only, argument # 1
> > > 
> > 
> 
> > > > [1]PETSC ERROR: #1 VecSet() line 547 in
> > > > /home/fghoussen/Documents/INRIA/petsc/src/vec/vec/interface/rvector.c
> > > 
> > 
> 
> > > > [1]PETSC ERROR: #2 SampleShellPCApply() line 299 in
> > > > /home/fghoussen/Documents/INRIA/petsc/local/../src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 

> > > > Why is that ? Is there a way to "unlock" x ?
> > > 
> > 
> 

> > > > It seems, it's possible to modify y but not x: why ?
> > > 
> > 
> 

> > > x is the input and should be read-only. Changes cannot have any
> > > mathematical
> > > significance because you cannot know
> > 
> 
> > > where the x vector would be used subsequently anyway.
> > 
> 

> > > Matt
> > 
> 

> > > Matt
> > 
> 

> > > > >> git diff
> > > 
> > 
> 
> > > > diff --git a/src/ksp/ksp/examples/tutorials/ex15.c
> > > > b/src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 
> > > > index badccd93b5..98ae001319 100644
> > > 
> > 
> 
> > > > --- a/src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 
> > > > +++ b/src/ksp/ksp/examples/tutorials/ex15.c
> > > 
> > 
> 
> > > > @@ -294,6 +294,7 @@ PetscErrorCode SampleShellPCApply(PC pc,Vec x,Vec
> > > > y)
> > > 
> > 
> 
> > > > SampleShellPC *shell;
> > > 
> > 
> 
> > > > PetscErrorCode ierr;
> > > 
> > 
> 

> > > > + ierr = VecSet(y, 0.);CHKERRQ(ierr);
> > > 
> > 
> 
> > > > ierr = PCShellGetContext(pc,(void**)&shell);CHKERRQ(ierr);
> > > 
> > 
> 
> > > > ierr = VecPointwiseMult(y,x,shell->diag);CHKERRQ(ierr);
> > > 
> > 
> 
> > > > >> mpirun -n 2 ./ex15.exe -user_defined_pc
> > > 
> > 
> 
> > > > Norm of error 5.90715e-08 iterations 15
> > > 
> > 
> 

> > > > Does PETSc uses x even after the callback has been called ?
> > > 
> > 
> 
> > > > My understanding is that at the end of the callback only y matters: y
> > > > replaces x that has become no-use (y is the new residu): am I wrong ?
> > > 
> > 
> 

> > > > If possible, I would like to reuse x (avoiding to re-create a vector) ?
> > > > Is
> > > > there a way to "unlock" x ?
> > > 
> > 
> 

> > > > Franck
> > > 
> > 
> 

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

> > > http://www.caam.rice.edu/~mk51/
> > 
> 

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

> http://www.caam.rice.edu/~mk51/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20170716/eff068ee/attachment.html>


More information about the petsc-dev mailing list