xref: /petsc/src/snes/utils/dmsnes.c (revision 73107ff1babc248481eafc1deee82c9703b7a0a0)
1af0996ceSBarry Smith #include <petsc/private/snesimpl.h>   /*I "petscsnes.h" I*/
2af0996ceSBarry Smith #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;
26060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr);
27060da220SMatthew G. Knepley   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,NULL,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) {
553964eb88SJed Brown     struct {
563964eb88SJed Brown       PetscErrorCode (*func)(SNES,Vec,Vec,void*);
579200755eSBarry Smith     } funcstruct;
589200755eSBarry Smith     struct {
59d1e9a80fSBarry Smith       PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*);
609200755eSBarry Smith     } jacstruct;
619200755eSBarry Smith     funcstruct.func = kdm->ops->computefunction;
629200755eSBarry Smith     jacstruct.jac   = kdm->ops->computejacobian;
639200755eSBarry Smith     ierr = PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
649200755eSBarry Smith     ierr = PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
652d53ad75SBarry Smith   }
662d53ad75SBarry Smith   PetscFunctionReturn(0);
672d53ad75SBarry Smith }
682d53ad75SBarry Smith 
692d53ad75SBarry Smith #undef __FUNCT__
7022c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate"
7122c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
7222c6f798SBarry Smith {
7322c6f798SBarry Smith   PetscErrorCode ierr;
7422c6f798SBarry Smith 
7522c6f798SBarry Smith   PetscFunctionBegin;
76607a6623SBarry Smith   ierr = SNESInitializePackage();CHKERRQ(ierr);
77*73107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(*kdm, DMSNES_CLASSID,  "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr);
786cab3a1bSJed Brown   PetscFunctionReturn(0);
796cab3a1bSJed Brown }
806cab3a1bSJed Brown 
816cab3a1bSJed Brown #undef __FUNCT__
82942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES"
83942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
846cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
856cab3a1bSJed Brown  */
86942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
876cab3a1bSJed Brown {
886cab3a1bSJed Brown   PetscErrorCode ierr;
896cab3a1bSJed Brown 
906cab3a1bSJed Brown   PetscFunctionBegin;
91942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr);
926cab3a1bSJed Brown   PetscFunctionReturn(0);
936cab3a1bSJed Brown }
946cab3a1bSJed Brown 
956cab3a1bSJed Brown #undef __FUNCT__
96942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES"
97dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
98caa4e7f2SJed Brown  */
99942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
100caa4e7f2SJed Brown {
101caa4e7f2SJed Brown 
102caa4e7f2SJed Brown   PetscFunctionBegin;
103caa4e7f2SJed Brown   PetscFunctionReturn(0);
104caa4e7f2SJed Brown }
105caa4e7f2SJed Brown 
106caa4e7f2SJed Brown #undef __FUNCT__
107be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES"
108be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */
109be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx)
110be081cd6SPeter Brune {
111be081cd6SPeter Brune   PetscErrorCode ierr;
112be081cd6SPeter Brune 
113be081cd6SPeter Brune   PetscFunctionBegin;
114be081cd6SPeter Brune   ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr);
115be081cd6SPeter Brune   PetscFunctionReturn(0);
116be081cd6SPeter Brune }
117be081cd6SPeter Brune 
118be081cd6SPeter Brune #undef __FUNCT__
119be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES"
120be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level.
121be081cd6SPeter Brune  */
122be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
123be081cd6SPeter Brune {
124be081cd6SPeter Brune 
125be081cd6SPeter Brune   PetscFunctionBegin;
126be081cd6SPeter Brune   PetscFunctionReturn(0);
127be081cd6SPeter Brune }
128be081cd6SPeter Brune 
129be081cd6SPeter Brune #undef __FUNCT__
130942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES"
131942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
13203a0fabfSPeter Brune {
13303a0fabfSPeter Brune   PetscErrorCode ierr;
13403a0fabfSPeter Brune 
13503a0fabfSPeter Brune   PetscFunctionBegin;
136942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
13703a0fabfSPeter Brune   PetscFunctionReturn(0);
13803a0fabfSPeter Brune }
13903a0fabfSPeter Brune 
14003a0fabfSPeter Brune #undef __FUNCT__
141942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES"
14203a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
14303a0fabfSPeter Brune  */
144942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
14503a0fabfSPeter Brune {
14603a0fabfSPeter Brune 
14703a0fabfSPeter Brune   PetscFunctionBegin;
14803a0fabfSPeter Brune   PetscFunctionReturn(0);
14903a0fabfSPeter Brune }
15003a0fabfSPeter Brune 
15103a0fabfSPeter Brune #undef __FUNCT__
15222c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy"
15322c6f798SBarry Smith /*@C
15422c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
15522c6f798SBarry Smith 
15622c6f798SBarry Smith    Not Collective
15722c6f798SBarry Smith 
15822c6f798SBarry Smith    Input Argument:
15922c6f798SBarry Smith +  kdm - Original DMSNES
16022c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
16122c6f798SBarry Smith 
16222c6f798SBarry Smith    Level: developer
16322c6f798SBarry Smith 
16422c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
16522c6f798SBarry Smith @*/
16622c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
16722c6f798SBarry Smith {
16822c6f798SBarry Smith   PetscErrorCode ierr;
16922c6f798SBarry Smith 
17022c6f798SBarry Smith   PetscFunctionBegin;
17122c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
17222c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
17322c6f798SBarry Smith   nkdm->ops->computefunction  = kdm->ops->computefunction;
1742bc4d0c4SPeter Brune   nkdm->ops->computejacobian  = kdm->ops->computejacobian;
17522c6f798SBarry Smith   nkdm->ops->computegs        = kdm->ops->computegs;
17622c6f798SBarry Smith   nkdm->ops->computeobjective = kdm->ops->computeobjective;
17722c6f798SBarry Smith   nkdm->ops->computepjacobian = kdm->ops->computepjacobian;
17822c6f798SBarry Smith   nkdm->ops->computepfunction = kdm->ops->computepfunction;
17922c6f798SBarry Smith   nkdm->ops->destroy          = kdm->ops->destroy;
18022c6f798SBarry Smith   nkdm->ops->duplicate        = kdm->ops->duplicate;
18122c6f798SBarry Smith 
18222c6f798SBarry Smith   nkdm->functionctx  = kdm->functionctx;
18322c6f798SBarry Smith   nkdm->gsctx        = kdm->gsctx;
18422c6f798SBarry Smith   nkdm->pctx         = kdm->pctx;
18522c6f798SBarry Smith   nkdm->jacobianctx  = kdm->jacobianctx;
18622c6f798SBarry Smith   nkdm->objectivectx = kdm->objectivectx;
18722c6f798SBarry Smith   nkdm->data         = kdm->data;
18822c6f798SBarry Smith 
18922c6f798SBarry Smith   /*
19022c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
19122c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
19222c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
19322c6f798SBarry Smith   */
19422c6f798SBarry Smith 
19522c6f798SBarry Smith   /* implementation specific copy hooks */
19622c6f798SBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
19722c6f798SBarry Smith   PetscFunctionReturn(0);
19822c6f798SBarry Smith }
19922c6f798SBarry Smith 
20022c6f798SBarry Smith #undef __FUNCT__
201942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES"
2026cab3a1bSJed Brown /*@C
203942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
2046cab3a1bSJed Brown 
2056cab3a1bSJed Brown    Not Collective
2066cab3a1bSJed Brown 
2076cab3a1bSJed Brown    Input Argument:
2086cab3a1bSJed Brown .  dm - DM to be used with SNES
2096cab3a1bSJed Brown 
2106cab3a1bSJed Brown    Output Argument:
211942e3340SBarry Smith .  snesdm - private DMSNES context
2126cab3a1bSJed Brown 
2136cab3a1bSJed Brown    Level: developer
2146cab3a1bSJed Brown 
2156cab3a1bSJed Brown    Notes:
216942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
2176cab3a1bSJed Brown 
218942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
2196cab3a1bSJed Brown @*/
220942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
2216cab3a1bSJed Brown {
2226cab3a1bSJed Brown   PetscErrorCode ierr;
2236cab3a1bSJed Brown 
2246cab3a1bSJed Brown   PetscFunctionBegin;
2256cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
226b4615a05SBarry Smith   *snesdm = (DMSNES) dm->dmsnes;
22722c6f798SBarry Smith   if (!*snesdm) {
228942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
229ce94432eSBarry Smith     ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm);CHKERRQ(ierr);
2301aa26658SKarl Rupp 
231b4615a05SBarry Smith     dm->dmsnes = (PetscObject) *snesdm;
2321aa26658SKarl Rupp 
2330298fd71SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2340298fd71SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr);
2350298fd71SBarry Smith     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
2366cab3a1bSJed Brown   }
2376cab3a1bSJed Brown   PetscFunctionReturn(0);
2386cab3a1bSJed Brown }
2396cab3a1bSJed Brown 
2406cab3a1bSJed Brown #undef __FUNCT__
241942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite"
2426cab3a1bSJed Brown /*@C
243942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
2446cab3a1bSJed Brown 
2456cab3a1bSJed Brown    Not Collective
2466cab3a1bSJed Brown 
2476cab3a1bSJed Brown    Input Argument:
2486cab3a1bSJed Brown .  dm - DM to be used with SNES
2496cab3a1bSJed Brown 
2506cab3a1bSJed Brown    Output Argument:
251942e3340SBarry Smith .  snesdm - private DMSNES context
2526cab3a1bSJed Brown 
2536cab3a1bSJed Brown    Level: developer
2546cab3a1bSJed Brown 
255942e3340SBarry Smith .seealso: DMGetDMSNES()
2566cab3a1bSJed Brown @*/
257942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
2586cab3a1bSJed Brown {
2596cab3a1bSJed Brown   PetscErrorCode ierr;
260942e3340SBarry Smith   DMSNES         sdm;
2616cab3a1bSJed Brown 
2626cab3a1bSJed Brown   PetscFunctionBegin;
2636cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
264942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2656cab3a1bSJed Brown   if (!sdm->originaldm) sdm->originaldm = dm;
2666cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
267b4615a05SBarry Smith     DMSNES oldsdm = sdm;
268942e3340SBarry Smith     ierr       = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
269ce94432eSBarry Smith     ierr       = DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr);
27022c6f798SBarry Smith     ierr       = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr);
271b4615a05SBarry Smith     ierr       = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr);
272b4615a05SBarry Smith     dm->dmsnes = (PetscObject)sdm;
2736cab3a1bSJed Brown   }
2746cab3a1bSJed Brown   *snesdm = sdm;
2756cab3a1bSJed Brown   PetscFunctionReturn(0);
2766cab3a1bSJed Brown }
2776cab3a1bSJed Brown 
2786cab3a1bSJed Brown #undef __FUNCT__
279942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES"
2806cab3a1bSJed Brown /*@C
281942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2826cab3a1bSJed Brown 
2836cab3a1bSJed Brown    Logically Collective
2846cab3a1bSJed Brown 
2856cab3a1bSJed Brown    Input Arguments:
2866cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2876cab3a1bSJed Brown -  dmdest - DM to add context to
2886cab3a1bSJed Brown 
2896cab3a1bSJed Brown    Level: developer
2906cab3a1bSJed Brown 
2916cab3a1bSJed Brown    Note:
2926cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2936cab3a1bSJed Brown 
294942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2956cab3a1bSJed Brown @*/
296942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2976cab3a1bSJed Brown {
2986cab3a1bSJed Brown   PetscErrorCode ierr;
2996cab3a1bSJed Brown 
3006cab3a1bSJed Brown   PetscFunctionBegin;
3016cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
3026cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
30353705c30SMatthew G. Knepley   if (!dmdest->dmsnes) {ierr = DMSNESCreate(PetscObjectComm((PetscObject) dmdest), (DMSNES *) &dmdest->dmsnes);CHKERRQ(ierr);}
30453705c30SMatthew G. Knepley   ierr = DMSNESCopy((DMSNES) dmsrc->dmsnes, (DMSNES) dmdest->dmsnes);CHKERRQ(ierr);
3050298fd71SBarry Smith   ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr);
3060298fd71SBarry Smith   ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr);
3070298fd71SBarry Smith   ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr);
3086cab3a1bSJed Brown   PetscFunctionReturn(0);
3096cab3a1bSJed Brown }
3106cab3a1bSJed Brown 
3116cab3a1bSJed Brown #undef __FUNCT__
3126cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction"
3136cab3a1bSJed Brown /*@C
3146cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
3156cab3a1bSJed Brown 
3166cab3a1bSJed Brown    Not Collective
3176cab3a1bSJed Brown 
3186cab3a1bSJed Brown    Input Arguments:
3196cab3a1bSJed Brown +  dm - DM to be used with SNES
320f8b49ee9SBarry Smith .  f - residual evaluation function; see SNESFunction for details
3216cab3a1bSJed Brown -  ctx - context for residual evaluation
3226cab3a1bSJed Brown 
3236cab3a1bSJed Brown    Level: advanced
3246cab3a1bSJed Brown 
3256cab3a1bSJed Brown    Note:
3266cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
3276cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
3286cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
3296cab3a1bSJed Brown 
330bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction
3316cab3a1bSJed Brown @*/
332f8b49ee9SBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
3336cab3a1bSJed Brown {
3346cab3a1bSJed Brown   PetscErrorCode ierr;
335942e3340SBarry Smith   DMSNES         sdm;
3366cab3a1bSJed Brown 
3376cab3a1bSJed Brown   PetscFunctionBegin;
3386cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
339f8b49ee9SBarry Smith   if (f || ctx) {
340942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
341fdaff8d6SPeter Brune   }
342f8b49ee9SBarry Smith   if (f) sdm->ops->computefunction = f;
3436cab3a1bSJed Brown   if (ctx) sdm->functionctx = ctx;
3446cab3a1bSJed Brown   PetscFunctionReturn(0);
3456cab3a1bSJed Brown }
3466cab3a1bSJed Brown 
3476cab3a1bSJed Brown #undef __FUNCT__
3486cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction"
3496cab3a1bSJed Brown /*@C
3506cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
3516cab3a1bSJed Brown 
3526cab3a1bSJed Brown    Not Collective
3536cab3a1bSJed Brown 
3546cab3a1bSJed Brown    Input Argument:
3556cab3a1bSJed Brown .  dm - DM to be used with SNES
3566cab3a1bSJed Brown 
3576cab3a1bSJed Brown    Output Arguments:
358f8b49ee9SBarry Smith +  f - residual evaluation function; see SNESFunction for details
3596cab3a1bSJed Brown -  ctx - context for residual evaluation
3606cab3a1bSJed Brown 
3616cab3a1bSJed Brown    Level: advanced
3626cab3a1bSJed Brown 
3636cab3a1bSJed Brown    Note:
3646cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3656cab3a1bSJed Brown    associated with the DM.
3666cab3a1bSJed Brown 
367bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction
3686cab3a1bSJed Brown @*/
369f8b49ee9SBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
3706cab3a1bSJed Brown {
3716cab3a1bSJed Brown   PetscErrorCode ierr;
372942e3340SBarry Smith   DMSNES         sdm;
3736cab3a1bSJed Brown 
3746cab3a1bSJed Brown   PetscFunctionBegin;
3756cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
376942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
377f8b49ee9SBarry Smith   if (f) *f = sdm->ops->computefunction;
3786cab3a1bSJed Brown   if (ctx) *ctx = sdm->functionctx;
3796cab3a1bSJed Brown   PetscFunctionReturn(0);
3806cab3a1bSJed Brown }
3816cab3a1bSJed Brown 
3826cab3a1bSJed Brown #undef __FUNCT__
3832a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective"
3842a4ee8f2SPeter Brune /*@C
385081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3862a4ee8f2SPeter Brune 
3872a4ee8f2SPeter Brune    Not Collective
3882a4ee8f2SPeter Brune 
3892a4ee8f2SPeter Brune    Input Arguments:
3902a4ee8f2SPeter Brune +  dm - DM to be used with SNES
391f8b49ee9SBarry Smith .  obj - objective evaluation function; see SNESObjectiveFunction for details
3922a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3932a4ee8f2SPeter Brune 
3942a4ee8f2SPeter Brune    Level: advanced
3952a4ee8f2SPeter Brune 
3962a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3972a4ee8f2SPeter Brune @*/
398f8b49ee9SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*obj)(SNES,Vec,PetscReal*,void*),void *ctx)
3992a4ee8f2SPeter Brune {
4002a4ee8f2SPeter Brune   PetscErrorCode ierr;
401942e3340SBarry Smith   DMSNES         sdm;
4022a4ee8f2SPeter Brune 
4032a4ee8f2SPeter Brune   PetscFunctionBegin;
4042a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
405f8b49ee9SBarry Smith   if (obj || ctx) {
406942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
407fdaff8d6SPeter Brune   }
408f8b49ee9SBarry Smith   if (obj) sdm->ops->computeobjective = obj;
4092a4ee8f2SPeter Brune   if (ctx) sdm->objectivectx = ctx;
4102a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4112a4ee8f2SPeter Brune }
4122a4ee8f2SPeter Brune 
4132a4ee8f2SPeter Brune #undef __FUNCT__
4142a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective"
4152a4ee8f2SPeter Brune /*@C
4162a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
4172a4ee8f2SPeter Brune 
4182a4ee8f2SPeter Brune    Not Collective
4192a4ee8f2SPeter Brune 
4202a4ee8f2SPeter Brune    Input Argument:
4212a4ee8f2SPeter Brune .  dm - DM to be used with SNES
4222a4ee8f2SPeter Brune 
4232a4ee8f2SPeter Brune    Output Arguments:
424f8b49ee9SBarry Smith +  obj- residual evaluation function; see SNESObjectiveFunction for details
4252a4ee8f2SPeter Brune -  ctx - context for residual evaluation
4262a4ee8f2SPeter Brune 
4272a4ee8f2SPeter Brune    Level: advanced
4282a4ee8f2SPeter Brune 
4292a4ee8f2SPeter Brune    Note:
4302a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
4312a4ee8f2SPeter Brune    associated with the DM.
4322a4ee8f2SPeter Brune 
4332a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
4342a4ee8f2SPeter Brune @*/
435f8b49ee9SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**obj)(SNES,Vec,PetscReal*,void*),void **ctx)
4362a4ee8f2SPeter Brune {
4372a4ee8f2SPeter Brune   PetscErrorCode ierr;
438942e3340SBarry Smith   DMSNES         sdm;
4392a4ee8f2SPeter Brune 
4402a4ee8f2SPeter Brune   PetscFunctionBegin;
4412a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
442942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
443f8b49ee9SBarry Smith   if (obj) *obj = sdm->ops->computeobjective;
4442a4ee8f2SPeter Brune   if (ctx) *ctx = sdm->objectivectx;
4452a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4462a4ee8f2SPeter Brune }
4472a4ee8f2SPeter Brune 
4482a4ee8f2SPeter Brune #undef __FUNCT__
449be95d8f1SBarry Smith #define __FUNCT__ "DMSNESSetNGS"
4506cab3a1bSJed Brown /*@C
451be95d8f1SBarry Smith    DMSNESSetNGS - set SNES Gauss-Seidel relaxation function
4526cab3a1bSJed Brown 
4536cab3a1bSJed Brown    Not Collective
4546cab3a1bSJed Brown 
4556cab3a1bSJed Brown    Input Argument:
4566cab3a1bSJed Brown +  dm - DM to be used with SNES
457be95d8f1SBarry Smith .  f  - relaxation function, see SNESGSFunction
4586cab3a1bSJed Brown -  ctx - context for residual evaluation
4596cab3a1bSJed Brown 
4606cab3a1bSJed Brown    Level: advanced
4616cab3a1bSJed Brown 
4626cab3a1bSJed Brown    Note:
463be95d8f1SBarry Smith    SNESSetNGS() is normally used, but it calls this function internally because the user context is actually
4646cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4656cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4666cab3a1bSJed Brown 
467bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction
4686cab3a1bSJed Brown @*/
469be95d8f1SBarry Smith PetscErrorCode DMSNESSetNGS(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx)
4706cab3a1bSJed Brown {
4716cab3a1bSJed Brown   PetscErrorCode ierr;
472942e3340SBarry Smith   DMSNES         sdm;
4736cab3a1bSJed Brown 
4746cab3a1bSJed Brown   PetscFunctionBegin;
4756cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
476be95d8f1SBarry Smith   if (f || ctx) {
477942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
478fdaff8d6SPeter Brune   }
479be95d8f1SBarry Smith   if (f) sdm->ops->computegs = f;
4806cab3a1bSJed Brown   if (ctx) sdm->gsctx = ctx;
4816cab3a1bSJed Brown   PetscFunctionReturn(0);
4826cab3a1bSJed Brown }
4836cab3a1bSJed Brown 
4846cab3a1bSJed Brown #undef __FUNCT__
485be95d8f1SBarry Smith #define __FUNCT__ "DMSNESGetNGS"
4866cab3a1bSJed Brown /*@C
487be95d8f1SBarry Smith    DMSNESGetNGS - get SNES Gauss-Seidel relaxation function
4886cab3a1bSJed Brown 
4896cab3a1bSJed Brown    Not Collective
4906cab3a1bSJed Brown 
4916cab3a1bSJed Brown    Input Argument:
4926cab3a1bSJed Brown .  dm - DM to be used with SNES
4936cab3a1bSJed Brown 
4946cab3a1bSJed Brown    Output Arguments:
495be95d8f1SBarry Smith +  f - relaxation function which performs Gauss-Seidel sweeps, see SNESGSFunction
4966cab3a1bSJed Brown -  ctx - context for residual evaluation
4976cab3a1bSJed Brown 
4986cab3a1bSJed Brown    Level: advanced
4996cab3a1bSJed Brown 
5006cab3a1bSJed Brown    Note:
501be95d8f1SBarry Smith    SNESGetNGS() is normally used, but it calls this function internally because the user context is actually
5026cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5036cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
5046cab3a1bSJed Brown 
505be95d8f1SBarry Smith .seealso: DMSNESSetContext(), SNESGetNGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESNGSFunction
5066cab3a1bSJed Brown @*/
507be95d8f1SBarry Smith PetscErrorCode DMSNESGetNGS(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx)
5086cab3a1bSJed Brown {
5096cab3a1bSJed Brown   PetscErrorCode ierr;
510942e3340SBarry Smith   DMSNES         sdm;
5116cab3a1bSJed Brown 
5126cab3a1bSJed Brown   PetscFunctionBegin;
5136cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
514942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
515be95d8f1SBarry Smith   if (f) *f = sdm->ops->computegs;
5166cab3a1bSJed Brown   if (ctx) *ctx = sdm->gsctx;
5176cab3a1bSJed Brown   PetscFunctionReturn(0);
5186cab3a1bSJed Brown }
5196cab3a1bSJed Brown 
5206cab3a1bSJed Brown #undef __FUNCT__
5216cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian"
5226cab3a1bSJed Brown /*@C
523ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
5246cab3a1bSJed Brown 
5256cab3a1bSJed Brown    Not Collective
5266cab3a1bSJed Brown 
5276cab3a1bSJed Brown    Input Argument:
5286cab3a1bSJed Brown +  dm - DM to be used with SNES
529f8b49ee9SBarry Smith .  J - Jacobian evaluation function
5306cab3a1bSJed Brown -  ctx - context for residual evaluation
5316cab3a1bSJed Brown 
5326cab3a1bSJed Brown    Level: advanced
5336cab3a1bSJed Brown 
5346cab3a1bSJed Brown    Note:
5356cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
5366cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5376cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5386cab3a1bSJed Brown 
539bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction
5406cab3a1bSJed Brown @*/
541d1e9a80fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
5426cab3a1bSJed Brown {
5436cab3a1bSJed Brown   PetscErrorCode ierr;
544942e3340SBarry Smith   DMSNES         sdm;
5456cab3a1bSJed Brown 
5466cab3a1bSJed Brown   PetscFunctionBegin;
5476cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
548f8b49ee9SBarry Smith   if (J || ctx) {
549942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
5501fdfe764SBarry Smith   }
551f8b49ee9SBarry Smith   if (J) sdm->ops->computejacobian = J;
5526cab3a1bSJed Brown   if (ctx) sdm->jacobianctx = ctx;
5536cab3a1bSJed Brown   PetscFunctionReturn(0);
5546cab3a1bSJed Brown }
5556cab3a1bSJed Brown 
5566cab3a1bSJed Brown #undef __FUNCT__
5576cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian"
5586cab3a1bSJed Brown /*@C
559ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
5606cab3a1bSJed Brown 
5616cab3a1bSJed Brown    Not Collective
5626cab3a1bSJed Brown 
5636cab3a1bSJed Brown    Input Argument:
5646cab3a1bSJed Brown .  dm - DM to be used with SNES
5656cab3a1bSJed Brown 
5666cab3a1bSJed Brown    Output Arguments:
567f8b49ee9SBarry Smith +  J - Jacobian evaluation function; see SNESJacobianFunction for all calling sequence
5686cab3a1bSJed Brown -  ctx - context for residual evaluation
5696cab3a1bSJed Brown 
5706cab3a1bSJed Brown    Level: advanced
5716cab3a1bSJed Brown 
5726cab3a1bSJed Brown    Note:
5736cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5746cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5756cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5766cab3a1bSJed Brown 
577bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction
5786cab3a1bSJed Brown @*/
579d1e9a80fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
5806cab3a1bSJed Brown {
5816cab3a1bSJed Brown   PetscErrorCode ierr;
582942e3340SBarry Smith   DMSNES         sdm;
5836cab3a1bSJed Brown 
5846cab3a1bSJed Brown   PetscFunctionBegin;
5856cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
586942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
587f8b49ee9SBarry Smith   if (J) *J = sdm->ops->computejacobian;
5886cab3a1bSJed Brown   if (ctx) *ctx = sdm->jacobianctx;
5896cab3a1bSJed Brown   PetscFunctionReturn(0);
5906cab3a1bSJed Brown }
5916cab3a1bSJed Brown 
5926cab3a1bSJed Brown #undef __FUNCT__
593e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard"
594e03ab78fSPeter Brune /*@C
595e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
596e03ab78fSPeter Brune 
597e03ab78fSPeter Brune    Not Collective
598e03ab78fSPeter Brune 
599e03ab78fSPeter Brune    Input Argument:
600e03ab78fSPeter Brune +  dm - DM to be used with SNES
601f8b49ee9SBarry Smith .  b - RHS evaluation function
602f8b49ee9SBarry Smith .  J - Picard matrix evaluation function
603e03ab78fSPeter Brune -  ctx - context for residual evaluation
604e03ab78fSPeter Brune 
605e03ab78fSPeter Brune    Level: advanced
606e03ab78fSPeter Brune 
607e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
608e03ab78fSPeter Brune @*/
609d1e9a80fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*b)(SNES,Vec,Vec,void*),PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx)
610e03ab78fSPeter Brune {
611e03ab78fSPeter Brune   PetscErrorCode ierr;
612942e3340SBarry Smith   DMSNES         sdm;
613e03ab78fSPeter Brune 
614e03ab78fSPeter Brune   PetscFunctionBegin;
615e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
616942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
617f8b49ee9SBarry Smith   if (b) sdm->ops->computepfunction = b;
618f8b49ee9SBarry Smith   if (J) sdm->ops->computepjacobian = J;
619e03ab78fSPeter Brune   if (ctx) sdm->pctx = ctx;
620e03ab78fSPeter Brune   PetscFunctionReturn(0);
621e03ab78fSPeter Brune }
622e03ab78fSPeter Brune 
6237971a8bfSPeter Brune #undef __FUNCT__
6247971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard"
6257971a8bfSPeter Brune /*@C
6267971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
6277971a8bfSPeter Brune 
6287971a8bfSPeter Brune    Not Collective
6297971a8bfSPeter Brune 
6307971a8bfSPeter Brune    Input Argument:
6317971a8bfSPeter Brune .  dm - DM to be used with SNES
6327971a8bfSPeter Brune 
6337971a8bfSPeter Brune    Output Arguments:
634f8b49ee9SBarry Smith +  b - RHS evaluation function; see SNESFunction for details
635f8b49ee9SBarry Smith .  J  - RHS evaluation function; see SNESJacobianFunction for detailsa
6367971a8bfSPeter Brune -  ctx - context for residual evaluation
6377971a8bfSPeter Brune 
6387971a8bfSPeter Brune    Level: advanced
6397971a8bfSPeter Brune 
6407971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6417971a8bfSPeter Brune @*/
642d1e9a80fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**b)(SNES,Vec,Vec,void*),PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx)
6437971a8bfSPeter Brune {
6447971a8bfSPeter Brune   PetscErrorCode ierr;
645942e3340SBarry Smith   DMSNES         sdm;
6467971a8bfSPeter Brune 
6477971a8bfSPeter Brune   PetscFunctionBegin;
6487971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
649942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
650f8b49ee9SBarry Smith   if (b) *b = sdm->ops->computepfunction;
651f8b49ee9SBarry Smith   if (J) *J = sdm->ops->computepjacobian;
6527971a8bfSPeter Brune   if (ctx) *ctx = sdm->pctx;
6537971a8bfSPeter Brune   PetscFunctionReturn(0);
6547971a8bfSPeter Brune }
655