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" <[email protected]> > À: "Franck Houssen" <[email protected]> > Cc: "petsc-dev" <[email protected]> > 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 < [email protected] > > 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" < [email protected] > > > > > > > À: "Franck Houssen" < [email protected] > > > > > > > Cc: "petsc-dev" < [email protected] > > > > > > > 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 < [email protected] > > > > > > > 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/
