Matthew Knepley <knep...@gmail.com> writes: > On Fri, Oct 26, 2018 at 11:06 AM Jed Brown <j...@jedbrown.org> wrote: > >> Matthew Knepley <knep...@gmail.com> writes: >> >> > 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); >> > } >> >> Wait, pc->dm is the coupled system while each dms[i] is a component >> (like velocity). It would be awkward to ask the user to write a single >> function that would inspect the DM to figure out what sort of problem it >> was discretizing (velocity-only, pressure-only, >> velocity-pressure-coupled, etc.). Do you currently have a >> ComputeOperators for each sub-problem? >> > > CreateSubDM() returns a DM whose DS only involves the subset of fields.
DS? That isn't really a DM-level concept; I see you use it in a couple utility functions in DMDA, but it isn't part of the solver-related functionality. In any case, the code you wrote above looks to be moving the outer ComputeOperators onto a sub-DM, which can't possibly be a desirable solution. Why can't DMCreateSubDM ensure that each sub DM is endowed with whatever discretization functionality is known? > Thus, only > the v-v block is present in the subDM, and when the SNES assembly functions > is called, > it forms that block. I just need that function to be called. Is it really the same function as is used by the outer DM? That is not a general-purpose solution because users can set DMKSPSetComputeOperators/KSPSetComputeOperator to directly call their own functions.