[petsc-users] MatGetDiagonalBlock and shell matrices

Dave May dave.mayhem23 at gmail.com
Fri Aug 26 07:34:07 CDT 2016


On 26 August 2016 at 14:14, Steven Dargaville <dargaville.steven at gmail.com>
wrote:

> Hi all
>
> I'm just wondering if there is any plans in the future for
> MatGetDiagonalBlock to support shell matrices by registering a
> user-implemented MATOP? MatGetDiagonal supports MATOP, but the block
> version of this does not.
>
> I found a previous query on the user list which touched on this and
> mentioned that it would be easy to add:
>
> http://lists.mcs.anl.gov/pipermail/petsc-users/2011-May/008700.html
>
> I have implemented a matrix-free multigrid algorithm using shell
> operations in PETSc, and it would be very convenient to be able to provide
> a local shell Mat so I could apply local GMRES (or other matvec-based
> solvers) as a local block smoother.
>

It looks like the thing you need to do is use PetscObjectComposeFunction()
and not MatShellSetOperation()

http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Sys/
PetscObjectComposeFunction.html#PetscObjectComposeFunction

with your MatShell object.

That is, instead of calling MatShellSetOperation(), call
ierr = PetscObjectComposeFunction(myshell,"MatGetDiagonalBlock_C",
MatGetDiagonalBlock_MyShell);CHKERRQ(ierr);

where MatGetDiagonalBlock_MyShell is a function pointer to your method to
get the diagonal block.

Important detail is that you don't change the string
"MatGetDiagonalBlock_C". The method MatGetDiagonalBlock() does a function
pointer query using this string. See
http://www.mcs.anl.gov/petsc/petsc-current/src/mat/interface/matrix.c.html#MatGetDiagonalBlock


Thanks
Dave






>
> Thanks!
> Steven
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20160826/04a7b5d2/attachment.html>


More information about the petsc-users mailing list