This is off the top of my head and my not be useful. Copy PCReset_MG() which 
is 

PetscErrorCode PCReset_MG(PC pc)
{
  PC_MG          *mg        = (PC_MG*)pc->data;
  PC_MG_Levels   **mglevels = mg->levels;
  PetscErrorCode ierr;
  PetscInt       i,n;

  PetscFunctionBegin;
  if (mglevels) {
    n = mglevels[0]->levels;
    for (i=0; i<n-1; i++) {
      ierr = VecDestroy(&mglevels[i+1]->r);CHKERRQ(ierr);
      ierr = VecDestroy(&mglevels[i]->b);CHKERRQ(ierr);
      ierr = VecDestroy(&mglevels[i]->x);CHKERRQ(ierr);
      ierr = MatDestroy(&mglevels[i+1]->restrct);CHKERRQ(ierr);
      ierr = MatDestroy(&mglevels[i+1]->interpolate);CHKERRQ(ierr);
      ierr = VecDestroy(&mglevels[i+1]->rscale);CHKERRQ(ierr);
    }

    for (i=0; i<n; i++) {
      ierr = MatDestroy(&mglevels[i]->A);CHKERRQ(ierr);
      if (mglevels[i]->smoothd != mglevels[i]->smoothu) {
        ierr = KSPReset(mglevels[i]->smoothd);CHKERRQ(ierr);
      }
      ierr = KSPReset(mglevels[i]->smoothu);CHKERRQ(ierr);
    }
  }
  PetscFunctionReturn(0);
}

And change it to only destroy mats on each level ierr = 
MatDestroy(&mglevels[i]->A);CHKERRQ(ierr); Keep everything else.

Not that you will need to include #include <petsc/private/pcmgimpl.h>  in your 
code.

> On Jan 24, 2018, at 9:53 AM, Ben Yee <[email protected]> wrote:
> 
> Yes, the nonzero structure changes in a way that cannot easily be predicted.  
> I could overallocate, add some extra entries to the first matrix, and reuse 
> that matrix, but I would have to roughly double the number of allocated 
> entries, leading to an undesirable increase in memory.  I think that one 
> alternative would be to just reset the KSP object when I change the operator, 
> but, if I'm not mistaken, this would destroy all the interpolation operators 
> and I'd have to redefine all of them.
> 
> On Wed, Jan 24, 2018 at 10:41 AM, Smith, Barry F. <[email protected]> wrote:
> 
>   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
> 
> 
> 
> 
> -- 
> Ben Yee
> 
> NERS PhD Candidate, University of Michigan
> B.S. Mech. & Nuclear Eng., U.C. Berkeley

Reply via email to