1af0996ceSBarry Smith #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/ 2af0996ceSBarry Smith #include <petsc/private/dmimpl.h> /*I "petscdm.h" I*/ 36cab3a1bSJed Brown 422c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm) 56cab3a1bSJed Brown { 66cab3a1bSJed Brown PetscFunctionBegin; 722c6f798SBarry Smith if (!*kdm) PetscFunctionReturn(0); 822c6f798SBarry Smith PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1); 99e5d0892SLisandro Dalcin if (--((PetscObject)(*kdm))->refct > 0) {*kdm = NULL; PetscFunctionReturn(0);} 105f80ce2aSJacob Faibussowitsch if ((*kdm)->ops->destroy) CHKERRQ(((*kdm)->ops->destroy)(*kdm)); 115f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(kdm)); 1222c6f798SBarry Smith PetscFunctionReturn(0); 1322c6f798SBarry Smith } 1422c6f798SBarry Smith 152d53ad75SBarry Smith PetscErrorCode DMSNESLoad(DMSNES kdm,PetscViewer viewer) 162d53ad75SBarry Smith { 172d53ad75SBarry Smith PetscFunctionBegin; 185f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,NULL,PETSC_FUNCTION)); 195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,NULL,PETSC_FUNCTION)); 202d53ad75SBarry Smith PetscFunctionReturn(0); 212d53ad75SBarry Smith } 222d53ad75SBarry Smith 232d53ad75SBarry Smith PetscErrorCode DMSNESView(DMSNES kdm,PetscViewer viewer) 242d53ad75SBarry Smith { 252d53ad75SBarry Smith PetscBool isascii,isbinary; 262d53ad75SBarry Smith 272d53ad75SBarry Smith PetscFunctionBegin; 285f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); 295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary)); 302d53ad75SBarry Smith if (isascii) { 314b5d3663SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) && defined(PETSC_SERIALIZE_FUNCTIONS_VIEW) 322d53ad75SBarry Smith const char *fname; 332d53ad75SBarry Smith 345f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFPTFind(kdm->ops->computefunction,&fname)); 352d53ad75SBarry Smith if (fname) { 365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"Function used by SNES: %s\n",fname)); 372d53ad75SBarry Smith } 385f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFPTFind(kdm->ops->computejacobian,&fname)); 392d53ad75SBarry Smith if (fname) { 405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer,"Jacobian function used by SNES: %s\n",fname)); 412d53ad75SBarry Smith } 42c7a10e08SBarry Smith #endif 432d53ad75SBarry Smith } else if (isbinary) { 443964eb88SJed Brown struct { 453964eb88SJed Brown PetscErrorCode (*func)(SNES,Vec,Vec,void*); 469200755eSBarry Smith } funcstruct; 479200755eSBarry Smith struct { 48d1e9a80fSBarry Smith PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*); 499200755eSBarry Smith } jacstruct; 509200755eSBarry Smith funcstruct.func = kdm->ops->computefunction; 519200755eSBarry Smith jacstruct.jac = kdm->ops->computejacobian; 525f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION)); 535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION)); 542d53ad75SBarry Smith } 552d53ad75SBarry Smith PetscFunctionReturn(0); 562d53ad75SBarry Smith } 572d53ad75SBarry Smith 5822c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm) 5922c6f798SBarry Smith { 6022c6f798SBarry Smith PetscFunctionBegin; 615f80ce2aSJacob Faibussowitsch CHKERRQ(SNESInitializePackage()); 625f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(*kdm, DMSNES_CLASSID, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView)); 636cab3a1bSJed Brown PetscFunctionReturn(0); 646cab3a1bSJed Brown } 656cab3a1bSJed Brown 66942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 676cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 686cab3a1bSJed Brown */ 69942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 706cab3a1bSJed Brown { 716cab3a1bSJed Brown PetscFunctionBegin; 725f80ce2aSJacob Faibussowitsch CHKERRQ(DMCopyDMSNES(dm,dmc)); 736cab3a1bSJed Brown PetscFunctionReturn(0); 746cab3a1bSJed Brown } 756cab3a1bSJed Brown 76dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 77caa4e7f2SJed Brown */ 78942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 79caa4e7f2SJed Brown { 80caa4e7f2SJed Brown PetscFunctionBegin; 81caa4e7f2SJed Brown PetscFunctionReturn(0); 82caa4e7f2SJed Brown } 83caa4e7f2SJed Brown 84be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */ 85be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx) 86be081cd6SPeter Brune { 87be081cd6SPeter Brune PetscFunctionBegin; 885f80ce2aSJacob Faibussowitsch CHKERRQ(DMCopyDMSNES(dm,subdm)); 89be081cd6SPeter Brune PetscFunctionReturn(0); 90be081cd6SPeter Brune } 91be081cd6SPeter Brune 92be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level. 93be081cd6SPeter Brune */ 94be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx) 95be081cd6SPeter Brune { 96be081cd6SPeter Brune PetscFunctionBegin; 97be081cd6SPeter Brune PetscFunctionReturn(0); 98be081cd6SPeter Brune } 99be081cd6SPeter Brune 100942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 10103a0fabfSPeter Brune { 10203a0fabfSPeter Brune PetscFunctionBegin; 1035f80ce2aSJacob Faibussowitsch CHKERRQ(DMCopyDMSNES(dm,dmf)); 10403a0fabfSPeter Brune PetscFunctionReturn(0); 10503a0fabfSPeter Brune } 10603a0fabfSPeter Brune 10703a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 10803a0fabfSPeter Brune */ 109942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 11003a0fabfSPeter Brune { 11103a0fabfSPeter Brune PetscFunctionBegin; 11203a0fabfSPeter Brune PetscFunctionReturn(0); 11303a0fabfSPeter Brune } 11403a0fabfSPeter Brune 11522c6f798SBarry Smith /*@C 11622c6f798SBarry Smith DMSNESCopy - copies the information in a DMSNES to another DMSNES 11722c6f798SBarry Smith 11822c6f798SBarry Smith Not Collective 11922c6f798SBarry Smith 1204165533cSJose E. Roman Input Parameters: 12122c6f798SBarry Smith + kdm - Original DMSNES 12222c6f798SBarry Smith - nkdm - DMSNES to receive the data, should have been created with DMSNESCreate() 12322c6f798SBarry Smith 12422c6f798SBarry Smith Level: developer 12522c6f798SBarry Smith 12622c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy() 12722c6f798SBarry Smith @*/ 12822c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm) 12922c6f798SBarry Smith { 13022c6f798SBarry Smith PetscFunctionBegin; 13122c6f798SBarry Smith PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1); 13222c6f798SBarry Smith PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2); 13322c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 1342bc4d0c4SPeter Brune nkdm->ops->computejacobian = kdm->ops->computejacobian; 13522c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 13622c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 13722c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 13822c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 13922c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 14022c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 14122c6f798SBarry Smith 14222c6f798SBarry Smith nkdm->functionctx = kdm->functionctx; 14322c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 14422c6f798SBarry Smith nkdm->pctx = kdm->pctx; 14522c6f798SBarry Smith nkdm->jacobianctx = kdm->jacobianctx; 14622c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 147af903c1dSJunchao Zhang nkdm->originaldm = kdm->originaldm; 14822c6f798SBarry Smith 14922c6f798SBarry Smith /* 15022c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 15122c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 15222c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 15322c6f798SBarry Smith */ 15422c6f798SBarry Smith 15522c6f798SBarry Smith /* implementation specific copy hooks */ 1565f80ce2aSJacob Faibussowitsch if (kdm->ops->duplicate) CHKERRQ((*kdm->ops->duplicate)(kdm,nkdm)); 15722c6f798SBarry Smith PetscFunctionReturn(0); 15822c6f798SBarry Smith } 15922c6f798SBarry Smith 1606cab3a1bSJed Brown /*@C 161942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 1626cab3a1bSJed Brown 1636cab3a1bSJed Brown Not Collective 1646cab3a1bSJed Brown 1654165533cSJose E. Roman Input Parameter: 1666cab3a1bSJed Brown . dm - DM to be used with SNES 1676cab3a1bSJed Brown 1684165533cSJose E. Roman Output Parameter: 169942e3340SBarry Smith . snesdm - private DMSNES context 1706cab3a1bSJed Brown 1716cab3a1bSJed Brown Level: developer 1726cab3a1bSJed Brown 1736cab3a1bSJed Brown Notes: 174942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 1756cab3a1bSJed Brown 176942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 1776cab3a1bSJed Brown @*/ 178942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 1796cab3a1bSJed Brown { 1806cab3a1bSJed Brown PetscFunctionBegin; 1816cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 182b4615a05SBarry Smith *snesdm = (DMSNES) dm->dmsnes; 18322c6f798SBarry Smith if (!*snesdm) { 1845f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(dm,"Creating new DMSNES\n")); 1855f80ce2aSJacob Faibussowitsch CHKERRQ(DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm)); 1861aa26658SKarl Rupp 187b4615a05SBarry Smith dm->dmsnes = (PetscObject) *snesdm; 188af903c1dSJunchao Zhang (*snesdm)->originaldm = dm; 1895f80ce2aSJacob Faibussowitsch CHKERRQ(DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL)); 1905f80ce2aSJacob Faibussowitsch CHKERRQ(DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL)); 1915f80ce2aSJacob Faibussowitsch CHKERRQ(DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL)); 1926cab3a1bSJed Brown } 1936cab3a1bSJed Brown PetscFunctionReturn(0); 1946cab3a1bSJed Brown } 1956cab3a1bSJed Brown 1966cab3a1bSJed Brown /*@C 197942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 1986cab3a1bSJed Brown 1996cab3a1bSJed Brown Not Collective 2006cab3a1bSJed Brown 2014165533cSJose E. Roman Input Parameter: 2026cab3a1bSJed Brown . dm - DM to be used with SNES 2036cab3a1bSJed Brown 2044165533cSJose E. Roman Output Parameter: 205942e3340SBarry Smith . snesdm - private DMSNES context 2066cab3a1bSJed Brown 2076cab3a1bSJed Brown Level: developer 2086cab3a1bSJed Brown 209942e3340SBarry Smith .seealso: DMGetDMSNES() 2106cab3a1bSJed Brown @*/ 211942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 2126cab3a1bSJed Brown { 213942e3340SBarry Smith DMSNES sdm; 2146cab3a1bSJed Brown 2156cab3a1bSJed Brown PetscFunctionBegin; 2166cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2175f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 218*28b400f6SJacob Faibussowitsch PetscCheck(sdm->originaldm,PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"DMSNES has a NULL originaldm"); 2196cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 220b4615a05SBarry Smith DMSNES oldsdm = sdm; 2215f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(dm,"Copying DMSNES due to write\n")); 2225f80ce2aSJacob Faibussowitsch CHKERRQ(DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm)); 2235f80ce2aSJacob Faibussowitsch CHKERRQ(DMSNESCopy(oldsdm,sdm)); 2245f80ce2aSJacob Faibussowitsch CHKERRQ(DMSNESDestroy((DMSNES*)&dm->dmsnes)); 225b4615a05SBarry Smith dm->dmsnes = (PetscObject)sdm; 226af903c1dSJunchao Zhang sdm->originaldm = dm; 2276cab3a1bSJed Brown } 2286cab3a1bSJed Brown *snesdm = sdm; 2296cab3a1bSJed Brown PetscFunctionReturn(0); 2306cab3a1bSJed Brown } 2316cab3a1bSJed Brown 2326cab3a1bSJed Brown /*@C 233942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 2346cab3a1bSJed Brown 2356cab3a1bSJed Brown Logically Collective 2366cab3a1bSJed Brown 2374165533cSJose E. Roman Input Parameters: 2386cab3a1bSJed Brown + dmsrc - DM to obtain context from 2396cab3a1bSJed Brown - dmdest - DM to add context to 2406cab3a1bSJed Brown 2416cab3a1bSJed Brown Level: developer 2426cab3a1bSJed Brown 2436cab3a1bSJed Brown Note: 2446cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2456cab3a1bSJed Brown 246942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 2476cab3a1bSJed Brown @*/ 248942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 2496cab3a1bSJed Brown { 2506cab3a1bSJed Brown PetscFunctionBegin; 2516cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 2526cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 2535f80ce2aSJacob Faibussowitsch if (!dmdest->dmsnes) CHKERRQ(DMSNESCreate(PetscObjectComm((PetscObject) dmdest), (DMSNES *) &dmdest->dmsnes)); 2545f80ce2aSJacob Faibussowitsch CHKERRQ(DMSNESCopy((DMSNES) dmsrc->dmsnes, (DMSNES) dmdest->dmsnes)); 2555f80ce2aSJacob Faibussowitsch CHKERRQ(DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL)); 2565f80ce2aSJacob Faibussowitsch CHKERRQ(DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL)); 2575f80ce2aSJacob Faibussowitsch CHKERRQ(DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL)); 2586cab3a1bSJed Brown PetscFunctionReturn(0); 2596cab3a1bSJed Brown } 2606cab3a1bSJed Brown 2616cab3a1bSJed Brown /*@C 2626cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 2636cab3a1bSJed Brown 2646cab3a1bSJed Brown Not Collective 2656cab3a1bSJed Brown 2664165533cSJose E. Roman Input Parameters: 2676cab3a1bSJed Brown + dm - DM to be used with SNES 268f8b49ee9SBarry Smith . f - residual evaluation function; see SNESFunction for details 2696cab3a1bSJed Brown - ctx - context for residual evaluation 2706cab3a1bSJed Brown 2716cab3a1bSJed Brown Level: advanced 2726cab3a1bSJed Brown 2736cab3a1bSJed Brown Note: 2746cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 2756cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 2766cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 2776cab3a1bSJed Brown 278bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction 2796cab3a1bSJed Brown @*/ 280f8b49ee9SBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx) 2816cab3a1bSJed Brown { 282942e3340SBarry Smith DMSNES sdm; 2836cab3a1bSJed Brown 2846cab3a1bSJed Brown PetscFunctionBegin; 2856cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 286f8b49ee9SBarry Smith if (f || ctx) { 2875f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNESWrite(dm,&sdm)); 288fdaff8d6SPeter Brune } 289f8b49ee9SBarry Smith if (f) sdm->ops->computefunction = f; 2906cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 2916cab3a1bSJed Brown PetscFunctionReturn(0); 2926cab3a1bSJed Brown } 2936cab3a1bSJed Brown 2946cab3a1bSJed Brown /*@C 295bbc1464cSBarry Smith DMSNESSetMFFunction - set SNES residual evaluation function used in applying the matrix-free Jacobian with -snes_mf_operator 296bbc1464cSBarry Smith 297bbc1464cSBarry Smith Logically Collective on dm 298bbc1464cSBarry Smith 2994165533cSJose E. Roman Input Parameters: 300bbc1464cSBarry Smith + dm - DM to be used with SNES 301bbc1464cSBarry Smith - f - residual evaluation function; see SNESFunction for details 302bbc1464cSBarry Smith 303bbc1464cSBarry Smith Level: advanced 304bbc1464cSBarry Smith 305bbc1464cSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction, DMSNESSetFunction() 306bbc1464cSBarry Smith @*/ 307bbc1464cSBarry Smith PetscErrorCode DMSNESSetMFFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx) 308bbc1464cSBarry Smith { 309bbc1464cSBarry Smith DMSNES sdm; 310bbc1464cSBarry Smith 311bbc1464cSBarry Smith PetscFunctionBegin; 312bbc1464cSBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 313bbc1464cSBarry Smith if (f || ctx) { 3145f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNESWrite(dm,&sdm)); 315bbc1464cSBarry Smith } 316bbc1464cSBarry Smith if (f) sdm->ops->computemffunction = f; 317bbc1464cSBarry Smith if (ctx) sdm->mffunctionctx = ctx; 318bbc1464cSBarry Smith PetscFunctionReturn(0); 319bbc1464cSBarry Smith } 320bbc1464cSBarry Smith 321bbc1464cSBarry Smith /*@C 3226cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 3236cab3a1bSJed Brown 3246cab3a1bSJed Brown Not Collective 3256cab3a1bSJed Brown 3264165533cSJose E. Roman Input Parameter: 3276cab3a1bSJed Brown . dm - DM to be used with SNES 3286cab3a1bSJed Brown 3294165533cSJose E. Roman Output Parameters: 330f8b49ee9SBarry Smith + f - residual evaluation function; see SNESFunction for details 3316cab3a1bSJed Brown - ctx - context for residual evaluation 3326cab3a1bSJed Brown 3336cab3a1bSJed Brown Level: advanced 3346cab3a1bSJed Brown 3356cab3a1bSJed Brown Note: 3366cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3376cab3a1bSJed Brown associated with the DM. 3386cab3a1bSJed Brown 339bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction 3406cab3a1bSJed Brown @*/ 341f8b49ee9SBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx) 3426cab3a1bSJed Brown { 343942e3340SBarry Smith DMSNES sdm; 3446cab3a1bSJed Brown 3456cab3a1bSJed Brown PetscFunctionBegin; 3466cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 3475f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 348f8b49ee9SBarry Smith if (f) *f = sdm->ops->computefunction; 3496cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 3506cab3a1bSJed Brown PetscFunctionReturn(0); 3516cab3a1bSJed Brown } 3526cab3a1bSJed Brown 3532a4ee8f2SPeter Brune /*@C 354081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 3552a4ee8f2SPeter Brune 3562a4ee8f2SPeter Brune Not Collective 3572a4ee8f2SPeter Brune 3584165533cSJose E. Roman Input Parameters: 3592a4ee8f2SPeter Brune + dm - DM to be used with SNES 360f8b49ee9SBarry Smith . obj - objective evaluation function; see SNESObjectiveFunction for details 3612a4ee8f2SPeter Brune - ctx - context for residual evaluation 3622a4ee8f2SPeter Brune 3632a4ee8f2SPeter Brune Level: advanced 3642a4ee8f2SPeter Brune 3652a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 3662a4ee8f2SPeter Brune @*/ 367f8b49ee9SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*obj)(SNES,Vec,PetscReal*,void*),void *ctx) 3682a4ee8f2SPeter Brune { 369942e3340SBarry Smith DMSNES sdm; 3702a4ee8f2SPeter Brune 3712a4ee8f2SPeter Brune PetscFunctionBegin; 3722a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 373f8b49ee9SBarry Smith if (obj || ctx) { 3745f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNESWrite(dm,&sdm)); 375fdaff8d6SPeter Brune } 376f8b49ee9SBarry Smith if (obj) sdm->ops->computeobjective = obj; 3772a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 3782a4ee8f2SPeter Brune PetscFunctionReturn(0); 3792a4ee8f2SPeter Brune } 3802a4ee8f2SPeter Brune 3812a4ee8f2SPeter Brune /*@C 3822a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 3832a4ee8f2SPeter Brune 3842a4ee8f2SPeter Brune Not Collective 3852a4ee8f2SPeter Brune 3864165533cSJose E. Roman Input Parameter: 3872a4ee8f2SPeter Brune . dm - DM to be used with SNES 3882a4ee8f2SPeter Brune 3894165533cSJose E. Roman Output Parameters: 390f8b49ee9SBarry Smith + obj- residual evaluation function; see SNESObjectiveFunction for details 3912a4ee8f2SPeter Brune - ctx - context for residual evaluation 3922a4ee8f2SPeter Brune 3932a4ee8f2SPeter Brune Level: advanced 3942a4ee8f2SPeter Brune 3952a4ee8f2SPeter Brune Note: 3962a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3972a4ee8f2SPeter Brune associated with the DM. 3982a4ee8f2SPeter Brune 3992a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 4002a4ee8f2SPeter Brune @*/ 401f8b49ee9SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**obj)(SNES,Vec,PetscReal*,void*),void **ctx) 4022a4ee8f2SPeter Brune { 403942e3340SBarry Smith DMSNES sdm; 4042a4ee8f2SPeter Brune 4052a4ee8f2SPeter Brune PetscFunctionBegin; 4062a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4075f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 408f8b49ee9SBarry Smith if (obj) *obj = sdm->ops->computeobjective; 4092a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 4102a4ee8f2SPeter Brune PetscFunctionReturn(0); 4112a4ee8f2SPeter Brune } 4122a4ee8f2SPeter Brune 4136cab3a1bSJed Brown /*@C 414be95d8f1SBarry Smith DMSNESSetNGS - set SNES Gauss-Seidel relaxation function 4156cab3a1bSJed Brown 4166cab3a1bSJed Brown Not Collective 4176cab3a1bSJed Brown 4184165533cSJose E. Roman Input Parameters: 4196cab3a1bSJed Brown + dm - DM to be used with SNES 420be95d8f1SBarry Smith . f - relaxation function, see SNESGSFunction 4216cab3a1bSJed Brown - ctx - context for residual evaluation 4226cab3a1bSJed Brown 4236cab3a1bSJed Brown Level: advanced 4246cab3a1bSJed Brown 4256cab3a1bSJed Brown Note: 426be95d8f1SBarry Smith SNESSetNGS() is normally used, but it calls this function internally because the user context is actually 4276cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4286cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4296cab3a1bSJed Brown 430bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction 4316cab3a1bSJed Brown @*/ 432be95d8f1SBarry Smith PetscErrorCode DMSNESSetNGS(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx) 4336cab3a1bSJed Brown { 434942e3340SBarry Smith DMSNES sdm; 4356cab3a1bSJed Brown 4366cab3a1bSJed Brown PetscFunctionBegin; 4376cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 438be95d8f1SBarry Smith if (f || ctx) { 4395f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNESWrite(dm,&sdm)); 440fdaff8d6SPeter Brune } 441be95d8f1SBarry Smith if (f) sdm->ops->computegs = f; 4426cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 4436cab3a1bSJed Brown PetscFunctionReturn(0); 4446cab3a1bSJed Brown } 4456cab3a1bSJed Brown 4466cab3a1bSJed Brown /*@C 447be95d8f1SBarry Smith DMSNESGetNGS - get SNES Gauss-Seidel relaxation function 4486cab3a1bSJed Brown 4496cab3a1bSJed Brown Not Collective 4506cab3a1bSJed Brown 4514165533cSJose E. Roman Input Parameter: 4526cab3a1bSJed Brown . dm - DM to be used with SNES 4536cab3a1bSJed Brown 4544165533cSJose E. Roman Output Parameters: 455be95d8f1SBarry Smith + f - relaxation function which performs Gauss-Seidel sweeps, see SNESGSFunction 4566cab3a1bSJed Brown - ctx - context for residual evaluation 4576cab3a1bSJed Brown 4586cab3a1bSJed Brown Level: advanced 4596cab3a1bSJed Brown 4606cab3a1bSJed Brown Note: 461be95d8f1SBarry Smith SNESGetNGS() is normally used, but it calls this function internally because the user context is actually 4626cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4636cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4646cab3a1bSJed Brown 465be95d8f1SBarry Smith .seealso: DMSNESSetContext(), SNESGetNGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESNGSFunction 4666cab3a1bSJed Brown @*/ 467be95d8f1SBarry Smith PetscErrorCode DMSNESGetNGS(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx) 4686cab3a1bSJed Brown { 469942e3340SBarry Smith DMSNES sdm; 4706cab3a1bSJed Brown 4716cab3a1bSJed Brown PetscFunctionBegin; 4726cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4735f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 474be95d8f1SBarry Smith if (f) *f = sdm->ops->computegs; 4756cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 4766cab3a1bSJed Brown PetscFunctionReturn(0); 4776cab3a1bSJed Brown } 4786cab3a1bSJed Brown 4796cab3a1bSJed Brown /*@C 480ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 4816cab3a1bSJed Brown 4826cab3a1bSJed Brown Not Collective 4836cab3a1bSJed Brown 4844165533cSJose E. Roman Input Parameters: 4856cab3a1bSJed Brown + dm - DM to be used with SNES 486f8b49ee9SBarry Smith . J - Jacobian evaluation function 4876cab3a1bSJed Brown - ctx - context for residual evaluation 4886cab3a1bSJed Brown 4896cab3a1bSJed Brown Level: advanced 4906cab3a1bSJed Brown 4916cab3a1bSJed Brown Note: 4926cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 4936cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4946cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 4956cab3a1bSJed Brown 496bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction 4976cab3a1bSJed Brown @*/ 498d1e9a80fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) 4996cab3a1bSJed Brown { 500942e3340SBarry Smith DMSNES sdm; 5016cab3a1bSJed Brown 5026cab3a1bSJed Brown PetscFunctionBegin; 5036cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 504f8b49ee9SBarry Smith if (J || ctx) { 5055f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNESWrite(dm,&sdm)); 5061fdfe764SBarry Smith } 507f8b49ee9SBarry Smith if (J) sdm->ops->computejacobian = J; 5086cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 5096cab3a1bSJed Brown PetscFunctionReturn(0); 5106cab3a1bSJed Brown } 5116cab3a1bSJed Brown 5126cab3a1bSJed Brown /*@C 513ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 5146cab3a1bSJed Brown 5156cab3a1bSJed Brown Not Collective 5166cab3a1bSJed Brown 5174165533cSJose E. Roman Input Parameter: 5186cab3a1bSJed Brown . dm - DM to be used with SNES 5196cab3a1bSJed Brown 5204165533cSJose E. Roman Output Parameters: 521f8b49ee9SBarry Smith + J - Jacobian evaluation function; see SNESJacobianFunction for all calling sequence 5226cab3a1bSJed Brown - ctx - context for residual evaluation 5236cab3a1bSJed Brown 5246cab3a1bSJed Brown Level: advanced 5256cab3a1bSJed Brown 5266cab3a1bSJed Brown Note: 5276cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 5286cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5296cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5306cab3a1bSJed Brown 531bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction 5326cab3a1bSJed Brown @*/ 533d1e9a80fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx) 5346cab3a1bSJed Brown { 535942e3340SBarry Smith DMSNES sdm; 5366cab3a1bSJed Brown 5376cab3a1bSJed Brown PetscFunctionBegin; 5386cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5395f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 540f8b49ee9SBarry Smith if (J) *J = sdm->ops->computejacobian; 5416cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 5426cab3a1bSJed Brown PetscFunctionReturn(0); 5436cab3a1bSJed Brown } 5446cab3a1bSJed Brown 545e03ab78fSPeter Brune /*@C 546e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 547e03ab78fSPeter Brune 548e03ab78fSPeter Brune Not Collective 549e03ab78fSPeter Brune 5504165533cSJose E. Roman Input Parameters: 551e03ab78fSPeter Brune + dm - DM to be used with SNES 552f8b49ee9SBarry Smith . b - RHS evaluation function 553f8b49ee9SBarry Smith . J - Picard matrix evaluation function 554e03ab78fSPeter Brune - ctx - context for residual evaluation 555e03ab78fSPeter Brune 556e03ab78fSPeter Brune Level: advanced 557e03ab78fSPeter Brune 558e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 559e03ab78fSPeter Brune @*/ 560d1e9a80fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*b)(SNES,Vec,Vec,void*),PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) 561e03ab78fSPeter Brune { 562942e3340SBarry Smith DMSNES sdm; 563e03ab78fSPeter Brune 564e03ab78fSPeter Brune PetscFunctionBegin; 565e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5665f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 567f8b49ee9SBarry Smith if (b) sdm->ops->computepfunction = b; 568f8b49ee9SBarry Smith if (J) sdm->ops->computepjacobian = J; 569e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 570e03ab78fSPeter Brune PetscFunctionReturn(0); 571e03ab78fSPeter Brune } 572e03ab78fSPeter Brune 5737971a8bfSPeter Brune /*@C 5747971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 5757971a8bfSPeter Brune 5767971a8bfSPeter Brune Not Collective 5777971a8bfSPeter Brune 5784165533cSJose E. Roman Input Parameter: 5797971a8bfSPeter Brune . dm - DM to be used with SNES 5807971a8bfSPeter Brune 5814165533cSJose E. Roman Output Parameters: 582f8b49ee9SBarry Smith + b - RHS evaluation function; see SNESFunction for details 583f8b49ee9SBarry Smith . J - RHS evaluation function; see SNESJacobianFunction for detailsa 5847971a8bfSPeter Brune - ctx - context for residual evaluation 5857971a8bfSPeter Brune 5867971a8bfSPeter Brune Level: advanced 5877971a8bfSPeter Brune 5887971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 5897971a8bfSPeter Brune @*/ 590d1e9a80fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**b)(SNES,Vec,Vec,void*),PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx) 5917971a8bfSPeter Brune { 592942e3340SBarry Smith DMSNES sdm; 5937971a8bfSPeter Brune 5947971a8bfSPeter Brune PetscFunctionBegin; 5957971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5965f80ce2aSJacob Faibussowitsch CHKERRQ(DMGetDMSNES(dm,&sdm)); 597f8b49ee9SBarry Smith if (b) *b = sdm->ops->computepfunction; 598f8b49ee9SBarry Smith if (J) *J = sdm->ops->computepjacobian; 5997971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 6007971a8bfSPeter Brune PetscFunctionReturn(0); 6017971a8bfSPeter Brune } 602