xref: /petsc/src/snes/utils/dmsnes.c (revision 942e334039a1a47ff909c032afdf0581bd880e9f)
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__
5*942e3340SBarry Smith #define __FUNCT__ "PetscContainerDestroy_DMSNES"
6*942e3340SBarry Smith static PetscErrorCode PetscContainerDestroy_DMSNES(void *ctx)
76cab3a1bSJed Brown {
86cab3a1bSJed Brown   PetscErrorCode ierr;
9*942e3340SBarry Smith   DMSNES         sdm = (DMSNES)ctx;
106cab3a1bSJed Brown 
116cab3a1bSJed Brown   PetscFunctionBegin;
126cab3a1bSJed Brown   if (sdm->destroy) {ierr = (*sdm->destroy)(sdm);CHKERRQ(ierr);}
136cab3a1bSJed Brown   ierr = PetscFree(sdm);CHKERRQ(ierr);
146cab3a1bSJed Brown   PetscFunctionReturn(0);
156cab3a1bSJed Brown }
166cab3a1bSJed Brown 
176cab3a1bSJed Brown #undef __FUNCT__
18*942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES"
19*942e3340SBarry Smith /* Attaches the DMSNES to the coarse level.
206cab3a1bSJed Brown  * Under what conditions should we copy versus duplicate?
216cab3a1bSJed Brown  */
22*942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx)
236cab3a1bSJed Brown {
246cab3a1bSJed Brown   PetscErrorCode ierr;
256cab3a1bSJed Brown 
266cab3a1bSJed Brown   PetscFunctionBegin;
27*942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr);
286cab3a1bSJed Brown   PetscFunctionReturn(0);
296cab3a1bSJed Brown }
306cab3a1bSJed Brown 
316cab3a1bSJed Brown #undef __FUNCT__
32*942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES"
33dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level.
34caa4e7f2SJed Brown  */
35*942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
36caa4e7f2SJed Brown {
37caa4e7f2SJed Brown 
38caa4e7f2SJed Brown   PetscFunctionBegin;
39caa4e7f2SJed Brown   PetscFunctionReturn(0);
40caa4e7f2SJed Brown }
41caa4e7f2SJed Brown 
42caa4e7f2SJed Brown #undef __FUNCT__
43*942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES"
44*942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx)
4503a0fabfSPeter Brune {
4603a0fabfSPeter Brune   PetscErrorCode ierr;
4703a0fabfSPeter Brune 
4803a0fabfSPeter Brune   PetscFunctionBegin;
49*942e3340SBarry Smith   ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr);
5003a0fabfSPeter Brune   PetscFunctionReturn(0);
5103a0fabfSPeter Brune }
5203a0fabfSPeter Brune 
5303a0fabfSPeter Brune #undef __FUNCT__
54*942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES"
5503a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level.
5603a0fabfSPeter Brune  */
57*942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx)
5803a0fabfSPeter Brune {
5903a0fabfSPeter Brune 
6003a0fabfSPeter Brune   PetscFunctionBegin;
6103a0fabfSPeter Brune   PetscFunctionReturn(0);
6203a0fabfSPeter Brune }
6303a0fabfSPeter Brune 
6403a0fabfSPeter Brune #undef __FUNCT__
65*942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES"
666cab3a1bSJed Brown /*@C
67*942e3340SBarry Smith    DMGetDMSNES - get read-only private DMSNES context from a DM
686cab3a1bSJed Brown 
696cab3a1bSJed Brown    Not Collective
706cab3a1bSJed Brown 
716cab3a1bSJed Brown    Input Argument:
726cab3a1bSJed Brown .  dm - DM to be used with SNES
736cab3a1bSJed Brown 
746cab3a1bSJed Brown    Output Argument:
75*942e3340SBarry Smith .  snesdm - private DMSNES context
766cab3a1bSJed Brown 
776cab3a1bSJed Brown    Level: developer
786cab3a1bSJed Brown 
796cab3a1bSJed Brown    Notes:
80*942e3340SBarry Smith    Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible.
816cab3a1bSJed Brown 
82*942e3340SBarry Smith .seealso: DMGetDMSNESWrite()
836cab3a1bSJed Brown @*/
84*942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm)
856cab3a1bSJed Brown {
866cab3a1bSJed Brown   PetscErrorCode ierr;
876cab3a1bSJed Brown   PetscContainer container;
88*942e3340SBarry Smith   DMSNES         sdm;
896cab3a1bSJed Brown 
906cab3a1bSJed Brown   PetscFunctionBegin;
916cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
92*942e3340SBarry Smith   ierr = PetscObjectQuery((PetscObject)dm,"DMSNES",(PetscObject*)&container);CHKERRQ(ierr);
936cab3a1bSJed Brown   if (container) {
946cab3a1bSJed Brown     ierr = PetscContainerGetPointer(container,(void**)snesdm);CHKERRQ(ierr);
956cab3a1bSJed Brown   } else {
96*942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr);
976cab3a1bSJed Brown     ierr = PetscContainerCreate(((PetscObject)dm)->comm,&container);CHKERRQ(ierr);
98*942e3340SBarry Smith     ierr = PetscNewLog(dm,struct _n_DMSNES,&sdm);CHKERRQ(ierr);
996cab3a1bSJed Brown     ierr = PetscContainerSetPointer(container,sdm);CHKERRQ(ierr);
100*942e3340SBarry Smith     ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_DMSNES);CHKERRQ(ierr);
101*942e3340SBarry Smith     ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)container);CHKERRQ(ierr);
102*942e3340SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
103*942e3340SBarry Smith     ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr);
1046cab3a1bSJed Brown     ierr = PetscContainerGetPointer(container,(void**)snesdm);CHKERRQ(ierr);
1056cab3a1bSJed Brown     ierr = PetscContainerDestroy(&container);CHKERRQ(ierr);
1066cab3a1bSJed Brown   }
1076cab3a1bSJed Brown   PetscFunctionReturn(0);
1086cab3a1bSJed Brown }
1096cab3a1bSJed Brown 
1106cab3a1bSJed Brown #undef __FUNCT__
111*942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite"
1126cab3a1bSJed Brown /*@C
113*942e3340SBarry Smith    DMGetDMSNESWrite - get write access to private DMSNES context from a DM
1146cab3a1bSJed Brown 
1156cab3a1bSJed Brown    Not Collective
1166cab3a1bSJed Brown 
1176cab3a1bSJed Brown    Input Argument:
1186cab3a1bSJed Brown .  dm - DM to be used with SNES
1196cab3a1bSJed Brown 
1206cab3a1bSJed Brown    Output Argument:
121*942e3340SBarry Smith .  snesdm - private DMSNES context
1226cab3a1bSJed Brown 
1236cab3a1bSJed Brown    Level: developer
1246cab3a1bSJed Brown 
125*942e3340SBarry Smith .seealso: DMGetDMSNES()
1266cab3a1bSJed Brown @*/
127*942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm)
1286cab3a1bSJed Brown {
1296cab3a1bSJed Brown   PetscErrorCode ierr;
130*942e3340SBarry Smith   DMSNES         sdm;
1316cab3a1bSJed Brown 
1326cab3a1bSJed Brown   PetscFunctionBegin;
1336cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
134*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
1356cab3a1bSJed Brown   if (!sdm->originaldm) sdm->originaldm = dm;
1366cab3a1bSJed Brown   if (sdm->originaldm != dm) {  /* Copy on write */
1376cab3a1bSJed Brown     PetscContainer container;
138*942e3340SBarry Smith     DMSNES         oldsdm = sdm;
139*942e3340SBarry Smith     ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr);
1406cab3a1bSJed Brown     ierr = PetscContainerCreate(((PetscObject)dm)->comm,&container);CHKERRQ(ierr);
141*942e3340SBarry Smith     ierr = PetscNewLog(dm,struct _n_DMSNES,&sdm);CHKERRQ(ierr);
1428caf3d72SBarry Smith     ierr = PetscMemcpy(sdm,oldsdm,sizeof(*sdm));CHKERRQ(ierr);
1436cab3a1bSJed Brown     ierr = PetscContainerSetPointer(container,sdm);CHKERRQ(ierr);
144*942e3340SBarry Smith     ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_DMSNES);CHKERRQ(ierr);
145*942e3340SBarry Smith     ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)container);CHKERRQ(ierr);
1466cab3a1bSJed Brown     ierr = PetscContainerDestroy(&container);CHKERRQ(ierr);
147e3c0b8a2SPeter Brune     /* implementation specific copy hooks */
148c9058dfbSJed Brown     if (sdm->duplicate) {ierr = (*sdm->duplicate)(oldsdm,dm);CHKERRQ(ierr);}
1496cab3a1bSJed Brown   }
1506cab3a1bSJed Brown   *snesdm = sdm;
1516cab3a1bSJed Brown   PetscFunctionReturn(0);
1526cab3a1bSJed Brown }
1536cab3a1bSJed Brown 
1546cab3a1bSJed Brown #undef __FUNCT__
155*942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES"
1566cab3a1bSJed Brown /*@C
157*942e3340SBarry Smith    DMCopyDMSNES - copies a DM context to a new DM
1586cab3a1bSJed Brown 
1596cab3a1bSJed Brown    Logically Collective
1606cab3a1bSJed Brown 
1616cab3a1bSJed Brown    Input Arguments:
1626cab3a1bSJed Brown +  dmsrc - DM to obtain context from
1636cab3a1bSJed Brown -  dmdest - DM to add context to
1646cab3a1bSJed Brown 
1656cab3a1bSJed Brown    Level: developer
1666cab3a1bSJed Brown 
1676cab3a1bSJed Brown    Note:
1686cab3a1bSJed Brown    The context is copied by reference. This function does not ensure that a context exists.
1696cab3a1bSJed Brown 
170*942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM()
1716cab3a1bSJed Brown @*/
172*942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest)
1736cab3a1bSJed Brown {
1746cab3a1bSJed Brown   PetscErrorCode ierr;
1756cab3a1bSJed Brown   PetscContainer container;
1766cab3a1bSJed Brown 
1776cab3a1bSJed Brown   PetscFunctionBegin;
1786cab3a1bSJed Brown   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
1796cab3a1bSJed Brown   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
180*942e3340SBarry Smith   ierr = PetscObjectQuery((PetscObject)dmsrc,"DMSNES",(PetscObject*)&container);CHKERRQ(ierr);
1816cab3a1bSJed Brown   if (container) {
182*942e3340SBarry Smith     ierr = PetscObjectCompose((PetscObject)dmdest,"DMSNES",(PetscObject)container);CHKERRQ(ierr);
183*942e3340SBarry Smith     ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
184*942e3340SBarry Smith     ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,PETSC_NULL);CHKERRQ(ierr);
1856cab3a1bSJed Brown   }
1866cab3a1bSJed Brown   PetscFunctionReturn(0);
1876cab3a1bSJed Brown }
1886cab3a1bSJed Brown 
1896cab3a1bSJed Brown #undef __FUNCT__
1906cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction"
1916cab3a1bSJed Brown /*@C
1926cab3a1bSJed Brown    DMSNESSetFunction - set SNES residual evaluation function
1936cab3a1bSJed Brown 
1946cab3a1bSJed Brown    Not Collective
1956cab3a1bSJed Brown 
1966cab3a1bSJed Brown    Input Arguments:
1976cab3a1bSJed Brown +  dm - DM to be used with SNES
1986cab3a1bSJed Brown .  func - residual evaluation function, see SNESSetFunction() for calling sequence
1996cab3a1bSJed Brown -  ctx - context for residual evaluation
2006cab3a1bSJed Brown 
2016cab3a1bSJed Brown    Level: advanced
2026cab3a1bSJed Brown 
2036cab3a1bSJed Brown    Note:
2046cab3a1bSJed Brown    SNESSetFunction() is normally used, but it calls this function internally because the user context is actually
2056cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
2066cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
2076cab3a1bSJed Brown 
2086cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
2096cab3a1bSJed Brown @*/
2106cab3a1bSJed Brown PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
2116cab3a1bSJed Brown {
2126cab3a1bSJed Brown   PetscErrorCode ierr;
213*942e3340SBarry Smith   DMSNES         sdm;
2146cab3a1bSJed Brown 
2156cab3a1bSJed Brown   PetscFunctionBegin;
2166cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
217fdaff8d6SPeter Brune   if (func || ctx) {
218*942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
219fdaff8d6SPeter Brune   }
2206cab3a1bSJed Brown   if (func) sdm->computefunction = func;
2216cab3a1bSJed Brown   if (ctx)  sdm->functionctx = ctx;
2226cab3a1bSJed Brown   PetscFunctionReturn(0);
2236cab3a1bSJed Brown }
2246cab3a1bSJed Brown 
2256cab3a1bSJed Brown #undef __FUNCT__
2266cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction"
2276cab3a1bSJed Brown /*@C
2286cab3a1bSJed Brown    DMSNESGetFunction - get SNES residual evaluation function
2296cab3a1bSJed Brown 
2306cab3a1bSJed Brown    Not Collective
2316cab3a1bSJed Brown 
2326cab3a1bSJed Brown    Input Argument:
2336cab3a1bSJed Brown .  dm - DM to be used with SNES
2346cab3a1bSJed Brown 
2356cab3a1bSJed Brown    Output Arguments:
2366cab3a1bSJed Brown +  func - residual evaluation function, see SNESSetFunction() for calling sequence
2376cab3a1bSJed Brown -  ctx - context for residual evaluation
2386cab3a1bSJed Brown 
2396cab3a1bSJed Brown    Level: advanced
2406cab3a1bSJed Brown 
2416cab3a1bSJed Brown    Note:
2426cab3a1bSJed Brown    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
2436cab3a1bSJed Brown    associated with the DM.
2446cab3a1bSJed Brown 
2456cab3a1bSJed Brown .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction()
2466cab3a1bSJed Brown @*/
2476cab3a1bSJed Brown PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
2486cab3a1bSJed Brown {
2496cab3a1bSJed Brown   PetscErrorCode ierr;
250*942e3340SBarry Smith   DMSNES         sdm;
2516cab3a1bSJed Brown 
2526cab3a1bSJed Brown   PetscFunctionBegin;
2536cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
254*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
2556cab3a1bSJed Brown   if (func) *func = sdm->computefunction;
2566cab3a1bSJed Brown   if (ctx)  *ctx = sdm->functionctx;
2576cab3a1bSJed Brown   PetscFunctionReturn(0);
2586cab3a1bSJed Brown }
2596cab3a1bSJed Brown 
2606cab3a1bSJed Brown #undef __FUNCT__
2612a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective"
2622a4ee8f2SPeter Brune /*@C
263081a7dcdSPeter Brune    DMSNESSetObjective - set SNES objective evaluation function
2642a4ee8f2SPeter Brune 
2652a4ee8f2SPeter Brune    Not Collective
2662a4ee8f2SPeter Brune 
2672a4ee8f2SPeter Brune    Input Arguments:
2682a4ee8f2SPeter Brune +  dm - DM to be used with SNES
2692a4ee8f2SPeter Brune .  func - residual evaluation function, see SNESSetObjective() for calling sequence
2702a4ee8f2SPeter Brune -  ctx - context for residual evaluation
2712a4ee8f2SPeter Brune 
2722a4ee8f2SPeter Brune    Level: advanced
2732a4ee8f2SPeter Brune 
2742a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction()
2752a4ee8f2SPeter Brune @*/
2762a4ee8f2SPeter Brune PetscErrorCode DMSNESSetObjective(DM dm,SNESObjective func,void *ctx)
2772a4ee8f2SPeter Brune {
2782a4ee8f2SPeter Brune   PetscErrorCode ierr;
279*942e3340SBarry Smith   DMSNES         sdm;
2802a4ee8f2SPeter Brune 
2812a4ee8f2SPeter Brune   PetscFunctionBegin;
2822a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
283fdaff8d6SPeter Brune   if (func || ctx) {
284*942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
285fdaff8d6SPeter Brune   }
2862a4ee8f2SPeter Brune   if (func) sdm->computeobjective = func;
2872a4ee8f2SPeter Brune   if (ctx)  sdm->objectivectx = ctx;
2882a4ee8f2SPeter Brune   PetscFunctionReturn(0);
2892a4ee8f2SPeter Brune }
2902a4ee8f2SPeter Brune 
2912a4ee8f2SPeter Brune #undef __FUNCT__
2922a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective"
2932a4ee8f2SPeter Brune /*@C
2942a4ee8f2SPeter Brune    DMSNESGetObjective - get SNES objective evaluation function
2952a4ee8f2SPeter Brune 
2962a4ee8f2SPeter Brune    Not Collective
2972a4ee8f2SPeter Brune 
2982a4ee8f2SPeter Brune    Input Argument:
2992a4ee8f2SPeter Brune .  dm - DM to be used with SNES
3002a4ee8f2SPeter Brune 
3012a4ee8f2SPeter Brune    Output Arguments:
3022a4ee8f2SPeter Brune +  func - residual evaluation function, see SNESSetObjective() for calling sequence
3032a4ee8f2SPeter Brune -  ctx - context for residual evaluation
3042a4ee8f2SPeter Brune 
3052a4ee8f2SPeter Brune    Level: advanced
3062a4ee8f2SPeter Brune 
3072a4ee8f2SPeter Brune    Note:
3082a4ee8f2SPeter Brune    SNESGetFunction() is normally used, but it calls this function internally because the user context is actually
3092a4ee8f2SPeter Brune    associated with the DM.
3102a4ee8f2SPeter Brune 
3112a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction()
3122a4ee8f2SPeter Brune @*/
3132a4ee8f2SPeter Brune PetscErrorCode DMSNESGetObjective(DM dm,SNESObjective *func,void **ctx)
3142a4ee8f2SPeter Brune {
3152a4ee8f2SPeter Brune   PetscErrorCode ierr;
316*942e3340SBarry Smith   DMSNES         sdm;
3172a4ee8f2SPeter Brune 
3182a4ee8f2SPeter Brune   PetscFunctionBegin;
3192a4ee8f2SPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
320*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
3212a4ee8f2SPeter Brune   if (func) *func = sdm->computeobjective;
3222a4ee8f2SPeter Brune   if (ctx)  *ctx = sdm->objectivectx;
3232a4ee8f2SPeter Brune   PetscFunctionReturn(0);
3242a4ee8f2SPeter Brune }
3252a4ee8f2SPeter Brune 
3262a4ee8f2SPeter Brune #undef __FUNCT__
3276cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS"
3286cab3a1bSJed Brown /*@C
3296cab3a1bSJed Brown    DMSNESSetGS - set SNES Gauss-Seidel relaxation function
3306cab3a1bSJed Brown 
3316cab3a1bSJed Brown    Not Collective
3326cab3a1bSJed Brown 
3336cab3a1bSJed Brown    Input Argument:
3346cab3a1bSJed Brown +  dm - DM to be used with SNES
3356cab3a1bSJed Brown .  func - relaxation function, see SNESSetGS() for calling sequence
3366cab3a1bSJed Brown -  ctx - context for residual evaluation
3376cab3a1bSJed Brown 
3386cab3a1bSJed Brown    Level: advanced
3396cab3a1bSJed Brown 
3406cab3a1bSJed Brown    Note:
3416cab3a1bSJed Brown    SNESSetGS() is normally used, but it calls this function internally because the user context is actually
3426cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
3436cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
3446cab3a1bSJed Brown 
3456cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction()
3466cab3a1bSJed Brown @*/
3476cab3a1bSJed Brown PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
3486cab3a1bSJed Brown {
3496cab3a1bSJed Brown   PetscErrorCode ierr;
350*942e3340SBarry Smith   DMSNES         sdm;
3516cab3a1bSJed Brown 
3526cab3a1bSJed Brown   PetscFunctionBegin;
3536cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
354fdaff8d6SPeter Brune   if (func || ctx) {
355*942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
356fdaff8d6SPeter Brune   }
3576cab3a1bSJed Brown   if (func) sdm->computegs = func;
3586cab3a1bSJed Brown   if (ctx)  sdm->gsctx = ctx;
3596cab3a1bSJed Brown   PetscFunctionReturn(0);
3606cab3a1bSJed Brown }
3616cab3a1bSJed Brown 
3626cab3a1bSJed Brown #undef __FUNCT__
3636cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS"
3646cab3a1bSJed Brown /*@C
3656cab3a1bSJed Brown    DMSNESGetGS - get SNES Gauss-Seidel relaxation function
3666cab3a1bSJed Brown 
3676cab3a1bSJed Brown    Not Collective
3686cab3a1bSJed Brown 
3696cab3a1bSJed Brown    Input Argument:
3706cab3a1bSJed Brown .  dm - DM to be used with SNES
3716cab3a1bSJed Brown 
3726cab3a1bSJed Brown    Output Arguments:
3736cab3a1bSJed Brown +  func - relaxation function, see SNESSetGS() for calling sequence
3746cab3a1bSJed Brown -  ctx - context for residual evaluation
3756cab3a1bSJed Brown 
3766cab3a1bSJed Brown    Level: advanced
3776cab3a1bSJed Brown 
3786cab3a1bSJed Brown    Note:
3796cab3a1bSJed Brown    SNESGetGS() is normally used, but it calls this function internally because the user context is actually
3806cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
3816cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
3826cab3a1bSJed Brown 
3836cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction()
3846cab3a1bSJed Brown @*/
3856cab3a1bSJed Brown PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
3866cab3a1bSJed Brown {
3876cab3a1bSJed Brown   PetscErrorCode ierr;
388*942e3340SBarry Smith   DMSNES         sdm;
3896cab3a1bSJed Brown 
3906cab3a1bSJed Brown   PetscFunctionBegin;
3916cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
392*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
3936cab3a1bSJed Brown   if (func) *func = sdm->computegs;
3946cab3a1bSJed Brown   if (ctx)  *ctx = sdm->gsctx;
3956cab3a1bSJed Brown   PetscFunctionReturn(0);
3966cab3a1bSJed Brown }
3976cab3a1bSJed Brown 
3986cab3a1bSJed Brown #undef __FUNCT__
3996cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian"
4006cab3a1bSJed Brown /*@C
401ecfdb398SPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
4026cab3a1bSJed Brown 
4036cab3a1bSJed Brown    Not Collective
4046cab3a1bSJed Brown 
4056cab3a1bSJed Brown    Input Argument:
4066cab3a1bSJed Brown +  dm - DM to be used with SNES
4076cab3a1bSJed Brown .  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
4086cab3a1bSJed Brown -  ctx - context for residual evaluation
4096cab3a1bSJed Brown 
4106cab3a1bSJed Brown    Level: advanced
4116cab3a1bSJed Brown 
4126cab3a1bSJed Brown    Note:
4136cab3a1bSJed Brown    SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually
4146cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4156cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
4166cab3a1bSJed Brown 
4176cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian()
4186cab3a1bSJed Brown @*/
4196cab3a1bSJed Brown PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
4206cab3a1bSJed Brown {
4216cab3a1bSJed Brown   PetscErrorCode ierr;
422*942e3340SBarry Smith   DMSNES         sdm;
4236cab3a1bSJed Brown 
4246cab3a1bSJed Brown   PetscFunctionBegin;
4256cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
4261fdfe764SBarry Smith   if (func || ctx) {
427*942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
4281fdfe764SBarry Smith   }
4296cab3a1bSJed Brown   if (func) sdm->computejacobian = func;
4306cab3a1bSJed Brown   if (ctx)  sdm->jacobianctx = ctx;
4316cab3a1bSJed Brown   PetscFunctionReturn(0);
4326cab3a1bSJed Brown }
4336cab3a1bSJed Brown 
4346cab3a1bSJed Brown #undef __FUNCT__
4356cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian"
4366cab3a1bSJed Brown /*@C
437ecfdb398SPeter Brune    DMSNESGetJacobian - get SNES Jacobian evaluation function
4386cab3a1bSJed Brown 
4396cab3a1bSJed Brown    Not Collective
4406cab3a1bSJed Brown 
4416cab3a1bSJed Brown    Input Argument:
4426cab3a1bSJed Brown .  dm - DM to be used with SNES
4436cab3a1bSJed Brown 
4446cab3a1bSJed Brown    Output Arguments:
4456cab3a1bSJed Brown +  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
4466cab3a1bSJed Brown -  ctx - context for residual evaluation
4476cab3a1bSJed Brown 
4486cab3a1bSJed Brown    Level: advanced
4496cab3a1bSJed Brown 
4506cab3a1bSJed Brown    Note:
4516cab3a1bSJed Brown    SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually
4526cab3a1bSJed Brown    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
4536cab3a1bSJed Brown    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
4546cab3a1bSJed Brown 
4556cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
4566cab3a1bSJed Brown @*/
4576cab3a1bSJed Brown PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
4586cab3a1bSJed Brown {
4596cab3a1bSJed Brown   PetscErrorCode ierr;
460*942e3340SBarry Smith   DMSNES         sdm;
4616cab3a1bSJed Brown 
4626cab3a1bSJed Brown   PetscFunctionBegin;
4636cab3a1bSJed Brown   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
464*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
4656cab3a1bSJed Brown   if (func) *func = sdm->computejacobian;
4666cab3a1bSJed Brown   if (ctx)  *ctx = sdm->jacobianctx;
4676cab3a1bSJed Brown   PetscFunctionReturn(0);
4686cab3a1bSJed Brown }
4696cab3a1bSJed Brown 
4706cab3a1bSJed Brown #undef __FUNCT__
471e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard"
472e03ab78fSPeter Brune /*@C
473e03ab78fSPeter Brune    DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions.
474e03ab78fSPeter Brune 
475e03ab78fSPeter Brune    Not Collective
476e03ab78fSPeter Brune 
477e03ab78fSPeter Brune    Input Argument:
478e03ab78fSPeter Brune +  dm - DM to be used with SNES
479e03ab78fSPeter Brune .  func - RHS evaluation function, see SNESSetFunction() for calling sequence
480e03ab78fSPeter Brune .  pjac - Picard matrix evaluation function, see SNESSetJacobian() for calling sequence
481e03ab78fSPeter Brune -  ctx - context for residual evaluation
482e03ab78fSPeter Brune 
483e03ab78fSPeter Brune    Level: advanced
484e03ab78fSPeter Brune 
485e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian()
486e03ab78fSPeter Brune @*/
487e03ab78fSPeter Brune PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (*pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
488e03ab78fSPeter Brune {
489e03ab78fSPeter Brune   PetscErrorCode ierr;
490*942e3340SBarry Smith   DMSNES         sdm;
491e03ab78fSPeter Brune 
492e03ab78fSPeter Brune   PetscFunctionBegin;
493e03ab78fSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
494*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
495e03ab78fSPeter Brune   if (pfunc) sdm->computepfunction = pfunc;
496e03ab78fSPeter Brune   if (pjac)  sdm->computepjacobian = pjac;
497e03ab78fSPeter Brune   if (ctx)   sdm->pctx             = ctx;
498e03ab78fSPeter Brune   PetscFunctionReturn(0);
499e03ab78fSPeter Brune }
500e03ab78fSPeter Brune 
5017971a8bfSPeter Brune 
5027971a8bfSPeter Brune #undef __FUNCT__
5037971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard"
5047971a8bfSPeter Brune /*@C
5057971a8bfSPeter Brune    DMSNESGetPicard - get SNES Picard iteration evaluation functions
5067971a8bfSPeter Brune 
5077971a8bfSPeter Brune    Not Collective
5087971a8bfSPeter Brune 
5097971a8bfSPeter Brune    Input Argument:
5107971a8bfSPeter Brune .  dm - DM to be used with SNES
5117971a8bfSPeter Brune 
5127971a8bfSPeter Brune    Output Arguments:
5137971a8bfSPeter Brune +  pfunc - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
5147971a8bfSPeter Brune .  pjac  - RHS evaluation function, see SNESSetFunction() for calling sequence
5157971a8bfSPeter Brune -  ctx - context for residual evaluation
5167971a8bfSPeter Brune 
5177971a8bfSPeter Brune    Level: advanced
5187971a8bfSPeter Brune 
5197971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5207971a8bfSPeter Brune @*/
5217971a8bfSPeter Brune PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (**pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
5227971a8bfSPeter Brune {
5237971a8bfSPeter Brune   PetscErrorCode ierr;
524*942e3340SBarry Smith   DMSNES         sdm;
5257971a8bfSPeter Brune 
5267971a8bfSPeter Brune   PetscFunctionBegin;
5277971a8bfSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
528*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
5297971a8bfSPeter Brune   if (pfunc) *pfunc = sdm->computepfunction;
5307971a8bfSPeter Brune   if (pjac) *pjac   = sdm->computepjacobian;
5317971a8bfSPeter Brune   if (ctx)  *ctx    = sdm->pctx;
5327971a8bfSPeter Brune   PetscFunctionReturn(0);
5337971a8bfSPeter Brune }
5347971a8bfSPeter Brune 
5356cab3a1bSJed Brown #undef __FUNCT__
5366cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetUpLegacy"
5376cab3a1bSJed Brown /* Sets up calling of legacy DM routines */
5386cab3a1bSJed Brown PetscErrorCode DMSNESSetUpLegacy(DM dm)
5396cab3a1bSJed Brown {
5406cab3a1bSJed Brown   PetscErrorCode ierr;
541*942e3340SBarry Smith   DMSNES         sdm;
5426cab3a1bSJed Brown 
5436cab3a1bSJed Brown   PetscFunctionBegin;
544*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
54574e1e8c1SBarry Smith   if (!sdm->computefunction) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_WRONGSTATE,"Function never provided to SNES object");
546679f678eSPeter Brune   if (!sdm->computejacobian) {
547679f678eSPeter Brune     ierr = DMSNESSetJacobian(dm,SNESDefaultComputeJacobianColor,PETSC_NULL);CHKERRQ(ierr);
548679f678eSPeter Brune   }
5496cab3a1bSJed Brown   PetscFunctionReturn(0);
5506cab3a1bSJed Brown }
5516427ad5bSPeter Brune 
5526427ad5bSPeter Brune /* block functions */
5536427ad5bSPeter Brune 
5546427ad5bSPeter Brune #undef __FUNCT__
5556427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockFunction"
5566427ad5bSPeter Brune /*@C
5576427ad5bSPeter Brune    DMSNESSetBlockFunction - set SNES residual evaluation function
5586427ad5bSPeter Brune 
5596427ad5bSPeter Brune    Not Collective
5606427ad5bSPeter Brune 
5616427ad5bSPeter Brune    Input Arguments:
5626427ad5bSPeter Brune +  dm - DM to be used with SNES
5636427ad5bSPeter Brune .  func - residual evaluation function, see SNESSetFunction() for calling sequence
5646427ad5bSPeter Brune -  ctx - context for residual evaluation
5656427ad5bSPeter Brune 
5666427ad5bSPeter Brune    Level: developer
5676427ad5bSPeter Brune 
5686427ad5bSPeter Brune    Note:
5696427ad5bSPeter Brune    Mostly for use in DM implementations and transferred to a block function rather than being called from here.
5706427ad5bSPeter Brune 
5716427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
5726427ad5bSPeter Brune @*/
5736427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx)
5746427ad5bSPeter Brune {
5756427ad5bSPeter Brune   PetscErrorCode ierr;
576*942e3340SBarry Smith   DMSNES         sdm;
5776427ad5bSPeter Brune 
5786427ad5bSPeter Brune   PetscFunctionBegin;
5796427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
580fdaff8d6SPeter Brune   if (func || ctx) {
581*942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
582fdaff8d6SPeter Brune   }
5836427ad5bSPeter Brune   if (func) sdm->computeblockfunction = func;
5846427ad5bSPeter Brune   if (ctx)  sdm->blockfunctionctx = ctx;
5856427ad5bSPeter Brune   PetscFunctionReturn(0);
5866427ad5bSPeter Brune }
5876427ad5bSPeter Brune 
5886427ad5bSPeter Brune #undef __FUNCT__
5896427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockFunction"
5906427ad5bSPeter Brune /*@C
5916427ad5bSPeter Brune    DMSNESGetBlockFunction - get SNES residual evaluation function
5926427ad5bSPeter Brune 
5936427ad5bSPeter Brune    Not Collective
5946427ad5bSPeter Brune 
5956427ad5bSPeter Brune    Input Argument:
5966427ad5bSPeter Brune .  dm - DM to be used with SNES
5976427ad5bSPeter Brune 
5986427ad5bSPeter Brune    Output Arguments:
5996427ad5bSPeter Brune +  func - residual evaluation function, see SNESSetFunction() for calling sequence
6006427ad5bSPeter Brune -  ctx - context for residual evaluation
6016427ad5bSPeter Brune 
6026427ad5bSPeter Brune    Level: developer
6036427ad5bSPeter Brune 
6046427ad5bSPeter Brune .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction()
6056427ad5bSPeter Brune @*/
6066427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx)
6076427ad5bSPeter Brune {
6086427ad5bSPeter Brune   PetscErrorCode ierr;
609*942e3340SBarry Smith   DMSNES         sdm;
6106427ad5bSPeter Brune 
6116427ad5bSPeter Brune   PetscFunctionBegin;
6126427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
613*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
6146427ad5bSPeter Brune   if (func) *func = sdm->computeblockfunction;
6156427ad5bSPeter Brune   if (ctx)  *ctx = sdm->blockfunctionctx;
6166427ad5bSPeter Brune   PetscFunctionReturn(0);
6176427ad5bSPeter Brune }
6186427ad5bSPeter Brune 
6196427ad5bSPeter Brune 
6206427ad5bSPeter Brune #undef __FUNCT__
6216427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockJacobian"
6226427ad5bSPeter Brune /*@C
6236427ad5bSPeter Brune    DMSNESSetJacobian - set SNES Jacobian evaluation function
6246427ad5bSPeter Brune 
6256427ad5bSPeter Brune    Not Collective
6266427ad5bSPeter Brune 
6276427ad5bSPeter Brune    Input Argument:
6286427ad5bSPeter Brune +  dm - DM to be used with SNES
6296427ad5bSPeter Brune .  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
6306427ad5bSPeter Brune -  ctx - context for residual evaluation
6316427ad5bSPeter Brune 
6326427ad5bSPeter Brune    Level: advanced
6336427ad5bSPeter Brune 
6346427ad5bSPeter Brune    Note:
6356427ad5bSPeter Brune    Mostly for use in DM implementations and transferred to a block function rather than being called from here.
6366427ad5bSPeter Brune 
6376427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian()
6386427ad5bSPeter Brune @*/
6396427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx)
6406427ad5bSPeter Brune {
6416427ad5bSPeter Brune   PetscErrorCode ierr;
642*942e3340SBarry Smith   DMSNES         sdm;
6436427ad5bSPeter Brune 
6446427ad5bSPeter Brune   PetscFunctionBegin;
6456427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
646fdaff8d6SPeter Brune   if (func || ctx) {
647*942e3340SBarry Smith     ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr);
648fdaff8d6SPeter Brune   }
6496427ad5bSPeter Brune   if (func) sdm->computeblockjacobian = func;
6506427ad5bSPeter Brune   if (ctx)  sdm->blockjacobianctx = ctx;
6516427ad5bSPeter Brune   PetscFunctionReturn(0);
6526427ad5bSPeter Brune }
6536427ad5bSPeter Brune 
6546427ad5bSPeter Brune #undef __FUNCT__
6556427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockJacobian"
6566427ad5bSPeter Brune /*@C
6576427ad5bSPeter Brune    DMSNESGetBlockJacobian - get SNES Jacobian evaluation function
6586427ad5bSPeter Brune 
6596427ad5bSPeter Brune    Not Collective
6606427ad5bSPeter Brune 
6616427ad5bSPeter Brune    Input Argument:
6626427ad5bSPeter Brune .  dm - DM to be used with SNES
6636427ad5bSPeter Brune 
6646427ad5bSPeter Brune    Output Arguments:
6656427ad5bSPeter Brune +  func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence
6666427ad5bSPeter Brune -  ctx - context for residual evaluation
6676427ad5bSPeter Brune 
6686427ad5bSPeter Brune    Level: advanced
6696427ad5bSPeter Brune 
6706427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian()
6716427ad5bSPeter Brune @*/
6726427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx)
6736427ad5bSPeter Brune {
6746427ad5bSPeter Brune   PetscErrorCode ierr;
675*942e3340SBarry Smith   DMSNES         sdm;
6766427ad5bSPeter Brune 
6776427ad5bSPeter Brune   PetscFunctionBegin;
6786427ad5bSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
679*942e3340SBarry Smith   ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr);
6806427ad5bSPeter Brune   if (func) *func = sdm->computeblockjacobian;
6816427ad5bSPeter Brune   if (ctx)  *ctx = sdm->blockjacobianctx;
6826427ad5bSPeter Brune   PetscFunctionReturn(0);
6836427ad5bSPeter Brune }
684