xref: /petsc/src/snes/utils/dmsnes.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
1af0996ceSBarry Smith #include <petsc/private/snesimpl.h>   /*I "petscsnes.h" I*/
2af0996ceSBarry Smith #include <petsc/private/dmimpl.h>     /*I "petscdm.h" I*/
36cab3a1bSJed Brown 
422c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm)
56cab3a1bSJed Brown {
66cab3a1bSJed Brown   PetscFunctionBegin;
722c6f798SBarry Smith   if (!*kdm) PetscFunctionReturn(0);
822c6f798SBarry Smith   PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1);
99e5d0892SLisandro Dalcin   if (--((PetscObject)(*kdm))->refct > 0) {*kdm = NULL; PetscFunctionReturn(0);}
105f80ce2aSJacob Faibussowitsch   if ((*kdm)->ops->destroy) CHKERRQ(((*kdm)->ops->destroy)(*kdm));
115f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(kdm));
1222c6f798SBarry Smith   PetscFunctionReturn(0);
1322c6f798SBarry Smith }
1422c6f798SBarry Smith 
152d53ad75SBarry Smith PetscErrorCode DMSNESLoad(DMSNES kdm,PetscViewer viewer)
162d53ad75SBarry Smith {
172d53ad75SBarry Smith   PetscFunctionBegin;
185f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,NULL,PETSC_FUNCTION));
195f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,NULL,PETSC_FUNCTION));
202d53ad75SBarry Smith   PetscFunctionReturn(0);
212d53ad75SBarry Smith }
222d53ad75SBarry Smith 
232d53ad75SBarry Smith PetscErrorCode DMSNESView(DMSNES kdm,PetscViewer viewer)
242d53ad75SBarry Smith {
252d53ad75SBarry Smith   PetscBool      isascii,isbinary;
262d53ad75SBarry Smith 
272d53ad75SBarry Smith   PetscFunctionBegin;
285f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii));
295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary));
302d53ad75SBarry Smith   if (isascii) {
314b5d3663SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) && defined(PETSC_SERIALIZE_FUNCTIONS_VIEW)
322d53ad75SBarry Smith     const char *fname;
332d53ad75SBarry Smith 
345f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTFind(kdm->ops->computefunction,&fname));
352d53ad75SBarry Smith     if (fname) {
365f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"Function used by SNES: %s\n",fname));
372d53ad75SBarry Smith     }
385f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFPTFind(kdm->ops->computejacobian,&fname));
392d53ad75SBarry Smith     if (fname) {
405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(viewer,"Jacobian function used by SNES: %s\n",fname));
412d53ad75SBarry Smith     }
42c7a10e08SBarry Smith #endif
432d53ad75SBarry Smith   } else if (isbinary) {
443964eb88SJed Brown     struct {
453964eb88SJed Brown       PetscErrorCode (*func)(SNES,Vec,Vec,void*);
469200755eSBarry Smith     } funcstruct;
479200755eSBarry Smith     struct {
48d1e9a80fSBarry Smith       PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*);
499200755eSBarry Smith     } jacstruct;
509200755eSBarry Smith     funcstruct.func = kdm->ops->computefunction;
519200755eSBarry Smith     jacstruct.jac   = kdm->ops->computejacobian;
525f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION));
535f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION));
542d53ad75SBarry Smith   }
552d53ad75SBarry Smith   PetscFunctionReturn(0);
562d53ad75SBarry Smith }
572d53ad75SBarry Smith 
5822c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
5922c6f798SBarry Smith {
6022c6f798SBarry Smith   PetscFunctionBegin;
615f80ce2aSJacob Faibussowitsch   CHKERRQ(SNESInitializePackage());
625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(*kdm, DMSNES_CLASSID,  "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView));
636cab3a1bSJed Brown   PetscFunctionReturn(0);
646cab3a1bSJed Brown }
656cab3a1bSJed Brown 
66942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
676cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
686cab3a1bSJed Brown  */
69942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
706cab3a1bSJed Brown {
716cab3a1bSJed Brown   PetscFunctionBegin;
725f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCopyDMSNES(dm,dmc));
736cab3a1bSJed Brown   PetscFunctionReturn(0);
746cab3a1bSJed Brown }
756cab3a1bSJed Brown 
76dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
77caa4e7f2SJed Brown  */
78942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
79caa4e7f2SJed Brown {
80caa4e7f2SJed Brown   PetscFunctionBegin;
81caa4e7f2SJed Brown   PetscFunctionReturn(0);
82caa4e7f2SJed Brown }
83caa4e7f2SJed Brown 
84be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */
85be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx)
86be081cd6SPeter Brune {
87be081cd6SPeter Brune   PetscFunctionBegin;
885f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCopyDMSNES(dm,subdm));
89be081cd6SPeter Brune   PetscFunctionReturn(0);
90be081cd6SPeter Brune }
91be081cd6SPeter Brune 
92be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level.
93be081cd6SPeter Brune  */
94be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
95be081cd6SPeter Brune {
96be081cd6SPeter Brune   PetscFunctionBegin;
97be081cd6SPeter Brune   PetscFunctionReturn(0);
98be081cd6SPeter Brune }
99be081cd6SPeter Brune 
100942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
10103a0fabfSPeter Brune {
10203a0fabfSPeter Brune   PetscFunctionBegin;
1035f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCopyDMSNES(dm,dmf));
10403a0fabfSPeter Brune   PetscFunctionReturn(0);
10503a0fabfSPeter Brune }
10603a0fabfSPeter Brune 
10703a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
10803a0fabfSPeter Brune  */
109942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
11003a0fabfSPeter Brune {
11103a0fabfSPeter Brune   PetscFunctionBegin;
11203a0fabfSPeter Brune   PetscFunctionReturn(0);
11303a0fabfSPeter Brune }
11403a0fabfSPeter Brune 
11522c6f798SBarry Smith /*@C
11622c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
11722c6f798SBarry Smith 
11822c6f798SBarry Smith    Not Collective
11922c6f798SBarry Smith 
1204165533cSJose E. Roman    Input Parameters:
12122c6f798SBarry Smith +  kdm - Original DMSNES
12222c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
12322c6f798SBarry Smith 
12422c6f798SBarry Smith    Level: developer
12522c6f798SBarry Smith 
12622c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
12722c6f798SBarry Smith @*/
12822c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
12922c6f798SBarry Smith {
13022c6f798SBarry Smith   PetscFunctionBegin;
13122c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
13222c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
13322c6f798SBarry Smith   nkdm->ops->computefunction  = kdm->ops->computefunction;
1342bc4d0c4SPeter Brune   nkdm->ops->computejacobian  = kdm->ops->computejacobian;
13522c6f798SBarry Smith   nkdm->ops->computegs        = kdm->ops->computegs;
13622c6f798SBarry Smith   nkdm->ops->computeobjective = kdm->ops->computeobjective;
13722c6f798SBarry Smith   nkdm->ops->computepjacobian = kdm->ops->computepjacobian;
13822c6f798SBarry Smith   nkdm->ops->computepfunction = kdm->ops->computepfunction;
13922c6f798SBarry Smith   nkdm->ops->destroy          = kdm->ops->destroy;
14022c6f798SBarry Smith   nkdm->ops->duplicate        = kdm->ops->duplicate;
14122c6f798SBarry Smith 
14222c6f798SBarry Smith   nkdm->functionctx  = kdm->functionctx;
14322c6f798SBarry Smith   nkdm->gsctx        = kdm->gsctx;
14422c6f798SBarry Smith   nkdm->pctx         = kdm->pctx;
14522c6f798SBarry Smith   nkdm->jacobianctx  = kdm->jacobianctx;
14622c6f798SBarry Smith   nkdm->objectivectx = kdm->objectivectx;
147af903c1dSJunchao Zhang   nkdm->originaldm   = kdm->originaldm;
14822c6f798SBarry Smith 
14922c6f798SBarry Smith   /*
15022c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
15122c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
15222c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
15322c6f798SBarry Smith   */
15422c6f798SBarry Smith 
15522c6f798SBarry Smith   /* implementation specific copy hooks */
1565f80ce2aSJacob Faibussowitsch   if (kdm->ops->duplicate) CHKERRQ((*kdm->ops->duplicate)(kdm,nkdm));
15722c6f798SBarry Smith   PetscFunctionReturn(0);
15822c6f798SBarry Smith }
15922c6f798SBarry Smith 
1606cab3a1bSJed Brown /*@C
161942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
1626cab3a1bSJed Brown 
1636cab3a1bSJed Brown    Not Collective
1646cab3a1bSJed Brown 
1654165533cSJose E. Roman    Input Parameter:
1666cab3a1bSJed Brown .  dm - DM to be used with SNES
1676cab3a1bSJed Brown 
1684165533cSJose E. Roman    Output Parameter:
169942e3340SBarry Smith .  snesdm - private DMSNES context
1706cab3a1bSJed Brown 
1716cab3a1bSJed Brown    Level: developer
1726cab3a1bSJed Brown 
1736cab3a1bSJed Brown    Notes:
174942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
1756cab3a1bSJed Brown 
176942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
1776cab3a1bSJed Brown @*/
178942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
1796cab3a1bSJed Brown {
1806cab3a1bSJed Brown   PetscFunctionBegin;
1816cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
182b4615a05SBarry Smith   *snesdm = (DMSNES) dm->dmsnes;
18322c6f798SBarry Smith   if (!*snesdm) {
1845f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfo(dm,"Creating new DMSNES\n"));
1855f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm));
1861aa26658SKarl Rupp 
187b4615a05SBarry Smith     dm->dmsnes            = (PetscObject) *snesdm;
188af903c1dSJunchao Zhang     (*snesdm)->originaldm = dm;
1895f80ce2aSJacob Faibussowitsch     CHKERRQ(DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL));
1905f80ce2aSJacob Faibussowitsch     CHKERRQ(DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL));
1915f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL));
1926cab3a1bSJed Brown   }
1936cab3a1bSJed Brown   PetscFunctionReturn(0);
1946cab3a1bSJed Brown }
1956cab3a1bSJed Brown 
1966cab3a1bSJed Brown /*@C
197942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
1986cab3a1bSJed Brown 
1996cab3a1bSJed Brown    Not Collective
2006cab3a1bSJed Brown 
2014165533cSJose E. Roman    Input Parameter:
2026cab3a1bSJed Brown .  dm - DM to be used with SNES
2036cab3a1bSJed Brown 
2044165533cSJose E. Roman    Output Parameter:
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 {
213942e3340SBarry Smith   DMSNES         sdm;
2146cab3a1bSJed Brown 
2156cab3a1bSJed Brown   PetscFunctionBegin;
2166cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
2175f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
218*28b400f6SJacob Faibussowitsch   PetscCheck(sdm->originaldm,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"DMSNES has a NULL originaldm");
2196cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
220b4615a05SBarry Smith     DMSNES oldsdm = sdm;
2215f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfo(dm,"Copying DMSNES due to write\n"));
2225f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm));
2235f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSNESCopy(oldsdm,sdm));
2245f80ce2aSJacob Faibussowitsch     CHKERRQ(DMSNESDestroy((DMSNES*)&dm->dmsnes));
225b4615a05SBarry Smith     dm->dmsnes = (PetscObject)sdm;
226af903c1dSJunchao Zhang     sdm->originaldm = dm;
2276cab3a1bSJed Brown   }
2286cab3a1bSJed Brown   *snesdm = sdm;
2296cab3a1bSJed Brown   PetscFunctionReturn(0);
2306cab3a1bSJed Brown }
2316cab3a1bSJed Brown 
2326cab3a1bSJed Brown /*@C
233942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2346cab3a1bSJed Brown 
2356cab3a1bSJed Brown    Logically Collective
2366cab3a1bSJed Brown 
2374165533cSJose E. Roman    Input Parameters:
2386cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2396cab3a1bSJed Brown -  dmdest - DM to add context to
2406cab3a1bSJed Brown 
2416cab3a1bSJed Brown    Level: developer
2426cab3a1bSJed Brown 
2436cab3a1bSJed Brown    Note:
2446cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2456cab3a1bSJed Brown 
246942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2476cab3a1bSJed Brown @*/
248942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2496cab3a1bSJed Brown {
2506cab3a1bSJed Brown   PetscFunctionBegin;
2516cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
2526cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
2535f80ce2aSJacob Faibussowitsch   if (!dmdest->dmsnes) CHKERRQ(DMSNESCreate(PetscObjectComm((PetscObject) dmdest), (DMSNES *) &dmdest->dmsnes));
2545f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSNESCopy((DMSNES) dmsrc->dmsnes, (DMSNES) dmdest->dmsnes));
2555f80ce2aSJacob Faibussowitsch   CHKERRQ(DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL));
2565f80ce2aSJacob Faibussowitsch   CHKERRQ(DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL));
2575f80ce2aSJacob Faibussowitsch   CHKERRQ(DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL));
2586cab3a1bSJed Brown   PetscFunctionReturn(0);
2596cab3a1bSJed Brown }
2606cab3a1bSJed Brown 
2616cab3a1bSJed Brown /*@C
2626cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
2636cab3a1bSJed Brown 
2646cab3a1bSJed Brown    Not Collective
2656cab3a1bSJed Brown 
2664165533cSJose E. Roman    Input Parameters:
2676cab3a1bSJed Brown +  dm - DM to be used with SNES
268f8b49ee9SBarry Smith .  f - residual evaluation function; see SNESFunction for details
2696cab3a1bSJed Brown -  ctx - context for residual evaluation
2706cab3a1bSJed Brown 
2716cab3a1bSJed Brown    Level: advanced
2726cab3a1bSJed Brown 
2736cab3a1bSJed Brown    Note:
2746cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
2756cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
2766cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
2776cab3a1bSJed Brown 
278bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction
2796cab3a1bSJed Brown @*/
280f8b49ee9SBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
2816cab3a1bSJed Brown {
282942e3340SBarry Smith   DMSNES         sdm;
2836cab3a1bSJed Brown 
2846cab3a1bSJed Brown   PetscFunctionBegin;
2856cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
286f8b49ee9SBarry Smith   if (f || ctx) {
2875f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetDMSNESWrite(dm,&sdm));
288fdaff8d6SPeter Brune   }
289f8b49ee9SBarry Smith   if (f) sdm->ops->computefunction = f;
2906cab3a1bSJed Brown   if (ctx) sdm->functionctx = ctx;
2916cab3a1bSJed Brown   PetscFunctionReturn(0);
2926cab3a1bSJed Brown }
2936cab3a1bSJed Brown 
2946cab3a1bSJed Brown /*@C
295bbc1464cSBarry Smith    DMSNESSetMFFunction - set SNES residual evaluation function used in applying the matrix-free Jacobian with -snes_mf_operator
296bbc1464cSBarry Smith 
297bbc1464cSBarry Smith    Logically Collective on dm
298bbc1464cSBarry Smith 
2994165533cSJose E. Roman    Input Parameters:
300bbc1464cSBarry Smith +  dm - DM to be used with SNES
301bbc1464cSBarry Smith -  f - residual evaluation function; see SNESFunction for details
302bbc1464cSBarry Smith 
303bbc1464cSBarry Smith    Level: advanced
304bbc1464cSBarry Smith 
305bbc1464cSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction, DMSNESSetFunction()
306bbc1464cSBarry Smith @*/
307bbc1464cSBarry Smith PetscErrorCode DMSNESSetMFFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
308bbc1464cSBarry Smith {
309bbc1464cSBarry Smith   DMSNES         sdm;
310bbc1464cSBarry Smith 
311bbc1464cSBarry Smith   PetscFunctionBegin;
312bbc1464cSBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
313bbc1464cSBarry Smith   if (f || ctx) {
3145f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetDMSNESWrite(dm,&sdm));
315bbc1464cSBarry Smith   }
316bbc1464cSBarry Smith   if (f) sdm->ops->computemffunction = f;
317bbc1464cSBarry Smith   if (ctx) sdm->mffunctionctx = ctx;
318bbc1464cSBarry Smith   PetscFunctionReturn(0);
319bbc1464cSBarry Smith }
320bbc1464cSBarry Smith 
321bbc1464cSBarry Smith /*@C
3226cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
3236cab3a1bSJed Brown 
3246cab3a1bSJed Brown    Not Collective
3256cab3a1bSJed Brown 
3264165533cSJose E. Roman    Input Parameter:
3276cab3a1bSJed Brown .  dm - DM to be used with SNES
3286cab3a1bSJed Brown 
3294165533cSJose E. Roman    Output Parameters:
330f8b49ee9SBarry Smith +  f - residual evaluation function; see SNESFunction for details
3316cab3a1bSJed Brown -  ctx - context for residual evaluation
3326cab3a1bSJed Brown 
3336cab3a1bSJed Brown    Level: advanced
3346cab3a1bSJed Brown 
3356cab3a1bSJed Brown    Note:
3366cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3376cab3a1bSJed Brown    associated with the DM.
3386cab3a1bSJed Brown 
339bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction
3406cab3a1bSJed Brown @*/
341f8b49ee9SBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
3426cab3a1bSJed Brown {
343942e3340SBarry Smith   DMSNES         sdm;
3446cab3a1bSJed Brown 
3456cab3a1bSJed Brown   PetscFunctionBegin;
3466cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3475f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
348f8b49ee9SBarry Smith   if (f) *f = sdm->ops->computefunction;
3496cab3a1bSJed Brown   if (ctx) *ctx = sdm->functionctx;
3506cab3a1bSJed Brown   PetscFunctionReturn(0);
3516cab3a1bSJed Brown }
3526cab3a1bSJed Brown 
3532a4ee8f2SPeter Brune /*@C
354081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3552a4ee8f2SPeter Brune 
3562a4ee8f2SPeter Brune    Not Collective
3572a4ee8f2SPeter Brune 
3584165533cSJose E. Roman    Input Parameters:
3592a4ee8f2SPeter Brune +  dm - DM to be used with SNES
360f8b49ee9SBarry Smith .  obj - objective evaluation function; see SNESObjectiveFunction for details
3612a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3622a4ee8f2SPeter Brune 
3632a4ee8f2SPeter Brune    Level: advanced
3642a4ee8f2SPeter Brune 
3652a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3662a4ee8f2SPeter Brune @*/
367f8b49ee9SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*obj)(SNES,Vec,PetscReal*,void*),void *ctx)
3682a4ee8f2SPeter Brune {
369942e3340SBarry Smith   DMSNES         sdm;
3702a4ee8f2SPeter Brune 
3712a4ee8f2SPeter Brune   PetscFunctionBegin;
3722a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
373f8b49ee9SBarry Smith   if (obj || ctx) {
3745f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetDMSNESWrite(dm,&sdm));
375fdaff8d6SPeter Brune   }
376f8b49ee9SBarry Smith   if (obj) sdm->ops->computeobjective = obj;
3772a4ee8f2SPeter Brune   if (ctx) sdm->objectivectx = ctx;
3782a4ee8f2SPeter Brune   PetscFunctionReturn(0);
3792a4ee8f2SPeter Brune }
3802a4ee8f2SPeter Brune 
3812a4ee8f2SPeter Brune /*@C
3822a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
3832a4ee8f2SPeter Brune 
3842a4ee8f2SPeter Brune    Not Collective
3852a4ee8f2SPeter Brune 
3864165533cSJose E. Roman    Input Parameter:
3872a4ee8f2SPeter Brune .  dm - DM to be used with SNES
3882a4ee8f2SPeter Brune 
3894165533cSJose E. Roman    Output Parameters:
390f8b49ee9SBarry Smith +  obj- residual evaluation function; see SNESObjectiveFunction for details
3912a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3922a4ee8f2SPeter Brune 
3932a4ee8f2SPeter Brune    Level: advanced
3942a4ee8f2SPeter Brune 
3952a4ee8f2SPeter Brune    Note:
3962a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3972a4ee8f2SPeter Brune    associated with the DM.
3982a4ee8f2SPeter Brune 
3992a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
4002a4ee8f2SPeter Brune @*/
401f8b49ee9SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**obj)(SNES,Vec,PetscReal*,void*),void **ctx)
4022a4ee8f2SPeter Brune {
403942e3340SBarry Smith   DMSNES         sdm;
4042a4ee8f2SPeter Brune 
4052a4ee8f2SPeter Brune   PetscFunctionBegin;
4062a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4075f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
408f8b49ee9SBarry Smith   if (obj) *obj = sdm->ops->computeobjective;
4092a4ee8f2SPeter Brune   if (ctx) *ctx = sdm->objectivectx;
4102a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4112a4ee8f2SPeter Brune }
4122a4ee8f2SPeter Brune 
4136cab3a1bSJed Brown /*@C
414be95d8f1SBarry Smith    DMSNESSetNGS - set SNES Gauss-Seidel relaxation function
4156cab3a1bSJed Brown 
4166cab3a1bSJed Brown    Not Collective
4176cab3a1bSJed Brown 
4184165533cSJose E. Roman    Input Parameters:
4196cab3a1bSJed Brown +  dm - DM to be used with SNES
420be95d8f1SBarry Smith .  f  - relaxation function, see SNESGSFunction
4216cab3a1bSJed Brown -  ctx - context for residual evaluation
4226cab3a1bSJed Brown 
4236cab3a1bSJed Brown    Level: advanced
4246cab3a1bSJed Brown 
4256cab3a1bSJed Brown    Note:
426be95d8f1SBarry Smith    SNESSetNGS() is normally used, but it calls this function internally because the user context is actually
4276cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4286cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4296cab3a1bSJed Brown 
430bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction
4316cab3a1bSJed Brown @*/
432be95d8f1SBarry Smith PetscErrorCode DMSNESSetNGS(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
4336cab3a1bSJed Brown {
434942e3340SBarry Smith   DMSNES         sdm;
4356cab3a1bSJed Brown 
4366cab3a1bSJed Brown   PetscFunctionBegin;
4376cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
438be95d8f1SBarry Smith   if (f || ctx) {
4395f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetDMSNESWrite(dm,&sdm));
440fdaff8d6SPeter Brune   }
441be95d8f1SBarry Smith   if (f) sdm->ops->computegs = f;
4426cab3a1bSJed Brown   if (ctx) sdm->gsctx = ctx;
4436cab3a1bSJed Brown   PetscFunctionReturn(0);
4446cab3a1bSJed Brown }
4456cab3a1bSJed Brown 
4466cab3a1bSJed Brown /*@C
447be95d8f1SBarry Smith    DMSNESGetNGS - get SNES Gauss-Seidel relaxation function
4486cab3a1bSJed Brown 
4496cab3a1bSJed Brown    Not Collective
4506cab3a1bSJed Brown 
4514165533cSJose E. Roman    Input Parameter:
4526cab3a1bSJed Brown .  dm - DM to be used with SNES
4536cab3a1bSJed Brown 
4544165533cSJose E. Roman    Output Parameters:
455be95d8f1SBarry Smith +  f - relaxation function which performs Gauss-Seidel sweeps, see SNESGSFunction
4566cab3a1bSJed Brown -  ctx - context for residual evaluation
4576cab3a1bSJed Brown 
4586cab3a1bSJed Brown    Level: advanced
4596cab3a1bSJed Brown 
4606cab3a1bSJed Brown    Note:
461be95d8f1SBarry Smith    SNESGetNGS() is normally used, but it calls this function internally because the user context is actually
4626cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4636cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4646cab3a1bSJed Brown 
465be95d8f1SBarry Smith .seealso: DMSNESSetContext(), SNESGetNGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESNGSFunction
4666cab3a1bSJed Brown @*/
467be95d8f1SBarry Smith PetscErrorCode DMSNESGetNGS(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
4686cab3a1bSJed Brown {
469942e3340SBarry Smith   DMSNES         sdm;
4706cab3a1bSJed Brown 
4716cab3a1bSJed Brown   PetscFunctionBegin;
4726cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4735f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
474be95d8f1SBarry Smith   if (f) *f = sdm->ops->computegs;
4756cab3a1bSJed Brown   if (ctx) *ctx = sdm->gsctx;
4766cab3a1bSJed Brown   PetscFunctionReturn(0);
4776cab3a1bSJed Brown }
4786cab3a1bSJed Brown 
4796cab3a1bSJed Brown /*@C
480ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
4816cab3a1bSJed Brown 
4826cab3a1bSJed Brown    Not Collective
4836cab3a1bSJed Brown 
4844165533cSJose E. Roman    Input Parameters:
4856cab3a1bSJed Brown +  dm - DM to be used with SNES
486f8b49ee9SBarry Smith .  J - Jacobian evaluation function
4876cab3a1bSJed Brown -  ctx - context for residual evaluation
4886cab3a1bSJed Brown 
4896cab3a1bSJed Brown    Level: advanced
4906cab3a1bSJed Brown 
4916cab3a1bSJed Brown    Note:
4926cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
4936cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4946cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
4956cab3a1bSJed Brown 
496bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction
4976cab3a1bSJed Brown @*/
498d1e9a80fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
4996cab3a1bSJed Brown {
500942e3340SBarry Smith   DMSNES         sdm;
5016cab3a1bSJed Brown 
5026cab3a1bSJed Brown   PetscFunctionBegin;
5036cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
504f8b49ee9SBarry Smith   if (J || ctx) {
5055f80ce2aSJacob Faibussowitsch     CHKERRQ(DMGetDMSNESWrite(dm,&sdm));
5061fdfe764SBarry Smith   }
507f8b49ee9SBarry Smith   if (J) sdm->ops->computejacobian = J;
5086cab3a1bSJed Brown   if (ctx) sdm->jacobianctx = ctx;
5096cab3a1bSJed Brown   PetscFunctionReturn(0);
5106cab3a1bSJed Brown }
5116cab3a1bSJed Brown 
5126cab3a1bSJed Brown /*@C
513ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
5146cab3a1bSJed Brown 
5156cab3a1bSJed Brown    Not Collective
5166cab3a1bSJed Brown 
5174165533cSJose E. Roman    Input Parameter:
5186cab3a1bSJed Brown .  dm - DM to be used with SNES
5196cab3a1bSJed Brown 
5204165533cSJose E. Roman    Output Parameters:
521f8b49ee9SBarry Smith +  J - Jacobian evaluation function; see SNESJacobianFunction for all calling sequence
5226cab3a1bSJed Brown -  ctx - context for residual evaluation
5236cab3a1bSJed Brown 
5246cab3a1bSJed Brown    Level: advanced
5256cab3a1bSJed Brown 
5266cab3a1bSJed Brown    Note:
5276cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5286cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5296cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5306cab3a1bSJed Brown 
531bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction
5326cab3a1bSJed Brown @*/
533d1e9a80fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
5346cab3a1bSJed Brown {
535942e3340SBarry Smith   DMSNES         sdm;
5366cab3a1bSJed Brown 
5376cab3a1bSJed Brown   PetscFunctionBegin;
5386cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5395f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
540f8b49ee9SBarry Smith   if (J) *J = sdm->ops->computejacobian;
5416cab3a1bSJed Brown   if (ctx) *ctx = sdm->jacobianctx;
5426cab3a1bSJed Brown   PetscFunctionReturn(0);
5436cab3a1bSJed Brown }
5446cab3a1bSJed Brown 
545e03ab78fSPeter Brune /*@C
546e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
547e03ab78fSPeter Brune 
548e03ab78fSPeter Brune    Not Collective
549e03ab78fSPeter Brune 
5504165533cSJose E. Roman    Input Parameters:
551e03ab78fSPeter Brune +  dm - DM to be used with SNES
552f8b49ee9SBarry Smith .  b - RHS evaluation function
553f8b49ee9SBarry Smith .  J - Picard matrix evaluation function
554e03ab78fSPeter Brune -  ctx - context for residual evaluation
555e03ab78fSPeter Brune 
556e03ab78fSPeter Brune    Level: advanced
557e03ab78fSPeter Brune 
558e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
559e03ab78fSPeter Brune @*/
560d1e9a80fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*b)(SNES,Vec,Vec,void*),PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
561e03ab78fSPeter Brune {
562942e3340SBarry Smith   DMSNES         sdm;
563e03ab78fSPeter Brune 
564e03ab78fSPeter Brune   PetscFunctionBegin;
565e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5665f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
567f8b49ee9SBarry Smith   if (b) sdm->ops->computepfunction = b;
568f8b49ee9SBarry Smith   if (J) sdm->ops->computepjacobian = J;
569e03ab78fSPeter Brune   if (ctx) sdm->pctx = ctx;
570e03ab78fSPeter Brune   PetscFunctionReturn(0);
571e03ab78fSPeter Brune }
572e03ab78fSPeter Brune 
5737971a8bfSPeter Brune /*@C
5747971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
5757971a8bfSPeter Brune 
5767971a8bfSPeter Brune    Not Collective
5777971a8bfSPeter Brune 
5784165533cSJose E. Roman    Input Parameter:
5797971a8bfSPeter Brune .  dm - DM to be used with SNES
5807971a8bfSPeter Brune 
5814165533cSJose E. Roman    Output Parameters:
582f8b49ee9SBarry Smith +  b - RHS evaluation function; see SNESFunction for details
583f8b49ee9SBarry Smith .  J  - RHS evaluation function; see SNESJacobianFunction for detailsa
5847971a8bfSPeter Brune -  ctx - context for residual evaluation
5857971a8bfSPeter Brune 
5867971a8bfSPeter Brune    Level: advanced
5877971a8bfSPeter Brune 
5887971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5897971a8bfSPeter Brune @*/
590d1e9a80fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**b)(SNES,Vec,Vec,void*),PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
5917971a8bfSPeter Brune {
592942e3340SBarry Smith   DMSNES         sdm;
5937971a8bfSPeter Brune 
5947971a8bfSPeter Brune   PetscFunctionBegin;
5957971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5965f80ce2aSJacob Faibussowitsch   CHKERRQ(DMGetDMSNES(dm,&sdm));
597f8b49ee9SBarry Smith   if (b) *b = sdm->ops->computepfunction;
598f8b49ee9SBarry Smith   if (J) *J = sdm->ops->computepjacobian;
5997971a8bfSPeter Brune   if (ctx) *ctx = sdm->pctx;
6007971a8bfSPeter Brune   PetscFunctionReturn(0);
6017971a8bfSPeter Brune }
602