xref: /petsc/src/snes/utils/dmsnes.c (revision bbc1464cf0515385cd819c96cf84160a770064ee)
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   PetscErrorCode ierr;
76cab3a1bSJed Brown 
86cab3a1bSJed Brown   PetscFunctionBegin;
922c6f798SBarry Smith   if (!*kdm) PetscFunctionReturn(0);
1022c6f798SBarry Smith   PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1);
119e5d0892SLisandro Dalcin   if (--((PetscObject)(*kdm))->refct > 0) {*kdm = NULL; PetscFunctionReturn(0);}
1222c6f798SBarry Smith   if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);}
1322c6f798SBarry Smith   ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr);
1422c6f798SBarry Smith   PetscFunctionReturn(0);
1522c6f798SBarry Smith }
1622c6f798SBarry Smith 
172d53ad75SBarry Smith PetscErrorCode DMSNESLoad(DMSNES kdm,PetscViewer viewer)
182d53ad75SBarry Smith {
192d53ad75SBarry Smith   PetscErrorCode ierr;
202d53ad75SBarry Smith 
212d53ad75SBarry Smith   PetscFunctionBegin;
22060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr);
23060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr);
242d53ad75SBarry Smith   PetscFunctionReturn(0);
252d53ad75SBarry Smith }
262d53ad75SBarry Smith 
272d53ad75SBarry Smith PetscErrorCode DMSNESView(DMSNES kdm,PetscViewer viewer)
282d53ad75SBarry Smith {
292d53ad75SBarry Smith   PetscErrorCode ierr;
302d53ad75SBarry Smith   PetscBool      isascii,isbinary;
312d53ad75SBarry Smith 
322d53ad75SBarry Smith   PetscFunctionBegin;
332d53ad75SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
342d53ad75SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
352d53ad75SBarry Smith   if (isascii) {
364b5d3663SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) && defined(PETSC_SERIALIZE_FUNCTIONS_VIEW)
372d53ad75SBarry Smith     const char *fname;
382d53ad75SBarry Smith 
392d53ad75SBarry Smith     ierr = PetscFPTFind(kdm->ops->computefunction,&fname);CHKERRQ(ierr);
402d53ad75SBarry Smith     if (fname) {
412d53ad75SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"Function used by SNES: %s\n",fname);CHKERRQ(ierr);
422d53ad75SBarry Smith     }
432d53ad75SBarry Smith     ierr = PetscFPTFind(kdm->ops->computejacobian,&fname);CHKERRQ(ierr);
442d53ad75SBarry Smith     if (fname) {
452d53ad75SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"Jacobian function used by SNES: %s\n",fname);CHKERRQ(ierr);
462d53ad75SBarry Smith     }
47c7a10e08SBarry Smith #endif
482d53ad75SBarry Smith   } else if (isbinary) {
493964eb88SJed Brown     struct {
503964eb88SJed Brown       PetscErrorCode (*func)(SNES,Vec,Vec,void*);
519200755eSBarry Smith     } funcstruct;
529200755eSBarry Smith     struct {
53d1e9a80fSBarry Smith       PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*);
549200755eSBarry Smith     } jacstruct;
559200755eSBarry Smith     funcstruct.func = kdm->ops->computefunction;
569200755eSBarry Smith     jacstruct.jac   = kdm->ops->computejacobian;
57f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION);CHKERRQ(ierr);
58f253e43cSLisandro Dalcin     ierr = PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION);CHKERRQ(ierr);
592d53ad75SBarry Smith   }
602d53ad75SBarry Smith   PetscFunctionReturn(0);
612d53ad75SBarry Smith }
622d53ad75SBarry Smith 
6322c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
6422c6f798SBarry Smith {
6522c6f798SBarry Smith   PetscErrorCode ierr;
6622c6f798SBarry Smith 
6722c6f798SBarry Smith   PetscFunctionBegin;
68607a6623SBarry Smith   ierr = SNESInitializePackage();CHKERRQ(ierr);
6973107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(*kdm, DMSNES_CLASSID,  "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr);
706cab3a1bSJed Brown   PetscFunctionReturn(0);
716cab3a1bSJed Brown }
726cab3a1bSJed Brown 
73942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
746cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
756cab3a1bSJed Brown  */
76942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
776cab3a1bSJed Brown {
786cab3a1bSJed Brown   PetscErrorCode ierr;
796cab3a1bSJed Brown 
806cab3a1bSJed Brown   PetscFunctionBegin;
81942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr);
826cab3a1bSJed Brown   PetscFunctionReturn(0);
836cab3a1bSJed Brown }
846cab3a1bSJed Brown 
85dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
86caa4e7f2SJed Brown  */
87942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
88caa4e7f2SJed Brown {
89caa4e7f2SJed Brown 
90caa4e7f2SJed Brown   PetscFunctionBegin;
91caa4e7f2SJed Brown   PetscFunctionReturn(0);
92caa4e7f2SJed Brown }
93caa4e7f2SJed Brown 
94be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */
95be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx)
96be081cd6SPeter Brune {
97be081cd6SPeter Brune   PetscErrorCode ierr;
98be081cd6SPeter Brune 
99be081cd6SPeter Brune   PetscFunctionBegin;
100be081cd6SPeter Brune   ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr);
101be081cd6SPeter Brune   PetscFunctionReturn(0);
102be081cd6SPeter Brune }
103be081cd6SPeter Brune 
104be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level.
105be081cd6SPeter Brune  */
106be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
107be081cd6SPeter Brune {
108be081cd6SPeter Brune 
109be081cd6SPeter Brune   PetscFunctionBegin;
110be081cd6SPeter Brune   PetscFunctionReturn(0);
111be081cd6SPeter Brune }
112be081cd6SPeter Brune 
113942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
11403a0fabfSPeter Brune {
11503a0fabfSPeter Brune   PetscErrorCode ierr;
11603a0fabfSPeter Brune 
11703a0fabfSPeter Brune   PetscFunctionBegin;
118942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
11903a0fabfSPeter Brune   PetscFunctionReturn(0);
12003a0fabfSPeter Brune }
12103a0fabfSPeter Brune 
12203a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
12303a0fabfSPeter Brune  */
124942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
12503a0fabfSPeter Brune {
12603a0fabfSPeter Brune 
12703a0fabfSPeter Brune   PetscFunctionBegin;
12803a0fabfSPeter Brune   PetscFunctionReturn(0);
12903a0fabfSPeter Brune }
13003a0fabfSPeter Brune 
13122c6f798SBarry Smith /*@C
13222c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
13322c6f798SBarry Smith 
13422c6f798SBarry Smith    Not Collective
13522c6f798SBarry Smith 
13622c6f798SBarry Smith    Input Argument:
13722c6f798SBarry Smith +  kdm - Original DMSNES
13822c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
13922c6f798SBarry Smith 
14022c6f798SBarry Smith    Level: developer
14122c6f798SBarry Smith 
14222c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
14322c6f798SBarry Smith @*/
14422c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
14522c6f798SBarry Smith {
14622c6f798SBarry Smith   PetscErrorCode ierr;
14722c6f798SBarry Smith 
14822c6f798SBarry Smith   PetscFunctionBegin;
14922c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
15022c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
15122c6f798SBarry Smith   nkdm->ops->computefunction  = kdm->ops->computefunction;
1522bc4d0c4SPeter Brune   nkdm->ops->computejacobian  = kdm->ops->computejacobian;
15322c6f798SBarry Smith   nkdm->ops->computegs        = kdm->ops->computegs;
15422c6f798SBarry Smith   nkdm->ops->computeobjective = kdm->ops->computeobjective;
15522c6f798SBarry Smith   nkdm->ops->computepjacobian = kdm->ops->computepjacobian;
15622c6f798SBarry Smith   nkdm->ops->computepfunction = kdm->ops->computepfunction;
15722c6f798SBarry Smith   nkdm->ops->destroy          = kdm->ops->destroy;
15822c6f798SBarry Smith   nkdm->ops->duplicate        = kdm->ops->duplicate;
15922c6f798SBarry Smith 
16022c6f798SBarry Smith   nkdm->functionctx  = kdm->functionctx;
16122c6f798SBarry Smith   nkdm->gsctx        = kdm->gsctx;
16222c6f798SBarry Smith   nkdm->pctx         = kdm->pctx;
16322c6f798SBarry Smith   nkdm->jacobianctx  = kdm->jacobianctx;
16422c6f798SBarry Smith   nkdm->objectivectx = kdm->objectivectx;
165af903c1dSJunchao Zhang   nkdm->originaldm   = kdm->originaldm;
16622c6f798SBarry Smith 
16722c6f798SBarry Smith   /*
16822c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
16922c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
17022c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
17122c6f798SBarry Smith   */
17222c6f798SBarry Smith 
17322c6f798SBarry Smith   /* implementation specific copy hooks */
17422c6f798SBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
17522c6f798SBarry Smith   PetscFunctionReturn(0);
17622c6f798SBarry Smith }
17722c6f798SBarry Smith 
1786cab3a1bSJed Brown /*@C
179942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
1806cab3a1bSJed Brown 
1816cab3a1bSJed Brown    Not Collective
1826cab3a1bSJed Brown 
1836cab3a1bSJed Brown    Input Argument:
1846cab3a1bSJed Brown .  dm - DM to be used with SNES
1856cab3a1bSJed Brown 
1866cab3a1bSJed Brown    Output Argument:
187942e3340SBarry Smith .  snesdm - private DMSNES context
1886cab3a1bSJed Brown 
1896cab3a1bSJed Brown    Level: developer
1906cab3a1bSJed Brown 
1916cab3a1bSJed Brown    Notes:
192942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
1936cab3a1bSJed Brown 
194942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
1956cab3a1bSJed Brown @*/
196942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
1976cab3a1bSJed Brown {
1986cab3a1bSJed Brown   PetscErrorCode ierr;
1996cab3a1bSJed Brown 
2006cab3a1bSJed Brown   PetscFunctionBegin;
2016cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
202b4615a05SBarry Smith   *snesdm = (DMSNES) dm->dmsnes;
20322c6f798SBarry Smith   if (!*snesdm) {
204942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
205ce94432eSBarry Smith     ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm);CHKERRQ(ierr);
2061aa26658SKarl Rupp 
207b4615a05SBarry Smith     dm->dmsnes            = (PetscObject) *snesdm;
208af903c1dSJunchao Zhang     (*snesdm)->originaldm = dm;
2090298fd71SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2100298fd71SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr);
2110298fd71SBarry Smith     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2126cab3a1bSJed Brown   }
2136cab3a1bSJed Brown   PetscFunctionReturn(0);
2146cab3a1bSJed Brown }
2156cab3a1bSJed Brown 
2166cab3a1bSJed Brown /*@C
217942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
2186cab3a1bSJed Brown 
2196cab3a1bSJed Brown    Not Collective
2206cab3a1bSJed Brown 
2216cab3a1bSJed Brown    Input Argument:
2226cab3a1bSJed Brown .  dm - DM to be used with SNES
2236cab3a1bSJed Brown 
2246cab3a1bSJed Brown    Output Argument:
225942e3340SBarry Smith .  snesdm - private DMSNES context
2266cab3a1bSJed Brown 
2276cab3a1bSJed Brown    Level: developer
2286cab3a1bSJed Brown 
229942e3340SBarry Smith .seealso: DMGetDMSNES()
2306cab3a1bSJed Brown @*/
231942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
2326cab3a1bSJed Brown {
2336cab3a1bSJed Brown   PetscErrorCode ierr;
234942e3340SBarry Smith   DMSNES         sdm;
2356cab3a1bSJed Brown 
2366cab3a1bSJed Brown   PetscFunctionBegin;
2376cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
238942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
239af903c1dSJunchao Zhang   if (!sdm->originaldm) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"DMSNES has a NULL originaldm");
2406cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
241b4615a05SBarry Smith     DMSNES oldsdm = sdm;
242942e3340SBarry Smith     ierr       = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
243ce94432eSBarry Smith     ierr       = DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr);
24422c6f798SBarry Smith     ierr       = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr);
245b4615a05SBarry Smith     ierr       = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr);
246b4615a05SBarry Smith     dm->dmsnes = (PetscObject)sdm;
247af903c1dSJunchao Zhang     sdm->originaldm = dm;
2486cab3a1bSJed Brown   }
2496cab3a1bSJed Brown   *snesdm = sdm;
2506cab3a1bSJed Brown   PetscFunctionReturn(0);
2516cab3a1bSJed Brown }
2526cab3a1bSJed Brown 
2536cab3a1bSJed Brown /*@C
254942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2556cab3a1bSJed Brown 
2566cab3a1bSJed Brown    Logically Collective
2576cab3a1bSJed Brown 
2586cab3a1bSJed Brown    Input Arguments:
2596cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2606cab3a1bSJed Brown -  dmdest - DM to add context to
2616cab3a1bSJed Brown 
2626cab3a1bSJed Brown    Level: developer
2636cab3a1bSJed Brown 
2646cab3a1bSJed Brown    Note:
2656cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2666cab3a1bSJed Brown 
267942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2686cab3a1bSJed Brown @*/
269942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2706cab3a1bSJed Brown {
2716cab3a1bSJed Brown   PetscErrorCode ierr;
2726cab3a1bSJed Brown 
2736cab3a1bSJed Brown   PetscFunctionBegin;
2746cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
2756cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
27653705c30SMatthew G. Knepley   if (!dmdest->dmsnes) {ierr = DMSNESCreate(PetscObjectComm((PetscObject) dmdest), (DMSNES *) &dmdest->dmsnes);CHKERRQ(ierr);}
27753705c30SMatthew G. Knepley   ierr = DMSNESCopy((DMSNES) dmsrc->dmsnes, (DMSNES) dmdest->dmsnes);CHKERRQ(ierr);
2780298fd71SBarry Smith   ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr);
2790298fd71SBarry Smith   ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr);
2800298fd71SBarry Smith   ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2816cab3a1bSJed Brown   PetscFunctionReturn(0);
2826cab3a1bSJed Brown }
2836cab3a1bSJed Brown 
2846cab3a1bSJed Brown /*@C
2856cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
2866cab3a1bSJed Brown 
2876cab3a1bSJed Brown    Not Collective
2886cab3a1bSJed Brown 
2896cab3a1bSJed Brown    Input Arguments:
2906cab3a1bSJed Brown +  dm - DM to be used with SNES
291f8b49ee9SBarry Smith .  f - residual evaluation function; see SNESFunction for details
2926cab3a1bSJed Brown -  ctx - context for residual evaluation
2936cab3a1bSJed Brown 
2946cab3a1bSJed Brown    Level: advanced
2956cab3a1bSJed Brown 
2966cab3a1bSJed Brown    Note:
2976cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
2986cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
2996cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
3006cab3a1bSJed Brown 
301bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction
3026cab3a1bSJed Brown @*/
303f8b49ee9SBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
3046cab3a1bSJed Brown {
3056cab3a1bSJed Brown   PetscErrorCode ierr;
306942e3340SBarry Smith   DMSNES         sdm;
3076cab3a1bSJed Brown 
3086cab3a1bSJed Brown   PetscFunctionBegin;
3096cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
310f8b49ee9SBarry Smith   if (f || ctx) {
311942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
312fdaff8d6SPeter Brune   }
313f8b49ee9SBarry Smith   if (f) sdm->ops->computefunction = f;
3146cab3a1bSJed Brown   if (ctx) sdm->functionctx = ctx;
3156cab3a1bSJed Brown   PetscFunctionReturn(0);
3166cab3a1bSJed Brown }
3176cab3a1bSJed Brown 
3186cab3a1bSJed Brown /*@C
319*bbc1464cSBarry Smith    DMSNESSetMFFunction - set SNES residual evaluation function used in applying the matrix-free Jacobian with -snes_mf_operator
320*bbc1464cSBarry Smith 
321*bbc1464cSBarry Smith    Logically Collective on dm
322*bbc1464cSBarry Smith 
323*bbc1464cSBarry Smith    Input Arguments:
324*bbc1464cSBarry Smith +  dm - DM to be used with SNES
325*bbc1464cSBarry Smith -  f - residual evaluation function; see SNESFunction for details
326*bbc1464cSBarry Smith 
327*bbc1464cSBarry Smith    Level: advanced
328*bbc1464cSBarry Smith 
329*bbc1464cSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction, DMSNESSetFunction()
330*bbc1464cSBarry Smith @*/
331*bbc1464cSBarry Smith PetscErrorCode DMSNESSetMFFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
332*bbc1464cSBarry Smith {
333*bbc1464cSBarry Smith   PetscErrorCode ierr;
334*bbc1464cSBarry Smith   DMSNES         sdm;
335*bbc1464cSBarry Smith 
336*bbc1464cSBarry Smith   PetscFunctionBegin;
337*bbc1464cSBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
338*bbc1464cSBarry Smith   if (f || ctx) {
339*bbc1464cSBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
340*bbc1464cSBarry Smith   }
341*bbc1464cSBarry Smith   if (f) sdm->ops->computemffunction = f;
342*bbc1464cSBarry Smith   if (ctx) sdm->mffunctionctx = ctx;
343*bbc1464cSBarry Smith   PetscFunctionReturn(0);
344*bbc1464cSBarry Smith }
345*bbc1464cSBarry Smith 
346*bbc1464cSBarry Smith /*@C
3476cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
3486cab3a1bSJed Brown 
3496cab3a1bSJed Brown    Not Collective
3506cab3a1bSJed Brown 
3516cab3a1bSJed Brown    Input Argument:
3526cab3a1bSJed Brown .  dm - DM to be used with SNES
3536cab3a1bSJed Brown 
3546cab3a1bSJed Brown    Output Arguments:
355f8b49ee9SBarry Smith +  f - residual evaluation function; see SNESFunction for details
3566cab3a1bSJed Brown -  ctx - context for residual evaluation
3576cab3a1bSJed Brown 
3586cab3a1bSJed Brown    Level: advanced
3596cab3a1bSJed Brown 
3606cab3a1bSJed Brown    Note:
3616cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3626cab3a1bSJed Brown    associated with the DM.
3636cab3a1bSJed Brown 
364bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction
3656cab3a1bSJed Brown @*/
366f8b49ee9SBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
3676cab3a1bSJed Brown {
3686cab3a1bSJed Brown   PetscErrorCode ierr;
369942e3340SBarry Smith   DMSNES         sdm;
3706cab3a1bSJed Brown 
3716cab3a1bSJed Brown   PetscFunctionBegin;
3726cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
373942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
374f8b49ee9SBarry Smith   if (f) *f = sdm->ops->computefunction;
3756cab3a1bSJed Brown   if (ctx) *ctx = sdm->functionctx;
3766cab3a1bSJed Brown   PetscFunctionReturn(0);
3776cab3a1bSJed Brown }
3786cab3a1bSJed Brown 
3792a4ee8f2SPeter Brune /*@C
380081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3812a4ee8f2SPeter Brune 
3822a4ee8f2SPeter Brune    Not Collective
3832a4ee8f2SPeter Brune 
3842a4ee8f2SPeter Brune    Input Arguments:
3852a4ee8f2SPeter Brune +  dm - DM to be used with SNES
386f8b49ee9SBarry Smith .  obj - objective evaluation function; see SNESObjectiveFunction for details
3872a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3882a4ee8f2SPeter Brune 
3892a4ee8f2SPeter Brune    Level: advanced
3902a4ee8f2SPeter Brune 
3912a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3922a4ee8f2SPeter Brune @*/
393f8b49ee9SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*obj)(SNES,Vec,PetscReal*,void*),void *ctx)
3942a4ee8f2SPeter Brune {
3952a4ee8f2SPeter Brune   PetscErrorCode ierr;
396942e3340SBarry Smith   DMSNES         sdm;
3972a4ee8f2SPeter Brune 
3982a4ee8f2SPeter Brune   PetscFunctionBegin;
3992a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
400f8b49ee9SBarry Smith   if (obj || ctx) {
401942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
402fdaff8d6SPeter Brune   }
403f8b49ee9SBarry Smith   if (obj) sdm->ops->computeobjective = obj;
4042a4ee8f2SPeter Brune   if (ctx) sdm->objectivectx = ctx;
4052a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4062a4ee8f2SPeter Brune }
4072a4ee8f2SPeter Brune 
4082a4ee8f2SPeter Brune /*@C
4092a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
4102a4ee8f2SPeter Brune 
4112a4ee8f2SPeter Brune    Not Collective
4122a4ee8f2SPeter Brune 
4132a4ee8f2SPeter Brune    Input Argument:
4142a4ee8f2SPeter Brune .  dm - DM to be used with SNES
4152a4ee8f2SPeter Brune 
4162a4ee8f2SPeter Brune    Output Arguments:
417f8b49ee9SBarry Smith +  obj- residual evaluation function; see SNESObjectiveFunction for details
4182a4ee8f2SPeter Brune -  ctx - context for residual evaluation
4192a4ee8f2SPeter Brune 
4202a4ee8f2SPeter Brune    Level: advanced
4212a4ee8f2SPeter Brune 
4222a4ee8f2SPeter Brune    Note:
4232a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
4242a4ee8f2SPeter Brune    associated with the DM.
4252a4ee8f2SPeter Brune 
4262a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
4272a4ee8f2SPeter Brune @*/
428f8b49ee9SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**obj)(SNES,Vec,PetscReal*,void*),void **ctx)
4292a4ee8f2SPeter Brune {
4302a4ee8f2SPeter Brune   PetscErrorCode ierr;
431942e3340SBarry Smith   DMSNES         sdm;
4322a4ee8f2SPeter Brune 
4332a4ee8f2SPeter Brune   PetscFunctionBegin;
4342a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
435942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
436f8b49ee9SBarry Smith   if (obj) *obj = sdm->ops->computeobjective;
4372a4ee8f2SPeter Brune   if (ctx) *ctx = sdm->objectivectx;
4382a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4392a4ee8f2SPeter Brune }
4402a4ee8f2SPeter Brune 
4416cab3a1bSJed Brown /*@C
442be95d8f1SBarry Smith    DMSNESSetNGS - set 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
448be95d8f1SBarry Smith .  f  - relaxation function, see SNESGSFunction
4496cab3a1bSJed Brown -  ctx - context for residual evaluation
4506cab3a1bSJed Brown 
4516cab3a1bSJed Brown    Level: advanced
4526cab3a1bSJed Brown 
4536cab3a1bSJed Brown    Note:
454be95d8f1SBarry Smith    SNESSetNGS() is normally used, but it calls this function internally because the user context is actually
4556cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4566cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4576cab3a1bSJed Brown 
458bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction
4596cab3a1bSJed Brown @*/
460be95d8f1SBarry Smith PetscErrorCode DMSNESSetNGS(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
4616cab3a1bSJed Brown {
4626cab3a1bSJed Brown   PetscErrorCode ierr;
463942e3340SBarry Smith   DMSNES         sdm;
4646cab3a1bSJed Brown 
4656cab3a1bSJed Brown   PetscFunctionBegin;
4666cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
467be95d8f1SBarry Smith   if (f || ctx) {
468942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
469fdaff8d6SPeter Brune   }
470be95d8f1SBarry Smith   if (f) sdm->ops->computegs = f;
4716cab3a1bSJed Brown   if (ctx) sdm->gsctx = ctx;
4726cab3a1bSJed Brown   PetscFunctionReturn(0);
4736cab3a1bSJed Brown }
4746cab3a1bSJed Brown 
4756cab3a1bSJed Brown /*@C
476be95d8f1SBarry Smith    DMSNESGetNGS - get SNES Gauss-Seidel relaxation function
4776cab3a1bSJed Brown 
4786cab3a1bSJed Brown    Not Collective
4796cab3a1bSJed Brown 
4806cab3a1bSJed Brown    Input Argument:
4816cab3a1bSJed Brown .  dm - DM to be used with SNES
4826cab3a1bSJed Brown 
4836cab3a1bSJed Brown    Output Arguments:
484be95d8f1SBarry Smith +  f - relaxation function which performs Gauss-Seidel sweeps, see SNESGSFunction
4856cab3a1bSJed Brown -  ctx - context for residual evaluation
4866cab3a1bSJed Brown 
4876cab3a1bSJed Brown    Level: advanced
4886cab3a1bSJed Brown 
4896cab3a1bSJed Brown    Note:
490be95d8f1SBarry Smith    SNESGetNGS() 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 residual.
4936cab3a1bSJed Brown 
494be95d8f1SBarry Smith .seealso: DMSNESSetContext(), SNESGetNGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESNGSFunction
4956cab3a1bSJed Brown @*/
496be95d8f1SBarry Smith PetscErrorCode DMSNESGetNGS(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,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);
503942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
504be95d8f1SBarry Smith   if (f) *f = sdm->ops->computegs;
5056cab3a1bSJed Brown   if (ctx) *ctx = sdm->gsctx;
5066cab3a1bSJed Brown   PetscFunctionReturn(0);
5076cab3a1bSJed Brown }
5086cab3a1bSJed Brown 
5096cab3a1bSJed Brown /*@C
510ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
5116cab3a1bSJed Brown 
5126cab3a1bSJed Brown    Not Collective
5136cab3a1bSJed Brown 
5146cab3a1bSJed Brown    Input Argument:
5156cab3a1bSJed Brown +  dm - DM to be used with SNES
516f8b49ee9SBarry Smith .  J - Jacobian evaluation function
5176cab3a1bSJed Brown -  ctx - context for residual evaluation
5186cab3a1bSJed Brown 
5196cab3a1bSJed Brown    Level: advanced
5206cab3a1bSJed Brown 
5216cab3a1bSJed Brown    Note:
5226cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
5236cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5246cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5256cab3a1bSJed Brown 
526bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction
5276cab3a1bSJed Brown @*/
528d1e9a80fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
5296cab3a1bSJed Brown {
5306cab3a1bSJed Brown   PetscErrorCode ierr;
531942e3340SBarry Smith   DMSNES         sdm;
5326cab3a1bSJed Brown 
5336cab3a1bSJed Brown   PetscFunctionBegin;
5346cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
535f8b49ee9SBarry Smith   if (J || ctx) {
536942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
5371fdfe764SBarry Smith   }
538f8b49ee9SBarry Smith   if (J) sdm->ops->computejacobian = J;
5396cab3a1bSJed Brown   if (ctx) sdm->jacobianctx = ctx;
5406cab3a1bSJed Brown   PetscFunctionReturn(0);
5416cab3a1bSJed Brown }
5426cab3a1bSJed Brown 
5436cab3a1bSJed Brown /*@C
544ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
5456cab3a1bSJed Brown 
5466cab3a1bSJed Brown    Not Collective
5476cab3a1bSJed Brown 
5486cab3a1bSJed Brown    Input Argument:
5496cab3a1bSJed Brown .  dm - DM to be used with SNES
5506cab3a1bSJed Brown 
5516cab3a1bSJed Brown    Output Arguments:
552f8b49ee9SBarry Smith +  J - Jacobian evaluation function; see SNESJacobianFunction for all calling sequence
5536cab3a1bSJed Brown -  ctx - context for residual evaluation
5546cab3a1bSJed Brown 
5556cab3a1bSJed Brown    Level: advanced
5566cab3a1bSJed Brown 
5576cab3a1bSJed Brown    Note:
5586cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5596cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5606cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5616cab3a1bSJed Brown 
562bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction
5636cab3a1bSJed Brown @*/
564d1e9a80fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
5656cab3a1bSJed Brown {
5666cab3a1bSJed Brown   PetscErrorCode ierr;
567942e3340SBarry Smith   DMSNES         sdm;
5686cab3a1bSJed Brown 
5696cab3a1bSJed Brown   PetscFunctionBegin;
5706cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
571942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
572f8b49ee9SBarry Smith   if (J) *J = sdm->ops->computejacobian;
5736cab3a1bSJed Brown   if (ctx) *ctx = sdm->jacobianctx;
5746cab3a1bSJed Brown   PetscFunctionReturn(0);
5756cab3a1bSJed Brown }
5766cab3a1bSJed Brown 
577e03ab78fSPeter Brune /*@C
578e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
579e03ab78fSPeter Brune 
580e03ab78fSPeter Brune    Not Collective
581e03ab78fSPeter Brune 
582e03ab78fSPeter Brune    Input Argument:
583e03ab78fSPeter Brune +  dm - DM to be used with SNES
584f8b49ee9SBarry Smith .  b - RHS evaluation function
585f8b49ee9SBarry Smith .  J - Picard matrix evaluation function
586e03ab78fSPeter Brune -  ctx - context for residual evaluation
587e03ab78fSPeter Brune 
588e03ab78fSPeter Brune    Level: advanced
589e03ab78fSPeter Brune 
590e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
591e03ab78fSPeter Brune @*/
592d1e9a80fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*b)(SNES,Vec,Vec,void*),PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
593e03ab78fSPeter Brune {
594e03ab78fSPeter Brune   PetscErrorCode ierr;
595942e3340SBarry Smith   DMSNES         sdm;
596e03ab78fSPeter Brune 
597e03ab78fSPeter Brune   PetscFunctionBegin;
598e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
599942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
600f8b49ee9SBarry Smith   if (b) sdm->ops->computepfunction = b;
601f8b49ee9SBarry Smith   if (J) sdm->ops->computepjacobian = J;
602e03ab78fSPeter Brune   if (ctx) sdm->pctx = ctx;
603e03ab78fSPeter Brune   PetscFunctionReturn(0);
604e03ab78fSPeter Brune }
605e03ab78fSPeter Brune 
6067971a8bfSPeter Brune /*@C
6077971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
6087971a8bfSPeter Brune 
6097971a8bfSPeter Brune    Not Collective
6107971a8bfSPeter Brune 
6117971a8bfSPeter Brune    Input Argument:
6127971a8bfSPeter Brune .  dm - DM to be used with SNES
6137971a8bfSPeter Brune 
6147971a8bfSPeter Brune    Output Arguments:
615f8b49ee9SBarry Smith +  b - RHS evaluation function; see SNESFunction for details
616f8b49ee9SBarry Smith .  J  - RHS evaluation function; see SNESJacobianFunction for detailsa
6177971a8bfSPeter Brune -  ctx - context for residual evaluation
6187971a8bfSPeter Brune 
6197971a8bfSPeter Brune    Level: advanced
6207971a8bfSPeter Brune 
6217971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6227971a8bfSPeter Brune @*/
623d1e9a80fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**b)(SNES,Vec,Vec,void*),PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
6247971a8bfSPeter Brune {
6257971a8bfSPeter Brune   PetscErrorCode ierr;
626942e3340SBarry Smith   DMSNES         sdm;
6277971a8bfSPeter Brune 
6287971a8bfSPeter Brune   PetscFunctionBegin;
6297971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
630942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
631f8b49ee9SBarry Smith   if (b) *b = sdm->ops->computepfunction;
632f8b49ee9SBarry Smith   if (J) *J = sdm->ops->computepjacobian;
6337971a8bfSPeter Brune   if (ctx) *ctx = sdm->pctx;
6347971a8bfSPeter Brune   PetscFunctionReturn(0);
6357971a8bfSPeter Brune }
636