[petsc-users] PCComposite

Jed Brown jedbrown at mcs.anl.gov
Mon May 28 10:16:09 CDT 2012


On Mon, May 28, 2012 at 9:40 AM, Hui Zhang <mike.hui.zhang at hotmail.com>wrote:

>
> On May 28, 2012, at 3:42 PM, Jed Brown wrote:
>
> On Mon, May 28, 2012 at 8:40 AM, Hui Zhang <mike.hui.zhang at hotmail.com>wrote:
>
>>
>> On May 28, 2012, at 3:20 PM, Jed Brown wrote:
>>
>> On Mon, May 28, 2012 at 5:19 AM, Hui Zhang <mike.hui.zhang at hotmail.com>wrote:
>>
>>> Sorry for repost the following question, but after reading composite.c
>>> and asm.c,
>>> I can not understand.  I observed that my subroutine for modifying
>>> submatrices of PCASM was
>>> called twice.  In composite.c it seems there is no calling of PCSetUp on
>>> its componential PC's.
>>> In asm.c, the PCSetUp_ASM first determines whether pc->setupcalled is
>>> true.
>>>
>>> I think this is a general question for PCComposite say pc. If it
>>> consists of two pc's  pc0, pc1
>>> and I have PCSetUp(pc0), I would not expect pc0 to be SetUp again.  I
>>> can not understand
>>> in my case why PCASM seems SetUp twice.
>>>
>>
>> Does the routine do anything or just return immediately? If nothing has
>> been changed since the last time a PC was set up, it should return
>> immediately. If you have changed some configuration, it may need to be set
>> up again.
>>
>>
>> Thanks. But I said something wrong.  The source code asm.c does call the
>> ModifySubMatrices
>> whenever PCSetUp is called on PCASM, no matter whether it was called
>> before.  So this
>> explains my observation (two calls of ModifySubMatrices).  My new
>> question is:  can you
>> add a user control to determine whether MatGetSubMatrices and
>> PCModifySubMatrices
>> should be called inside PCSetUp_ASM ?  But maybe this is too invasive and
>> not
>> very useful to most people (although useful to me).
>>
>
> It does not reach PCSetUp_ASM unless something has changed. Run with -info
> and/or in a debugger to see why.
>
> PetscErrorCode  PCSetUp(PC pc)
> {
>   PetscErrorCode ierr;
>   const char     *def;
>
>   PetscFunctionBegin;
>   PetscValidHeaderSpecific(pc,PC_CLASSID,1);
>   if (!pc->mat)
> SETERRQ(((PetscObject)pc)->comm,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be
> set first");
>
>   if (pc->setupcalled > 1) {
>     ierr = PetscInfo(pc,"Setting PC with identical
> preconditioner\n");CHKERRQ(ierr);
>     PetscFunctionReturn(0);
>
>
>
> Thanks for the hints.  I found why (I hope).  We have KSP named ksp and
> its PC is pc,
> and pc is PCComposite with pc0, pc1. The program runs like KSPSetUp on
> ksp, which
> calls PCSetUp on pc, i.e. PCSetUp_Composite on pc.  The source codes read
>
> *static PetscErrorCode <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Sys/PetscErrorCode.html#PetscErrorCode> PCSetUp_Composite(PC <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PC.html#PC> pc)*168: {169:   PetscErrorCode <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Sys/PetscErrorCode.html#PetscErrorCode>   ierr;170:   PC_Composite     *jac = (PC_Composite*)pc->data;171:   PC_CompositeLink next = jac->head;
> 174:   if (!jac->work1) {175:    MatGetVecs <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/Mat/MatGetVecs.html#MatGetVecs>(pc->pmat,&jac->work1,0);176:   }177:   while (next) {178:     PCSetOperators <http://www.mcs.anl.gov/petsc/petsc-current/docs/manualpages/PC/PCSetOperators.html#PCSetOperators>(next->pc,pc->mat,pc->pmat,pc->flag);179:     next = next->next;180:   }181:   return(0);182: }
>
> Note the 178 line which calls PCSetOperators on pc0 and pc1.  The source
> codes of PCSetOperators
> read
>
> 1050:  if (pc->setupcalled == 2 && flag != SAME_PRECONDITIONER) {1051:     pc->setupcalled = 1;1052:   }
>
> Note the 1051 line reset pc->setupcalled to 1, here the pc from
> PCSetUp_Composite is pc0 and pc1.
> So although if pc0  has been set up, this will cause pc0 be set up again.
>
> Is my reading correct?
>

When you change the operators, the preconditioner has to be set up again
(perhaps not a "complete" setup, but some setup is required).


>
> Thanks a lot!
> Hui
>
>
>
>
>>
>>
>>
>>
>>
>>>
>>> Thanks!
>>> Hui
>>>
>>>
>>> > I have got a new question.  I'm now constructing a PCComposite from
>>> PCASM and another PCKSP (coarse
>>> > problem). And construction of PCKSP needs to use the subksp's of
>>> PCASM. So I need to PCSetUp on the
>>> > PCASM, right?  But the KSP using PCComposite would setup PCASM again.
>>>  How can I avoid twice setup
>>> > of PCASM ?
>>>
>>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20120528/c808b14f/attachment.html>


More information about the petsc-users mailing list