Sounds good. Yes the outer most Jacobian can be shell (or even nest but then 
I think you need to "build" it yourself, I don't think the DMDA will give back 
an appropriate nest matrix.)


> On Jul 1, 2021, at 4:10 PM, Matteo Semplice <[email protected]> 
> wrote:
> 
> Thank you, Matthew and Barry!
> 
> I can now see a way forward.
> 
> Il 01/07/21 21:42, Barry Smith ha scritto:
>>> I do not understand how creating a DMDA with n0+n1 dofs will let me easily 
>>> reuse my shell preconditioner code on the top-left block.
>>    PCFIELDSPLIT (and friends) do not order the dof by block, rather they 
>> "pull out" the required pieces of the vector (using IS's) when needed. Your 
>> shell preconditioner will just operate on the "pulled out" vectors. If you 
>> use DMDAVecGetArray etc in your shell preconditioner you can create an 
>> auxiliary DMDA of that smaller dof to still be able to use the 
>> DMDAVecGetArray constructs.
> Just to be sure:
> - I create a DMDA with n0+n1 dof per node
> 
> - the jacobian will be associated to this DMDA. (It is not crucial, but can 
> this be a shell matrix?)
> 
> - I create a multiplicative PCfieldsplit, assign the correct n0 and n1 fields 
> to each split (and get the IS for the splits via PCFieldSplitGetIS, shuld I 
> need them)
> 
> - the routine A00PCApply for the shell preconditioner of the A00 block, will 
> see a Vec which is really a subvector with n0 dofs per node. In order to use 
> DMDA semantics on this one, I create a DMDA with n0 dofs using 
> DMDACreateCompatibleDMDA and then VecGetArrayDOFS using the smaller DMDA?
> 
> Best
> 
>     Matteo
> 
> 
> 

Reply via email to