On Friday, 26 August 2016, Steven Dargaville <dargaville.ste...@gmail.com>
wrote:

> Hi Dave
>
> Thanks for the response. I'm actually using fortran and I wasn't sure that
> PetscObjectComposeFunction would be accessible, and if so, what sort of
> fortran magic I might need to call this function (possibly an interface,
> with or without c_opt).
>
> Do you know if it is possible to call that routine directly from fortran?
>

 I don't know. I'll have appeal to the other petsc users for an answer to
these questions.

Thanks,
  Dave


> Thanks
> Steven
>
> On Fri, Aug 26, 2016 at 1:35 PM, Dave May <dave.mayhe...@gmail.com
> <javascript:_e(%7B%7D,'cvml','dave.mayhe...@gmail.com');>> wrote:
>
>>
>>
>> On 26 August 2016 at 14:34, Dave May <dave.mayhe...@gmail.com
>> <javascript:_e(%7B%7D,'cvml','dave.mayhe...@gmail.com');>> wrote:
>>
>>>
>>>
>>> On 26 August 2016 at 14:14, Steven Dargaville <
>>> dargaville.ste...@gmail.com
>>> <javascript:_e(%7B%7D,'cvml','dargaville.ste...@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);
>>>
>>
>> Oops - I forgot the cast, the above should be
>>
>> ierr = PetscObjectComposeFunction((PetscObject)myshell,"MatGetDiago
>> nalBlock_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
>>>>
>>>>
>>>>
>>>
>>
>

Reply via email to