[petsc-users] PCComposite
Hui Zhang
mike.hui.zhang at hotmail.com
Mon May 28 10:25:49 CDT 2012
On May 28, 2012, at 5:16 PM, Jed Brown wrote:
> 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 PCSetUp_Composite(PC pc)
> 168: {
> 169: PetscErrorCode ierr;
> 170: PC_Composite *jac = (PC_Composite*)pc->data;
> 171: PC_CompositeLink next = jac->head;
>
> 174: if (!jac->work1) {
> 175: MatGetVecs(pc->pmat,&jac->work1,0);
> 176: }
> 177: while (next) {
> 178: 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).
But I'm not *changing* the operator. It is PCSetUp_Composite that call PCSetOperators on sub pc
a second time-- he does not know that the sub pc has been set up before.
>
>
> 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/ea9cbb03/attachment-0001.html>
More information about the petsc-users
mailing list