Damn - Jed scooped me :D On 2 November 2015 at 22:19, Dave May <dave.mayhe...@gmail.com> wrote:
> > > On 2 November 2015 at 21:49, Justin Chang <jychan...@gmail.com> wrote: > >> So when would I use one over the other? >> >> - If I wanted to solve a problem using a direct solver or an iterative >> solver without a preconditioner, I would use A = J? >> > > Yes. > > >> >> - The documentation for SNESSetJacobian() says that AMat and PMat are >> usually the same, but if I used something like GAMG would I need to create >> two different objects/Mats? >> > > I would say "maybe". > > If the Jacobian (here A) was defined via a matrix-free finite difference > approximation, but you wish to use a non-trivial preconditioner, you might > wish to assemble J. J might be the Picard linearized operator (for example). > > Another use case where A != J might arise is if you define A with a high > order spatial discretization (probably matrix free) and you use a low order > discretization to define the preconditioner which will ultimately be passed > to GAMG. > > > >> >> Thanks, >> Justin >> >> On Mon, Nov 2, 2015 at 1:39 PM, Jed Brown <j...@jedbrown.org> wrote: >> >>> Justin Chang <jychan...@gmail.com> writes: >>> >>> > Hi all, >>> > >>> > In my DMPlex program, I have these lines: >>> > >>> > Mat A,J; >>> > >>> > ... >>> > >>> > ierr = DMSetMatType(dm, MATAIJ); CHKERRQ(ierr); >>> > ierr = DMCreateMatrix(dm, &J); CHKERRQ(ierr); >>> > A = J; >>> > >>> > ierr = DMSNESSetFunctionLocal(dm, ...); CHKERRQ(ierr); >>> > ierr = DMSNESSetJacobianLocal(dm, ...); CHKERRQ(ierr); >>> > ierr = SNESSetJacobian(snes, A, J, NULL, NULL); CHKERRQ(ierr); >>> > ierr = SNESSetFromOptions(snes); CHKERRQ(ierr); >>> > >>> > ... >>> > >>> > ierr = SNESSolve(snes, NULL, x); CHKERRQ(ierr); >>> > >>> > ... >>> > ierr = MatDestroy(&J); CHKERRQ(ierr); >>> > >>> > >>> > For the line "A = J;", >>> >>> This means you have two handles referring to the same object. >>> >>> > what exactly is the difference, if any, between that and "ierr = >>> > MatDuplicate(...)" >>> >>> This creates a new object. >>> >>> > or "ierr = MatCopy(...)"? >>> >>> The second argument needs to be a valid Mat to call this function. >>> >>> > Do these different options somehow affect memory usage/performance? >>> >>> Yes. >>> >>> > Say I am solving a standard poisson equation using either GAMG and/or >>> > HYPRE. >>> > >>> > Thanks, >>> > Justin >>> >> >> >