Ben

    This is a good question, I'll take a look at how difficult it would be to 
add this feature.

     I take it the nonzero structure of the outer matrix changes over time?


   Barry


> On Jan 24, 2018, at 9:12 AM, Ben Yee <[email protected]> wrote:
> 
> Hi,
> 
> I have multiple matrices (with different nonzero structures) for which I 
> would like to use the same KSP operator (KSPRICHARDSON with PCMG, Galerkin 
> process for generating coarse grid operator).  I want to use the same PCMG 
> structure for all the matrices (same interpolation, same restriction, same 
> number of levels, same smoothing techniques, etc.), so I tried using 
> KSPSetOperators to just change the operator.  My interpolation matrices are 
> MPIAIJ matrices that I have defined myself and provided to PCMG.  My hope was 
> that, with the new operator I provided, PETSc would recompute all of the 
> coarse/intermediate grid operators using the Galerkin process with the old 
> interpolation matrices and the new fine-grid operator.
> 
> However, I get the wrong solution after changing the operator with 
> KSPSetOperators.  After some extensive digging around the PETSc source code, 
> it seems that the operators in mg.c are not updated by KSPSetOperators.  When 
> I do a MatView on mglevels->A or the operator in mglevels->smoothu or 
> mglevels->smoothd in PCMGMCycle_Private() of mg.c, it has the matrix values 
> of the old matrix.  From what I understand, the only place where mglevels->A 
> (used to compute the residual) is updated is in PCApplyRIchardson_MG() of 
> mg.c, from the following lines of code:
>  74:   for
>  (i=0; i<levels; i++) {
> 
>  75:     if
>  (!mglevels[i]->A) {
> 
>  76:       KSPGetOperators
> (mglevels[i]->smoothu,&mglevels[i]->A,NULL);
> 
>  77:       PetscObjectReference((PetscObject
> )mglevels[i]->A);
> 
>  78: 
>     }
> 
>  79:   }
> It seems to me that the pointer mglevels[i]->A is only set once, when it is 
> undefined at the beginning of the iteration scheme.  I think there are more 
> issues as well, but this is the easiest one to point out.  (For example, it 
> doesn't seem like it is possible to update the operator for 
> mglevels[i]->smoothd from KSPSetOperators on the outermost KSP object, and, 
> if I try to set it manually via PCMGGetSmoother, I get errors if the nonzero 
> structures of the coarse-grid operators have changed, which tends to be the 
> case when the fine-grid operator's nonzero structure changes).
> 
> Is there something I'm doing wrong?  Is there a way to do this so that I can 
> reuse PCMG with a new operator?
> 
> Thanks!
> 
> -- 
> Ben Yee
> 
> NERS PhD Candidate, University of Michigan
> B.S. Mech. & Nuclear Eng., U.C. Berkeley

Reply via email to