xref: /petsc/src/snes/utils/dmsnes.c (revision be081cd66c6344e0381e975908126fb3e880340e)
1b45d2f2cSJed Brown #include <petsc-private/snesimpl.h>   /*I "petscsnes.h" I*/
2679f678eSPeter Brune #include <petsc-private/dmimpl.h>     /*I "petscdm.h" I*/
36cab3a1bSJed Brown 
46cab3a1bSJed Brown #undef __FUNCT__
522c6f798SBarry Smith #define __FUNCT__ "DMSNESDestroy"
622c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm)
76cab3a1bSJed Brown {
86cab3a1bSJed Brown   PetscErrorCode ierr;
96cab3a1bSJed Brown 
106cab3a1bSJed Brown   PetscFunctionBegin;
1122c6f798SBarry Smith  if (!*kdm) PetscFunctionReturn(0);
1222c6f798SBarry Smith   PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1);
1322c6f798SBarry Smith   if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);}
1422c6f798SBarry Smith   if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);}
1522c6f798SBarry Smith   ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr);
1622c6f798SBarry Smith   PetscFunctionReturn(0);
1722c6f798SBarry Smith }
1822c6f798SBarry Smith 
1922c6f798SBarry Smith #undef __FUNCT__
2022c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate"
2122c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
2222c6f798SBarry Smith {
2322c6f798SBarry Smith   PetscErrorCode ierr;
2422c6f798SBarry Smith 
2522c6f798SBarry Smith   PetscFunctionBegin;
2622c6f798SBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES
2722c6f798SBarry Smith   ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr);
2822c6f798SBarry Smith #endif
29b4615a05SBarry Smith   ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID, -1, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, PETSC_NULL);CHKERRQ(ierr);
3022c6f798SBarry Smith   ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMSNESOps));CHKERRQ(ierr);
316cab3a1bSJed Brown   PetscFunctionReturn(0);
326cab3a1bSJed Brown }
336cab3a1bSJed Brown 
346cab3a1bSJed Brown #undef __FUNCT__
35942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES"
36942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
376cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
386cab3a1bSJed Brown  */
39942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
406cab3a1bSJed Brown {
416cab3a1bSJed Brown   PetscErrorCode ierr;
426cab3a1bSJed Brown 
436cab3a1bSJed Brown   PetscFunctionBegin;
44942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr);
456cab3a1bSJed Brown   PetscFunctionReturn(0);
466cab3a1bSJed Brown }
476cab3a1bSJed Brown 
486cab3a1bSJed Brown #undef __FUNCT__
49942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES"
50dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
51caa4e7f2SJed Brown  */
52942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
53caa4e7f2SJed Brown {
54caa4e7f2SJed Brown 
55caa4e7f2SJed Brown   PetscFunctionBegin;
56caa4e7f2SJed Brown   PetscFunctionReturn(0);
57caa4e7f2SJed Brown }
58caa4e7f2SJed Brown 
59caa4e7f2SJed Brown #undef __FUNCT__
60*be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES"
61*be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */
62*be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx)
63*be081cd6SPeter Brune {
64*be081cd6SPeter Brune   PetscErrorCode ierr;
65*be081cd6SPeter Brune 
66*be081cd6SPeter Brune   PetscFunctionBegin;
67*be081cd6SPeter Brune   ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr);
68*be081cd6SPeter Brune   PetscFunctionReturn(0);
69*be081cd6SPeter Brune }
70*be081cd6SPeter Brune 
71*be081cd6SPeter Brune #undef __FUNCT__
72*be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES"
73*be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level.
74*be081cd6SPeter Brune  */
75*be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
76*be081cd6SPeter Brune {
77*be081cd6SPeter Brune 
78*be081cd6SPeter Brune   PetscFunctionBegin;
79*be081cd6SPeter Brune   PetscFunctionReturn(0);
80*be081cd6SPeter Brune }
81*be081cd6SPeter Brune 
82*be081cd6SPeter Brune #undef __FUNCT__
83942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES"
84942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
8503a0fabfSPeter Brune {
8603a0fabfSPeter Brune   PetscErrorCode ierr;
8703a0fabfSPeter Brune 
8803a0fabfSPeter Brune   PetscFunctionBegin;
89942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
9003a0fabfSPeter Brune   PetscFunctionReturn(0);
9103a0fabfSPeter Brune }
9203a0fabfSPeter Brune 
9303a0fabfSPeter Brune #undef __FUNCT__
94942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES"
9503a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
9603a0fabfSPeter Brune  */
97942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
9803a0fabfSPeter Brune {
9903a0fabfSPeter Brune 
10003a0fabfSPeter Brune   PetscFunctionBegin;
10103a0fabfSPeter Brune   PetscFunctionReturn(0);
10203a0fabfSPeter Brune }
10303a0fabfSPeter Brune 
10403a0fabfSPeter Brune #undef __FUNCT__
10522c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy"
10622c6f798SBarry Smith /*@C
10722c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
10822c6f798SBarry Smith 
10922c6f798SBarry Smith    Not Collective
11022c6f798SBarry Smith 
11122c6f798SBarry Smith    Input Argument:
11222c6f798SBarry Smith +  kdm - Original DMSNES
11322c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
11422c6f798SBarry Smith 
11522c6f798SBarry Smith    Level: developer
11622c6f798SBarry Smith 
11722c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
11822c6f798SBarry Smith @*/
11922c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
12022c6f798SBarry Smith {
12122c6f798SBarry Smith   PetscErrorCode ierr;
12222c6f798SBarry Smith 
12322c6f798SBarry Smith   PetscFunctionBegin;
12422c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
12522c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
12622c6f798SBarry Smith   nkdm->ops->computefunction       = kdm->ops->computefunction;
12722c6f798SBarry Smith   nkdm->ops->computegs             = kdm->ops->computegs;
12822c6f798SBarry Smith   nkdm->ops->computeobjective      = kdm->ops->computeobjective;
12922c6f798SBarry Smith   nkdm->ops->computepjacobian      = kdm->ops->computepjacobian;
13022c6f798SBarry Smith   nkdm->ops->computepfunction      = kdm->ops->computepfunction;
13122c6f798SBarry Smith   nkdm->ops->computeblockfunction  = kdm->ops->computeblockfunction;
13222c6f798SBarry Smith   nkdm->ops->computeblockjacobian  = kdm->ops->computeblockjacobian;
13322c6f798SBarry Smith   nkdm->ops->destroy               = kdm->ops->destroy;
13422c6f798SBarry Smith   nkdm->ops->duplicate             = kdm->ops->duplicate;
13522c6f798SBarry Smith 
13622c6f798SBarry Smith   nkdm->functionctx      = kdm->functionctx;
13722c6f798SBarry Smith   nkdm->gsctx            = kdm->gsctx;
13822c6f798SBarry Smith   nkdm->pctx             = kdm->pctx;
13922c6f798SBarry Smith   nkdm->jacobianctx      = kdm->jacobianctx;
14022c6f798SBarry Smith   nkdm->objectivectx     = kdm->objectivectx;
14122c6f798SBarry Smith   nkdm->blockfunctionctx = kdm->blockfunctionctx;
14222c6f798SBarry Smith   nkdm->blockjacobianctx = kdm->blockjacobianctx;
14322c6f798SBarry Smith   nkdm->data             = kdm->data;
14422c6f798SBarry Smith 
14522c6f798SBarry Smith   /*
14622c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
14722c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
14822c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
14922c6f798SBarry Smith   */
15022c6f798SBarry Smith 
15122c6f798SBarry Smith   /* implementation specific copy hooks */
15222c6f798SBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
15322c6f798SBarry Smith   PetscFunctionReturn(0);
15422c6f798SBarry Smith }
15522c6f798SBarry Smith 
15622c6f798SBarry Smith #undef __FUNCT__
157942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES"
1586cab3a1bSJed Brown /*@C
159942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
1606cab3a1bSJed Brown 
1616cab3a1bSJed Brown    Not Collective
1626cab3a1bSJed Brown 
1636cab3a1bSJed Brown    Input Argument:
1646cab3a1bSJed Brown .  dm - DM to be used with SNES
1656cab3a1bSJed Brown 
1666cab3a1bSJed Brown    Output Argument:
167942e3340SBarry Smith .  snesdm - private DMSNES context
1686cab3a1bSJed Brown 
1696cab3a1bSJed Brown    Level: developer
1706cab3a1bSJed Brown 
1716cab3a1bSJed Brown    Notes:
172942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
1736cab3a1bSJed Brown 
174942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
1756cab3a1bSJed Brown @*/
176942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
1776cab3a1bSJed Brown {
1786cab3a1bSJed Brown   PetscErrorCode ierr;
1796cab3a1bSJed Brown 
1806cab3a1bSJed Brown   PetscFunctionBegin;
1816cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
182b4615a05SBarry Smith   *snesdm = (DMSNES) dm->dmsnes;
18322c6f798SBarry Smith   if (!*snesdm) {
184942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
18522c6f798SBarry Smith     ierr = DMSNESCreate(((PetscObject)dm)->comm,snesdm);CHKERRQ(ierr);
186b4615a05SBarry Smith     dm->dmsnes = (PetscObject) *snesdm;
187942e3340SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
18822c6f798SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
189*be081cd6SPeter Brune     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
1906cab3a1bSJed Brown   }
1916cab3a1bSJed Brown   PetscFunctionReturn(0);
1926cab3a1bSJed Brown }
1936cab3a1bSJed Brown 
1946cab3a1bSJed Brown #undef __FUNCT__
195942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite"
1966cab3a1bSJed Brown /*@C
197942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
1986cab3a1bSJed Brown 
1996cab3a1bSJed Brown    Not Collective
2006cab3a1bSJed Brown 
2016cab3a1bSJed Brown    Input Argument:
2026cab3a1bSJed Brown .  dm - DM to be used with SNES
2036cab3a1bSJed Brown 
2046cab3a1bSJed Brown    Output Argument:
205942e3340SBarry Smith .  snesdm - private DMSNES context
2066cab3a1bSJed Brown 
2076cab3a1bSJed Brown    Level: developer
2086cab3a1bSJed Brown 
209942e3340SBarry Smith .seealso: DMGetDMSNES()
2106cab3a1bSJed Brown @*/
211942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
2126cab3a1bSJed Brown {
2136cab3a1bSJed Brown   PetscErrorCode ierr;
214942e3340SBarry Smith   DMSNES         sdm;
2156cab3a1bSJed Brown 
2166cab3a1bSJed Brown   PetscFunctionBegin;
2176cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
218942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2196cab3a1bSJed Brown   if (!sdm->originaldm) sdm->originaldm = dm;
2206cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
221b4615a05SBarry Smith     DMSNES          oldsdm = sdm;
222942e3340SBarry Smith     ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
22322c6f798SBarry Smith     ierr = DMSNESCreate(((PetscObject)dm)->comm,&sdm);CHKERRQ(ierr);
22422c6f798SBarry Smith     ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr);
225b4615a05SBarry Smith     ierr = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr);
226b4615a05SBarry Smith     dm->dmsnes = (PetscObject)sdm;
2276cab3a1bSJed Brown   }
2286cab3a1bSJed Brown   *snesdm = sdm;
2296cab3a1bSJed Brown   PetscFunctionReturn(0);
2306cab3a1bSJed Brown }
2316cab3a1bSJed Brown 
2326cab3a1bSJed Brown #undef __FUNCT__
233942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES"
2346cab3a1bSJed Brown /*@C
235942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2366cab3a1bSJed Brown 
2376cab3a1bSJed Brown    Logically Collective
2386cab3a1bSJed Brown 
2396cab3a1bSJed Brown    Input Arguments:
2406cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2416cab3a1bSJed Brown -  dmdest - DM to add context to
2426cab3a1bSJed Brown 
2436cab3a1bSJed Brown    Level: developer
2446cab3a1bSJed Brown 
2456cab3a1bSJed Brown    Note:
2466cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2476cab3a1bSJed Brown 
248942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2496cab3a1bSJed Brown @*/
250942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2516cab3a1bSJed Brown {
2526cab3a1bSJed Brown   PetscErrorCode ierr;
2536cab3a1bSJed Brown 
2546cab3a1bSJed Brown   PetscFunctionBegin;
2556cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
2566cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
257b4615a05SBarry Smith   ierr = DMSNESDestroy((DMSNES*)&dmdest->dmsnes);CHKERRQ(ierr);
258b4615a05SBarry Smith   dmdest->dmsnes = dmsrc->dmsnes;
259b4615a05SBarry Smith   ierr = PetscObjectReference(dmdest->dmsnes);CHKERRQ(ierr);
26022c6f798SBarry Smith   ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
26122c6f798SBarry Smith   ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
262*be081cd6SPeter Brune   ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
2636cab3a1bSJed Brown   PetscFunctionReturn(0);
2646cab3a1bSJed Brown }
2656cab3a1bSJed Brown 
2666cab3a1bSJed Brown #undef __FUNCT__
2676cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction"
2686cab3a1bSJed Brown /*@C
2696cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
2706cab3a1bSJed Brown 
2716cab3a1bSJed Brown    Not Collective
2726cab3a1bSJed Brown 
2736cab3a1bSJed Brown    Input Arguments:
2746cab3a1bSJed Brown +  dm - DM to be used with SNES
2756cab3a1bSJed Brown .  func - residual evaluation function, see SNESSetFunction() for calling sequence
2766cab3a1bSJed Brown -  ctx - context for residual evaluation
2776cab3a1bSJed Brown 
2786cab3a1bSJed Brown    Level: advanced
2796cab3a1bSJed Brown 
2806cab3a1bSJed Brown    Note:
2816cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
2826cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
2836cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
2846cab3a1bSJed Brown 
2856cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
2866cab3a1bSJed Brown @*/
2876cab3a1bSJed Brown PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
2886cab3a1bSJed Brown {
2896cab3a1bSJed Brown   PetscErrorCode ierr;
290942e3340SBarry Smith   DMSNES         sdm;
2916cab3a1bSJed Brown 
2926cab3a1bSJed Brown   PetscFunctionBegin;
2936cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
294fdaff8d6SPeter Brune   if (func || ctx) {
295942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
296fdaff8d6SPeter Brune   }
29722c6f798SBarry Smith   if (func) sdm->ops->computefunction = func;
2986cab3a1bSJed Brown   if (ctx)  sdm->functionctx = ctx;
2996cab3a1bSJed Brown   PetscFunctionReturn(0);
3006cab3a1bSJed Brown }
3016cab3a1bSJed Brown 
3026cab3a1bSJed Brown #undef __FUNCT__
3036cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction"
3046cab3a1bSJed Brown /*@C
3056cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
3066cab3a1bSJed Brown 
3076cab3a1bSJed Brown    Not Collective
3086cab3a1bSJed Brown 
3096cab3a1bSJed Brown    Input Argument:
3106cab3a1bSJed Brown .  dm - DM to be used with SNES
3116cab3a1bSJed Brown 
3126cab3a1bSJed Brown    Output Arguments:
3136cab3a1bSJed Brown +  func - residual evaluation function, see SNESSetFunction() for calling sequence
3146cab3a1bSJed Brown -  ctx - context for residual evaluation
3156cab3a1bSJed Brown 
3166cab3a1bSJed Brown    Level: advanced
3176cab3a1bSJed Brown 
3186cab3a1bSJed Brown    Note:
3196cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3206cab3a1bSJed Brown    associated with the DM.
3216cab3a1bSJed Brown 
3226cab3a1bSJed Brown .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction()
3236cab3a1bSJed Brown @*/
3246cab3a1bSJed Brown PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
3256cab3a1bSJed Brown {
3266cab3a1bSJed Brown   PetscErrorCode ierr;
327942e3340SBarry Smith   DMSNES         sdm;
3286cab3a1bSJed Brown 
3296cab3a1bSJed Brown   PetscFunctionBegin;
3306cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
331942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
33222c6f798SBarry Smith   if (func) *func = sdm->ops->computefunction;
3336cab3a1bSJed Brown   if (ctx)  *ctx = sdm->functionctx;
3346cab3a1bSJed Brown   PetscFunctionReturn(0);
3356cab3a1bSJed Brown }
3366cab3a1bSJed Brown 
3376cab3a1bSJed Brown #undef __FUNCT__
3382a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective"
3392a4ee8f2SPeter Brune /*@C
340081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3412a4ee8f2SPeter Brune 
3422a4ee8f2SPeter Brune    Not Collective
3432a4ee8f2SPeter Brune 
3442a4ee8f2SPeter Brune    Input Arguments:
3452a4ee8f2SPeter Brune +  dm - DM to be used with SNES
3462a4ee8f2SPeter Brune .  func - residual evaluation function, see SNESSetObjective() for calling sequence
3472a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3482a4ee8f2SPeter Brune 
3492a4ee8f2SPeter Brune    Level: advanced
3502a4ee8f2SPeter Brune 
3512a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3522a4ee8f2SPeter Brune @*/
3532a4ee8f2SPeter Brune PetscErrorCode DMSNESSetObjective(DM dm,SNESObjective func,void *ctx)
3542a4ee8f2SPeter Brune {
3552a4ee8f2SPeter Brune   PetscErrorCode ierr;
356942e3340SBarry Smith   DMSNES         sdm;
3572a4ee8f2SPeter Brune 
3582a4ee8f2SPeter Brune   PetscFunctionBegin;
3592a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
360fdaff8d6SPeter Brune   if (func || ctx) {
361942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
362fdaff8d6SPeter Brune   }
36322c6f798SBarry Smith   if (func) sdm->ops->computeobjective = func;
3642a4ee8f2SPeter Brune   if (ctx)  sdm->objectivectx = ctx;
3652a4ee8f2SPeter Brune   PetscFunctionReturn(0);
3662a4ee8f2SPeter Brune }
3672a4ee8f2SPeter Brune 
3682a4ee8f2SPeter Brune #undef __FUNCT__
3692a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective"
3702a4ee8f2SPeter Brune /*@C
3712a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
3722a4ee8f2SPeter Brune 
3732a4ee8f2SPeter Brune    Not Collective
3742a4ee8f2SPeter Brune 
3752a4ee8f2SPeter Brune    Input Argument:
3762a4ee8f2SPeter Brune .  dm - DM to be used with SNES
3772a4ee8f2SPeter Brune 
3782a4ee8f2SPeter Brune    Output Arguments:
3792a4ee8f2SPeter Brune +  func - residual evaluation function, see SNESSetObjective() for calling sequence
3802a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3812a4ee8f2SPeter Brune 
3822a4ee8f2SPeter Brune    Level: advanced
3832a4ee8f2SPeter Brune 
3842a4ee8f2SPeter Brune    Note:
3852a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3862a4ee8f2SPeter Brune    associated with the DM.
3872a4ee8f2SPeter Brune 
3882a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
3892a4ee8f2SPeter Brune @*/
3902a4ee8f2SPeter Brune PetscErrorCode DMSNESGetObjective(DM dm,SNESObjective *func,void **ctx)
3912a4ee8f2SPeter Brune {
3922a4ee8f2SPeter Brune   PetscErrorCode ierr;
393942e3340SBarry Smith   DMSNES         sdm;
3942a4ee8f2SPeter Brune 
3952a4ee8f2SPeter Brune   PetscFunctionBegin;
3962a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
397942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
39822c6f798SBarry Smith   if (func) *func = sdm->ops->computeobjective;
3992a4ee8f2SPeter Brune   if (ctx)  *ctx = sdm->objectivectx;
4002a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4012a4ee8f2SPeter Brune }
4022a4ee8f2SPeter Brune 
4032a4ee8f2SPeter Brune #undef __FUNCT__
4046cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS"
4056cab3a1bSJed Brown /*@C
4066cab3a1bSJed Brown    DMSNESSetGS - set SNES Gauss-Seidel relaxation function
4076cab3a1bSJed Brown 
4086cab3a1bSJed Brown    Not Collective
4096cab3a1bSJed Brown 
4106cab3a1bSJed Brown    Input Argument:
4116cab3a1bSJed Brown +  dm - DM to be used with SNES
4126cab3a1bSJed Brown .  func - relaxation function, see SNESSetGS() for calling sequence
4136cab3a1bSJed Brown -  ctx - context for residual evaluation
4146cab3a1bSJed Brown 
4156cab3a1bSJed Brown    Level: advanced
4166cab3a1bSJed Brown 
4176cab3a1bSJed Brown    Note:
4186cab3a1bSJed Brown    SNESSetGS() is normally used, but it calls this function internally because the user context is actually
4196cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4206cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4216cab3a1bSJed Brown 
4226cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction()
4236cab3a1bSJed Brown @*/
4246cab3a1bSJed Brown PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
4256cab3a1bSJed Brown {
4266cab3a1bSJed Brown   PetscErrorCode ierr;
427942e3340SBarry Smith   DMSNES         sdm;
4286cab3a1bSJed Brown 
4296cab3a1bSJed Brown   PetscFunctionBegin;
4306cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
431fdaff8d6SPeter Brune   if (func || ctx) {
432942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
433fdaff8d6SPeter Brune   }
43422c6f798SBarry Smith   if (func) sdm->ops->computegs = func;
4356cab3a1bSJed Brown   if (ctx)  sdm->gsctx = ctx;
4366cab3a1bSJed Brown   PetscFunctionReturn(0);
4376cab3a1bSJed Brown }
4386cab3a1bSJed Brown 
4396cab3a1bSJed Brown #undef __FUNCT__
4406cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS"
4416cab3a1bSJed Brown /*@C
4426cab3a1bSJed Brown    DMSNESGetGS - get SNES Gauss-Seidel relaxation function
4436cab3a1bSJed Brown 
4446cab3a1bSJed Brown    Not Collective
4456cab3a1bSJed Brown 
4466cab3a1bSJed Brown    Input Argument:
4476cab3a1bSJed Brown .  dm - DM to be used with SNES
4486cab3a1bSJed Brown 
4496cab3a1bSJed Brown    Output Arguments:
4506cab3a1bSJed Brown +  func - relaxation function, see SNESSetGS() for calling sequence
4516cab3a1bSJed Brown -  ctx - context for residual evaluation
4526cab3a1bSJed Brown 
4536cab3a1bSJed Brown    Level: advanced
4546cab3a1bSJed Brown 
4556cab3a1bSJed Brown    Note:
4566cab3a1bSJed Brown    SNESGetGS() is normally used, but it calls this function internally because the user context is actually
4576cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4586cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4596cab3a1bSJed Brown 
4606cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction()
4616cab3a1bSJed Brown @*/
4626cab3a1bSJed Brown PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
4636cab3a1bSJed Brown {
4646cab3a1bSJed Brown   PetscErrorCode ierr;
465942e3340SBarry Smith   DMSNES         sdm;
4666cab3a1bSJed Brown 
4676cab3a1bSJed Brown   PetscFunctionBegin;
4686cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
469942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
47022c6f798SBarry Smith   if (func) *func = sdm->ops->computegs;
4716cab3a1bSJed Brown   if (ctx)  *ctx = sdm->gsctx;
4726cab3a1bSJed Brown   PetscFunctionReturn(0);
4736cab3a1bSJed Brown }
4746cab3a1bSJed Brown 
4756cab3a1bSJed Brown #undef __FUNCT__
4766cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian"
4776cab3a1bSJed Brown /*@C
478ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
4796cab3a1bSJed Brown 
4806cab3a1bSJed Brown    Not Collective
4816cab3a1bSJed Brown 
4826cab3a1bSJed Brown    Input Argument:
4836cab3a1bSJed Brown +  dm - DM to be used with SNES
4846cab3a1bSJed Brown .  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
4856cab3a1bSJed Brown -  ctx - context for residual evaluation
4866cab3a1bSJed Brown 
4876cab3a1bSJed Brown    Level: advanced
4886cab3a1bSJed Brown 
4896cab3a1bSJed Brown    Note:
4906cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
4916cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4926cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
4936cab3a1bSJed Brown 
4946cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian()
4956cab3a1bSJed Brown @*/
4966cab3a1bSJed Brown PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
4976cab3a1bSJed Brown {
4986cab3a1bSJed Brown   PetscErrorCode ierr;
499942e3340SBarry Smith   DMSNES         sdm;
5006cab3a1bSJed Brown 
5016cab3a1bSJed Brown   PetscFunctionBegin;
5026cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5031fdfe764SBarry Smith   if (func || ctx) {
504942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
5051fdfe764SBarry Smith   }
50622c6f798SBarry Smith   if (func) sdm->ops->computejacobian = func;
5076cab3a1bSJed Brown   if (ctx)  sdm->jacobianctx = ctx;
5086cab3a1bSJed Brown   PetscFunctionReturn(0);
5096cab3a1bSJed Brown }
5106cab3a1bSJed Brown 
5116cab3a1bSJed Brown #undef __FUNCT__
5126cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian"
5136cab3a1bSJed Brown /*@C
514ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
5156cab3a1bSJed Brown 
5166cab3a1bSJed Brown    Not Collective
5176cab3a1bSJed Brown 
5186cab3a1bSJed Brown    Input Argument:
5196cab3a1bSJed Brown .  dm - DM to be used with SNES
5206cab3a1bSJed Brown 
5216cab3a1bSJed Brown    Output Arguments:
5226cab3a1bSJed Brown +  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
5236cab3a1bSJed Brown -  ctx - context for residual evaluation
5246cab3a1bSJed Brown 
5256cab3a1bSJed Brown    Level: advanced
5266cab3a1bSJed Brown 
5276cab3a1bSJed Brown    Note:
5286cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5296cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5306cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5316cab3a1bSJed Brown 
5326cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5336cab3a1bSJed Brown @*/
5346cab3a1bSJed Brown PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5356cab3a1bSJed Brown {
5366cab3a1bSJed Brown   PetscErrorCode ierr;
537942e3340SBarry Smith   DMSNES         sdm;
5386cab3a1bSJed Brown 
5396cab3a1bSJed Brown   PetscFunctionBegin;
5406cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
541942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
54222c6f798SBarry Smith   if (func) *func = sdm->ops->computejacobian;
5436cab3a1bSJed Brown   if (ctx)  *ctx = sdm->jacobianctx;
5446cab3a1bSJed Brown   PetscFunctionReturn(0);
5456cab3a1bSJed Brown }
5466cab3a1bSJed Brown 
5476cab3a1bSJed Brown #undef __FUNCT__
548e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard"
549e03ab78fSPeter Brune /*@C
550e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
551e03ab78fSPeter Brune 
552e03ab78fSPeter Brune    Not Collective
553e03ab78fSPeter Brune 
554e03ab78fSPeter Brune    Input Argument:
555e03ab78fSPeter Brune +  dm - DM to be used with SNES
556e03ab78fSPeter Brune .  func - RHS evaluation function, see SNESSetFunction() for calling sequence
557e03ab78fSPeter Brune .  pjac - Picard matrix evaluation function, see SNESSetJacobian() for calling sequence
558e03ab78fSPeter Brune -  ctx - context for residual evaluation
559e03ab78fSPeter Brune 
560e03ab78fSPeter Brune    Level: advanced
561e03ab78fSPeter Brune 
562e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
563e03ab78fSPeter Brune @*/
564e03ab78fSPeter Brune PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (*pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
565e03ab78fSPeter Brune {
566e03ab78fSPeter Brune   PetscErrorCode ierr;
567942e3340SBarry Smith   DMSNES         sdm;
568e03ab78fSPeter Brune 
569e03ab78fSPeter Brune   PetscFunctionBegin;
570e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
571942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
57222c6f798SBarry Smith   if (pfunc) sdm->ops->computepfunction = pfunc;
57322c6f798SBarry Smith   if (pjac)  sdm->ops->computepjacobian = pjac;
574e03ab78fSPeter Brune   if (ctx)   sdm->pctx             = ctx;
575e03ab78fSPeter Brune   PetscFunctionReturn(0);
576e03ab78fSPeter Brune }
577e03ab78fSPeter Brune 
5787971a8bfSPeter Brune 
5797971a8bfSPeter Brune #undef __FUNCT__
5807971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard"
5817971a8bfSPeter Brune /*@C
5827971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
5837971a8bfSPeter Brune 
5847971a8bfSPeter Brune    Not Collective
5857971a8bfSPeter Brune 
5867971a8bfSPeter Brune    Input Argument:
5877971a8bfSPeter Brune .  dm - DM to be used with SNES
5887971a8bfSPeter Brune 
5897971a8bfSPeter Brune    Output Arguments:
5907971a8bfSPeter Brune +  pfunc - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
5917971a8bfSPeter Brune .  pjac  - RHS evaluation function, see SNESSetFunction() for calling sequence
5927971a8bfSPeter Brune -  ctx - context for residual evaluation
5937971a8bfSPeter Brune 
5947971a8bfSPeter Brune    Level: advanced
5957971a8bfSPeter Brune 
5967971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5977971a8bfSPeter Brune @*/
5987971a8bfSPeter Brune PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (**pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5997971a8bfSPeter Brune {
6007971a8bfSPeter Brune   PetscErrorCode ierr;
601942e3340SBarry Smith   DMSNES         sdm;
6027971a8bfSPeter Brune 
6037971a8bfSPeter Brune   PetscFunctionBegin;
6047971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
605942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
60622c6f798SBarry Smith   if (pfunc) *pfunc = sdm->ops->computepfunction;
60722c6f798SBarry Smith   if (pjac) *pjac   = sdm->ops->computepjacobian;
6087971a8bfSPeter Brune   if (ctx)  *ctx    = sdm->pctx;
6097971a8bfSPeter Brune   PetscFunctionReturn(0);
6107971a8bfSPeter Brune }
6117971a8bfSPeter Brune 
6126427ad5bSPeter Brune /* block functions */
6136427ad5bSPeter Brune 
6146427ad5bSPeter Brune #undef __FUNCT__
6156427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockFunction"
6166427ad5bSPeter Brune /*@C
6176427ad5bSPeter Brune    DMSNESSetBlockFunction - set SNES residual evaluation function
6186427ad5bSPeter Brune 
6196427ad5bSPeter Brune    Not Collective
6206427ad5bSPeter Brune 
6216427ad5bSPeter Brune    Input Arguments:
6226427ad5bSPeter Brune +  dm - DM to be used with SNES
6236427ad5bSPeter Brune .  func - residual evaluation function, see SNESSetFunction() for calling sequence
6246427ad5bSPeter Brune -  ctx - context for residual evaluation
6256427ad5bSPeter Brune 
6266427ad5bSPeter Brune    Level: developer
6276427ad5bSPeter Brune 
6286427ad5bSPeter Brune    Note:
6296427ad5bSPeter Brune    Mostly for use in DM implementations and transferred to a block function rather than being called from here.
6306427ad5bSPeter Brune 
6316427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6326427ad5bSPeter Brune @*/
6336427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
6346427ad5bSPeter Brune {
6356427ad5bSPeter Brune   PetscErrorCode ierr;
636942e3340SBarry Smith   DMSNES         sdm;
6376427ad5bSPeter Brune 
6386427ad5bSPeter Brune   PetscFunctionBegin;
6396427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
640fdaff8d6SPeter Brune   if (func || ctx) {
641942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
642fdaff8d6SPeter Brune   }
64322c6f798SBarry Smith   if (func) sdm->ops->computeblockfunction = func;
6446427ad5bSPeter Brune   if (ctx)  sdm->blockfunctionctx = ctx;
6456427ad5bSPeter Brune   PetscFunctionReturn(0);
6466427ad5bSPeter Brune }
6476427ad5bSPeter Brune 
6486427ad5bSPeter Brune #undef __FUNCT__
6496427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockFunction"
6506427ad5bSPeter Brune /*@C
6516427ad5bSPeter Brune    DMSNESGetBlockFunction - get SNES residual evaluation function
6526427ad5bSPeter Brune 
6536427ad5bSPeter Brune    Not Collective
6546427ad5bSPeter Brune 
6556427ad5bSPeter Brune    Input Argument:
6566427ad5bSPeter Brune .  dm - DM to be used with SNES
6576427ad5bSPeter Brune 
6586427ad5bSPeter Brune    Output Arguments:
6596427ad5bSPeter Brune +  func - residual evaluation function, see SNESSetFunction() for calling sequence
6606427ad5bSPeter Brune -  ctx - context for residual evaluation
6616427ad5bSPeter Brune 
6626427ad5bSPeter Brune    Level: developer
6636427ad5bSPeter Brune 
6646427ad5bSPeter Brune .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction()
6656427ad5bSPeter Brune @*/
6666427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
6676427ad5bSPeter Brune {
6686427ad5bSPeter Brune   PetscErrorCode ierr;
669942e3340SBarry Smith   DMSNES         sdm;
6706427ad5bSPeter Brune 
6716427ad5bSPeter Brune   PetscFunctionBegin;
6726427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
673942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
67422c6f798SBarry Smith   if (func) *func = sdm->ops->computeblockfunction;
6756427ad5bSPeter Brune   if (ctx)  *ctx = sdm->blockfunctionctx;
6766427ad5bSPeter Brune   PetscFunctionReturn(0);
6776427ad5bSPeter Brune }
6786427ad5bSPeter Brune 
6796427ad5bSPeter Brune 
6806427ad5bSPeter Brune #undef __FUNCT__
6816427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockJacobian"
6826427ad5bSPeter Brune /*@C
6836427ad5bSPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
6846427ad5bSPeter Brune 
6856427ad5bSPeter Brune    Not Collective
6866427ad5bSPeter Brune 
6876427ad5bSPeter Brune    Input Argument:
6886427ad5bSPeter Brune +  dm - DM to be used with SNES
6896427ad5bSPeter Brune .  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
6906427ad5bSPeter Brune -  ctx - context for residual evaluation
6916427ad5bSPeter Brune 
6926427ad5bSPeter Brune    Level: advanced
6936427ad5bSPeter Brune 
6946427ad5bSPeter Brune    Note:
6956427ad5bSPeter Brune    Mostly for use in DM implementations and transferred to a block function rather than being called from here.
6966427ad5bSPeter Brune 
6976427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian()
6986427ad5bSPeter Brune @*/
6996427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
7006427ad5bSPeter Brune {
7016427ad5bSPeter Brune   PetscErrorCode ierr;
702942e3340SBarry Smith   DMSNES         sdm;
7036427ad5bSPeter Brune 
7046427ad5bSPeter Brune   PetscFunctionBegin;
7056427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
706fdaff8d6SPeter Brune   if (func || ctx) {
707942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
708fdaff8d6SPeter Brune   }
70922c6f798SBarry Smith   if (func) sdm->ops->computeblockjacobian = func;
7106427ad5bSPeter Brune   if (ctx)  sdm->blockjacobianctx = ctx;
7116427ad5bSPeter Brune   PetscFunctionReturn(0);
7126427ad5bSPeter Brune }
7136427ad5bSPeter Brune 
7146427ad5bSPeter Brune #undef __FUNCT__
7156427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockJacobian"
7166427ad5bSPeter Brune /*@C
7176427ad5bSPeter Brune    DMSNESGetBlockJacobian - get SNES Jacobian evaluation function
7186427ad5bSPeter Brune 
7196427ad5bSPeter Brune    Not Collective
7206427ad5bSPeter Brune 
7216427ad5bSPeter Brune    Input Argument:
7226427ad5bSPeter Brune .  dm - DM to be used with SNES
7236427ad5bSPeter Brune 
7246427ad5bSPeter Brune    Output Arguments:
7256427ad5bSPeter Brune +  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
7266427ad5bSPeter Brune -  ctx - context for residual evaluation
7276427ad5bSPeter Brune 
7286427ad5bSPeter Brune    Level: advanced
7296427ad5bSPeter Brune 
7306427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
7316427ad5bSPeter Brune @*/
7326427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
7336427ad5bSPeter Brune {
7346427ad5bSPeter Brune   PetscErrorCode ierr;
735942e3340SBarry Smith   DMSNES         sdm;
7366427ad5bSPeter Brune 
7376427ad5bSPeter Brune   PetscFunctionBegin;
7386427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
739942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
74022c6f798SBarry Smith   if (func) *func = sdm->ops->computeblockjacobian;
7416427ad5bSPeter Brune   if (ctx)  *ctx = sdm->blockjacobianctx;
7426427ad5bSPeter Brune   PetscFunctionReturn(0);
7436427ad5bSPeter Brune }
744