[petsc-users] Changing the operator for PCMG while leaving interpolation matrices unchanged
Ben Yee
bcyee at umich.edu
Fri Jan 26 09:48:07 CST 2018
Hi Barry,
This seems to work for me. I defined the following function in our code
repository, and I call it every time I use KSPSetOperators to update the
operator for my KSP object with PCMG:
PetscErrorCode PCMGSoftReset(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; 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);
}
}
pc->setupcalled = PETSC_FALSE;
PetscFunctionReturn(0);
}
(Note that I had to add "pc->setupcalled = PETSC_FALSE".) Thanks for the
help!
On Wed, Jan 24, 2018 at 12:19 PM, Smith, Barry F. <bsmith at mcs.anl.gov>
wrote:
>
> 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 <bcyee at umich.edu> 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. <bsmith at mcs.anl.gov>
> 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 <bcyee at umich.edu> 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
>
>
--
Ben Yee
NERS PhD Candidate, University of Michigan
B.S. Mech. & Nuclear Eng., U.C. Berkeley
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20180126/8f76e561/attachment-0001.html>
More information about the petsc-users
mailing list