xref: /petsc/src/snes/utils/dmsnes.c (revision 075cc63271bc17bb23469d9a3ffd37ec6fcef0fb)
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) {
5598da9c48SSatish Balay     ierr = PetscViewerBinaryWrite(viewer,(void*)kdm->ops->computefunction,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
5698da9c48SSatish Balay     ierr = PetscViewerBinaryWrite(viewer,(void*)kdm->ops->computejacobian,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
572d53ad75SBarry Smith   }
582d53ad75SBarry Smith   PetscFunctionReturn(0);
592d53ad75SBarry Smith }
602d53ad75SBarry Smith 
612d53ad75SBarry Smith #undef __FUNCT__
6222c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate"
6322c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm)
6422c6f798SBarry Smith {
6522c6f798SBarry Smith   PetscErrorCode ierr;
6622c6f798SBarry Smith 
6722c6f798SBarry Smith   PetscFunctionBegin;
6822c6f798SBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES
6922c6f798SBarry Smith   ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr);
7022c6f798SBarry Smith #endif
712d53ad75SBarry Smith   ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID, -1, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr);
7222c6f798SBarry Smith   ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMSNESOps));CHKERRQ(ierr);
736cab3a1bSJed Brown   PetscFunctionReturn(0);
746cab3a1bSJed Brown }
756cab3a1bSJed Brown 
766cab3a1bSJed Brown #undef __FUNCT__
77942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES"
78942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
796cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
806cab3a1bSJed Brown  */
81942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
826cab3a1bSJed Brown {
836cab3a1bSJed Brown   PetscErrorCode ierr;
846cab3a1bSJed Brown 
856cab3a1bSJed Brown   PetscFunctionBegin;
86942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr);
876cab3a1bSJed Brown   PetscFunctionReturn(0);
886cab3a1bSJed Brown }
896cab3a1bSJed Brown 
906cab3a1bSJed Brown #undef __FUNCT__
91942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES"
92dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
93caa4e7f2SJed Brown  */
94942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
95caa4e7f2SJed Brown {
96caa4e7f2SJed Brown 
97caa4e7f2SJed Brown   PetscFunctionBegin;
98caa4e7f2SJed Brown   PetscFunctionReturn(0);
99caa4e7f2SJed Brown }
100caa4e7f2SJed Brown 
101caa4e7f2SJed Brown #undef __FUNCT__
102be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES"
103be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */
104be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx)
105be081cd6SPeter Brune {
106be081cd6SPeter Brune   PetscErrorCode ierr;
107be081cd6SPeter Brune 
108be081cd6SPeter Brune   PetscFunctionBegin;
109be081cd6SPeter Brune   ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr);
110be081cd6SPeter Brune   PetscFunctionReturn(0);
111be081cd6SPeter Brune }
112be081cd6SPeter Brune 
113be081cd6SPeter Brune #undef __FUNCT__
114be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES"
115be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level.
116be081cd6SPeter Brune  */
117be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx)
118be081cd6SPeter Brune {
119be081cd6SPeter Brune 
120be081cd6SPeter Brune   PetscFunctionBegin;
121be081cd6SPeter Brune   PetscFunctionReturn(0);
122be081cd6SPeter Brune }
123be081cd6SPeter Brune 
124be081cd6SPeter Brune #undef __FUNCT__
125942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES"
126942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
12703a0fabfSPeter Brune {
12803a0fabfSPeter Brune   PetscErrorCode ierr;
12903a0fabfSPeter Brune 
13003a0fabfSPeter Brune   PetscFunctionBegin;
131942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
13203a0fabfSPeter Brune   PetscFunctionReturn(0);
13303a0fabfSPeter Brune }
13403a0fabfSPeter Brune 
13503a0fabfSPeter Brune #undef __FUNCT__
136942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES"
13703a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
13803a0fabfSPeter Brune  */
139942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
14003a0fabfSPeter Brune {
14103a0fabfSPeter Brune 
14203a0fabfSPeter Brune   PetscFunctionBegin;
14303a0fabfSPeter Brune   PetscFunctionReturn(0);
14403a0fabfSPeter Brune }
14503a0fabfSPeter Brune 
14603a0fabfSPeter Brune #undef __FUNCT__
14722c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy"
14822c6f798SBarry Smith /*@C
14922c6f798SBarry Smith    DMSNESCopy - copies the information in a DMSNES to another DMSNES
15022c6f798SBarry Smith 
15122c6f798SBarry Smith    Not Collective
15222c6f798SBarry Smith 
15322c6f798SBarry Smith    Input Argument:
15422c6f798SBarry Smith +  kdm - Original DMSNES
15522c6f798SBarry Smith -  nkdm - DMSNES to receive the data, should have been created with DMSNESCreate()
15622c6f798SBarry Smith 
15722c6f798SBarry Smith    Level: developer
15822c6f798SBarry Smith 
15922c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy()
16022c6f798SBarry Smith @*/
16122c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm)
16222c6f798SBarry Smith {
16322c6f798SBarry Smith   PetscErrorCode ierr;
16422c6f798SBarry Smith 
16522c6f798SBarry Smith   PetscFunctionBegin;
16622c6f798SBarry Smith   PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1);
16722c6f798SBarry Smith   PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2);
16822c6f798SBarry Smith   nkdm->ops->computefunction       = kdm->ops->computefunction;
1692bc4d0c4SPeter Brune   nkdm->ops->computejacobian       = kdm->ops->computejacobian;
17022c6f798SBarry Smith   nkdm->ops->computegs             = kdm->ops->computegs;
17122c6f798SBarry Smith   nkdm->ops->computeobjective      = kdm->ops->computeobjective;
17222c6f798SBarry Smith   nkdm->ops->computepjacobian      = kdm->ops->computepjacobian;
17322c6f798SBarry Smith   nkdm->ops->computepfunction      = kdm->ops->computepfunction;
17422c6f798SBarry Smith   nkdm->ops->destroy               = kdm->ops->destroy;
17522c6f798SBarry Smith   nkdm->ops->duplicate             = kdm->ops->duplicate;
17622c6f798SBarry Smith 
17722c6f798SBarry Smith   nkdm->functionctx      = kdm->functionctx;
17822c6f798SBarry Smith   nkdm->gsctx            = kdm->gsctx;
17922c6f798SBarry Smith   nkdm->pctx             = kdm->pctx;
18022c6f798SBarry Smith   nkdm->jacobianctx      = kdm->jacobianctx;
18122c6f798SBarry Smith   nkdm->objectivectx     = kdm->objectivectx;
18222c6f798SBarry Smith   nkdm->data             = kdm->data;
18322c6f798SBarry Smith 
18422c6f798SBarry Smith   /*
18522c6f798SBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
18622c6f798SBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
18722c6f798SBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
18822c6f798SBarry Smith   */
18922c6f798SBarry Smith 
19022c6f798SBarry Smith   /* implementation specific copy hooks */
19122c6f798SBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
19222c6f798SBarry Smith   PetscFunctionReturn(0);
19322c6f798SBarry Smith }
19422c6f798SBarry Smith 
19522c6f798SBarry Smith #undef __FUNCT__
196942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES"
1976cab3a1bSJed Brown /*@C
198942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
1996cab3a1bSJed Brown 
2006cab3a1bSJed Brown    Not Collective
2016cab3a1bSJed Brown 
2026cab3a1bSJed Brown    Input Argument:
2036cab3a1bSJed Brown .  dm - DM to be used with SNES
2046cab3a1bSJed Brown 
2056cab3a1bSJed Brown    Output Argument:
206942e3340SBarry Smith .  snesdm - private DMSNES context
2076cab3a1bSJed Brown 
2086cab3a1bSJed Brown    Level: developer
2096cab3a1bSJed Brown 
2106cab3a1bSJed Brown    Notes:
211942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
2126cab3a1bSJed Brown 
213942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
2146cab3a1bSJed Brown @*/
215942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
2166cab3a1bSJed Brown {
2176cab3a1bSJed Brown   PetscErrorCode ierr;
2186cab3a1bSJed Brown 
2196cab3a1bSJed Brown   PetscFunctionBegin;
2206cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
221b4615a05SBarry Smith   *snesdm = (DMSNES) dm->dmsnes;
22222c6f798SBarry Smith   if (!*snesdm) {
223942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
22422c6f798SBarry Smith     ierr = DMSNESCreate(((PetscObject)dm)->comm,snesdm);CHKERRQ(ierr);
225b4615a05SBarry Smith     dm->dmsnes = (PetscObject) *snesdm;
226942e3340SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
22722c6f798SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
228be081cd6SPeter Brune     ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
2296cab3a1bSJed Brown   }
2306cab3a1bSJed Brown   PetscFunctionReturn(0);
2316cab3a1bSJed Brown }
2326cab3a1bSJed Brown 
2336cab3a1bSJed Brown #undef __FUNCT__
234942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite"
2356cab3a1bSJed Brown /*@C
236942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
2376cab3a1bSJed Brown 
2386cab3a1bSJed Brown    Not Collective
2396cab3a1bSJed Brown 
2406cab3a1bSJed Brown    Input Argument:
2416cab3a1bSJed Brown .  dm - DM to be used with SNES
2426cab3a1bSJed Brown 
2436cab3a1bSJed Brown    Output Argument:
244942e3340SBarry Smith .  snesdm - private DMSNES context
2456cab3a1bSJed Brown 
2466cab3a1bSJed Brown    Level: developer
2476cab3a1bSJed Brown 
248942e3340SBarry Smith .seealso: DMGetDMSNES()
2496cab3a1bSJed Brown @*/
250942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
2516cab3a1bSJed Brown {
2526cab3a1bSJed Brown   PetscErrorCode ierr;
253942e3340SBarry Smith   DMSNES         sdm;
2546cab3a1bSJed Brown 
2556cab3a1bSJed Brown   PetscFunctionBegin;
2566cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
257942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2586cab3a1bSJed Brown   if (!sdm->originaldm) sdm->originaldm = dm;
2596cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
260b4615a05SBarry Smith     DMSNES          oldsdm = sdm;
261942e3340SBarry Smith     ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
26222c6f798SBarry Smith     ierr = DMSNESCreate(((PetscObject)dm)->comm,&sdm);CHKERRQ(ierr);
26322c6f798SBarry Smith     ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr);
264b4615a05SBarry Smith     ierr = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr);
265b4615a05SBarry Smith     dm->dmsnes = (PetscObject)sdm;
2666cab3a1bSJed Brown   }
2676cab3a1bSJed Brown   *snesdm = sdm;
2686cab3a1bSJed Brown   PetscFunctionReturn(0);
2696cab3a1bSJed Brown }
2706cab3a1bSJed Brown 
2716cab3a1bSJed Brown #undef __FUNCT__
272942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES"
2736cab3a1bSJed Brown /*@C
274942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
2756cab3a1bSJed Brown 
2766cab3a1bSJed Brown    Logically Collective
2776cab3a1bSJed Brown 
2786cab3a1bSJed Brown    Input Arguments:
2796cab3a1bSJed Brown +  dmsrc - DM to obtain context from
2806cab3a1bSJed Brown -  dmdest - DM to add context to
2816cab3a1bSJed Brown 
2826cab3a1bSJed Brown    Level: developer
2836cab3a1bSJed Brown 
2846cab3a1bSJed Brown    Note:
2856cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
2866cab3a1bSJed Brown 
287942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
2886cab3a1bSJed Brown @*/
289942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
2906cab3a1bSJed Brown {
2916cab3a1bSJed Brown   PetscErrorCode ierr;
2926cab3a1bSJed Brown 
2936cab3a1bSJed Brown   PetscFunctionBegin;
2946cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
2956cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
296b4615a05SBarry Smith   ierr = DMSNESDestroy((DMSNES*)&dmdest->dmsnes);CHKERRQ(ierr);
297b4615a05SBarry Smith   dmdest->dmsnes = dmsrc->dmsnes;
298b4615a05SBarry Smith   ierr = PetscObjectReference(dmdest->dmsnes);CHKERRQ(ierr);
29922c6f798SBarry Smith   ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
30022c6f798SBarry Smith   ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
301be081cd6SPeter Brune   ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
3026cab3a1bSJed Brown   PetscFunctionReturn(0);
3036cab3a1bSJed Brown }
3046cab3a1bSJed Brown 
3056cab3a1bSJed Brown #undef __FUNCT__
3066cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction"
3076cab3a1bSJed Brown /*@C
3086cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
3096cab3a1bSJed Brown 
3106cab3a1bSJed Brown    Not Collective
3116cab3a1bSJed Brown 
3126cab3a1bSJed Brown    Input Arguments:
3136cab3a1bSJed Brown +  dm - DM to be used with SNES
314bf388a1fSBarry Smith .  SNESFunction - residual evaluation function
3156cab3a1bSJed Brown -  ctx - context for residual evaluation
3166cab3a1bSJed Brown 
3176cab3a1bSJed Brown    Level: advanced
3186cab3a1bSJed Brown 
3196cab3a1bSJed Brown    Note:
3206cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
3216cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
3226cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
3236cab3a1bSJed Brown 
324bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction
3256cab3a1bSJed Brown @*/
326bf388a1fSBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),void *ctx)
3276cab3a1bSJed Brown {
3286cab3a1bSJed Brown   PetscErrorCode ierr;
329942e3340SBarry Smith   DMSNES         sdm;
3306cab3a1bSJed Brown 
3316cab3a1bSJed Brown   PetscFunctionBegin;
3326cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
333bf388a1fSBarry Smith   if (SNESFunction || ctx) {
334942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
335fdaff8d6SPeter Brune   }
336bf388a1fSBarry Smith   if (SNESFunction) sdm->ops->computefunction = SNESFunction;
3376cab3a1bSJed Brown   if (ctx)  sdm->functionctx = ctx;
3386cab3a1bSJed Brown   PetscFunctionReturn(0);
3396cab3a1bSJed Brown }
3406cab3a1bSJed Brown 
3416cab3a1bSJed Brown #undef __FUNCT__
3426cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction"
3436cab3a1bSJed Brown /*@C
3446cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
3456cab3a1bSJed Brown 
3466cab3a1bSJed Brown    Not Collective
3476cab3a1bSJed Brown 
3486cab3a1bSJed Brown    Input Argument:
3496cab3a1bSJed Brown .  dm - DM to be used with SNES
3506cab3a1bSJed Brown 
3516cab3a1bSJed Brown    Output Arguments:
352bf388a1fSBarry Smith +  SNESFunction - residual evaluation function
3536cab3a1bSJed Brown -  ctx - context for residual evaluation
3546cab3a1bSJed Brown 
3556cab3a1bSJed Brown    Level: advanced
3566cab3a1bSJed Brown 
3576cab3a1bSJed Brown    Note:
3586cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3596cab3a1bSJed Brown    associated with the DM.
3606cab3a1bSJed Brown 
361bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction
3626cab3a1bSJed Brown @*/
363bf388a1fSBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),void **ctx)
3646cab3a1bSJed Brown {
3656cab3a1bSJed Brown   PetscErrorCode ierr;
366942e3340SBarry Smith   DMSNES         sdm;
3676cab3a1bSJed Brown 
3686cab3a1bSJed Brown   PetscFunctionBegin;
3696cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
370942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
371bf388a1fSBarry Smith   if (SNESFunction) *SNESFunction = sdm->ops->computefunction;
3726cab3a1bSJed Brown   if (ctx)  *ctx = sdm->functionctx;
3736cab3a1bSJed Brown   PetscFunctionReturn(0);
3746cab3a1bSJed Brown }
3756cab3a1bSJed Brown 
3766cab3a1bSJed Brown #undef __FUNCT__
3772a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective"
3782a4ee8f2SPeter Brune /*@C
379081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
3802a4ee8f2SPeter Brune 
3812a4ee8f2SPeter Brune    Not Collective
3822a4ee8f2SPeter Brune 
3832a4ee8f2SPeter Brune    Input Arguments:
3842a4ee8f2SPeter Brune +  dm - DM to be used with SNES
385*075cc632SBarry Smith .  SNESObjectiveFunction - residual evaluation function
3862a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3872a4ee8f2SPeter Brune 
3882a4ee8f2SPeter Brune    Level: advanced
3892a4ee8f2SPeter Brune 
3902a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
3912a4ee8f2SPeter Brune @*/
392*075cc632SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*SNESObjectiveFunction)(SNES,Vec,PetscReal *,void*),void *ctx)
3932a4ee8f2SPeter Brune {
3942a4ee8f2SPeter Brune   PetscErrorCode ierr;
395942e3340SBarry Smith   DMSNES         sdm;
3962a4ee8f2SPeter Brune 
3972a4ee8f2SPeter Brune   PetscFunctionBegin;
3982a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
399*075cc632SBarry Smith   if (SNESObjectiveFunction || ctx) {
400942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
401fdaff8d6SPeter Brune   }
402*075cc632SBarry Smith   if (SNESObjectiveFunction) sdm->ops->computeobjective = SNESObjectiveFunction;
4032a4ee8f2SPeter Brune   if (ctx)  sdm->objectivectx = ctx;
4042a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4052a4ee8f2SPeter Brune }
4062a4ee8f2SPeter Brune 
4072a4ee8f2SPeter Brune #undef __FUNCT__
4082a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective"
4092a4ee8f2SPeter Brune /*@C
4102a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
4112a4ee8f2SPeter Brune 
4122a4ee8f2SPeter Brune    Not Collective
4132a4ee8f2SPeter Brune 
4142a4ee8f2SPeter Brune    Input Argument:
4152a4ee8f2SPeter Brune .  dm - DM to be used with SNES
4162a4ee8f2SPeter Brune 
4172a4ee8f2SPeter Brune    Output Arguments:
418*075cc632SBarry Smith +  SNESObjectiveFunction- residual evaluation function
4192a4ee8f2SPeter Brune -  ctx - context for residual evaluation
4202a4ee8f2SPeter Brune 
4212a4ee8f2SPeter Brune    Level: advanced
4222a4ee8f2SPeter Brune 
4232a4ee8f2SPeter Brune    Note:
4242a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
4252a4ee8f2SPeter Brune    associated with the DM.
4262a4ee8f2SPeter Brune 
4272a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
4282a4ee8f2SPeter Brune @*/
429*075cc632SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**SNESObjectiveFunction)(SNES,Vec,PetscReal *,void*),void **ctx)
4302a4ee8f2SPeter Brune {
4312a4ee8f2SPeter Brune   PetscErrorCode ierr;
432942e3340SBarry Smith   DMSNES         sdm;
4332a4ee8f2SPeter Brune 
4342a4ee8f2SPeter Brune   PetscFunctionBegin;
4352a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
436942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
437*075cc632SBarry Smith   if (SNESObjectiveFunction) *SNESObjectiveFunction = sdm->ops->computeobjective;
4382a4ee8f2SPeter Brune   if (ctx)  *ctx = sdm->objectivectx;
4392a4ee8f2SPeter Brune   PetscFunctionReturn(0);
4402a4ee8f2SPeter Brune }
4412a4ee8f2SPeter Brune 
4422a4ee8f2SPeter Brune #undef __FUNCT__
4436cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS"
4446cab3a1bSJed Brown /*@C
4456cab3a1bSJed Brown    DMSNESSetGS - set SNES Gauss-Seidel relaxation function
4466cab3a1bSJed Brown 
4476cab3a1bSJed Brown    Not Collective
4486cab3a1bSJed Brown 
4496cab3a1bSJed Brown    Input Argument:
4506cab3a1bSJed Brown +  dm - DM to be used with SNES
451bf388a1fSBarry Smith .  SNESGSFunction - relaxation function
4526cab3a1bSJed Brown -  ctx - context for residual evaluation
4536cab3a1bSJed Brown 
4546cab3a1bSJed Brown    Level: advanced
4556cab3a1bSJed Brown 
4566cab3a1bSJed Brown    Note:
4576cab3a1bSJed Brown    SNESSetGS() is normally used, but it calls this function internally because the user context is actually
4586cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4596cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4606cab3a1bSJed Brown 
461bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction
4626cab3a1bSJed Brown @*/
463bf388a1fSBarry Smith PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*SNESGSFunction)(SNES,Vec,Vec,void*),void *ctx)
4646cab3a1bSJed Brown {
4656cab3a1bSJed Brown   PetscErrorCode ierr;
466942e3340SBarry Smith   DMSNES         sdm;
4676cab3a1bSJed Brown 
4686cab3a1bSJed Brown   PetscFunctionBegin;
4696cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
470bf388a1fSBarry Smith   if (SNESGSFunction || ctx) {
471942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
472fdaff8d6SPeter Brune   }
473bf388a1fSBarry Smith   if (SNESGSFunction) sdm->ops->computegs = SNESGSFunction;
4746cab3a1bSJed Brown   if (ctx)  sdm->gsctx = ctx;
4756cab3a1bSJed Brown   PetscFunctionReturn(0);
4766cab3a1bSJed Brown }
4776cab3a1bSJed Brown 
4786cab3a1bSJed Brown #undef __FUNCT__
4796cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS"
4806cab3a1bSJed Brown /*@C
4816cab3a1bSJed Brown    DMSNESGetGS - get SNES Gauss-Seidel relaxation function
4826cab3a1bSJed Brown 
4836cab3a1bSJed Brown    Not Collective
4846cab3a1bSJed Brown 
4856cab3a1bSJed Brown    Input Argument:
4866cab3a1bSJed Brown .  dm - DM to be used with SNES
4876cab3a1bSJed Brown 
4886cab3a1bSJed Brown    Output Arguments:
489bf388a1fSBarry Smith +  SNESGSFunction - relaxation function which performs Gauss-Seidel sweeps
4906cab3a1bSJed Brown -  ctx - context for residual evaluation
4916cab3a1bSJed Brown 
4926cab3a1bSJed Brown    Level: advanced
4936cab3a1bSJed Brown 
4946cab3a1bSJed Brown    Note:
4956cab3a1bSJed Brown    SNESGetGS() is normally used, but it calls this function internally because the user context is actually
4966cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4976cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
4986cab3a1bSJed Brown 
499bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESGSFunction
5006cab3a1bSJed Brown @*/
501bf388a1fSBarry Smith PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**SNESGSFunction)(SNES,Vec,Vec,void*),void **ctx)
5026cab3a1bSJed Brown {
5036cab3a1bSJed Brown   PetscErrorCode ierr;
504942e3340SBarry Smith   DMSNES         sdm;
5056cab3a1bSJed Brown 
5066cab3a1bSJed Brown   PetscFunctionBegin;
5076cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
508942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
509bf388a1fSBarry Smith   if (SNESGSFunction) *SNESGSFunction = sdm->ops->computegs;
5106cab3a1bSJed Brown   if (ctx)  *ctx = sdm->gsctx;
5116cab3a1bSJed Brown   PetscFunctionReturn(0);
5126cab3a1bSJed Brown }
5136cab3a1bSJed Brown 
5146cab3a1bSJed Brown #undef __FUNCT__
5156cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian"
5166cab3a1bSJed Brown /*@C
517ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
5186cab3a1bSJed Brown 
5196cab3a1bSJed Brown    Not Collective
5206cab3a1bSJed Brown 
5216cab3a1bSJed Brown    Input Argument:
5226cab3a1bSJed Brown +  dm - DM to be used with SNES
523bf388a1fSBarry Smith .  SNESJacobianFunction - Jacobian evaluation function
5246cab3a1bSJed Brown -  ctx - context for residual evaluation
5256cab3a1bSJed Brown 
5266cab3a1bSJed Brown    Level: advanced
5276cab3a1bSJed Brown 
5286cab3a1bSJed Brown    Note:
5296cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
5306cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5316cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5326cab3a1bSJed Brown 
533bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction
5346cab3a1bSJed Brown @*/
535bf388a1fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
5366cab3a1bSJed Brown {
5376cab3a1bSJed Brown   PetscErrorCode ierr;
538942e3340SBarry Smith   DMSNES         sdm;
5396cab3a1bSJed Brown 
5406cab3a1bSJed Brown   PetscFunctionBegin;
5416cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
542bf388a1fSBarry Smith   if (SNESJacobianFunction || ctx) {
543942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
5441fdfe764SBarry Smith   }
545bf388a1fSBarry Smith   if (SNESJacobianFunction) sdm->ops->computejacobian = SNESJacobianFunction;
5466cab3a1bSJed Brown   if (ctx)  sdm->jacobianctx = ctx;
5476cab3a1bSJed Brown   PetscFunctionReturn(0);
5486cab3a1bSJed Brown }
5496cab3a1bSJed Brown 
5506cab3a1bSJed Brown #undef __FUNCT__
5516cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian"
5526cab3a1bSJed Brown /*@C
553ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
5546cab3a1bSJed Brown 
5556cab3a1bSJed Brown    Not Collective
5566cab3a1bSJed Brown 
5576cab3a1bSJed Brown    Input Argument:
5586cab3a1bSJed Brown .  dm - DM to be used with SNES
5596cab3a1bSJed Brown 
5606cab3a1bSJed Brown    Output Arguments:
561bf388a1fSBarry Smith +  SNESJacobianFunction - Jacobian evaluation function
5626cab3a1bSJed Brown -  ctx - context for residual evaluation
5636cab3a1bSJed Brown 
5646cab3a1bSJed Brown    Level: advanced
5656cab3a1bSJed Brown 
5666cab3a1bSJed Brown    Note:
5676cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
5686cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
5696cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
5706cab3a1bSJed Brown 
571bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction
5726cab3a1bSJed Brown @*/
573bf388a1fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5746cab3a1bSJed Brown {
5756cab3a1bSJed Brown   PetscErrorCode ierr;
576942e3340SBarry Smith   DMSNES         sdm;
5776cab3a1bSJed Brown 
5786cab3a1bSJed Brown   PetscFunctionBegin;
5796cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
580942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
581bf388a1fSBarry Smith   if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computejacobian;
5826cab3a1bSJed Brown   if (ctx)  *ctx = sdm->jacobianctx;
5836cab3a1bSJed Brown   PetscFunctionReturn(0);
5846cab3a1bSJed Brown }
5856cab3a1bSJed Brown 
5866cab3a1bSJed Brown #undef __FUNCT__
587e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard"
588e03ab78fSPeter Brune /*@C
589e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
590e03ab78fSPeter Brune 
591e03ab78fSPeter Brune    Not Collective
592e03ab78fSPeter Brune 
593e03ab78fSPeter Brune    Input Argument:
594e03ab78fSPeter Brune +  dm - DM to be used with SNES
595bf388a1fSBarry Smith .  SNESFunction - RHS evaluation function
596bf388a1fSBarry Smith .  SNESJacobianFunction - Picard matrix evaluation function
597e03ab78fSPeter Brune -  ctx - context for residual evaluation
598e03ab78fSPeter Brune 
599e03ab78fSPeter Brune    Level: advanced
600e03ab78fSPeter Brune 
601e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
602e03ab78fSPeter Brune @*/
603bf388a1fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
604e03ab78fSPeter Brune {
605e03ab78fSPeter Brune   PetscErrorCode ierr;
606942e3340SBarry Smith   DMSNES         sdm;
607e03ab78fSPeter Brune 
608e03ab78fSPeter Brune   PetscFunctionBegin;
609e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
610942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
611bf388a1fSBarry Smith   if (SNESFunction) sdm->ops->computepfunction = SNESFunction;
612bf388a1fSBarry Smith   if (SNESJacobianFunction)  sdm->ops->computepjacobian = SNESJacobianFunction;
613e03ab78fSPeter Brune   if (ctx)   sdm->pctx             = ctx;
614e03ab78fSPeter Brune   PetscFunctionReturn(0);
615e03ab78fSPeter Brune }
616e03ab78fSPeter Brune 
6177971a8bfSPeter Brune #undef __FUNCT__
6187971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard"
6197971a8bfSPeter Brune /*@C
6207971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
6217971a8bfSPeter Brune 
6227971a8bfSPeter Brune    Not Collective
6237971a8bfSPeter Brune 
6247971a8bfSPeter Brune    Input Argument:
6257971a8bfSPeter Brune .  dm - DM to be used with SNES
6267971a8bfSPeter Brune 
6277971a8bfSPeter Brune    Output Arguments:
628bf388a1fSBarry Smith +  SNESFunction - Jacobian evaluation function;
629bf388a1fSBarry Smith .  SNESJacobianFunction  - RHS evaluation function;
6307971a8bfSPeter Brune -  ctx - context for residual evaluation
6317971a8bfSPeter Brune 
6327971a8bfSPeter Brune    Level: advanced
6337971a8bfSPeter Brune 
6347971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6357971a8bfSPeter Brune @*/
636bf388a1fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
6377971a8bfSPeter Brune {
6387971a8bfSPeter Brune   PetscErrorCode ierr;
639942e3340SBarry Smith   DMSNES         sdm;
6407971a8bfSPeter Brune 
6417971a8bfSPeter Brune   PetscFunctionBegin;
6427971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
643942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
644bf388a1fSBarry Smith   if (SNESFunction) *SNESFunction = sdm->ops->computepfunction;
645bf388a1fSBarry Smith   if (SNESJacobianFunction) *SNESJacobianFunction   = sdm->ops->computepjacobian;
6467971a8bfSPeter Brune   if (ctx)  *ctx    = sdm->pctx;
6477971a8bfSPeter Brune   PetscFunctionReturn(0);
6487971a8bfSPeter Brune }
649