On Sun, Jul 16, 2017 at 9:19 AM, Franck Houssen <[email protected]> wrote:
> 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. > You can build the subspace correct part using http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PCGALERKIN.html which might make this easier. Thanks, Matt > Not such a big deal anyway > > Franck > > > ------------------------------ > > *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/ > > > -- 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/
