DMKSP#
Object held by a DM
that contains all the callback functions and their contexts needed by a KSP
Synopsis#
struct _p_DMKSP {
PETSCHEADER(struct _DMKSPOps);
void *operatorsctx;
void *rhsctx;
void *initialguessctx;
void *data;
/* See developer note for `DMKSP` above */
DM originaldm;
void (*fortran_func_pointers[3])(void); /* Store our own function pointers so they are associated with the DMKSP instead of the DM */
};
Notes#
Users provides callback functions and their contexts to KSP
using, for example, KSPSetComputeRHS()
. These values are stored
in a DMKSP
that is contained in the DM
associated with the KSP
. If no DM
was provided by
the user with KSPSetDM()
it is automatically created by KSPGetDM()
with DMShellCreate()
.
Users very rarely need to worked directly with the DMKSP
object, rather they work with the KSP
and the DM
they created
Multiple DM
can share a single DMKSP
, often each DM
is associated with
a grid refinement level. DMGetDMKSP()
returns the DMKSP
associated with a DM
. DMGetDMKSPWrite()
returns a unique
DMKSP
that is only associated with the current DM
, making a copy of the shared DMKSP
if needed (copy-on-write).
Developer Notes#
It is rather subtle why DMKSP
, DMSNES
, and DMTS
are needed instead of simply storing the user callback functions and contexts in DM
or KSP
, SNES
, or TS
.
It is to support composable solvers such as geometric multigrid. We want, by default, the same callback functions and contexts for all the levels in the computation,
but we need to also support different callbacks and contexts on each level. The copy-on-write approach of DMGetDMKSPWrite()
makes this possible.
The originaldm
inside the DMKSP
is NOT reference counted (to prevent a reference count loop between a DM
and a DMKSP
).
The DM
on which this context was first created is cached here to implement one-way
copy-on-write. When DMGetDMKSPWrite()
sees a request using a different DM
, it makes a copy of the TSDM
. Thus, if a user
only interacts directly with one level, e.g., using TSSetIFunction()
, then coarse levels of a multilevel item
integrator are built, then the user changes the routine with another call to TSSetIFunction()
, it automatically
propagates to all the levels. If instead, they get out a specific level and set the function on that level,
subsequent changes to the original level will no longer propagate to that level.
See Also#
TS: Scalable ODE and DAE Solvers, KSP
, KSPCreate()
, DM
, DMGetDMKSPWrite()
, DMGetDMKSP()
, DMSNES
, DMTS
, DMKSPSetComputeOperators()
, DMKSPGetComputeOperators()
,
DMKSPSetComputeRHS()
, DMKSPSetComputeInitialGuess()
Level#
developer
Location#
include/petsc/private/kspimpl.h
Index of all KSP routines
Table of Contents for all manual pages
Index of all manual pages