xref: /petsc/src/snes/utils/dmsnes.c (revision 22c6f798c41ac35d5678a4dd5e6b463fe29503b1)
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__
5*22c6f798SBarry Smith #define __FUNCT__ "DMSNESDestroy"
6*22c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm)
76cab3a1bSJed Brown {
86cab3a1bSJed Brown   PetscErrorCode ierr;
96cab3a1bSJed Brown 
106cab3a1bSJed Brown   PetscFunctionBegin;
11*22c6f798SBarry Smith  if (!*kdm) PetscFunctionReturn(0);
12*22c6f798SBarry Smith   PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1);
13*22c6f798SBarry Smith   if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);}
14*22c6f798SBarry Smith   if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);}
15*22c6f798SBarry Smith   ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr);
16*22c6f798SBarry Smith   PetscFunctionReturn(0);
17*22c6f798SBarry Smith }
18*22c6f798SBarry Smith 
19*22c6f798SBarry Smith #undef __FUNCT__
20*22c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate"
21*22c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
22*22c6f798SBarry Smith {
23*22c6f798SBarry Smith   PetscErrorCode ierr;
24*22c6f798SBarry Smith 
25*22c6f798SBarry Smith   PetscFunctionBegin;
26*22c6f798SBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES
27*22c6f798SBarry Smith   ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr);
28*22c6f798SBarry Smith #endif
29*22c6f798SBarry Smith   ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID, -1, "DMKSP", "DMSNES", "DMSNES", comm, DMSNESDestroy, PETSC_NULL);CHKERRQ(ierr);
30*22c6f798SBarry 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__
60942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES"
61942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
6203a0fabfSPeter Brune {
6303a0fabfSPeter Brune   PetscErrorCode ierr;
6403a0fabfSPeter Brune 
6503a0fabfSPeter Brune   PetscFunctionBegin;
66942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
6703a0fabfSPeter Brune   PetscFunctionReturn(0);
6803a0fabfSPeter Brune }
6903a0fabfSPeter Brune 
7003a0fabfSPeter Brune #undef __FUNCT__
71942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES"
7203a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
7303a0fabfSPeter Brune  */
74942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
7503a0fabfSPeter Brune {
7603a0fabfSPeter Brune 
7703a0fabfSPeter Brune   PetscFunctionBegin;
7803a0fabfSPeter Brune   PetscFunctionReturn(0);
7903a0fabfSPeter Brune }
8003a0fabfSPeter Brune 
8103a0fabfSPeter Brune #undef __FUNCT__
82*22c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy"
83*22c6f798SBarry Smith /*@C
84*22c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
85*22c6f798SBarry Smith 
86*22c6f798SBarry Smith    Not Collective
87*22c6f798SBarry Smith 
88*22c6f798SBarry Smith    Input Argument:
89*22c6f798SBarry Smith +  kdm - Original DMSNES
90*22c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
91*22c6f798SBarry Smith 
92*22c6f798SBarry Smith    Level: developer
93*22c6f798SBarry Smith 
94*22c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
95*22c6f798SBarry Smith @*/
96*22c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
97*22c6f798SBarry Smith {
98*22c6f798SBarry Smith   PetscErrorCode ierr;
99*22c6f798SBarry Smith 
100*22c6f798SBarry Smith   PetscFunctionBegin;
101*22c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
102*22c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
103*22c6f798SBarry Smith   nkdm->ops->computefunction       = kdm->ops->computefunction;
104*22c6f798SBarry Smith   nkdm->ops->computegs             = kdm->ops->computegs;
105*22c6f798SBarry Smith   nkdm->ops->computeobjective      = kdm->ops->computeobjective;
106*22c6f798SBarry Smith   nkdm->ops->computepjacobian      = kdm->ops->computepjacobian;
107*22c6f798SBarry Smith   nkdm->ops->computepfunction      = kdm->ops->computepfunction;
108*22c6f798SBarry Smith   nkdm->ops->computeblockfunction  = kdm->ops->computeblockfunction;
109*22c6f798SBarry Smith   nkdm->ops->computeblockjacobian  = kdm->ops->computeblockjacobian;
110*22c6f798SBarry Smith   nkdm->ops->destroy               = kdm->ops->destroy;
111*22c6f798SBarry Smith   nkdm->ops->duplicate             = kdm->ops->duplicate;
112*22c6f798SBarry Smith 
113*22c6f798SBarry Smith   nkdm->functionctx      = kdm->functionctx;
114*22c6f798SBarry Smith   nkdm->gsctx            = kdm->gsctx;
115*22c6f798SBarry Smith   nkdm->pctx             = kdm->pctx;
116*22c6f798SBarry Smith   nkdm->jacobianctx      = kdm->jacobianctx;
117*22c6f798SBarry Smith   nkdm->objectivectx     = kdm->objectivectx;
118*22c6f798SBarry Smith   nkdm->blockfunctionctx = kdm->blockfunctionctx;
119*22c6f798SBarry Smith   nkdm->blockjacobianctx = kdm->blockjacobianctx;
120*22c6f798SBarry Smith   nkdm->data             = kdm->data;
121*22c6f798SBarry Smith 
122*22c6f798SBarry Smith   /*
123*22c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
124*22c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
125*22c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
126*22c6f798SBarry Smith   */
127*22c6f798SBarry Smith 
128*22c6f798SBarry Smith   /* implementation specific copy hooks */
129*22c6f798SBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
130*22c6f798SBarry Smith   PetscFunctionReturn(0);
131*22c6f798SBarry Smith }
132*22c6f798SBarry Smith 
133*22c6f798SBarry Smith #undef __FUNCT__
134942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES"
1356cab3a1bSJed Brown /*@C
136942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
1376cab3a1bSJed Brown 
1386cab3a1bSJed Brown    Not Collective
1396cab3a1bSJed Brown 
1406cab3a1bSJed Brown    Input Argument:
1416cab3a1bSJed Brown .  dm - DM to be used with SNES
1426cab3a1bSJed Brown 
1436cab3a1bSJed Brown    Output Argument:
144942e3340SBarry Smith .  snesdm - private DMSNES context
1456cab3a1bSJed Brown 
1466cab3a1bSJed Brown    Level: developer
1476cab3a1bSJed Brown 
1486cab3a1bSJed Brown    Notes:
149942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
1506cab3a1bSJed Brown 
151942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
1526cab3a1bSJed Brown @*/
153942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
1546cab3a1bSJed Brown {
1556cab3a1bSJed Brown   PetscErrorCode ierr;
1566cab3a1bSJed Brown 
1576cab3a1bSJed Brown   PetscFunctionBegin;
1586cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
159*22c6f798SBarry Smith   ierr = PetscObjectQuery((PetscObject)dm,"DMSNES",(PetscObject*)snesdm);CHKERRQ(ierr);
160*22c6f798SBarry Smith   if (!*snesdm) {
161*22c6f798SBarry Smith     DMSNES tmpsnesdm;
162942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
163*22c6f798SBarry Smith     ierr = DMSNESCreate(((PetscObject)dm)->comm,snesdm);CHKERRQ(ierr);
164*22c6f798SBarry Smith     ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)*snesdm);CHKERRQ(ierr);
165942e3340SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
166*22c6f798SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
167*22c6f798SBarry Smith     tmpsnesdm = *snesdm;
168*22c6f798SBarry Smith     ierr = DMSNESDestroy(&tmpsnesdm);CHKERRQ(ierr);
1696cab3a1bSJed Brown   }
1706cab3a1bSJed Brown   PetscFunctionReturn(0);
1716cab3a1bSJed Brown }
1726cab3a1bSJed Brown 
1736cab3a1bSJed Brown #undef __FUNCT__
174942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite"
1756cab3a1bSJed Brown /*@C
176942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
1776cab3a1bSJed Brown 
1786cab3a1bSJed Brown    Not Collective
1796cab3a1bSJed Brown 
1806cab3a1bSJed Brown    Input Argument:
1816cab3a1bSJed Brown .  dm - DM to be used with SNES
1826cab3a1bSJed Brown 
1836cab3a1bSJed Brown    Output Argument:
184942e3340SBarry Smith .  snesdm - private DMSNES context
1856cab3a1bSJed Brown 
1866cab3a1bSJed Brown    Level: developer
1876cab3a1bSJed Brown 
188942e3340SBarry Smith .seealso: DMGetDMSNES()
1896cab3a1bSJed Brown @*/
190942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
1916cab3a1bSJed Brown {
1926cab3a1bSJed Brown   PetscErrorCode ierr;
193942e3340SBarry Smith   DMSNES         sdm;
1946cab3a1bSJed Brown 
1956cab3a1bSJed Brown   PetscFunctionBegin;
1966cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
197942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
1986cab3a1bSJed Brown   if (!sdm->originaldm) sdm->originaldm = dm;
1996cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
200*22c6f798SBarry Smith     DMSNES          oldsdm = sdm,tsdm;
201942e3340SBarry Smith     ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
202*22c6f798SBarry Smith     ierr = DMSNESCreate(((PetscObject)dm)->comm,&sdm);CHKERRQ(ierr);
203*22c6f798SBarry Smith     ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr);
204*22c6f798SBarry Smith 
205*22c6f798SBarry Smith     ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)sdm);CHKERRQ(ierr);
206*22c6f798SBarry Smith     tsdm = sdm;
207*22c6f798SBarry Smith     ierr = DMSNESDestroy(&tsdm );CHKERRQ(ierr);
2086cab3a1bSJed Brown   }
2096cab3a1bSJed Brown   *snesdm = sdm;
2106cab3a1bSJed Brown   PetscFunctionReturn(0);
2116cab3a1bSJed Brown }
2126cab3a1bSJed Brown 
2136cab3a1bSJed Brown #undef __FUNCT__
214942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES"
2156cab3a1bSJed Brown /*@C
216942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2176cab3a1bSJed Brown 
2186cab3a1bSJed Brown    Logically Collective
2196cab3a1bSJed Brown 
2206cab3a1bSJed Brown    Input Arguments:
2216cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2226cab3a1bSJed Brown -  dmdest - DM to add context to
2236cab3a1bSJed Brown 
2246cab3a1bSJed Brown    Level: developer
2256cab3a1bSJed Brown 
2266cab3a1bSJed Brown    Note:
2276cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2286cab3a1bSJed Brown 
229942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2306cab3a1bSJed Brown @*/
231942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2326cab3a1bSJed Brown {
2336cab3a1bSJed Brown   PetscErrorCode ierr;
234*22c6f798SBarry Smith   DMSNES         sdm;
2356cab3a1bSJed Brown 
2366cab3a1bSJed Brown   PetscFunctionBegin;
2376cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
2386cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
239*22c6f798SBarry Smith   ierr = PetscObjectQuery((PetscObject)dmsrc,"DMSNES",(PetscObject*)&sdm);CHKERRQ(ierr);
240*22c6f798SBarry Smith   if (sdm) {
241*22c6f798SBarry Smith     ierr = PetscObjectCompose((PetscObject)dmdest,"DMSNES",(PetscObject)sdm);CHKERRQ(ierr);
242*22c6f798SBarry Smith     ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
243*22c6f798SBarry Smith     ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
2446cab3a1bSJed Brown   }
2456cab3a1bSJed Brown   PetscFunctionReturn(0);
2466cab3a1bSJed Brown }
2476cab3a1bSJed Brown 
2486cab3a1bSJed Brown #undef __FUNCT__
2496cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction"
2506cab3a1bSJed Brown /*@C
2516cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
2526cab3a1bSJed Brown 
2536cab3a1bSJed Brown    Not Collective
2546cab3a1bSJed Brown 
2556cab3a1bSJed Brown    Input Arguments:
2566cab3a1bSJed Brown +  dm - DM to be used with SNES
2576cab3a1bSJed Brown .  func - residual evaluation function, see SNESSetFunction() for calling sequence
2586cab3a1bSJed Brown -  ctx - context for residual evaluation
2596cab3a1bSJed Brown 
2606cab3a1bSJed Brown    Level: advanced
2616cab3a1bSJed Brown 
2626cab3a1bSJed Brown    Note:
2636cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
2646cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
2656cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
2666cab3a1bSJed Brown 
2676cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
2686cab3a1bSJed Brown @*/
2696cab3a1bSJed Brown PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
2706cab3a1bSJed Brown {
2716cab3a1bSJed Brown   PetscErrorCode ierr;
272942e3340SBarry Smith   DMSNES         sdm;
2736cab3a1bSJed Brown 
2746cab3a1bSJed Brown   PetscFunctionBegin;
2756cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
276fdaff8d6SPeter Brune   if (func || ctx) {
277942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
278fdaff8d6SPeter Brune   }
279*22c6f798SBarry Smith   if (func) sdm->ops->computefunction = func;
2806cab3a1bSJed Brown   if (ctx)  sdm->functionctx = ctx;
2816cab3a1bSJed Brown   PetscFunctionReturn(0);
2826cab3a1bSJed Brown }
2836cab3a1bSJed Brown 
2846cab3a1bSJed Brown #undef __FUNCT__
2856cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction"
2866cab3a1bSJed Brown /*@C
2876cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
2886cab3a1bSJed Brown 
2896cab3a1bSJed Brown    Not Collective
2906cab3a1bSJed Brown 
2916cab3a1bSJed Brown    Input Argument:
2926cab3a1bSJed Brown .  dm - DM to be used with SNES
2936cab3a1bSJed Brown 
2946cab3a1bSJed Brown    Output Arguments:
2956cab3a1bSJed Brown +  func - residual evaluation function, see SNESSetFunction() for calling sequence
2966cab3a1bSJed Brown -  ctx - context for residual evaluation
2976cab3a1bSJed Brown 
2986cab3a1bSJed Brown    Level: advanced
2996cab3a1bSJed Brown 
3006cab3a1bSJed Brown    Note:
3016cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3026cab3a1bSJed Brown    associated with the DM.
3036cab3a1bSJed Brown 
3046cab3a1bSJed Brown .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction()
3056cab3a1bSJed Brown @*/
3066cab3a1bSJed Brown PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
3076cab3a1bSJed Brown {
3086cab3a1bSJed Brown   PetscErrorCode ierr;
309942e3340SBarry Smith   DMSNES         sdm;
3106cab3a1bSJed Brown 
3116cab3a1bSJed Brown   PetscFunctionBegin;
3126cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
313942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
314*22c6f798SBarry Smith   if (func) *func = sdm->ops->computefunction;
3156cab3a1bSJed Brown   if (ctx)  *ctx = sdm->functionctx;
3166cab3a1bSJed Brown   PetscFunctionReturn(0);
3176cab3a1bSJed Brown }
3186cab3a1bSJed Brown 
3196cab3a1bSJed Brown #undef __FUNCT__
3202a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective"
3212a4ee8f2SPeter Brune /*@C
322081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3232a4ee8f2SPeter Brune 
3242a4ee8f2SPeter Brune    Not Collective
3252a4ee8f2SPeter Brune 
3262a4ee8f2SPeter Brune    Input Arguments:
3272a4ee8f2SPeter Brune +  dm - DM to be used with SNES
3282a4ee8f2SPeter Brune .  func - residual evaluation function, see SNESSetObjective() for calling sequence
3292a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3302a4ee8f2SPeter Brune 
3312a4ee8f2SPeter Brune    Level: advanced
3322a4ee8f2SPeter Brune 
3332a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3342a4ee8f2SPeter Brune @*/
3352a4ee8f2SPeter Brune PetscErrorCode DMSNESSetObjective(DM dm,SNESObjective func,void *ctx)
3362a4ee8f2SPeter Brune {
3372a4ee8f2SPeter Brune   PetscErrorCode ierr;
338942e3340SBarry Smith   DMSNES         sdm;
3392a4ee8f2SPeter Brune 
3402a4ee8f2SPeter Brune   PetscFunctionBegin;
3412a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
342fdaff8d6SPeter Brune   if (func || ctx) {
343942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
344fdaff8d6SPeter Brune   }
345*22c6f798SBarry Smith   if (func) sdm->ops->computeobjective = func;
3462a4ee8f2SPeter Brune   if (ctx)  sdm->objectivectx = ctx;
3472a4ee8f2SPeter Brune   PetscFunctionReturn(0);
3482a4ee8f2SPeter Brune }
3492a4ee8f2SPeter Brune 
3502a4ee8f2SPeter Brune #undef __FUNCT__
3512a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective"
3522a4ee8f2SPeter Brune /*@C
3532a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
3542a4ee8f2SPeter Brune 
3552a4ee8f2SPeter Brune    Not Collective
3562a4ee8f2SPeter Brune 
3572a4ee8f2SPeter Brune    Input Argument:
3582a4ee8f2SPeter Brune .  dm - DM to be used with SNES
3592a4ee8f2SPeter Brune 
3602a4ee8f2SPeter Brune    Output Arguments:
3612a4ee8f2SPeter Brune +  func - residual evaluation function, see SNESSetObjective() for calling sequence
3622a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3632a4ee8f2SPeter Brune 
3642a4ee8f2SPeter Brune    Level: advanced
3652a4ee8f2SPeter Brune 
3662a4ee8f2SPeter Brune    Note:
3672a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3682a4ee8f2SPeter Brune    associated with the DM.
3692a4ee8f2SPeter Brune 
3702a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
3712a4ee8f2SPeter Brune @*/
3722a4ee8f2SPeter Brune PetscErrorCode DMSNESGetObjective(DM dm,SNESObjective *func,void **ctx)
3732a4ee8f2SPeter Brune {
3742a4ee8f2SPeter Brune   PetscErrorCode ierr;
375942e3340SBarry Smith   DMSNES         sdm;
3762a4ee8f2SPeter Brune 
3772a4ee8f2SPeter Brune   PetscFunctionBegin;
3782a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
379942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
380*22c6f798SBarry Smith   if (func) *func = sdm->ops->computeobjective;
3812a4ee8f2SPeter Brune   if (ctx)  *ctx = sdm->objectivectx;
3822a4ee8f2SPeter Brune   PetscFunctionReturn(0);
3832a4ee8f2SPeter Brune }
3842a4ee8f2SPeter Brune 
3852a4ee8f2SPeter Brune #undef __FUNCT__
3866cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS"
3876cab3a1bSJed Brown /*@C
3886cab3a1bSJed Brown    DMSNESSetGS - set SNES Gauss-Seidel relaxation function
3896cab3a1bSJed Brown 
3906cab3a1bSJed Brown    Not Collective
3916cab3a1bSJed Brown 
3926cab3a1bSJed Brown    Input Argument:
3936cab3a1bSJed Brown +  dm - DM to be used with SNES
3946cab3a1bSJed Brown .  func - relaxation function, see SNESSetGS() for calling sequence
3956cab3a1bSJed Brown -  ctx - context for residual evaluation
3966cab3a1bSJed Brown 
3976cab3a1bSJed Brown    Level: advanced
3986cab3a1bSJed Brown 
3996cab3a1bSJed Brown    Note:
4006cab3a1bSJed Brown    SNESSetGS() is normally used, but it calls this function internally because the user context is actually
4016cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4026cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4036cab3a1bSJed Brown 
4046cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction()
4056cab3a1bSJed Brown @*/
4066cab3a1bSJed Brown PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
4076cab3a1bSJed Brown {
4086cab3a1bSJed Brown   PetscErrorCode ierr;
409942e3340SBarry Smith   DMSNES         sdm;
4106cab3a1bSJed Brown 
4116cab3a1bSJed Brown   PetscFunctionBegin;
4126cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
413fdaff8d6SPeter Brune   if (func || ctx) {
414942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
415fdaff8d6SPeter Brune   }
416*22c6f798SBarry Smith   if (func) sdm->ops->computegs = func;
4176cab3a1bSJed Brown   if (ctx)  sdm->gsctx = ctx;
4186cab3a1bSJed Brown   PetscFunctionReturn(0);
4196cab3a1bSJed Brown }
4206cab3a1bSJed Brown 
4216cab3a1bSJed Brown #undef __FUNCT__
4226cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS"
4236cab3a1bSJed Brown /*@C
4246cab3a1bSJed Brown    DMSNESGetGS - get SNES Gauss-Seidel relaxation function
4256cab3a1bSJed Brown 
4266cab3a1bSJed Brown    Not Collective
4276cab3a1bSJed Brown 
4286cab3a1bSJed Brown    Input Argument:
4296cab3a1bSJed Brown .  dm - DM to be used with SNES
4306cab3a1bSJed Brown 
4316cab3a1bSJed Brown    Output Arguments:
4326cab3a1bSJed Brown +  func - relaxation function, see SNESSetGS() for calling sequence
4336cab3a1bSJed Brown -  ctx - context for residual evaluation
4346cab3a1bSJed Brown 
4356cab3a1bSJed Brown    Level: advanced
4366cab3a1bSJed Brown 
4376cab3a1bSJed Brown    Note:
4386cab3a1bSJed Brown    SNESGetGS() is normally used, but it calls this function internally because the user context is actually
4396cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4406cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4416cab3a1bSJed Brown 
4426cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction()
4436cab3a1bSJed Brown @*/
4446cab3a1bSJed Brown PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
4456cab3a1bSJed Brown {
4466cab3a1bSJed Brown   PetscErrorCode ierr;
447942e3340SBarry Smith   DMSNES         sdm;
4486cab3a1bSJed Brown 
4496cab3a1bSJed Brown   PetscFunctionBegin;
4506cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
451942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
452*22c6f798SBarry Smith   if (func) *func = sdm->ops->computegs;
4536cab3a1bSJed Brown   if (ctx)  *ctx = sdm->gsctx;
4546cab3a1bSJed Brown   PetscFunctionReturn(0);
4556cab3a1bSJed Brown }
4566cab3a1bSJed Brown 
4576cab3a1bSJed Brown #undef __FUNCT__
4586cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian"
4596cab3a1bSJed Brown /*@C
460ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
4616cab3a1bSJed Brown 
4626cab3a1bSJed Brown    Not Collective
4636cab3a1bSJed Brown 
4646cab3a1bSJed Brown    Input Argument:
4656cab3a1bSJed Brown +  dm - DM to be used with SNES
4666cab3a1bSJed Brown .  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
4676cab3a1bSJed Brown -  ctx - context for residual evaluation
4686cab3a1bSJed Brown 
4696cab3a1bSJed Brown    Level: advanced
4706cab3a1bSJed Brown 
4716cab3a1bSJed Brown    Note:
4726cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
4736cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4746cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
4756cab3a1bSJed Brown 
4766cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian()
4776cab3a1bSJed Brown @*/
4786cab3a1bSJed Brown PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
4796cab3a1bSJed Brown {
4806cab3a1bSJed Brown   PetscErrorCode ierr;
481942e3340SBarry Smith   DMSNES         sdm;
4826cab3a1bSJed Brown 
4836cab3a1bSJed Brown   PetscFunctionBegin;
4846cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4851fdfe764SBarry Smith   if (func || ctx) {
486942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
4871fdfe764SBarry Smith   }
488*22c6f798SBarry Smith   if (func) sdm->ops->computejacobian = func;
4896cab3a1bSJed Brown   if (ctx)  sdm->jacobianctx = ctx;
4906cab3a1bSJed Brown   PetscFunctionReturn(0);
4916cab3a1bSJed Brown }
4926cab3a1bSJed Brown 
4936cab3a1bSJed Brown #undef __FUNCT__
4946cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian"
4956cab3a1bSJed Brown /*@C
496ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
4976cab3a1bSJed Brown 
4986cab3a1bSJed Brown    Not Collective
4996cab3a1bSJed Brown 
5006cab3a1bSJed Brown    Input Argument:
5016cab3a1bSJed Brown .  dm - DM to be used with SNES
5026cab3a1bSJed Brown 
5036cab3a1bSJed Brown    Output Arguments:
5046cab3a1bSJed Brown +  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
5056cab3a1bSJed Brown -  ctx - context for residual evaluation
5066cab3a1bSJed Brown 
5076cab3a1bSJed Brown    Level: advanced
5086cab3a1bSJed Brown 
5096cab3a1bSJed Brown    Note:
5106cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5116cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5126cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5136cab3a1bSJed Brown 
5146cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5156cab3a1bSJed Brown @*/
5166cab3a1bSJed Brown PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5176cab3a1bSJed Brown {
5186cab3a1bSJed Brown   PetscErrorCode ierr;
519942e3340SBarry Smith   DMSNES         sdm;
5206cab3a1bSJed Brown 
5216cab3a1bSJed Brown   PetscFunctionBegin;
5226cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
523942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
524*22c6f798SBarry Smith   if (func) *func = sdm->ops->computejacobian;
5256cab3a1bSJed Brown   if (ctx)  *ctx = sdm->jacobianctx;
5266cab3a1bSJed Brown   PetscFunctionReturn(0);
5276cab3a1bSJed Brown }
5286cab3a1bSJed Brown 
5296cab3a1bSJed Brown #undef __FUNCT__
530e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard"
531e03ab78fSPeter Brune /*@C
532e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
533e03ab78fSPeter Brune 
534e03ab78fSPeter Brune    Not Collective
535e03ab78fSPeter Brune 
536e03ab78fSPeter Brune    Input Argument:
537e03ab78fSPeter Brune +  dm - DM to be used with SNES
538e03ab78fSPeter Brune .  func - RHS evaluation function, see SNESSetFunction() for calling sequence
539e03ab78fSPeter Brune .  pjac - Picard matrix evaluation function, see SNESSetJacobian() for calling sequence
540e03ab78fSPeter Brune -  ctx - context for residual evaluation
541e03ab78fSPeter Brune 
542e03ab78fSPeter Brune    Level: advanced
543e03ab78fSPeter Brune 
544e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
545e03ab78fSPeter Brune @*/
546e03ab78fSPeter Brune PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (*pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
547e03ab78fSPeter Brune {
548e03ab78fSPeter Brune   PetscErrorCode ierr;
549942e3340SBarry Smith   DMSNES         sdm;
550e03ab78fSPeter Brune 
551e03ab78fSPeter Brune   PetscFunctionBegin;
552e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
553942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
554*22c6f798SBarry Smith   if (pfunc) sdm->ops->computepfunction = pfunc;
555*22c6f798SBarry Smith   if (pjac)  sdm->ops->computepjacobian = pjac;
556e03ab78fSPeter Brune   if (ctx)   sdm->pctx             = ctx;
557e03ab78fSPeter Brune   PetscFunctionReturn(0);
558e03ab78fSPeter Brune }
559e03ab78fSPeter Brune 
5607971a8bfSPeter Brune 
5617971a8bfSPeter Brune #undef __FUNCT__
5627971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard"
5637971a8bfSPeter Brune /*@C
5647971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
5657971a8bfSPeter Brune 
5667971a8bfSPeter Brune    Not Collective
5677971a8bfSPeter Brune 
5687971a8bfSPeter Brune    Input Argument:
5697971a8bfSPeter Brune .  dm - DM to be used with SNES
5707971a8bfSPeter Brune 
5717971a8bfSPeter Brune    Output Arguments:
5727971a8bfSPeter Brune +  pfunc - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
5737971a8bfSPeter Brune .  pjac  - RHS evaluation function, see SNESSetFunction() for calling sequence
5747971a8bfSPeter Brune -  ctx - context for residual evaluation
5757971a8bfSPeter Brune 
5767971a8bfSPeter Brune    Level: advanced
5777971a8bfSPeter Brune 
5787971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5797971a8bfSPeter Brune @*/
5807971a8bfSPeter Brune PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (**pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5817971a8bfSPeter Brune {
5827971a8bfSPeter Brune   PetscErrorCode ierr;
583942e3340SBarry Smith   DMSNES         sdm;
5847971a8bfSPeter Brune 
5857971a8bfSPeter Brune   PetscFunctionBegin;
5867971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
587942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
588*22c6f798SBarry Smith   if (pfunc) *pfunc = sdm->ops->computepfunction;
589*22c6f798SBarry Smith   if (pjac) *pjac   = sdm->ops->computepjacobian;
5907971a8bfSPeter Brune   if (ctx)  *ctx    = sdm->pctx;
5917971a8bfSPeter Brune   PetscFunctionReturn(0);
5927971a8bfSPeter Brune }
5937971a8bfSPeter Brune 
5946427ad5bSPeter Brune /* block functions */
5956427ad5bSPeter Brune 
5966427ad5bSPeter Brune #undef __FUNCT__
5976427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockFunction"
5986427ad5bSPeter Brune /*@C
5996427ad5bSPeter Brune    DMSNESSetBlockFunction - set SNES residual evaluation function
6006427ad5bSPeter Brune 
6016427ad5bSPeter Brune    Not Collective
6026427ad5bSPeter Brune 
6036427ad5bSPeter Brune    Input Arguments:
6046427ad5bSPeter Brune +  dm - DM to be used with SNES
6056427ad5bSPeter Brune .  func - residual evaluation function, see SNESSetFunction() for calling sequence
6066427ad5bSPeter Brune -  ctx - context for residual evaluation
6076427ad5bSPeter Brune 
6086427ad5bSPeter Brune    Level: developer
6096427ad5bSPeter Brune 
6106427ad5bSPeter Brune    Note:
6116427ad5bSPeter Brune    Mostly for use in DM implementations and transferred to a block function rather than being called from here.
6126427ad5bSPeter Brune 
6136427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6146427ad5bSPeter Brune @*/
6156427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
6166427ad5bSPeter Brune {
6176427ad5bSPeter Brune   PetscErrorCode ierr;
618942e3340SBarry Smith   DMSNES         sdm;
6196427ad5bSPeter Brune 
6206427ad5bSPeter Brune   PetscFunctionBegin;
6216427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
622fdaff8d6SPeter Brune   if (func || ctx) {
623942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
624fdaff8d6SPeter Brune   }
625*22c6f798SBarry Smith   if (func) sdm->ops->computeblockfunction = func;
6266427ad5bSPeter Brune   if (ctx)  sdm->blockfunctionctx = ctx;
6276427ad5bSPeter Brune   PetscFunctionReturn(0);
6286427ad5bSPeter Brune }
6296427ad5bSPeter Brune 
6306427ad5bSPeter Brune #undef __FUNCT__
6316427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockFunction"
6326427ad5bSPeter Brune /*@C
6336427ad5bSPeter Brune    DMSNESGetBlockFunction - get SNES residual evaluation function
6346427ad5bSPeter Brune 
6356427ad5bSPeter Brune    Not Collective
6366427ad5bSPeter Brune 
6376427ad5bSPeter Brune    Input Argument:
6386427ad5bSPeter Brune .  dm - DM to be used with SNES
6396427ad5bSPeter Brune 
6406427ad5bSPeter Brune    Output Arguments:
6416427ad5bSPeter Brune +  func - residual evaluation function, see SNESSetFunction() for calling sequence
6426427ad5bSPeter Brune -  ctx - context for residual evaluation
6436427ad5bSPeter Brune 
6446427ad5bSPeter Brune    Level: developer
6456427ad5bSPeter Brune 
6466427ad5bSPeter Brune .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction()
6476427ad5bSPeter Brune @*/
6486427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
6496427ad5bSPeter Brune {
6506427ad5bSPeter Brune   PetscErrorCode ierr;
651942e3340SBarry Smith   DMSNES         sdm;
6526427ad5bSPeter Brune 
6536427ad5bSPeter Brune   PetscFunctionBegin;
6546427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
655942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
656*22c6f798SBarry Smith   if (func) *func = sdm->ops->computeblockfunction;
6576427ad5bSPeter Brune   if (ctx)  *ctx = sdm->blockfunctionctx;
6586427ad5bSPeter Brune   PetscFunctionReturn(0);
6596427ad5bSPeter Brune }
6606427ad5bSPeter Brune 
6616427ad5bSPeter Brune 
6626427ad5bSPeter Brune #undef __FUNCT__
6636427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockJacobian"
6646427ad5bSPeter Brune /*@C
6656427ad5bSPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
6666427ad5bSPeter Brune 
6676427ad5bSPeter Brune    Not Collective
6686427ad5bSPeter Brune 
6696427ad5bSPeter Brune    Input Argument:
6706427ad5bSPeter Brune +  dm - DM to be used with SNES
6716427ad5bSPeter Brune .  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
6726427ad5bSPeter Brune -  ctx - context for residual evaluation
6736427ad5bSPeter Brune 
6746427ad5bSPeter Brune    Level: advanced
6756427ad5bSPeter Brune 
6766427ad5bSPeter Brune    Note:
6776427ad5bSPeter Brune    Mostly for use in DM implementations and transferred to a block function rather than being called from here.
6786427ad5bSPeter Brune 
6796427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian()
6806427ad5bSPeter Brune @*/
6816427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
6826427ad5bSPeter Brune {
6836427ad5bSPeter Brune   PetscErrorCode ierr;
684942e3340SBarry Smith   DMSNES         sdm;
6856427ad5bSPeter Brune 
6866427ad5bSPeter Brune   PetscFunctionBegin;
6876427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
688fdaff8d6SPeter Brune   if (func || ctx) {
689942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
690fdaff8d6SPeter Brune   }
691*22c6f798SBarry Smith   if (func) sdm->ops->computeblockjacobian = func;
6926427ad5bSPeter Brune   if (ctx)  sdm->blockjacobianctx = ctx;
6936427ad5bSPeter Brune   PetscFunctionReturn(0);
6946427ad5bSPeter Brune }
6956427ad5bSPeter Brune 
6966427ad5bSPeter Brune #undef __FUNCT__
6976427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockJacobian"
6986427ad5bSPeter Brune /*@C
6996427ad5bSPeter Brune    DMSNESGetBlockJacobian - get SNES Jacobian evaluation function
7006427ad5bSPeter Brune 
7016427ad5bSPeter Brune    Not Collective
7026427ad5bSPeter Brune 
7036427ad5bSPeter Brune    Input Argument:
7046427ad5bSPeter Brune .  dm - DM to be used with SNES
7056427ad5bSPeter Brune 
7066427ad5bSPeter Brune    Output Arguments:
7076427ad5bSPeter Brune +  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
7086427ad5bSPeter Brune -  ctx - context for residual evaluation
7096427ad5bSPeter Brune 
7106427ad5bSPeter Brune    Level: advanced
7116427ad5bSPeter Brune 
7126427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
7136427ad5bSPeter Brune @*/
7146427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
7156427ad5bSPeter Brune {
7166427ad5bSPeter Brune   PetscErrorCode ierr;
717942e3340SBarry Smith   DMSNES         sdm;
7186427ad5bSPeter Brune 
7196427ad5bSPeter Brune   PetscFunctionBegin;
7206427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
721942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
722*22c6f798SBarry Smith   if (func) *func = sdm->ops->computeblockjacobian;
7236427ad5bSPeter Brune   if (ctx)  *ctx = sdm->blockjacobianctx;
7246427ad5bSPeter Brune   PetscFunctionReturn(0);
7256427ad5bSPeter Brune }
726