xref: /petsc/src/snes/utils/dmsnes.c (revision 3964eb8815a373d98cd54ebd45324cfa27b228df)
1b45d2f2cSJed Brown #include <petsc-private/snesimpl.h>   /*I "petscsnes.h" I*/
2679f678eSPeter Brune #include <petsc-private/dmimpl.h>     /*I "petscdm.h" I*/
36cab3a1bSJed Brown 
46cab3a1bSJed Brown #undef __FUNCT__
522c6f798SBarry Smith #define __FUNCT__ "DMSNESDestroy"
622c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm)
76cab3a1bSJed Brown {
86cab3a1bSJed Brown   PetscErrorCode ierr;
96cab3a1bSJed Brown 
106cab3a1bSJed Brown   PetscFunctionBegin;
1122c6f798SBarry Smith   if (!*kdm) PetscFunctionReturn(0);
1222c6f798SBarry Smith   PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1);
1322c6f798SBarry Smith   if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);}
1422c6f798SBarry Smith   if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);}
1522c6f798SBarry Smith   ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr);
1622c6f798SBarry Smith   PetscFunctionReturn(0);
1722c6f798SBarry Smith }
1822c6f798SBarry Smith 
1922c6f798SBarry Smith #undef __FUNCT__
202d53ad75SBarry Smith #define __FUNCT__ "DMSNESLoad"
212d53ad75SBarry Smith PetscErrorCode DMSNESLoad(DMSNES kdm,PetscViewer viewer)
222d53ad75SBarry Smith {
232d53ad75SBarry Smith   PetscErrorCode ierr;
242d53ad75SBarry Smith 
252d53ad75SBarry Smith   PetscFunctionBegin;
262d53ad75SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,PETSC_FUNCTION);CHKERRQ(ierr);
272d53ad75SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,PETSC_FUNCTION);CHKERRQ(ierr);
282d53ad75SBarry Smith   PetscFunctionReturn(0);
292d53ad75SBarry Smith }
302d53ad75SBarry Smith 
312d53ad75SBarry Smith #undef __FUNCT__
322d53ad75SBarry Smith #define __FUNCT__ "DMSNESView"
332d53ad75SBarry Smith PetscErrorCode DMSNESView(DMSNES kdm,PetscViewer viewer)
342d53ad75SBarry Smith {
352d53ad75SBarry Smith   PetscErrorCode ierr;
362d53ad75SBarry Smith   PetscBool      isascii,isbinary;
372d53ad75SBarry Smith 
382d53ad75SBarry Smith   PetscFunctionBegin;
392d53ad75SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
402d53ad75SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
412d53ad75SBarry Smith   if (isascii) {
42c7a10e08SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS)
432d53ad75SBarry Smith     const char *fname;
442d53ad75SBarry Smith 
452d53ad75SBarry Smith     ierr = PetscFPTFind(kdm->ops->computefunction,&fname);CHKERRQ(ierr);
462d53ad75SBarry Smith     if (fname) {
472d53ad75SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"Function used by SNES: %s\n",fname);CHKERRQ(ierr);
482d53ad75SBarry Smith     }
492d53ad75SBarry Smith     ierr = PetscFPTFind(kdm->ops->computejacobian,&fname);CHKERRQ(ierr);
502d53ad75SBarry Smith     if (fname) {
512d53ad75SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"Jacobian function used by SNES: %s\n",fname);CHKERRQ(ierr);
522d53ad75SBarry Smith     }
53c7a10e08SBarry Smith #endif
542d53ad75SBarry Smith   } else if (isbinary) {
55*3964eb88SJed Brown     struct {
56*3964eb88SJed Brown       PetscErrorCode (*func)(SNES,Vec,Vec,void*);
57*3964eb88SJed Brown       PetscErrorCode (*jac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*);
58*3964eb88SJed Brown     } funcstruct = {kdm->ops->computefunction,kdm->ops->computejacobian};
59*3964eb88SJed Brown     ierr = PetscViewerBinaryWrite(viewer,&funcstruct,2,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
602d53ad75SBarry Smith   }
612d53ad75SBarry Smith   PetscFunctionReturn(0);
622d53ad75SBarry Smith }
632d53ad75SBarry Smith 
642d53ad75SBarry Smith #undef __FUNCT__
6522c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate"
6622c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
6722c6f798SBarry Smith {
6822c6f798SBarry Smith   PetscErrorCode ierr;
6922c6f798SBarry Smith 
7022c6f798SBarry Smith   PetscFunctionBegin;
71519f805aSKarl Rupp #if !defined(PETSC_USE_DYNAMIC_LIBRARIES)
720298fd71SBarry Smith   ierr = SNESInitializePackage(NULL);CHKERRQ(ierr);
7322c6f798SBarry Smith #endif
7467c2884eSBarry Smith   ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID,  "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr);
7522c6f798SBarry Smith   ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMSNESOps));CHKERRQ(ierr);
766cab3a1bSJed Brown   PetscFunctionReturn(0);
776cab3a1bSJed Brown }
786cab3a1bSJed Brown 
796cab3a1bSJed Brown #undef __FUNCT__
80942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES"
81942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
826cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
836cab3a1bSJed Brown  */
84942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
856cab3a1bSJed Brown {
866cab3a1bSJed Brown   PetscErrorCode ierr;
876cab3a1bSJed Brown 
886cab3a1bSJed Brown   PetscFunctionBegin;
89942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr);
906cab3a1bSJed Brown   PetscFunctionReturn(0);
916cab3a1bSJed Brown }
926cab3a1bSJed Brown 
936cab3a1bSJed Brown #undef __FUNCT__
94942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES"
95dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
96caa4e7f2SJed Brown  */
97942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
98caa4e7f2SJed Brown {
99caa4e7f2SJed Brown 
100caa4e7f2SJed Brown   PetscFunctionBegin;
101caa4e7f2SJed Brown   PetscFunctionReturn(0);
102caa4e7f2SJed Brown }
103caa4e7f2SJed Brown 
104caa4e7f2SJed Brown #undef __FUNCT__
105be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES"
106be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */
107be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx)
108be081cd6SPeter Brune {
109be081cd6SPeter Brune   PetscErrorCode ierr;
110be081cd6SPeter Brune 
111be081cd6SPeter Brune   PetscFunctionBegin;
112be081cd6SPeter Brune   ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr);
113be081cd6SPeter Brune   PetscFunctionReturn(0);
114be081cd6SPeter Brune }
115be081cd6SPeter Brune 
116be081cd6SPeter Brune #undef __FUNCT__
117be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES"
118be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level.
119be081cd6SPeter Brune  */
120be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
121be081cd6SPeter Brune {
122be081cd6SPeter Brune 
123be081cd6SPeter Brune   PetscFunctionBegin;
124be081cd6SPeter Brune   PetscFunctionReturn(0);
125be081cd6SPeter Brune }
126be081cd6SPeter Brune 
127be081cd6SPeter Brune #undef __FUNCT__
128942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES"
129942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
13003a0fabfSPeter Brune {
13103a0fabfSPeter Brune   PetscErrorCode ierr;
13203a0fabfSPeter Brune 
13303a0fabfSPeter Brune   PetscFunctionBegin;
134942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
13503a0fabfSPeter Brune   PetscFunctionReturn(0);
13603a0fabfSPeter Brune }
13703a0fabfSPeter Brune 
13803a0fabfSPeter Brune #undef __FUNCT__
139942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES"
14003a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
14103a0fabfSPeter Brune  */
142942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
14303a0fabfSPeter Brune {
14403a0fabfSPeter Brune 
14503a0fabfSPeter Brune   PetscFunctionBegin;
14603a0fabfSPeter Brune   PetscFunctionReturn(0);
14703a0fabfSPeter Brune }
14803a0fabfSPeter Brune 
14903a0fabfSPeter Brune #undef __FUNCT__
15022c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy"
15122c6f798SBarry Smith /*@C
15222c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
15322c6f798SBarry Smith 
15422c6f798SBarry Smith    Not Collective
15522c6f798SBarry Smith 
15622c6f798SBarry Smith    Input Argument:
15722c6f798SBarry Smith +  kdm - Original DMSNES
15822c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
15922c6f798SBarry Smith 
16022c6f798SBarry Smith    Level: developer
16122c6f798SBarry Smith 
16222c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
16322c6f798SBarry Smith @*/
16422c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
16522c6f798SBarry Smith {
16622c6f798SBarry Smith   PetscErrorCode ierr;
16722c6f798SBarry Smith 
16822c6f798SBarry Smith   PetscFunctionBegin;
16922c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
17022c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
17122c6f798SBarry Smith   nkdm->ops->computefunction  = kdm->ops->computefunction;
1722bc4d0c4SPeter Brune   nkdm->ops->computejacobian  = kdm->ops->computejacobian;
17322c6f798SBarry Smith   nkdm->ops->computegs        = kdm->ops->computegs;
17422c6f798SBarry Smith   nkdm->ops->computeobjective = kdm->ops->computeobjective;
17522c6f798SBarry Smith   nkdm->ops->computepjacobian = kdm->ops->computepjacobian;
17622c6f798SBarry Smith   nkdm->ops->computepfunction = kdm->ops->computepfunction;
17722c6f798SBarry Smith   nkdm->ops->destroy          = kdm->ops->destroy;
17822c6f798SBarry Smith   nkdm->ops->duplicate        = kdm->ops->duplicate;
17922c6f798SBarry Smith 
18022c6f798SBarry Smith   nkdm->functionctx  = kdm->functionctx;
18122c6f798SBarry Smith   nkdm->gsctx        = kdm->gsctx;
18222c6f798SBarry Smith   nkdm->pctx         = kdm->pctx;
18322c6f798SBarry Smith   nkdm->jacobianctx  = kdm->jacobianctx;
18422c6f798SBarry Smith   nkdm->objectivectx = kdm->objectivectx;
18522c6f798SBarry Smith   nkdm->data         = kdm->data;
18622c6f798SBarry Smith 
18722c6f798SBarry Smith   /*
18822c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
18922c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
19022c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
19122c6f798SBarry Smith   */
19222c6f798SBarry Smith 
19322c6f798SBarry Smith   /* implementation specific copy hooks */
19422c6f798SBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
19522c6f798SBarry Smith   PetscFunctionReturn(0);
19622c6f798SBarry Smith }
19722c6f798SBarry Smith 
19822c6f798SBarry Smith #undef __FUNCT__
199942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES"
2006cab3a1bSJed Brown /*@C
201942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
2026cab3a1bSJed Brown 
2036cab3a1bSJed Brown    Not Collective
2046cab3a1bSJed Brown 
2056cab3a1bSJed Brown    Input Argument:
2066cab3a1bSJed Brown .  dm - DM to be used with SNES
2076cab3a1bSJed Brown 
2086cab3a1bSJed Brown    Output Argument:
209942e3340SBarry Smith .  snesdm - private DMSNES context
2106cab3a1bSJed Brown 
2116cab3a1bSJed Brown    Level: developer
2126cab3a1bSJed Brown 
2136cab3a1bSJed Brown    Notes:
214942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
2156cab3a1bSJed Brown 
216942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
2176cab3a1bSJed Brown @*/
218942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
2196cab3a1bSJed Brown {
2206cab3a1bSJed Brown   PetscErrorCode ierr;
2216cab3a1bSJed Brown 
2226cab3a1bSJed Brown   PetscFunctionBegin;
2236cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
224b4615a05SBarry Smith   *snesdm = (DMSNES) dm->dmsnes;
22522c6f798SBarry Smith   if (!*snesdm) {
226942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
227ce94432eSBarry Smith     ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm);CHKERRQ(ierr);
2281aa26658SKarl Rupp 
229b4615a05SBarry Smith     dm->dmsnes = (PetscObject) *snesdm;
2301aa26658SKarl Rupp 
2310298fd71SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2320298fd71SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr);
2330298fd71SBarry Smith     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2346cab3a1bSJed Brown   }
2356cab3a1bSJed Brown   PetscFunctionReturn(0);
2366cab3a1bSJed Brown }
2376cab3a1bSJed Brown 
2386cab3a1bSJed Brown #undef __FUNCT__
239942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite"
2406cab3a1bSJed Brown /*@C
241942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
2426cab3a1bSJed Brown 
2436cab3a1bSJed Brown    Not Collective
2446cab3a1bSJed Brown 
2456cab3a1bSJed Brown    Input Argument:
2466cab3a1bSJed Brown .  dm - DM to be used with SNES
2476cab3a1bSJed Brown 
2486cab3a1bSJed Brown    Output Argument:
249942e3340SBarry Smith .  snesdm - private DMSNES context
2506cab3a1bSJed Brown 
2516cab3a1bSJed Brown    Level: developer
2526cab3a1bSJed Brown 
253942e3340SBarry Smith .seealso: DMGetDMSNES()
2546cab3a1bSJed Brown @*/
255942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
2566cab3a1bSJed Brown {
2576cab3a1bSJed Brown   PetscErrorCode ierr;
258942e3340SBarry Smith   DMSNES         sdm;
2596cab3a1bSJed Brown 
2606cab3a1bSJed Brown   PetscFunctionBegin;
2616cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
262942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2636cab3a1bSJed Brown   if (!sdm->originaldm) sdm->originaldm = dm;
2646cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
265b4615a05SBarry Smith     DMSNES oldsdm = sdm;
266942e3340SBarry Smith     ierr       = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
267ce94432eSBarry Smith     ierr       = DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr);
26822c6f798SBarry Smith     ierr       = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr);
269b4615a05SBarry Smith     ierr       = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr);
270b4615a05SBarry Smith     dm->dmsnes = (PetscObject)sdm;
2716cab3a1bSJed Brown   }
2726cab3a1bSJed Brown   *snesdm = sdm;
2736cab3a1bSJed Brown   PetscFunctionReturn(0);
2746cab3a1bSJed Brown }
2756cab3a1bSJed Brown 
2766cab3a1bSJed Brown #undef __FUNCT__
277942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES"
2786cab3a1bSJed Brown /*@C
279942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2806cab3a1bSJed Brown 
2816cab3a1bSJed Brown    Logically Collective
2826cab3a1bSJed Brown 
2836cab3a1bSJed Brown    Input Arguments:
2846cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2856cab3a1bSJed Brown -  dmdest - DM to add context to
2866cab3a1bSJed Brown 
2876cab3a1bSJed Brown    Level: developer
2886cab3a1bSJed Brown 
2896cab3a1bSJed Brown    Note:
2906cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2916cab3a1bSJed Brown 
292942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2936cab3a1bSJed Brown @*/
294942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2956cab3a1bSJed Brown {
2966cab3a1bSJed Brown   PetscErrorCode ierr;
2976cab3a1bSJed Brown 
2986cab3a1bSJed Brown   PetscFunctionBegin;
2996cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
3006cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
301b4615a05SBarry Smith   ierr = DMSNESDestroy((DMSNES*)&dmdest->dmsnes);CHKERRQ(ierr);
3021aa26658SKarl Rupp 
303b4615a05SBarry Smith   dmdest->dmsnes = dmsrc->dmsnes;
3041aa26658SKarl Rupp 
305b4615a05SBarry Smith   ierr = PetscObjectReference(dmdest->dmsnes);CHKERRQ(ierr);
3060298fd71SBarry Smith   ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr);
3070298fd71SBarry Smith   ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr);
3080298fd71SBarry Smith   ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
3096cab3a1bSJed Brown   PetscFunctionReturn(0);
3106cab3a1bSJed Brown }
3116cab3a1bSJed Brown 
3126cab3a1bSJed Brown #undef __FUNCT__
3136cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction"
3146cab3a1bSJed Brown /*@C
3156cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
3166cab3a1bSJed Brown 
3176cab3a1bSJed Brown    Not Collective
3186cab3a1bSJed Brown 
3196cab3a1bSJed Brown    Input Arguments:
3206cab3a1bSJed Brown +  dm - DM to be used with SNES
321bf388a1fSBarry Smith .  SNESFunction - residual evaluation function
3226cab3a1bSJed Brown -  ctx - context for residual evaluation
3236cab3a1bSJed Brown 
3246cab3a1bSJed Brown    Level: advanced
3256cab3a1bSJed Brown 
3266cab3a1bSJed Brown    Note:
3276cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
3286cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
3296cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
3306cab3a1bSJed Brown 
331bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction
3326cab3a1bSJed Brown @*/
333bf388a1fSBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),void *ctx)
3346cab3a1bSJed Brown {
3356cab3a1bSJed Brown   PetscErrorCode ierr;
336942e3340SBarry Smith   DMSNES         sdm;
3376cab3a1bSJed Brown 
3386cab3a1bSJed Brown   PetscFunctionBegin;
3396cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
340bf388a1fSBarry Smith   if (SNESFunction || ctx) {
341942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
342fdaff8d6SPeter Brune   }
343bf388a1fSBarry Smith   if (SNESFunction) sdm->ops->computefunction = SNESFunction;
3446cab3a1bSJed Brown   if (ctx) sdm->functionctx = ctx;
3456cab3a1bSJed Brown   PetscFunctionReturn(0);
3466cab3a1bSJed Brown }
3476cab3a1bSJed Brown 
3486cab3a1bSJed Brown #undef __FUNCT__
3496cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction"
3506cab3a1bSJed Brown /*@C
3516cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
3526cab3a1bSJed Brown 
3536cab3a1bSJed Brown    Not Collective
3546cab3a1bSJed Brown 
3556cab3a1bSJed Brown    Input Argument:
3566cab3a1bSJed Brown .  dm - DM to be used with SNES
3576cab3a1bSJed Brown 
3586cab3a1bSJed Brown    Output Arguments:
359bf388a1fSBarry Smith +  SNESFunction - residual evaluation function
3606cab3a1bSJed Brown -  ctx - context for residual evaluation
3616cab3a1bSJed Brown 
3626cab3a1bSJed Brown    Level: advanced
3636cab3a1bSJed Brown 
3646cab3a1bSJed Brown    Note:
3656cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3666cab3a1bSJed Brown    associated with the DM.
3676cab3a1bSJed Brown 
368bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction
3696cab3a1bSJed Brown @*/
370bf388a1fSBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),void **ctx)
3716cab3a1bSJed Brown {
3726cab3a1bSJed Brown   PetscErrorCode ierr;
373942e3340SBarry Smith   DMSNES         sdm;
3746cab3a1bSJed Brown 
3756cab3a1bSJed Brown   PetscFunctionBegin;
3766cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
377942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
378bf388a1fSBarry Smith   if (SNESFunction) *SNESFunction = sdm->ops->computefunction;
3796cab3a1bSJed Brown   if (ctx) *ctx = sdm->functionctx;
3806cab3a1bSJed Brown   PetscFunctionReturn(0);
3816cab3a1bSJed Brown }
3826cab3a1bSJed Brown 
3836cab3a1bSJed Brown #undef __FUNCT__
3842a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective"
3852a4ee8f2SPeter Brune /*@C
386081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3872a4ee8f2SPeter Brune 
3882a4ee8f2SPeter Brune    Not Collective
3892a4ee8f2SPeter Brune 
3902a4ee8f2SPeter Brune    Input Arguments:
3912a4ee8f2SPeter Brune +  dm - DM to be used with SNES
392075cc632SBarry Smith .  SNESObjectiveFunction - residual evaluation function
3932a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3942a4ee8f2SPeter Brune 
3952a4ee8f2SPeter Brune    Level: advanced
3962a4ee8f2SPeter Brune 
3972a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3982a4ee8f2SPeter Brune @*/
399075cc632SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*SNESObjectiveFunction)(SNES,Vec,PetscReal*,void*),void *ctx)
4002a4ee8f2SPeter Brune {
4012a4ee8f2SPeter Brune   PetscErrorCode ierr;
402942e3340SBarry Smith   DMSNES         sdm;
4032a4ee8f2SPeter Brune 
4042a4ee8f2SPeter Brune   PetscFunctionBegin;
4052a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
406075cc632SBarry Smith   if (SNESObjectiveFunction || ctx) {
407942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
408fdaff8d6SPeter Brune   }
409075cc632SBarry Smith   if (SNESObjectiveFunction) sdm->ops->computeobjective = SNESObjectiveFunction;
4102a4ee8f2SPeter Brune   if (ctx) sdm->objectivectx = ctx;
4112a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4122a4ee8f2SPeter Brune }
4132a4ee8f2SPeter Brune 
4142a4ee8f2SPeter Brune #undef __FUNCT__
4152a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective"
4162a4ee8f2SPeter Brune /*@C
4172a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
4182a4ee8f2SPeter Brune 
4192a4ee8f2SPeter Brune    Not Collective
4202a4ee8f2SPeter Brune 
4212a4ee8f2SPeter Brune    Input Argument:
4222a4ee8f2SPeter Brune .  dm - DM to be used with SNES
4232a4ee8f2SPeter Brune 
4242a4ee8f2SPeter Brune    Output Arguments:
425075cc632SBarry Smith +  SNESObjectiveFunction- residual evaluation function
4262a4ee8f2SPeter Brune -  ctx - context for residual evaluation
4272a4ee8f2SPeter Brune 
4282a4ee8f2SPeter Brune    Level: advanced
4292a4ee8f2SPeter Brune 
4302a4ee8f2SPeter Brune    Note:
4312a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
4322a4ee8f2SPeter Brune    associated with the DM.
4332a4ee8f2SPeter Brune 
4342a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
4352a4ee8f2SPeter Brune @*/
436075cc632SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**SNESObjectiveFunction)(SNES,Vec,PetscReal*,void*),void **ctx)
4372a4ee8f2SPeter Brune {
4382a4ee8f2SPeter Brune   PetscErrorCode ierr;
439942e3340SBarry Smith   DMSNES         sdm;
4402a4ee8f2SPeter Brune 
4412a4ee8f2SPeter Brune   PetscFunctionBegin;
4422a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
443942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
444075cc632SBarry Smith   if (SNESObjectiveFunction) *SNESObjectiveFunction = sdm->ops->computeobjective;
4452a4ee8f2SPeter Brune   if (ctx) *ctx = sdm->objectivectx;
4462a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4472a4ee8f2SPeter Brune }
4482a4ee8f2SPeter Brune 
4492a4ee8f2SPeter Brune #undef __FUNCT__
4506cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS"
4516cab3a1bSJed Brown /*@C
4526cab3a1bSJed Brown    DMSNESSetGS - set SNES Gauss-Seidel relaxation function
4536cab3a1bSJed Brown 
4546cab3a1bSJed Brown    Not Collective
4556cab3a1bSJed Brown 
4566cab3a1bSJed Brown    Input Argument:
4576cab3a1bSJed Brown +  dm - DM to be used with SNES
458bf388a1fSBarry Smith .  SNESGSFunction - relaxation function
4596cab3a1bSJed Brown -  ctx - context for residual evaluation
4606cab3a1bSJed Brown 
4616cab3a1bSJed Brown    Level: advanced
4626cab3a1bSJed Brown 
4636cab3a1bSJed Brown    Note:
4646cab3a1bSJed Brown    SNESSetGS() is normally used, but it calls this function internally because the user context is actually
4656cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4666cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4676cab3a1bSJed Brown 
468bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction
4696cab3a1bSJed Brown @*/
470bf388a1fSBarry Smith PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*SNESGSFunction)(SNES,Vec,Vec,void*),void *ctx)
4716cab3a1bSJed Brown {
4726cab3a1bSJed Brown   PetscErrorCode ierr;
473942e3340SBarry Smith   DMSNES         sdm;
4746cab3a1bSJed Brown 
4756cab3a1bSJed Brown   PetscFunctionBegin;
4766cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
477bf388a1fSBarry Smith   if (SNESGSFunction || ctx) {
478942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
479fdaff8d6SPeter Brune   }
480bf388a1fSBarry Smith   if (SNESGSFunction) sdm->ops->computegs = SNESGSFunction;
4816cab3a1bSJed Brown   if (ctx) sdm->gsctx = ctx;
4826cab3a1bSJed Brown   PetscFunctionReturn(0);
4836cab3a1bSJed Brown }
4846cab3a1bSJed Brown 
4856cab3a1bSJed Brown #undef __FUNCT__
4866cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS"
4876cab3a1bSJed Brown /*@C
4886cab3a1bSJed Brown    DMSNESGetGS - get SNES Gauss-Seidel relaxation function
4896cab3a1bSJed Brown 
4906cab3a1bSJed Brown    Not Collective
4916cab3a1bSJed Brown 
4926cab3a1bSJed Brown    Input Argument:
4936cab3a1bSJed Brown .  dm - DM to be used with SNES
4946cab3a1bSJed Brown 
4956cab3a1bSJed Brown    Output Arguments:
496bf388a1fSBarry Smith +  SNESGSFunction - relaxation function which performs Gauss-Seidel sweeps
4976cab3a1bSJed Brown -  ctx - context for residual evaluation
4986cab3a1bSJed Brown 
4996cab3a1bSJed Brown    Level: advanced
5006cab3a1bSJed Brown 
5016cab3a1bSJed Brown    Note:
5026cab3a1bSJed Brown    SNESGetGS() is normally used, but it calls this function internally because the user context is actually
5036cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5046cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
5056cab3a1bSJed Brown 
506bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESGSFunction
5076cab3a1bSJed Brown @*/
508bf388a1fSBarry Smith PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**SNESGSFunction)(SNES,Vec,Vec,void*),void **ctx)
5096cab3a1bSJed Brown {
5106cab3a1bSJed Brown   PetscErrorCode ierr;
511942e3340SBarry Smith   DMSNES         sdm;
5126cab3a1bSJed Brown 
5136cab3a1bSJed Brown   PetscFunctionBegin;
5146cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
515942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
516bf388a1fSBarry Smith   if (SNESGSFunction) *SNESGSFunction = sdm->ops->computegs;
5176cab3a1bSJed Brown   if (ctx) *ctx = sdm->gsctx;
5186cab3a1bSJed Brown   PetscFunctionReturn(0);
5196cab3a1bSJed Brown }
5206cab3a1bSJed Brown 
5216cab3a1bSJed Brown #undef __FUNCT__
5226cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian"
5236cab3a1bSJed Brown /*@C
524ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
5256cab3a1bSJed Brown 
5266cab3a1bSJed Brown    Not Collective
5276cab3a1bSJed Brown 
5286cab3a1bSJed Brown    Input Argument:
5296cab3a1bSJed Brown +  dm - DM to be used with SNES
530bf388a1fSBarry Smith .  SNESJacobianFunction - Jacobian evaluation function
5316cab3a1bSJed Brown -  ctx - context for residual evaluation
5326cab3a1bSJed Brown 
5336cab3a1bSJed Brown    Level: advanced
5346cab3a1bSJed Brown 
5356cab3a1bSJed Brown    Note:
5366cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
5376cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5386cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5396cab3a1bSJed Brown 
540bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction
5416cab3a1bSJed Brown @*/
542bf388a1fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
5436cab3a1bSJed Brown {
5446cab3a1bSJed Brown   PetscErrorCode ierr;
545942e3340SBarry Smith   DMSNES         sdm;
5466cab3a1bSJed Brown 
5476cab3a1bSJed Brown   PetscFunctionBegin;
5486cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
549bf388a1fSBarry Smith   if (SNESJacobianFunction || ctx) {
550942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
5511fdfe764SBarry Smith   }
552bf388a1fSBarry Smith   if (SNESJacobianFunction) sdm->ops->computejacobian = SNESJacobianFunction;
5536cab3a1bSJed Brown   if (ctx) sdm->jacobianctx = ctx;
5546cab3a1bSJed Brown   PetscFunctionReturn(0);
5556cab3a1bSJed Brown }
5566cab3a1bSJed Brown 
5576cab3a1bSJed Brown #undef __FUNCT__
5586cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian"
5596cab3a1bSJed Brown /*@C
560ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
5616cab3a1bSJed Brown 
5626cab3a1bSJed Brown    Not Collective
5636cab3a1bSJed Brown 
5646cab3a1bSJed Brown    Input Argument:
5656cab3a1bSJed Brown .  dm - DM to be used with SNES
5666cab3a1bSJed Brown 
5676cab3a1bSJed Brown    Output Arguments:
568bf388a1fSBarry Smith +  SNESJacobianFunction - Jacobian evaluation function
5696cab3a1bSJed Brown -  ctx - context for residual evaluation
5706cab3a1bSJed Brown 
5716cab3a1bSJed Brown    Level: advanced
5726cab3a1bSJed Brown 
5736cab3a1bSJed Brown    Note:
5746cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5756cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5766cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5776cab3a1bSJed Brown 
578bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction
5796cab3a1bSJed Brown @*/
580bf388a1fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5816cab3a1bSJed Brown {
5826cab3a1bSJed Brown   PetscErrorCode ierr;
583942e3340SBarry Smith   DMSNES         sdm;
5846cab3a1bSJed Brown 
5856cab3a1bSJed Brown   PetscFunctionBegin;
5866cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
587942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
588bf388a1fSBarry Smith   if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computejacobian;
5896cab3a1bSJed Brown   if (ctx) *ctx = sdm->jacobianctx;
5906cab3a1bSJed Brown   PetscFunctionReturn(0);
5916cab3a1bSJed Brown }
5926cab3a1bSJed Brown 
5936cab3a1bSJed Brown #undef __FUNCT__
594e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard"
595e03ab78fSPeter Brune /*@C
596e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
597e03ab78fSPeter Brune 
598e03ab78fSPeter Brune    Not Collective
599e03ab78fSPeter Brune 
600e03ab78fSPeter Brune    Input Argument:
601e03ab78fSPeter Brune +  dm - DM to be used with SNES
602bf388a1fSBarry Smith .  SNESFunction - RHS evaluation function
603bf388a1fSBarry Smith .  SNESJacobianFunction - Picard matrix evaluation function
604e03ab78fSPeter Brune -  ctx - context for residual evaluation
605e03ab78fSPeter Brune 
606e03ab78fSPeter Brune    Level: advanced
607e03ab78fSPeter Brune 
608e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
609e03ab78fSPeter Brune @*/
610bf388a1fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
611e03ab78fSPeter Brune {
612e03ab78fSPeter Brune   PetscErrorCode ierr;
613942e3340SBarry Smith   DMSNES         sdm;
614e03ab78fSPeter Brune 
615e03ab78fSPeter Brune   PetscFunctionBegin;
616e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
617942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
618bf388a1fSBarry Smith   if (SNESFunction) sdm->ops->computepfunction = SNESFunction;
619bf388a1fSBarry Smith   if (SNESJacobianFunction) sdm->ops->computepjacobian = SNESJacobianFunction;
620e03ab78fSPeter Brune   if (ctx) sdm->pctx = ctx;
621e03ab78fSPeter Brune   PetscFunctionReturn(0);
622e03ab78fSPeter Brune }
623e03ab78fSPeter Brune 
6247971a8bfSPeter Brune #undef __FUNCT__
6257971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard"
6267971a8bfSPeter Brune /*@C
6277971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
6287971a8bfSPeter Brune 
6297971a8bfSPeter Brune    Not Collective
6307971a8bfSPeter Brune 
6317971a8bfSPeter Brune    Input Argument:
6327971a8bfSPeter Brune .  dm - DM to be used with SNES
6337971a8bfSPeter Brune 
6347971a8bfSPeter Brune    Output Arguments:
635bf388a1fSBarry Smith +  SNESFunction - Jacobian evaluation function;
636bf388a1fSBarry Smith .  SNESJacobianFunction  - RHS evaluation function;
6377971a8bfSPeter Brune -  ctx - context for residual evaluation
6387971a8bfSPeter Brune 
6397971a8bfSPeter Brune    Level: advanced
6407971a8bfSPeter Brune 
6417971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6427971a8bfSPeter Brune @*/
643bf388a1fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
6447971a8bfSPeter Brune {
6457971a8bfSPeter Brune   PetscErrorCode ierr;
646942e3340SBarry Smith   DMSNES         sdm;
6477971a8bfSPeter Brune 
6487971a8bfSPeter Brune   PetscFunctionBegin;
6497971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
650942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
651bf388a1fSBarry Smith   if (SNESFunction) *SNESFunction = sdm->ops->computepfunction;
652bf388a1fSBarry Smith   if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computepjacobian;
6537971a8bfSPeter Brune   if (ctx) *ctx = sdm->pctx;
6547971a8bfSPeter Brune   PetscFunctionReturn(0);
6557971a8bfSPeter Brune }
656