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.

Reply via email to