I am having a problem, and every solution I can think of would seem to do violence to encapsulation or to DMKSP/DMSNES.

I want to have GMG automatically work on the velocity part of Stokes. So I give

  -fieldsplit_velocity_pc_type mg

in SNES ex62. This complains that the KSP has a DM but KSPSetComputeOperator() has not been called. It is fine on the global system because SNES called that in SNESSetupMatrices(). Thus in FieldSplit, I inserted

          {
            PetscErrorCode (*func)(KSP,Mat,Mat,void*);
            void            *ctx;

            ierr = DMKSPGetComputeOperators(pc->dm, &func, &ctx);CHKERRQ(ierr);
            ierr = DMKSPSetComputeOperators(dms[i],  func,  ctx);CHKERRQ(ierr);
          }

where we call KSPSetDM(). However, this does not work, because the subDM has a new DMSNES, which does not have the information about the problem.

Solution #1:

  Copy the info from the old DMSNES to the subDMSNES. This inserts a dependence between KSP and SNES which we do not want.

Solution #2:

  Have DMCreateSubDM() copy everything from the solvers. This also inserts dependencies, unless we have a "copy everything" mechanism, but is this what we want.

Solution #3:

  Rethink DMKSP/DMSNES. Is this how we should store problem information. Dave already had another problem with the organization.

What should be done? I have never understood this construct very well. Right now, this is holding up doing some computations I need.

  Thanks,

     Matt
--
What most experimenters take for granted before they begin their experiments is infinitely more interesting than any results to which their experiments lead.
-- Norbert Wiener