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*22c6f798SBarry Smith #define __FUNCT__ "DMSNESDestroy" 6*22c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm) 76cab3a1bSJed Brown { 86cab3a1bSJed Brown PetscErrorCode ierr; 96cab3a1bSJed Brown 106cab3a1bSJed Brown PetscFunctionBegin; 11*22c6f798SBarry Smith if (!*kdm) PetscFunctionReturn(0); 12*22c6f798SBarry Smith PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1); 13*22c6f798SBarry Smith if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);} 14*22c6f798SBarry Smith if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);} 15*22c6f798SBarry Smith ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr); 16*22c6f798SBarry Smith PetscFunctionReturn(0); 17*22c6f798SBarry Smith } 18*22c6f798SBarry Smith 19*22c6f798SBarry Smith #undef __FUNCT__ 20*22c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate" 21*22c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm) 22*22c6f798SBarry Smith { 23*22c6f798SBarry Smith PetscErrorCode ierr; 24*22c6f798SBarry Smith 25*22c6f798SBarry Smith PetscFunctionBegin; 26*22c6f798SBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES 27*22c6f798SBarry Smith ierr = SNESInitializePackage(PETSC_NULL);CHKERRQ(ierr); 28*22c6f798SBarry Smith #endif 29*22c6f798SBarry Smith ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID, -1, "DMKSP", "DMSNES", "DMSNES", comm, DMSNESDestroy, PETSC_NULL);CHKERRQ(ierr); 30*22c6f798SBarry Smith ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMSNESOps));CHKERRQ(ierr); 316cab3a1bSJed Brown PetscFunctionReturn(0); 326cab3a1bSJed Brown } 336cab3a1bSJed Brown 346cab3a1bSJed Brown #undef __FUNCT__ 35942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES" 36942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 376cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 386cab3a1bSJed Brown */ 39942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 406cab3a1bSJed Brown { 416cab3a1bSJed Brown PetscErrorCode ierr; 426cab3a1bSJed Brown 436cab3a1bSJed Brown PetscFunctionBegin; 44942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr); 456cab3a1bSJed Brown PetscFunctionReturn(0); 466cab3a1bSJed Brown } 476cab3a1bSJed Brown 486cab3a1bSJed Brown #undef __FUNCT__ 49942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES" 50dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 51caa4e7f2SJed Brown */ 52942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 53caa4e7f2SJed Brown { 54caa4e7f2SJed Brown 55caa4e7f2SJed Brown PetscFunctionBegin; 56caa4e7f2SJed Brown PetscFunctionReturn(0); 57caa4e7f2SJed Brown } 58caa4e7f2SJed Brown 59caa4e7f2SJed Brown #undef __FUNCT__ 60942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES" 61942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 6203a0fabfSPeter Brune { 6303a0fabfSPeter Brune PetscErrorCode ierr; 6403a0fabfSPeter Brune 6503a0fabfSPeter Brune PetscFunctionBegin; 66942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr); 6703a0fabfSPeter Brune PetscFunctionReturn(0); 6803a0fabfSPeter Brune } 6903a0fabfSPeter Brune 7003a0fabfSPeter Brune #undef __FUNCT__ 71942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES" 7203a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 7303a0fabfSPeter Brune */ 74942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 7503a0fabfSPeter Brune { 7603a0fabfSPeter Brune 7703a0fabfSPeter Brune PetscFunctionBegin; 7803a0fabfSPeter Brune PetscFunctionReturn(0); 7903a0fabfSPeter Brune } 8003a0fabfSPeter Brune 8103a0fabfSPeter Brune #undef __FUNCT__ 82*22c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy" 83*22c6f798SBarry Smith /*@C 84*22c6f798SBarry Smith DMSNESCopy - copies the information in a DMSNES to another DMSNES 85*22c6f798SBarry Smith 86*22c6f798SBarry Smith Not Collective 87*22c6f798SBarry Smith 88*22c6f798SBarry Smith Input Argument: 89*22c6f798SBarry Smith + kdm - Original DMSNES 90*22c6f798SBarry Smith - nkdm - DMSNES to receive the data, should have been created with DMSNESCreate() 91*22c6f798SBarry Smith 92*22c6f798SBarry Smith Level: developer 93*22c6f798SBarry Smith 94*22c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy() 95*22c6f798SBarry Smith @*/ 96*22c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm) 97*22c6f798SBarry Smith { 98*22c6f798SBarry Smith PetscErrorCode ierr; 99*22c6f798SBarry Smith 100*22c6f798SBarry Smith PetscFunctionBegin; 101*22c6f798SBarry Smith PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1); 102*22c6f798SBarry Smith PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2); 103*22c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 104*22c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 105*22c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 106*22c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 107*22c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 108*22c6f798SBarry Smith nkdm->ops->computeblockfunction = kdm->ops->computeblockfunction; 109*22c6f798SBarry Smith nkdm->ops->computeblockjacobian = kdm->ops->computeblockjacobian; 110*22c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 111*22c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 112*22c6f798SBarry Smith 113*22c6f798SBarry Smith nkdm->functionctx = kdm->functionctx; 114*22c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 115*22c6f798SBarry Smith nkdm->pctx = kdm->pctx; 116*22c6f798SBarry Smith nkdm->jacobianctx = kdm->jacobianctx; 117*22c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 118*22c6f798SBarry Smith nkdm->blockfunctionctx = kdm->blockfunctionctx; 119*22c6f798SBarry Smith nkdm->blockjacobianctx = kdm->blockjacobianctx; 120*22c6f798SBarry Smith nkdm->data = kdm->data; 121*22c6f798SBarry Smith 122*22c6f798SBarry Smith /* 123*22c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 124*22c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 125*22c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 126*22c6f798SBarry Smith */ 127*22c6f798SBarry Smith 128*22c6f798SBarry Smith /* implementation specific copy hooks */ 129*22c6f798SBarry Smith if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);} 130*22c6f798SBarry Smith PetscFunctionReturn(0); 131*22c6f798SBarry Smith } 132*22c6f798SBarry Smith 133*22c6f798SBarry Smith #undef __FUNCT__ 134942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES" 1356cab3a1bSJed Brown /*@C 136942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 1376cab3a1bSJed Brown 1386cab3a1bSJed Brown Not Collective 1396cab3a1bSJed Brown 1406cab3a1bSJed Brown Input Argument: 1416cab3a1bSJed Brown . dm - DM to be used with SNES 1426cab3a1bSJed Brown 1436cab3a1bSJed Brown Output Argument: 144942e3340SBarry Smith . snesdm - private DMSNES context 1456cab3a1bSJed Brown 1466cab3a1bSJed Brown Level: developer 1476cab3a1bSJed Brown 1486cab3a1bSJed Brown Notes: 149942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 1506cab3a1bSJed Brown 151942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 1526cab3a1bSJed Brown @*/ 153942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 1546cab3a1bSJed Brown { 1556cab3a1bSJed Brown PetscErrorCode ierr; 1566cab3a1bSJed Brown 1576cab3a1bSJed Brown PetscFunctionBegin; 1586cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 159*22c6f798SBarry Smith ierr = PetscObjectQuery((PetscObject)dm,"DMSNES",(PetscObject*)snesdm);CHKERRQ(ierr); 160*22c6f798SBarry Smith if (!*snesdm) { 161*22c6f798SBarry Smith DMSNES tmpsnesdm; 162942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr); 163*22c6f798SBarry Smith ierr = DMSNESCreate(((PetscObject)dm)->comm,snesdm);CHKERRQ(ierr); 164*22c6f798SBarry Smith ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)*snesdm);CHKERRQ(ierr); 165942e3340SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr); 166*22c6f798SBarry Smith ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,PETSC_NULL);CHKERRQ(ierr); 167*22c6f798SBarry Smith tmpsnesdm = *snesdm; 168*22c6f798SBarry Smith ierr = DMSNESDestroy(&tmpsnesdm);CHKERRQ(ierr); 1696cab3a1bSJed Brown } 1706cab3a1bSJed Brown PetscFunctionReturn(0); 1716cab3a1bSJed Brown } 1726cab3a1bSJed Brown 1736cab3a1bSJed Brown #undef __FUNCT__ 174942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite" 1756cab3a1bSJed Brown /*@C 176942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 1776cab3a1bSJed Brown 1786cab3a1bSJed Brown Not Collective 1796cab3a1bSJed Brown 1806cab3a1bSJed Brown Input Argument: 1816cab3a1bSJed Brown . dm - DM to be used with SNES 1826cab3a1bSJed Brown 1836cab3a1bSJed Brown Output Argument: 184942e3340SBarry Smith . snesdm - private DMSNES context 1856cab3a1bSJed Brown 1866cab3a1bSJed Brown Level: developer 1876cab3a1bSJed Brown 188942e3340SBarry Smith .seealso: DMGetDMSNES() 1896cab3a1bSJed Brown @*/ 190942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 1916cab3a1bSJed Brown { 1926cab3a1bSJed Brown PetscErrorCode ierr; 193942e3340SBarry Smith DMSNES sdm; 1946cab3a1bSJed Brown 1956cab3a1bSJed Brown PetscFunctionBegin; 1966cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 197942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 1986cab3a1bSJed Brown if (!sdm->originaldm) sdm->originaldm = dm; 1996cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 200*22c6f798SBarry Smith DMSNES oldsdm = sdm,tsdm; 201942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr); 202*22c6f798SBarry Smith ierr = DMSNESCreate(((PetscObject)dm)->comm,&sdm);CHKERRQ(ierr); 203*22c6f798SBarry Smith ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr); 204*22c6f798SBarry Smith 205*22c6f798SBarry Smith ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)sdm);CHKERRQ(ierr); 206*22c6f798SBarry Smith tsdm = sdm; 207*22c6f798SBarry Smith ierr = DMSNESDestroy(&tsdm );CHKERRQ(ierr); 2086cab3a1bSJed Brown } 2096cab3a1bSJed Brown *snesdm = sdm; 2106cab3a1bSJed Brown PetscFunctionReturn(0); 2116cab3a1bSJed Brown } 2126cab3a1bSJed Brown 2136cab3a1bSJed Brown #undef __FUNCT__ 214942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES" 2156cab3a1bSJed Brown /*@C 216942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 2176cab3a1bSJed Brown 2186cab3a1bSJed Brown Logically Collective 2196cab3a1bSJed Brown 2206cab3a1bSJed Brown Input Arguments: 2216cab3a1bSJed Brown + dmsrc - DM to obtain context from 2226cab3a1bSJed Brown - dmdest - DM to add context to 2236cab3a1bSJed Brown 2246cab3a1bSJed Brown Level: developer 2256cab3a1bSJed Brown 2266cab3a1bSJed Brown Note: 2276cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2286cab3a1bSJed Brown 229942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 2306cab3a1bSJed Brown @*/ 231942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 2326cab3a1bSJed Brown { 2336cab3a1bSJed Brown PetscErrorCode ierr; 234*22c6f798SBarry Smith DMSNES sdm; 2356cab3a1bSJed Brown 2366cab3a1bSJed Brown PetscFunctionBegin; 2376cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 2386cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 239*22c6f798SBarry Smith ierr = PetscObjectQuery((PetscObject)dmsrc,"DMSNES",(PetscObject*)&sdm);CHKERRQ(ierr); 240*22c6f798SBarry Smith if (sdm) { 241*22c6f798SBarry Smith ierr = PetscObjectCompose((PetscObject)dmdest,"DMSNES",(PetscObject)sdm);CHKERRQ(ierr); 242*22c6f798SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 243*22c6f798SBarry Smith ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 2446cab3a1bSJed Brown } 2456cab3a1bSJed Brown PetscFunctionReturn(0); 2466cab3a1bSJed Brown } 2476cab3a1bSJed Brown 2486cab3a1bSJed Brown #undef __FUNCT__ 2496cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction" 2506cab3a1bSJed Brown /*@C 2516cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 2526cab3a1bSJed Brown 2536cab3a1bSJed Brown Not Collective 2546cab3a1bSJed Brown 2556cab3a1bSJed Brown Input Arguments: 2566cab3a1bSJed Brown + dm - DM to be used with SNES 2576cab3a1bSJed Brown . func - residual evaluation function, see SNESSetFunction() for calling sequence 2586cab3a1bSJed Brown - ctx - context for residual evaluation 2596cab3a1bSJed Brown 2606cab3a1bSJed Brown Level: advanced 2616cab3a1bSJed Brown 2626cab3a1bSJed Brown Note: 2636cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 2646cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 2656cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 2666cab3a1bSJed Brown 2676cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 2686cab3a1bSJed Brown @*/ 2696cab3a1bSJed Brown PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 2706cab3a1bSJed Brown { 2716cab3a1bSJed Brown PetscErrorCode ierr; 272942e3340SBarry Smith DMSNES sdm; 2736cab3a1bSJed Brown 2746cab3a1bSJed Brown PetscFunctionBegin; 2756cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 276fdaff8d6SPeter Brune if (func || ctx) { 277942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 278fdaff8d6SPeter Brune } 279*22c6f798SBarry Smith if (func) sdm->ops->computefunction = func; 2806cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 2816cab3a1bSJed Brown PetscFunctionReturn(0); 2826cab3a1bSJed Brown } 2836cab3a1bSJed Brown 2846cab3a1bSJed Brown #undef __FUNCT__ 2856cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction" 2866cab3a1bSJed Brown /*@C 2876cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 2886cab3a1bSJed Brown 2896cab3a1bSJed Brown Not Collective 2906cab3a1bSJed Brown 2916cab3a1bSJed Brown Input Argument: 2926cab3a1bSJed Brown . dm - DM to be used with SNES 2936cab3a1bSJed Brown 2946cab3a1bSJed Brown Output Arguments: 2956cab3a1bSJed Brown + func - residual evaluation function, see SNESSetFunction() for calling sequence 2966cab3a1bSJed Brown - ctx - context for residual evaluation 2976cab3a1bSJed Brown 2986cab3a1bSJed Brown Level: advanced 2996cab3a1bSJed Brown 3006cab3a1bSJed Brown Note: 3016cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3026cab3a1bSJed Brown associated with the DM. 3036cab3a1bSJed Brown 3046cab3a1bSJed Brown .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction() 3056cab3a1bSJed Brown @*/ 3066cab3a1bSJed Brown PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 3076cab3a1bSJed Brown { 3086cab3a1bSJed Brown PetscErrorCode ierr; 309942e3340SBarry Smith DMSNES sdm; 3106cab3a1bSJed Brown 3116cab3a1bSJed Brown PetscFunctionBegin; 3126cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 313942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 314*22c6f798SBarry Smith if (func) *func = sdm->ops->computefunction; 3156cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 3166cab3a1bSJed Brown PetscFunctionReturn(0); 3176cab3a1bSJed Brown } 3186cab3a1bSJed Brown 3196cab3a1bSJed Brown #undef __FUNCT__ 3202a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective" 3212a4ee8f2SPeter Brune /*@C 322081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 3232a4ee8f2SPeter Brune 3242a4ee8f2SPeter Brune Not Collective 3252a4ee8f2SPeter Brune 3262a4ee8f2SPeter Brune Input Arguments: 3272a4ee8f2SPeter Brune + dm - DM to be used with SNES 3282a4ee8f2SPeter Brune . func - residual evaluation function, see SNESSetObjective() for calling sequence 3292a4ee8f2SPeter Brune - ctx - context for residual evaluation 3302a4ee8f2SPeter Brune 3312a4ee8f2SPeter Brune Level: advanced 3322a4ee8f2SPeter Brune 3332a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 3342a4ee8f2SPeter Brune @*/ 3352a4ee8f2SPeter Brune PetscErrorCode DMSNESSetObjective(DM dm,SNESObjective func,void *ctx) 3362a4ee8f2SPeter Brune { 3372a4ee8f2SPeter Brune PetscErrorCode ierr; 338942e3340SBarry Smith DMSNES sdm; 3392a4ee8f2SPeter Brune 3402a4ee8f2SPeter Brune PetscFunctionBegin; 3412a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 342fdaff8d6SPeter Brune if (func || ctx) { 343942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 344fdaff8d6SPeter Brune } 345*22c6f798SBarry Smith if (func) sdm->ops->computeobjective = func; 3462a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 3472a4ee8f2SPeter Brune PetscFunctionReturn(0); 3482a4ee8f2SPeter Brune } 3492a4ee8f2SPeter Brune 3502a4ee8f2SPeter Brune #undef __FUNCT__ 3512a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective" 3522a4ee8f2SPeter Brune /*@C 3532a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 3542a4ee8f2SPeter Brune 3552a4ee8f2SPeter Brune Not Collective 3562a4ee8f2SPeter Brune 3572a4ee8f2SPeter Brune Input Argument: 3582a4ee8f2SPeter Brune . dm - DM to be used with SNES 3592a4ee8f2SPeter Brune 3602a4ee8f2SPeter Brune Output Arguments: 3612a4ee8f2SPeter Brune + func - residual evaluation function, see SNESSetObjective() for calling sequence 3622a4ee8f2SPeter Brune - ctx - context for residual evaluation 3632a4ee8f2SPeter Brune 3642a4ee8f2SPeter Brune Level: advanced 3652a4ee8f2SPeter Brune 3662a4ee8f2SPeter Brune Note: 3672a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3682a4ee8f2SPeter Brune associated with the DM. 3692a4ee8f2SPeter Brune 3702a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 3712a4ee8f2SPeter Brune @*/ 3722a4ee8f2SPeter Brune PetscErrorCode DMSNESGetObjective(DM dm,SNESObjective *func,void **ctx) 3732a4ee8f2SPeter Brune { 3742a4ee8f2SPeter Brune PetscErrorCode ierr; 375942e3340SBarry Smith DMSNES sdm; 3762a4ee8f2SPeter Brune 3772a4ee8f2SPeter Brune PetscFunctionBegin; 3782a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 379942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 380*22c6f798SBarry Smith if (func) *func = sdm->ops->computeobjective; 3812a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 3822a4ee8f2SPeter Brune PetscFunctionReturn(0); 3832a4ee8f2SPeter Brune } 3842a4ee8f2SPeter Brune 3852a4ee8f2SPeter Brune #undef __FUNCT__ 3866cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS" 3876cab3a1bSJed Brown /*@C 3886cab3a1bSJed Brown DMSNESSetGS - set SNES Gauss-Seidel relaxation function 3896cab3a1bSJed Brown 3906cab3a1bSJed Brown Not Collective 3916cab3a1bSJed Brown 3926cab3a1bSJed Brown Input Argument: 3936cab3a1bSJed Brown + dm - DM to be used with SNES 3946cab3a1bSJed Brown . func - relaxation function, see SNESSetGS() for calling sequence 3956cab3a1bSJed Brown - ctx - context for residual evaluation 3966cab3a1bSJed Brown 3976cab3a1bSJed Brown Level: advanced 3986cab3a1bSJed Brown 3996cab3a1bSJed Brown Note: 4006cab3a1bSJed Brown SNESSetGS() is normally used, but it calls this function internally because the user context is actually 4016cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4026cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4036cab3a1bSJed Brown 4046cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction() 4056cab3a1bSJed Brown @*/ 4066cab3a1bSJed Brown PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 4076cab3a1bSJed Brown { 4086cab3a1bSJed Brown PetscErrorCode ierr; 409942e3340SBarry Smith DMSNES sdm; 4106cab3a1bSJed Brown 4116cab3a1bSJed Brown PetscFunctionBegin; 4126cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 413fdaff8d6SPeter Brune if (func || ctx) { 414942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 415fdaff8d6SPeter Brune } 416*22c6f798SBarry Smith if (func) sdm->ops->computegs = func; 4176cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 4186cab3a1bSJed Brown PetscFunctionReturn(0); 4196cab3a1bSJed Brown } 4206cab3a1bSJed Brown 4216cab3a1bSJed Brown #undef __FUNCT__ 4226cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS" 4236cab3a1bSJed Brown /*@C 4246cab3a1bSJed Brown DMSNESGetGS - get SNES Gauss-Seidel relaxation function 4256cab3a1bSJed Brown 4266cab3a1bSJed Brown Not Collective 4276cab3a1bSJed Brown 4286cab3a1bSJed Brown Input Argument: 4296cab3a1bSJed Brown . dm - DM to be used with SNES 4306cab3a1bSJed Brown 4316cab3a1bSJed Brown Output Arguments: 4326cab3a1bSJed Brown + func - relaxation function, see SNESSetGS() for calling sequence 4336cab3a1bSJed Brown - ctx - context for residual evaluation 4346cab3a1bSJed Brown 4356cab3a1bSJed Brown Level: advanced 4366cab3a1bSJed Brown 4376cab3a1bSJed Brown Note: 4386cab3a1bSJed Brown SNESGetGS() is normally used, but it calls this function internally because the user context is actually 4396cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4406cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4416cab3a1bSJed Brown 4426cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction() 4436cab3a1bSJed Brown @*/ 4446cab3a1bSJed Brown PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 4456cab3a1bSJed Brown { 4466cab3a1bSJed Brown PetscErrorCode ierr; 447942e3340SBarry Smith DMSNES sdm; 4486cab3a1bSJed Brown 4496cab3a1bSJed Brown PetscFunctionBegin; 4506cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 451942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 452*22c6f798SBarry Smith if (func) *func = sdm->ops->computegs; 4536cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 4546cab3a1bSJed Brown PetscFunctionReturn(0); 4556cab3a1bSJed Brown } 4566cab3a1bSJed Brown 4576cab3a1bSJed Brown #undef __FUNCT__ 4586cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian" 4596cab3a1bSJed Brown /*@C 460ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 4616cab3a1bSJed Brown 4626cab3a1bSJed Brown Not Collective 4636cab3a1bSJed Brown 4646cab3a1bSJed Brown Input Argument: 4656cab3a1bSJed Brown + dm - DM to be used with SNES 4666cab3a1bSJed Brown . func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 4676cab3a1bSJed Brown - ctx - context for residual evaluation 4686cab3a1bSJed Brown 4696cab3a1bSJed Brown Level: advanced 4706cab3a1bSJed Brown 4716cab3a1bSJed Brown Note: 4726cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 4736cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4746cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 4756cab3a1bSJed Brown 4766cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian() 4776cab3a1bSJed Brown @*/ 4786cab3a1bSJed Brown PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 4796cab3a1bSJed Brown { 4806cab3a1bSJed Brown PetscErrorCode ierr; 481942e3340SBarry Smith DMSNES sdm; 4826cab3a1bSJed Brown 4836cab3a1bSJed Brown PetscFunctionBegin; 4846cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4851fdfe764SBarry Smith if (func || ctx) { 486942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 4871fdfe764SBarry Smith } 488*22c6f798SBarry Smith if (func) sdm->ops->computejacobian = func; 4896cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 4906cab3a1bSJed Brown PetscFunctionReturn(0); 4916cab3a1bSJed Brown } 4926cab3a1bSJed Brown 4936cab3a1bSJed Brown #undef __FUNCT__ 4946cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian" 4956cab3a1bSJed Brown /*@C 496ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 4976cab3a1bSJed Brown 4986cab3a1bSJed Brown Not Collective 4996cab3a1bSJed Brown 5006cab3a1bSJed Brown Input Argument: 5016cab3a1bSJed Brown . dm - DM to be used with SNES 5026cab3a1bSJed Brown 5036cab3a1bSJed Brown Output Arguments: 5046cab3a1bSJed Brown + func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 5056cab3a1bSJed Brown - ctx - context for residual evaluation 5066cab3a1bSJed Brown 5076cab3a1bSJed Brown Level: advanced 5086cab3a1bSJed Brown 5096cab3a1bSJed Brown Note: 5106cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 5116cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5126cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5136cab3a1bSJed Brown 5146cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 5156cab3a1bSJed Brown @*/ 5166cab3a1bSJed Brown PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 5176cab3a1bSJed Brown { 5186cab3a1bSJed Brown PetscErrorCode ierr; 519942e3340SBarry Smith DMSNES sdm; 5206cab3a1bSJed Brown 5216cab3a1bSJed Brown PetscFunctionBegin; 5226cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 523942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 524*22c6f798SBarry Smith if (func) *func = sdm->ops->computejacobian; 5256cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 5266cab3a1bSJed Brown PetscFunctionReturn(0); 5276cab3a1bSJed Brown } 5286cab3a1bSJed Brown 5296cab3a1bSJed Brown #undef __FUNCT__ 530e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard" 531e03ab78fSPeter Brune /*@C 532e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 533e03ab78fSPeter Brune 534e03ab78fSPeter Brune Not Collective 535e03ab78fSPeter Brune 536e03ab78fSPeter Brune Input Argument: 537e03ab78fSPeter Brune + dm - DM to be used with SNES 538e03ab78fSPeter Brune . func - RHS evaluation function, see SNESSetFunction() for calling sequence 539e03ab78fSPeter Brune . pjac - Picard matrix evaluation function, see SNESSetJacobian() for calling sequence 540e03ab78fSPeter Brune - ctx - context for residual evaluation 541e03ab78fSPeter Brune 542e03ab78fSPeter Brune Level: advanced 543e03ab78fSPeter Brune 544e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 545e03ab78fSPeter Brune @*/ 546e03ab78fSPeter Brune PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (*pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 547e03ab78fSPeter Brune { 548e03ab78fSPeter Brune PetscErrorCode ierr; 549942e3340SBarry Smith DMSNES sdm; 550e03ab78fSPeter Brune 551e03ab78fSPeter Brune PetscFunctionBegin; 552e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 553942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 554*22c6f798SBarry Smith if (pfunc) sdm->ops->computepfunction = pfunc; 555*22c6f798SBarry Smith if (pjac) sdm->ops->computepjacobian = pjac; 556e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 557e03ab78fSPeter Brune PetscFunctionReturn(0); 558e03ab78fSPeter Brune } 559e03ab78fSPeter Brune 5607971a8bfSPeter Brune 5617971a8bfSPeter Brune #undef __FUNCT__ 5627971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard" 5637971a8bfSPeter Brune /*@C 5647971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 5657971a8bfSPeter Brune 5667971a8bfSPeter Brune Not Collective 5677971a8bfSPeter Brune 5687971a8bfSPeter Brune Input Argument: 5697971a8bfSPeter Brune . dm - DM to be used with SNES 5707971a8bfSPeter Brune 5717971a8bfSPeter Brune Output Arguments: 5727971a8bfSPeter Brune + pfunc - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 5737971a8bfSPeter Brune . pjac - RHS evaluation function, see SNESSetFunction() for calling sequence 5747971a8bfSPeter Brune - ctx - context for residual evaluation 5757971a8bfSPeter Brune 5767971a8bfSPeter Brune Level: advanced 5777971a8bfSPeter Brune 5787971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 5797971a8bfSPeter Brune @*/ 5807971a8bfSPeter Brune PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (**pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 5817971a8bfSPeter Brune { 5827971a8bfSPeter Brune PetscErrorCode ierr; 583942e3340SBarry Smith DMSNES sdm; 5847971a8bfSPeter Brune 5857971a8bfSPeter Brune PetscFunctionBegin; 5867971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 587942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 588*22c6f798SBarry Smith if (pfunc) *pfunc = sdm->ops->computepfunction; 589*22c6f798SBarry Smith if (pjac) *pjac = sdm->ops->computepjacobian; 5907971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 5917971a8bfSPeter Brune PetscFunctionReturn(0); 5927971a8bfSPeter Brune } 5937971a8bfSPeter Brune 5946427ad5bSPeter Brune /* block functions */ 5956427ad5bSPeter Brune 5966427ad5bSPeter Brune #undef __FUNCT__ 5976427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockFunction" 5986427ad5bSPeter Brune /*@C 5996427ad5bSPeter Brune DMSNESSetBlockFunction - set SNES residual evaluation function 6006427ad5bSPeter Brune 6016427ad5bSPeter Brune Not Collective 6026427ad5bSPeter Brune 6036427ad5bSPeter Brune Input Arguments: 6046427ad5bSPeter Brune + dm - DM to be used with SNES 6056427ad5bSPeter Brune . func - residual evaluation function, see SNESSetFunction() for calling sequence 6066427ad5bSPeter Brune - ctx - context for residual evaluation 6076427ad5bSPeter Brune 6086427ad5bSPeter Brune Level: developer 6096427ad5bSPeter Brune 6106427ad5bSPeter Brune Note: 6116427ad5bSPeter Brune Mostly for use in DM implementations and transferred to a block function rather than being called from here. 6126427ad5bSPeter Brune 6136427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 6146427ad5bSPeter Brune @*/ 6156427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 6166427ad5bSPeter Brune { 6176427ad5bSPeter Brune PetscErrorCode ierr; 618942e3340SBarry Smith DMSNES sdm; 6196427ad5bSPeter Brune 6206427ad5bSPeter Brune PetscFunctionBegin; 6216427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 622fdaff8d6SPeter Brune if (func || ctx) { 623942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 624fdaff8d6SPeter Brune } 625*22c6f798SBarry Smith if (func) sdm->ops->computeblockfunction = func; 6266427ad5bSPeter Brune if (ctx) sdm->blockfunctionctx = ctx; 6276427ad5bSPeter Brune PetscFunctionReturn(0); 6286427ad5bSPeter Brune } 6296427ad5bSPeter Brune 6306427ad5bSPeter Brune #undef __FUNCT__ 6316427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockFunction" 6326427ad5bSPeter Brune /*@C 6336427ad5bSPeter Brune DMSNESGetBlockFunction - get SNES residual evaluation function 6346427ad5bSPeter Brune 6356427ad5bSPeter Brune Not Collective 6366427ad5bSPeter Brune 6376427ad5bSPeter Brune Input Argument: 6386427ad5bSPeter Brune . dm - DM to be used with SNES 6396427ad5bSPeter Brune 6406427ad5bSPeter Brune Output Arguments: 6416427ad5bSPeter Brune + func - residual evaluation function, see SNESSetFunction() for calling sequence 6426427ad5bSPeter Brune - ctx - context for residual evaluation 6436427ad5bSPeter Brune 6446427ad5bSPeter Brune Level: developer 6456427ad5bSPeter Brune 6466427ad5bSPeter Brune .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction() 6476427ad5bSPeter Brune @*/ 6486427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 6496427ad5bSPeter Brune { 6506427ad5bSPeter Brune PetscErrorCode ierr; 651942e3340SBarry Smith DMSNES sdm; 6526427ad5bSPeter Brune 6536427ad5bSPeter Brune PetscFunctionBegin; 6546427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 655942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 656*22c6f798SBarry Smith if (func) *func = sdm->ops->computeblockfunction; 6576427ad5bSPeter Brune if (ctx) *ctx = sdm->blockfunctionctx; 6586427ad5bSPeter Brune PetscFunctionReturn(0); 6596427ad5bSPeter Brune } 6606427ad5bSPeter Brune 6616427ad5bSPeter Brune 6626427ad5bSPeter Brune #undef __FUNCT__ 6636427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockJacobian" 6646427ad5bSPeter Brune /*@C 6656427ad5bSPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 6666427ad5bSPeter Brune 6676427ad5bSPeter Brune Not Collective 6686427ad5bSPeter Brune 6696427ad5bSPeter Brune Input Argument: 6706427ad5bSPeter Brune + dm - DM to be used with SNES 6716427ad5bSPeter Brune . func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 6726427ad5bSPeter Brune - ctx - context for residual evaluation 6736427ad5bSPeter Brune 6746427ad5bSPeter Brune Level: advanced 6756427ad5bSPeter Brune 6766427ad5bSPeter Brune Note: 6776427ad5bSPeter Brune Mostly for use in DM implementations and transferred to a block function rather than being called from here. 6786427ad5bSPeter Brune 6796427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian() 6806427ad5bSPeter Brune @*/ 6816427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 6826427ad5bSPeter Brune { 6836427ad5bSPeter Brune PetscErrorCode ierr; 684942e3340SBarry Smith DMSNES sdm; 6856427ad5bSPeter Brune 6866427ad5bSPeter Brune PetscFunctionBegin; 6876427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 688fdaff8d6SPeter Brune if (func || ctx) { 689942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 690fdaff8d6SPeter Brune } 691*22c6f798SBarry Smith if (func) sdm->ops->computeblockjacobian = func; 6926427ad5bSPeter Brune if (ctx) sdm->blockjacobianctx = ctx; 6936427ad5bSPeter Brune PetscFunctionReturn(0); 6946427ad5bSPeter Brune } 6956427ad5bSPeter Brune 6966427ad5bSPeter Brune #undef __FUNCT__ 6976427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockJacobian" 6986427ad5bSPeter Brune /*@C 6996427ad5bSPeter Brune DMSNESGetBlockJacobian - get SNES Jacobian evaluation function 7006427ad5bSPeter Brune 7016427ad5bSPeter Brune Not Collective 7026427ad5bSPeter Brune 7036427ad5bSPeter Brune Input Argument: 7046427ad5bSPeter Brune . dm - DM to be used with SNES 7056427ad5bSPeter Brune 7066427ad5bSPeter Brune Output Arguments: 7076427ad5bSPeter Brune + func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 7086427ad5bSPeter Brune - ctx - context for residual evaluation 7096427ad5bSPeter Brune 7106427ad5bSPeter Brune Level: advanced 7116427ad5bSPeter Brune 7126427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 7136427ad5bSPeter Brune @*/ 7146427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 7156427ad5bSPeter Brune { 7166427ad5bSPeter Brune PetscErrorCode ierr; 717942e3340SBarry Smith DMSNES sdm; 7186427ad5bSPeter Brune 7196427ad5bSPeter Brune PetscFunctionBegin; 7206427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 721942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 722*22c6f798SBarry Smith if (func) *func = sdm->ops->computeblockjacobian; 7236427ad5bSPeter Brune if (ctx) *ctx = sdm->blockjacobianctx; 7246427ad5bSPeter Brune PetscFunctionReturn(0); 7256427ad5bSPeter Brune } 726