[petsc-dev] PetscObjectStateIncrease in MatMult*

Barry Smith bsmith at mcs.anl.gov
Mon Oct 19 07:13:01 CDT 2015


> On Oct 19, 2015, at 5:06 AM, Václav Hapla <vaclav.hapla at vsb.cz> wrote:
> 
> Again, I can see that MatShellSetOperation sets mat->ops->mult pointer directly
> (see http://www.mcs.anl.gov/petsc/petsc-dev/src/mat/impls/shell/shell.c.html line 779).
> to user-specified MatMult unless MatShellUseScaledMethods has been called (e.g. from MatScale_Shell)
> (see http://www.mcs.anl.gov/petsc/petsc-dev/src/mat/impls/shell/shell.c.html line 70).
> 
> So your MatMult_Shell and MatMultTranspose_Shell is completely ignored if one has not scaled its Mat.
> 
> Sorry Barry for replying this only to you before.

  Ahh, thanks for reporting this I guess I need to change the code to always do the extra indirection.
> 
> Vaclav
> 
> 
> Dne 17.10.2015 v 22:08 Barry Smith napsal(a):
>> https://bitbucket.org/petsc/petsc/pull-requests/378/update-the-output-vector-state-in-pc-and/diff
>> 
>> On Oct 17, 2015, at 11:12 AM, Václav Hapla <vaclav.hapla at vsb.cz> wrote:
>>> Yes, exactly, MATSHELL.
>>> But if I am right, MatShellSetOperation sets mat->ops->mult pointer directly to user-specified MatMult unless MatShellUseScaledMethods has been called.
>>> So user must keep in mind he should call PetscObjectStateIncrease in his MatMult.
>>> I feel like this is something one would intuitively await from the interface function...
>>> It would be less error-prone for future and user-implemented MatTypes.
>>> Vaclav
>>> 
>>> Dne 17.10.2015 v 17:58 Barry Smith napsal(a):
>>>>> On Oct 17, 2015, at 5:10 AM, Václav Hapla <vaclav.hapla at vsb.cz> wrote:
>>>>> 
>>>>> Hello,
>>>>> MatMult(), MatMultTranspose(), MatMultAdd(), MatMultTransposeAdd() and PCApply() belong to most common modifiers of Vec values.
>>>>> Maybe it would be nice if these routines called PetscObjectStateIncrease explicitly because of MATSHELL and such stuff.
>>>>> Thanks,
>>>>> Vaclav
>>>>    I assume you are suggesting this because users of MATSHELL or PCSHELL may not realize they need to call PetscObjectStateIncrease() on the output vector if they do not use VecGe/RestoretArray() to access the vector entries? (VecRestoreArray() automatically increases the state)
>>>> 
>>>>    What if we add it to MatMult_Shell(), MatMultTranspose_Shell(), PCApply_Shell() and PCApplyTranspose_Shell()?  It looks like those are the only ones where the state won't get increased automatically
>>>> 
>>>>    Thanks for the suggestion,
>>>> 
>>>>   Barry
>>>> 
>>>>> -- 
>>>>> 
>>>>> Vaclav Hapla
>>>>> Junior researcher
>>>>> IT4Innovations <http://www.it4i.eu/>
>>>>> 
>>>>> 
> 
> 




More information about the petsc-dev mailing list