Thank you, Barry.
Now I put in the KSPSetOperators() in the ComputeJacobian() routine. It works.
And I found out some interesting things, it also triggers the LU factorization
for the fine grid smoothers. Now I get 2 MatLUFactorSym (one for coarse and one
the fine grid), and 4 MatLUFactorNum (two for coarse and two for fine) for 2
SNES iteration.
Can I also ask another question? Because MatPtAP is not supported for baij
matrices. I want to setup a routine to calculate coarse operator if the fine
grid matrices is of type baij. Is there any approach so that I can keep the
symbolic pattern and only redo the numeric part in each SNES, similar to
MatPtAPSymbolic and MatPtAPNumeric?
Best
Yuqi
---- Original message ----
>Date: Thu, 5 Apr 2012 21:35:58 -0500
>From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry Smith <bsmith at
>mcs.anl.gov>)
>Subject: Re: [petsc-users] Questions about PCMG
>To: PETSc users list <petsc-users at mcs.anl.gov>
>
>
>On Apr 5, 2012, at 9:31 PM, Yuqi Wu wrote:
>
>> Hi, Barry,
>>
>> If I use the following routines to setup the coarse operator instead of
>> calling PCMGSetGalerkin()
>>
>> ierr = PCMGGetCoarseSolve(finepc,&ctx->coarseksp);CHKERRQ(ierr);
>> ierr = KSPSetOperators(ctx->coarseksp, coarsealgebra->J, coarsealgebra->J,
>> DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
>
> Are you calling this at every SNES iteration? You should call this inside
> your ComputeJacobian() function, is that where you call it? Passing the
> DIFFERENT_NONZERO_PATTERN will also trigger a new symbolic factorization also.
>
> The refactorization fo the find grid smoother not being redone only effects
> the fine grid smoother, not the coarse grid.
> Barry
>
>
>>
>> Then in the case I have 2 SNES iteration, the MatLUFactorSym and
>> MatLUFactorNum are only called twice in the program. Is this issue also
>> related to the refactorization issue for the fine grid smoother?
>>
>> Best
>>
>> Yuqi
>>
>>
>>
>> ---- Original message ----
>>> Date: Thu, 5 Apr 2012 14:10:02 -0500
>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry Smith <bsmith
>>> at mcs.anl.gov>)
>>> Subject: Re: [petsc-users] Questions about PCMG
>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>
>>>
>>> Yes, at least that is the intention.
>>>
>>> Barry
>>>
>>> On Apr 5, 2012, at 2:06 PM, Yuqi Wu wrote:
>>>
>>>> Hi, Barry,
>>>>
>>>> If my matrix is of type mpibaij, then I cannot use the Galerkin flag in
>>>> the PCMG, e.g. PCMGSetGalerkin(finepc,PETSC_TRUE);
>>>>
>>>> Otherwise, I got the following error messages in PETSc
>>>> [0]PETSC ERROR: No support for this operation for this object type!
>>>> [0]PETSC ERROR: Matrix of type <mpibaij> does not support PtAP!
>>>>
>>>> Can I use the following commands to setup the coarse operator
>>>>
>>>> ierr = PCMGGetCoarseSolve(finepc,&ctx->coarseksp);CHKERRQ(ierr);
>>>> ierr = KSPSetOperators(ctx->coarseksp, coarsealgebra->J, coarsealgebra->J,
>>>> DIFFERENT_NONZERO_PATTERN);CHKERRQ(ierr);
>>>>
>>>> Thank you.
>>>>
>>>> Best
>>>>
>>>> Yuqi
>>>>
>>>>
>>>> ---- Original message ----
>>>>> Date: Thu, 5 Apr 2012 08:10:03 -0500
>>>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry Smith
>>>>> <bsmith at mcs.anl.gov>)
>>>>> Subject: Re: [petsc-users] Questions about PCMG
>>>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>>>
>>>>>
>>>>> It looks like the logic for that line has gotten so convoluted that it
>>>>> lost its purpose and is not triggering the rebuilding on the finest
>>>>> level. Thanks for finding this, we will investigate and get back to you.
>>>>>
>>>>>
>>>>> Barry
>>>>>
>>>>> If your code is not complicated and you are willing to send it to us at
>>>>> petsc-maint at mcs.anl.gov that will make it quicker for us to determine
>>>>> the problem.
>>>>>
>>>>>
>>>>> On Apr 4, 2012, at 11:55 PM, Yuqi Wu wrote:
>>>>>
>>>>>> Thank you Barry.
>>>>>>
>>>>>> I am using exact LU as subdomain solver, so I find out PCSetUp_LU() in
>>>>>> my debugging output. But there are only three PCSetUp_LU() was called in
>>>>>> my program. One in the down smoother of the first SNES, one in the
>>>>>> coarse solve of the first SNES, and one in the coarse solve of the
>>>>>> second SNES.
>>>>>>
>>>>>> In those PCSetUp_LU(), MatLUFactorSymbolic and MatLUFactorNumeric is
>>>>>> called. But I still have no ideas about the actions taken on the down
>>>>>> smoother of the second SNES.
>>>>>>
>>>>>> I try to setup a breakpoint for PCSetUp_MG(). I find out that the IF
>>>>>> statement shown in below is called in the first SNES but not the second
>>>>>> SNES. Is it has something related to this issue?
>>>>>>
>>>>>> /* If user did not provide fine grid operators OR operator was not
>>>>>> updated since last global KSPSetOperators() */
>>>>>> /* so use those from global PC */
>>>>>> /* Is this what we always want? What if user wants to keep old one? */
>>>>>> ierr =
>>>>>> KSPGetOperatorsSet(mglevels[n-1]->smoothd,PETSC_NULL,&opsset);CHKERRQ(ierr);
>>>>>> ierr = KSPGetPC(mglevels[0]->smoothd,&cpc);CHKERRQ(ierr);
>>>>>> ierr = KSPGetPC(mglevels[n-1]->smoothd,&mpc);CHKERRQ(ierr);
>>>>>> if (!opsset || ((cpc->setupcalled == 1) && (mpc->setupcalled == 2)) ||
>>>>>> ((mpc == cpc) && (mpc->setupcalled == 2))) {
>>>>>> ierr = PetscInfo(pc,"Using outer operators to define finest grid
>>>>>> operator \n because
>>>>>> PCMGGetSmoother(pc,nlevels-1,&ksp);KSPSetOperators(ksp,...); was not
>>>>>> called.\n");CHKERRQ(ierr);
>>>>>> ierr =
>>>>>> KSPSetOperators(mglevels[n-1]->smoothd,pc->mat,pc->pmat,pc->flag);CHKERRQ(ierr);
>>>>>> }
>>>>>>
>>>>>> Thank you.
>>>>>>
>>>>>> Yuqi
>>>>>>
>>>>>>
>>>>>>
>>>>>> ---- Original message ----
>>>>>>> Date: Wed, 4 Apr 2012 19:51:23 -0500
>>>>>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry Smith
>>>>>>> <bsmith at mcs.anl.gov>)
>>>>>>> Subject: Re: [petsc-users] Questions about PCMG
>>>>>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>>>>>
>>>>>>>
>>>>>>> Step through the PCSetUp() function using "next" and you will it first
>>>>>>> making the decision of whether to continue with the setup or simply
>>>>>>> return early.
>>>>>>>
>>>>>>> When it gets to the lines
>>>>>>>
>>>>>>> if (pc->ops->setup) {
>>>>>>> ierr = (*pc->ops->setup)(pc);CHKERRQ(ierr);
>>>>>>> }
>>>>>>>
>>>>>>> don't use "next" instead use "step" and it will go into the function
>>>>>>> PCSetUp_ILU() and you can move through that one with "next"
>>>>>>>
>>>>>>>> I cannot find any MatLUFactorSymbolic or MatLUFactorNumeric calls in
>>>>>>>> the debugger.
>>>>>>>
>>>>>>> It has to be calling them. Did you use "break MatLUFactorSymbolic" in
>>>>>>> the debugger?
>>>>>>>
>>>>>>> Barry
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Apr 4, 2012, at 7:45 PM, Yuqi Wu wrote:
>>>>>>>
>>>>>>>> ---- Original message ----
>>>>>>>>> Date: Wed, 4 Apr 2012 13:55:55 -0500
>>>>>>>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry Smith
>>>>>>>>> <bsmith at mcs.anl.gov>)
>>>>>>>>> Subject: Re: [petsc-users] Questions about PCMG
>>>>>>>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Note: In most applications the flag SAME_NONZERO_PATTERN is provided
>>>>>>>>> in the compute Jacobian routine, this means that the SYMBOLIC
>>>>>>>>> factorization needs to be only done ONCE per matrix; only the numeric
>>>>>>>>> factorization needs to be done when the nonzero values have changed
>>>>>>>>> (the symbolic need not be repeated). Are you using this flag? How
>>>>>>>>> many times in the NUMERIC factorization being done?
>>>>>>>>>
>>>>>>>>> When you run the program with -info it will print information of the
>>>>>>>>> form: (run on one process to make life simple)
>>>>>>>>>
>>>>>>>>> Setting PC with identical preconditioner\
>>>>>>>>> Setting up new PC
>>>>>>>>> Setting up PC with same nonzero pattern\
>>>>>>>>> Setting up PC with different nonzero pattern\n
>>>>>>>>>
>>>>>>>>> How many, and exactly what messages of this form are you getting?
>>>>>>>>>
>>>>>>>>> When all else fails you can run the program in the debugger to track
>>>>>>>>> what is happening and why.
>>>>>>>>>
>>>>>>>>> Put a breakpoint in PCSetUp() then each time it gets called use next
>>>>>>>>> to step through it to see what is happening.
>>>>>>>>>
>>>>>>>>> First thing to check, is PCSetUp() getting called on each level for
>>>>>>>>> each new SNES iteration?
>>>>>>>>>
>>>>>>>>> Second thing, if it is then why is it not triggering the new
>>>>>>>>> numerical factorization.
>>>>>>>>
>>>>>>>> I run the program in debugger. I got total 8 PCSetUp() in the program.
>>>>>>>> And I believe that PCSetup() is called on each level for each new SNES
>>>>>>>> iteration.
>>>>>>>>
>>>>>>>> But I don't know how to check why is it not triggering the new
>>>>>>>> numerical factorization in the debugger. I cannot find any
>>>>>>>> MatLUFactorSymbolic or MatLUFactorNumeric calls in the debugger. Could
>>>>>>>> you give me some suggestions to find out the problem?
>>>>>>>>
>>>>>>>> Best
>>>>>>>>
>>>>>>>> Yuqi
>>>>>>>>
>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Barry
>>>>>>>>>
>>>>>>>>> On Apr 4, 2012, at 1:34 PM, Yuqi Wu wrote:
>>>>>>>>>
>>>>>>>>>> Thanks, Adam.
>>>>>>>>>>
>>>>>>>>>> Yes. I am using the Galerkin coarse grids. But I am not sure whether
>>>>>>>>>> the coarse grid is not getting refactored in the second SNES solve
>>>>>>>>>> or the fine grid smoother is not getting refactored in the second
>>>>>>>>>> SNES solve.
>>>>>>>>>>
>>>>>>>>>> In the -info output attached in the previous email, the fine grid
>>>>>>>>>> matrix is of size 11585 by 11585, and the coarse grid matrix is of
>>>>>>>>>> size 4186 by 4186. In the -info output, I found out three
>>>>>>>>>> MatLUFactorSymbolic_SeqAIJ routines, one for fine martrix, and two
>>>>>>>>>> for coarse matrix.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): Reallocs 2 Fill ratio:given 5
>>>>>>>>>> needed 11.401
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): Run with -pc_factor_fill 11.401 or
>>>>>>>>>> use
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): PCFactorSetFill(pc,11.401);
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): for best performance.
>>>>>>>>>> [0] Mat_CheckInode_FactorLU(): Found 8057 nodes of 11585. Limit
>>>>>>>>>> used: 5. Using Inode routines
>>>>>>>>>>
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): Reallocs 1 Fill ratio:given 5
>>>>>>>>>> needed 7.07175
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): Run with -pc_factor_fill 7.07175
>>>>>>>>>> or use
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): PCFactorSetFill(pc,7.07175);
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): for best performance.
>>>>>>>>>> [0] Mat_CheckInode_FactorLU(): Found 1764 nodes of 4186. Limit used:
>>>>>>>>>> 5. Using Inode routines
>>>>>>>>>>
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): Reallocs 1 Fill ratio:given 5
>>>>>>>>>> needed 7.07175
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): Run with -pc_factor_fill 7.07175
>>>>>>>>>> or use
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): PCFactorSetFill(pc,7.07175);
>>>>>>>>>> [0] MatLUFactorSymbolic_SeqAIJ(): for best performance.
>>>>>>>>>> [0] Mat_CheckInode_FactorLU(): Found 1764 nodes of 4186. Limit used:
>>>>>>>>>> 5. Using Inode routines
>>>>>>>>>>
>>>>>>>>>> So I believe that the fine grid smoother is not getting refactored
>>>>>>>>>> in the second SNES solve.
>>>>>>>>>>
>>>>>>>>>> Best
>>>>>>>>>>
>>>>>>>>>> Yuqi
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> ---- Original message ----
>>>>>>>>>>> Date: Wed, 4 Apr 2012 14:24:28 -0400
>>>>>>>>>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of "Mark F.
>>>>>>>>>>> Adams" <mark.adams at columbia.edu>)
>>>>>>>>>>> Subject: Re: [petsc-users] Questions about PCMG
>>>>>>>>>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>>>>>>>>>
>>>>>>>>>>> I would expect 4 calls to MatLUFactorSym here. It looks like the
>>>>>>>>>>> coarse grid is not getting refactored in the second SNES solve.
>>>>>>>>>>>
>>>>>>>>>>> Are you using Galerkin coarse grids? Perhaps you are not setting a
>>>>>>>>>>> new coarse grid with KSPSetOperator and so MG does not bother
>>>>>>>>>>> refactoring it.
>>>>>>>>>>>
>>>>>>>>>>> Mark
>>>>>>>>>>>
>>>>>>>>>>> On Apr 4, 2012, at 1:53 PM, Yuqi Wu wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Thank you.
>>>>>>>>>>>>
>>>>>>>>>>>> Can I ask another question?
>>>>>>>>>>>>
>>>>>>>>>>>> In my log summary output, it shows that although there are two
>>>>>>>>>>>> SNES iteration and total 9 linear iterations. The functions
>>>>>>>>>>>> MatLUFactorSym and MatLUFactorNum are only called for three times.
>>>>>>>>>>>>
>>>>>>>>>>>> MatLUFactorSym 3 1.0 1.4073e+00 1.0 0.00e+00 0.0 0.0e+00
>>>>>>>>>>>> 0.0e+00 1.5e+01 1 0 0 0 2 1 0 0 0 2 0
>>>>>>>>>>>> MatLUFactorNum 3 1.0 3.2754e+01 1.0 9.16e+09 1.0 0.0e+00
>>>>>>>>>>>> 0.0e+00 0.0e+00 31 97 0 0 0 32 97 0 0 0 280
>>>>>>>>>>>>
>>>>>>>>>>>> I checked the -info output. It shows that One
>>>>>>>>>>>> MatLUFactorSymbolic_SeqAIJ() is called in down smoother of the
>>>>>>>>>>>> first SNES, one MatLUFactorSymbolic_SeqAIJ() is called in the
>>>>>>>>>>>> coarse solve of the first SNES, and one
>>>>>>>>>>>> MatLUFactorSymbolic_SeqAIJ() is called in the down smoother of the
>>>>>>>>>>>> second SNES.
>>>>>>>>>>>>
>>>>>>>>>>>> Do you have any ideas why there are 9 multigrid iterations, but
>>>>>>>>>>>> only 3 MatLUFactorSymbolic calls in the program?
>>>>>>>>>>>>
>>>>>>>>>>>> Best
>>>>>>>>>>>>
>>>>>>>>>>>> Yuqi
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> ---- Original message ----
>>>>>>>>>>>>> Date: Tue, 3 Apr 2012 20:08:27 -0500
>>>>>>>>>>>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry
>>>>>>>>>>>>> Smith <bsmith at mcs.anl.gov>)
>>>>>>>>>>>>> Subject: Re: [petsc-users] Questions about PCMG
>>>>>>>>>>>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> There are two linear solves (for 1 SNES and 2 SNES) so there are
>>>>>>>>>>>>> two MGSetUp on each level. Then a total of 9 multigrid iterations
>>>>>>>>>>>>> (in both linear solves together) hence 9 smoother on level 0
>>>>>>>>>>>>> (level 0 means coarse grid solve). One smooth down and one smooth
>>>>>>>>>>>>> up on level 1 hence 18 total smooths on level 1. 9 computation
>>>>>>>>>>>>> of residual on level 1 and 18 MgInterp because that logs both the
>>>>>>>>>>>>> restriction to level 0 and the interpolation back to level 1 and
>>>>>>>>>>>>> 18 = 9 + 9.
>>>>>>>>>>>>>
>>>>>>>>>>>>> Barry
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Apr 3, 2012, at 7:57 PM, Yuqi Wu wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi, Barry,
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Thank you. If my program converges in two SNES iteration,
>>>>>>>>>>>>>> 0 SNES norm 1.014991e+02, 0 KSP its (nan coarse its average),
>>>>>>>>>>>>>> last norm 0.000000e+00
>>>>>>>>>>>>>> 1 SNES norm 9.925218e-05, 4 KSP its (5.25 coarse its average),
>>>>>>>>>>>>>> last norm 2.268574e-06.
>>>>>>>>>>>>>> 2 SNES norm 1.397282e-09, 5 KSP its (5.20 coarse its average),
>>>>>>>>>>>>>> last norm 1.312605e-12.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> And -pc_mg_log shows the following output
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> MGSetup Level 0 2 1.0 3.4091e-01 2.1 0.00e+00 0.0 3.0e+02
>>>>>>>>>>>>>> 6.0e+04 3.0e+01 1 0 3 11 2 1 0 3 11 2 0
>>>>>>>>>>>>>> MGSmooth Level 0 9 1.0 1.2126e+01 1.0 9.38e+08 3.2 2.8e+03
>>>>>>>>>>>>>> 1.7e+03 6.4e+02 33 71 28 3 34 35 71 28 3 35 415
>>>>>>>>>>>>>> MGSetup Level 1 2 1.0 1.3925e-01 2.1 0.00e+00 0.0 1.5e+02
>>>>>>>>>>>>>> 3.1e+04 2.3e+01 0 0 1 3 1 0 0 1 3 1 0
>>>>>>>>>>>>>> MGSmooth Level 1 18 1.0 5.8493e+00 1.0 3.66e+08 3.1 1.5e+03
>>>>>>>>>>>>>> 2.9e+03 3.6e+02 16 28 15 3 19 17 28 15 3 19 339
>>>>>>>>>>>>>> MGResid Level 1 9 1.0 1.1826e-01 1.4 1.49e+06 2.4 2.0e+02
>>>>>>>>>>>>>> 2.7e+03 9.0e+00 0 0 2 0 0 0 0 2 0 0 70
>>>>>>>>>>>>>> MGInterp Level 1 18 1.0 1.2317e-01 1.3 7.74e+05 2.2 3.8e+02
>>>>>>>>>>>>>> 1.1e+03 1.8e+01 0 0 4 0 1 0 0 4 0 1 37
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> What are the MGSmooth, MGResid, MGInterp represent for?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Best
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Yuqi
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> ---- Original message ----
>>>>>>>>>>>>>>> Date: Tue, 3 Apr 2012 19:19:23 -0500
>>>>>>>>>>>>>>> From: petsc-users-bounces at mcs.anl.gov (on behalf of Barry
>>>>>>>>>>>>>>> Smith <bsmith at mcs.anl.gov>)
>>>>>>>>>>>>>>> Subject: Re: [petsc-users] Questions about PCMG
>>>>>>>>>>>>>>> To: PETSc users list <petsc-users at mcs.anl.gov>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> -pc_mg_log doesn't have anything to do with DA or DMMG it is
>>>>>>>>>>>>>>> part of the basic PCMG. Are you sure you are calling
>>>>>>>>>>>>>>> SNESSetFromOptions()?
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> Barry
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Apr 3, 2012, at 6:56 PM, Yuqi Wu wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hi, Mark,
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Thank you so much for your suggestion.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> The problem 1 is resolved by avoiding calling
>>>>>>>>>>>>>>>> PCMGSetNumberSmoothUp.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> But since I am using the unstructured grid in my application,
>>>>>>>>>>>>>>>> I didn't use DA or dmmg, so -pc_mg_log didn't give any level
>>>>>>>>>>>>>>>> information. I try to run my code using -info with 1
>>>>>>>>>>>>>>>> processor, and I find out some interesting issues.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>
>>>
>