> On Nov 9, 2017, at 11:13 PM, Jed Brown <j...@jedbrown.org> wrote:
> 
> "Smith, Barry F." <bsm...@mcs.anl.gov> writes:
> 
>>  Jed,
>> 
>>    Please articulate in a bit more detail. From what I can interpolate you 
>> are saying 
>> 
>> 1) that if we only propagate the outer matrices to inner matrices that the 
>> user has not set we will get a better more intuitive interface for users
>> 
>> but 
>> 
>> 2) the whole idea of propagating in is probably flawed.
> 
> The idea of having only two matrices, Amat and Pmat, is flawed.

  Yes

>  A
> composite preconditioner, for example, may need more.  Having users
> unwrap solvers to manually set matrices is ugly, but in lieu of a better
> way (like named auxiliary matrices that can be requested by nested
> preconditioners), we should honor the user's manual choices.

   Yes. 

    But you are not directly answering my question. Should we change the code 
to not propagate if already set?
> 
>> My interpretation is that, since it unlikely we are going to immediately 
>> come up with a better abstract than propagating we should fix 1) and leave 
>> 2) for the future. Is this a reasonable thing to do, that is do not stop 
>> improvement because perfection is better? Or is there something else we 
>> should do?
>> 
>>   Barry
>> 
>> 
>> 
>>> On Nov 4, 2017, at 8:52 PM, Jed Brown <j...@jedbrown.org> wrote:
>>> 
>>> PCSetUp_Composite propagates the outer matrices to the inner PCs.
>>> 
>>> while (next) {
>>>   ierr = PCSetDM(next->pc,dm);CHKERRQ(ierr);
>>>   ierr = PCSetOperators(next->pc,pc->mat,pc->pmat);CHKERRQ(ierr);
>>>   next = next->next;
>>> }
>>> 
>>> 
>>> You can get the desired behavior by calling PCSetUp before
>>> PCCompositeGetPC.
>>> 
>>> Perhaps the code should be changed to only propagate the outer matrices
>>> if they haven't been set yet.  But propagating matrices like this is a
>>> poor abstraction in general because it conflates configuration with the
>>> supply of problem information.  We don't want the FormJacobian in a time
>>> integrator to need to reach into the SNES -> KSP -> PCComposite to set a
>>> different operator; it doesn't even have enough information to do that.
>>> 
>>> Pierre Jolivet <pierre.joli...@enseeiht.fr> writes:
>>> 
>>>> I’d like to use PCCOMPOSITE to define a preconditioner as the sum of two 
>>>> preconditioners with different operators.
>>>> My current code works with a PCSHELL, but I don’t know how to setup the 
>>>> PCCOMPOSITE appropriately to get the same results.
>>>> Attached is a reproducer (using complex scalars).
>>>> $ ./SHELL_v_COMPOSITE -fSp S.bin -fMp Mp.bin -fLp Lp.bin -ksp_view 
>>>> -pc_type shell -ksp_type preonly 
>>>> $ ./SHELL_v_COMPOSITE -fSp S.bin -fMp Mp.bin -fLp Lp.bin -ksp_view 
>>>> -ksp_type preonly -pc_type composite -pc_composite_type additive 
>>>> -prefix_push sub_0_ -pc_type ksp -ksp_ksp_type preonly -ksp_pc_type jacobi 
>>>> -prefix_pop -prefix_push sub_1_ -pc_type ksp -ksp_ksp_type preonly 
>>>> -ksp_pc_type jacobi -prefix_pop
>>>> What looks weird to me is that for the PCSHELL, the operators for both PCs 
>>>> are of the correct size (36588 and 36814 nonzeros respectively), while for 
>>>> the PCCOMPOSITE, it looks like the same operator is duplicated (-ksp_view 
>>>> tells me that both have 36814 nonzeros which is not what I get with 
>>>> -mat_view ::ascii_info).
>>>> Any idea on how to fix this?
>>>> 
>>>> Thanks,
>>>> Pierre

Reply via email to