[petsc-dev] Problem with DMKSP/DMSNES and GMG
Jed Brown
jed at jedbrown.org
Fri Oct 26 10:24:56 CDT 2018
Matthew Knepley <knepley at gmail.com> writes:
> On Fri, Oct 26, 2018 at 11:06 AM Jed Brown <jed at jedbrown.org> wrote:
>
>> Matthew Knepley <knepley at 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.
More information about the petsc-dev
mailing list