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 PetscErrorCode ierr; 76cab3a1bSJed Brown 86cab3a1bSJed Brown PetscFunctionBegin; 922c6f798SBarry Smith if (!*kdm) PetscFunctionReturn(0); 1022c6f798SBarry Smith PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1); 1122c6f798SBarry Smith if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);} 1222c6f798SBarry Smith if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);} 1322c6f798SBarry Smith ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr); 1422c6f798SBarry Smith PetscFunctionReturn(0); 1522c6f798SBarry Smith } 1622c6f798SBarry Smith 172d53ad75SBarry Smith PetscErrorCode DMSNESLoad(DMSNES kdm,PetscViewer viewer) 182d53ad75SBarry Smith { 192d53ad75SBarry Smith PetscErrorCode ierr; 202d53ad75SBarry Smith 212d53ad75SBarry Smith PetscFunctionBegin; 22060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 23060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 242d53ad75SBarry Smith PetscFunctionReturn(0); 252d53ad75SBarry Smith } 262d53ad75SBarry Smith 272d53ad75SBarry Smith PetscErrorCode DMSNESView(DMSNES kdm,PetscViewer viewer) 282d53ad75SBarry Smith { 292d53ad75SBarry Smith PetscErrorCode ierr; 302d53ad75SBarry Smith PetscBool isascii,isbinary; 312d53ad75SBarry Smith 322d53ad75SBarry Smith PetscFunctionBegin; 332d53ad75SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 342d53ad75SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 352d53ad75SBarry Smith if (isascii) { 364b5d3663SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) && defined(PETSC_SERIALIZE_FUNCTIONS_VIEW) 372d53ad75SBarry Smith const char *fname; 382d53ad75SBarry Smith 392d53ad75SBarry Smith ierr = PetscFPTFind(kdm->ops->computefunction,&fname);CHKERRQ(ierr); 402d53ad75SBarry Smith if (fname) { 412d53ad75SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Function used by SNES: %s\n",fname);CHKERRQ(ierr); 422d53ad75SBarry Smith } 432d53ad75SBarry Smith ierr = PetscFPTFind(kdm->ops->computejacobian,&fname);CHKERRQ(ierr); 442d53ad75SBarry Smith if (fname) { 452d53ad75SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Jacobian function used by SNES: %s\n",fname);CHKERRQ(ierr); 462d53ad75SBarry Smith } 47c7a10e08SBarry Smith #endif 482d53ad75SBarry Smith } else if (isbinary) { 493964eb88SJed Brown struct { 503964eb88SJed Brown PetscErrorCode (*func)(SNES,Vec,Vec,void*); 519200755eSBarry Smith } funcstruct; 529200755eSBarry Smith struct { 53d1e9a80fSBarry Smith PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*); 549200755eSBarry Smith } jacstruct; 559200755eSBarry Smith funcstruct.func = kdm->ops->computefunction; 569200755eSBarry Smith jacstruct.jac = kdm->ops->computejacobian; 57*f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION);CHKERRQ(ierr); 58*f253e43cSLisandro Dalcin ierr = PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION);CHKERRQ(ierr); 592d53ad75SBarry Smith } 602d53ad75SBarry Smith PetscFunctionReturn(0); 612d53ad75SBarry Smith } 622d53ad75SBarry Smith 6322c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm) 6422c6f798SBarry Smith { 6522c6f798SBarry Smith PetscErrorCode ierr; 6622c6f798SBarry Smith 6722c6f798SBarry Smith PetscFunctionBegin; 68607a6623SBarry Smith ierr = SNESInitializePackage();CHKERRQ(ierr); 6973107ff1SLisandro Dalcin ierr = PetscHeaderCreate(*kdm, DMSNES_CLASSID, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr); 706cab3a1bSJed Brown PetscFunctionReturn(0); 716cab3a1bSJed Brown } 726cab3a1bSJed Brown 73942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 746cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 756cab3a1bSJed Brown */ 76942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 776cab3a1bSJed Brown { 786cab3a1bSJed Brown PetscErrorCode ierr; 796cab3a1bSJed Brown 806cab3a1bSJed Brown PetscFunctionBegin; 81942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr); 826cab3a1bSJed Brown PetscFunctionReturn(0); 836cab3a1bSJed Brown } 846cab3a1bSJed Brown 85dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 86caa4e7f2SJed Brown */ 87942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 88caa4e7f2SJed Brown { 89caa4e7f2SJed Brown 90caa4e7f2SJed Brown PetscFunctionBegin; 91caa4e7f2SJed Brown PetscFunctionReturn(0); 92caa4e7f2SJed Brown } 93caa4e7f2SJed Brown 94be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */ 95be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx) 96be081cd6SPeter Brune { 97be081cd6SPeter Brune PetscErrorCode ierr; 98be081cd6SPeter Brune 99be081cd6SPeter Brune PetscFunctionBegin; 100be081cd6SPeter Brune ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr); 101be081cd6SPeter Brune PetscFunctionReturn(0); 102be081cd6SPeter Brune } 103be081cd6SPeter Brune 104be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level. 105be081cd6SPeter Brune */ 106be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx) 107be081cd6SPeter Brune { 108be081cd6SPeter Brune 109be081cd6SPeter Brune PetscFunctionBegin; 110be081cd6SPeter Brune PetscFunctionReturn(0); 111be081cd6SPeter Brune } 112be081cd6SPeter Brune 113942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 11403a0fabfSPeter Brune { 11503a0fabfSPeter Brune PetscErrorCode ierr; 11603a0fabfSPeter Brune 11703a0fabfSPeter Brune PetscFunctionBegin; 118942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr); 11903a0fabfSPeter Brune PetscFunctionReturn(0); 12003a0fabfSPeter Brune } 12103a0fabfSPeter Brune 12203a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 12303a0fabfSPeter Brune */ 124942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 12503a0fabfSPeter Brune { 12603a0fabfSPeter Brune 12703a0fabfSPeter Brune PetscFunctionBegin; 12803a0fabfSPeter Brune PetscFunctionReturn(0); 12903a0fabfSPeter Brune } 13003a0fabfSPeter Brune 13122c6f798SBarry Smith /*@C 13222c6f798SBarry Smith DMSNESCopy - copies the information in a DMSNES to another DMSNES 13322c6f798SBarry Smith 13422c6f798SBarry Smith Not Collective 13522c6f798SBarry Smith 13622c6f798SBarry Smith Input Argument: 13722c6f798SBarry Smith + kdm - Original DMSNES 13822c6f798SBarry Smith - nkdm - DMSNES to receive the data, should have been created with DMSNESCreate() 13922c6f798SBarry Smith 14022c6f798SBarry Smith Level: developer 14122c6f798SBarry Smith 14222c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy() 14322c6f798SBarry Smith @*/ 14422c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm) 14522c6f798SBarry Smith { 14622c6f798SBarry Smith PetscErrorCode ierr; 14722c6f798SBarry Smith 14822c6f798SBarry Smith PetscFunctionBegin; 14922c6f798SBarry Smith PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1); 15022c6f798SBarry Smith PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2); 15122c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 1522bc4d0c4SPeter Brune nkdm->ops->computejacobian = kdm->ops->computejacobian; 15322c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 15422c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 15522c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 15622c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 15722c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 15822c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 15922c6f798SBarry Smith 16022c6f798SBarry Smith nkdm->functionctx = kdm->functionctx; 16122c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 16222c6f798SBarry Smith nkdm->pctx = kdm->pctx; 16322c6f798SBarry Smith nkdm->jacobianctx = kdm->jacobianctx; 16422c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 165af903c1dSJunchao Zhang nkdm->originaldm = kdm->originaldm; 16622c6f798SBarry Smith 16722c6f798SBarry Smith /* 16822c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 16922c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 17022c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 17122c6f798SBarry Smith */ 17222c6f798SBarry Smith 17322c6f798SBarry Smith /* implementation specific copy hooks */ 17422c6f798SBarry Smith if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);} 17522c6f798SBarry Smith PetscFunctionReturn(0); 17622c6f798SBarry Smith } 17722c6f798SBarry Smith 1786cab3a1bSJed Brown /*@C 179942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 1806cab3a1bSJed Brown 1816cab3a1bSJed Brown Not Collective 1826cab3a1bSJed Brown 1836cab3a1bSJed Brown Input Argument: 1846cab3a1bSJed Brown . dm - DM to be used with SNES 1856cab3a1bSJed Brown 1866cab3a1bSJed Brown Output Argument: 187942e3340SBarry Smith . snesdm - private DMSNES context 1886cab3a1bSJed Brown 1896cab3a1bSJed Brown Level: developer 1906cab3a1bSJed Brown 1916cab3a1bSJed Brown Notes: 192942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 1936cab3a1bSJed Brown 194942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 1956cab3a1bSJed Brown @*/ 196942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 1976cab3a1bSJed Brown { 1986cab3a1bSJed Brown PetscErrorCode ierr; 1996cab3a1bSJed Brown 2006cab3a1bSJed Brown PetscFunctionBegin; 2016cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 202b4615a05SBarry Smith *snesdm = (DMSNES) dm->dmsnes; 20322c6f798SBarry Smith if (!*snesdm) { 204942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr); 205ce94432eSBarry Smith ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm);CHKERRQ(ierr); 2061aa26658SKarl Rupp 207b4615a05SBarry Smith dm->dmsnes = (PetscObject) *snesdm; 208af903c1dSJunchao Zhang (*snesdm)->originaldm = dm; 2090298fd71SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2100298fd71SBarry Smith ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr); 2110298fd71SBarry Smith ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2126cab3a1bSJed Brown } 2136cab3a1bSJed Brown PetscFunctionReturn(0); 2146cab3a1bSJed Brown } 2156cab3a1bSJed Brown 2166cab3a1bSJed Brown /*@C 217942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 2186cab3a1bSJed Brown 2196cab3a1bSJed Brown Not Collective 2206cab3a1bSJed Brown 2216cab3a1bSJed Brown Input Argument: 2226cab3a1bSJed Brown . dm - DM to be used with SNES 2236cab3a1bSJed Brown 2246cab3a1bSJed Brown Output Argument: 225942e3340SBarry Smith . snesdm - private DMSNES context 2266cab3a1bSJed Brown 2276cab3a1bSJed Brown Level: developer 2286cab3a1bSJed Brown 229942e3340SBarry Smith .seealso: DMGetDMSNES() 2306cab3a1bSJed Brown @*/ 231942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 2326cab3a1bSJed Brown { 2336cab3a1bSJed Brown PetscErrorCode ierr; 234942e3340SBarry Smith DMSNES sdm; 2356cab3a1bSJed Brown 2366cab3a1bSJed Brown PetscFunctionBegin; 2376cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 238942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 239af903c1dSJunchao Zhang if (!sdm->originaldm) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"DMSNES has a NULL originaldm"); 2406cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 241b4615a05SBarry Smith DMSNES oldsdm = sdm; 242942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr); 243ce94432eSBarry Smith ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr); 24422c6f798SBarry Smith ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr); 245b4615a05SBarry Smith ierr = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr); 246b4615a05SBarry Smith dm->dmsnes = (PetscObject)sdm; 247af903c1dSJunchao Zhang sdm->originaldm = dm; 2486cab3a1bSJed Brown } 2496cab3a1bSJed Brown *snesdm = sdm; 2506cab3a1bSJed Brown PetscFunctionReturn(0); 2516cab3a1bSJed Brown } 2526cab3a1bSJed Brown 2536cab3a1bSJed Brown /*@C 254942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 2556cab3a1bSJed Brown 2566cab3a1bSJed Brown Logically Collective 2576cab3a1bSJed Brown 2586cab3a1bSJed Brown Input Arguments: 2596cab3a1bSJed Brown + dmsrc - DM to obtain context from 2606cab3a1bSJed Brown - dmdest - DM to add context to 2616cab3a1bSJed Brown 2626cab3a1bSJed Brown Level: developer 2636cab3a1bSJed Brown 2646cab3a1bSJed Brown Note: 2656cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2666cab3a1bSJed Brown 267942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 2686cab3a1bSJed Brown @*/ 269942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 2706cab3a1bSJed Brown { 2716cab3a1bSJed Brown PetscErrorCode ierr; 2726cab3a1bSJed Brown 2736cab3a1bSJed Brown PetscFunctionBegin; 2746cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 2756cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 27653705c30SMatthew G. Knepley if (!dmdest->dmsnes) {ierr = DMSNESCreate(PetscObjectComm((PetscObject) dmdest), (DMSNES *) &dmdest->dmsnes);CHKERRQ(ierr);} 27753705c30SMatthew G. Knepley ierr = DMSNESCopy((DMSNES) dmsrc->dmsnes, (DMSNES) dmdest->dmsnes);CHKERRQ(ierr); 2780298fd71SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 2790298fd71SBarry Smith ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 2800298fd71SBarry Smith ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2816cab3a1bSJed Brown PetscFunctionReturn(0); 2826cab3a1bSJed Brown } 2836cab3a1bSJed Brown 2846cab3a1bSJed Brown /*@C 2856cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 2866cab3a1bSJed Brown 2876cab3a1bSJed Brown Not Collective 2886cab3a1bSJed Brown 2896cab3a1bSJed Brown Input Arguments: 2906cab3a1bSJed Brown + dm - DM to be used with SNES 291f8b49ee9SBarry Smith . f - residual evaluation function; see SNESFunction for details 2926cab3a1bSJed Brown - ctx - context for residual evaluation 2936cab3a1bSJed Brown 2946cab3a1bSJed Brown Level: advanced 2956cab3a1bSJed Brown 2966cab3a1bSJed Brown Note: 2976cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 2986cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 2996cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 3006cab3a1bSJed Brown 301bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction 3026cab3a1bSJed Brown @*/ 303f8b49ee9SBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx) 3046cab3a1bSJed Brown { 3056cab3a1bSJed Brown PetscErrorCode ierr; 306942e3340SBarry Smith DMSNES sdm; 3076cab3a1bSJed Brown 3086cab3a1bSJed Brown PetscFunctionBegin; 3096cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 310f8b49ee9SBarry Smith if (f || ctx) { 311942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 312fdaff8d6SPeter Brune } 313f8b49ee9SBarry Smith if (f) sdm->ops->computefunction = f; 3146cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 3156cab3a1bSJed Brown PetscFunctionReturn(0); 3166cab3a1bSJed Brown } 3176cab3a1bSJed Brown 3186cab3a1bSJed Brown /*@C 3196cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 3206cab3a1bSJed Brown 3216cab3a1bSJed Brown Not Collective 3226cab3a1bSJed Brown 3236cab3a1bSJed Brown Input Argument: 3246cab3a1bSJed Brown . dm - DM to be used with SNES 3256cab3a1bSJed Brown 3266cab3a1bSJed Brown Output Arguments: 327f8b49ee9SBarry Smith + f - residual evaluation function; see SNESFunction for details 3286cab3a1bSJed Brown - ctx - context for residual evaluation 3296cab3a1bSJed Brown 3306cab3a1bSJed Brown Level: advanced 3316cab3a1bSJed Brown 3326cab3a1bSJed Brown Note: 3336cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3346cab3a1bSJed Brown associated with the DM. 3356cab3a1bSJed Brown 336bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction 3376cab3a1bSJed Brown @*/ 338f8b49ee9SBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx) 3396cab3a1bSJed Brown { 3406cab3a1bSJed Brown PetscErrorCode ierr; 341942e3340SBarry Smith DMSNES sdm; 3426cab3a1bSJed Brown 3436cab3a1bSJed Brown PetscFunctionBegin; 3446cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 345942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 346f8b49ee9SBarry Smith if (f) *f = sdm->ops->computefunction; 3476cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 3486cab3a1bSJed Brown PetscFunctionReturn(0); 3496cab3a1bSJed Brown } 3506cab3a1bSJed Brown 3512a4ee8f2SPeter Brune /*@C 352081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 3532a4ee8f2SPeter Brune 3542a4ee8f2SPeter Brune Not Collective 3552a4ee8f2SPeter Brune 3562a4ee8f2SPeter Brune Input Arguments: 3572a4ee8f2SPeter Brune + dm - DM to be used with SNES 358f8b49ee9SBarry Smith . obj - objective evaluation function; see SNESObjectiveFunction for details 3592a4ee8f2SPeter Brune - ctx - context for residual evaluation 3602a4ee8f2SPeter Brune 3612a4ee8f2SPeter Brune Level: advanced 3622a4ee8f2SPeter Brune 3632a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 3642a4ee8f2SPeter Brune @*/ 365f8b49ee9SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*obj)(SNES,Vec,PetscReal*,void*),void *ctx) 3662a4ee8f2SPeter Brune { 3672a4ee8f2SPeter Brune PetscErrorCode ierr; 368942e3340SBarry Smith DMSNES sdm; 3692a4ee8f2SPeter Brune 3702a4ee8f2SPeter Brune PetscFunctionBegin; 3712a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 372f8b49ee9SBarry Smith if (obj || ctx) { 373942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 374fdaff8d6SPeter Brune } 375f8b49ee9SBarry Smith if (obj) sdm->ops->computeobjective = obj; 3762a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 3772a4ee8f2SPeter Brune PetscFunctionReturn(0); 3782a4ee8f2SPeter Brune } 3792a4ee8f2SPeter Brune 3802a4ee8f2SPeter Brune /*@C 3812a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 3822a4ee8f2SPeter Brune 3832a4ee8f2SPeter Brune Not Collective 3842a4ee8f2SPeter Brune 3852a4ee8f2SPeter Brune Input Argument: 3862a4ee8f2SPeter Brune . dm - DM to be used with SNES 3872a4ee8f2SPeter Brune 3882a4ee8f2SPeter Brune Output Arguments: 389f8b49ee9SBarry Smith + obj- residual evaluation function; see SNESObjectiveFunction for details 3902a4ee8f2SPeter Brune - ctx - context for residual evaluation 3912a4ee8f2SPeter Brune 3922a4ee8f2SPeter Brune Level: advanced 3932a4ee8f2SPeter Brune 3942a4ee8f2SPeter Brune Note: 3952a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3962a4ee8f2SPeter Brune associated with the DM. 3972a4ee8f2SPeter Brune 3982a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 3992a4ee8f2SPeter Brune @*/ 400f8b49ee9SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**obj)(SNES,Vec,PetscReal*,void*),void **ctx) 4012a4ee8f2SPeter Brune { 4022a4ee8f2SPeter Brune PetscErrorCode ierr; 403942e3340SBarry Smith DMSNES sdm; 4042a4ee8f2SPeter Brune 4052a4ee8f2SPeter Brune PetscFunctionBegin; 4062a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 407942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 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 4186cab3a1bSJed Brown Input Argument: 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 { 4346cab3a1bSJed Brown PetscErrorCode ierr; 435942e3340SBarry Smith DMSNES sdm; 4366cab3a1bSJed Brown 4376cab3a1bSJed Brown PetscFunctionBegin; 4386cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 439be95d8f1SBarry Smith if (f || ctx) { 440942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 441fdaff8d6SPeter Brune } 442be95d8f1SBarry Smith if (f) sdm->ops->computegs = f; 4436cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 4446cab3a1bSJed Brown PetscFunctionReturn(0); 4456cab3a1bSJed Brown } 4466cab3a1bSJed Brown 4476cab3a1bSJed Brown /*@C 448be95d8f1SBarry Smith DMSNESGetNGS - get SNES Gauss-Seidel relaxation function 4496cab3a1bSJed Brown 4506cab3a1bSJed Brown Not Collective 4516cab3a1bSJed Brown 4526cab3a1bSJed Brown Input Argument: 4536cab3a1bSJed Brown . dm - DM to be used with SNES 4546cab3a1bSJed Brown 4556cab3a1bSJed Brown Output Arguments: 456be95d8f1SBarry Smith + f - relaxation function which performs Gauss-Seidel sweeps, see SNESGSFunction 4576cab3a1bSJed Brown - ctx - context for residual evaluation 4586cab3a1bSJed Brown 4596cab3a1bSJed Brown Level: advanced 4606cab3a1bSJed Brown 4616cab3a1bSJed Brown Note: 462be95d8f1SBarry Smith SNESGetNGS() is normally used, but it calls this function internally because the user context is actually 4636cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4646cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4656cab3a1bSJed Brown 466be95d8f1SBarry Smith .seealso: DMSNESSetContext(), SNESGetNGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESNGSFunction 4676cab3a1bSJed Brown @*/ 468be95d8f1SBarry Smith PetscErrorCode DMSNESGetNGS(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx) 4696cab3a1bSJed Brown { 4706cab3a1bSJed Brown PetscErrorCode ierr; 471942e3340SBarry Smith DMSNES sdm; 4726cab3a1bSJed Brown 4736cab3a1bSJed Brown PetscFunctionBegin; 4746cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 475942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 476be95d8f1SBarry Smith if (f) *f = sdm->ops->computegs; 4776cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 4786cab3a1bSJed Brown PetscFunctionReturn(0); 4796cab3a1bSJed Brown } 4806cab3a1bSJed Brown 4816cab3a1bSJed Brown /*@C 482ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 4836cab3a1bSJed Brown 4846cab3a1bSJed Brown Not Collective 4856cab3a1bSJed Brown 4866cab3a1bSJed Brown Input Argument: 4876cab3a1bSJed Brown + dm - DM to be used with SNES 488f8b49ee9SBarry Smith . J - Jacobian evaluation function 4896cab3a1bSJed Brown - ctx - context for residual evaluation 4906cab3a1bSJed Brown 4916cab3a1bSJed Brown Level: advanced 4926cab3a1bSJed Brown 4936cab3a1bSJed Brown Note: 4946cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 4956cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4966cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 4976cab3a1bSJed Brown 498bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction 4996cab3a1bSJed Brown @*/ 500d1e9a80fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) 5016cab3a1bSJed Brown { 5026cab3a1bSJed Brown PetscErrorCode ierr; 503942e3340SBarry Smith DMSNES sdm; 5046cab3a1bSJed Brown 5056cab3a1bSJed Brown PetscFunctionBegin; 5066cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 507f8b49ee9SBarry Smith if (J || ctx) { 508942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 5091fdfe764SBarry Smith } 510f8b49ee9SBarry Smith if (J) sdm->ops->computejacobian = J; 5116cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 5126cab3a1bSJed Brown PetscFunctionReturn(0); 5136cab3a1bSJed Brown } 5146cab3a1bSJed Brown 5156cab3a1bSJed Brown /*@C 516ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 5176cab3a1bSJed Brown 5186cab3a1bSJed Brown Not Collective 5196cab3a1bSJed Brown 5206cab3a1bSJed Brown Input Argument: 5216cab3a1bSJed Brown . dm - DM to be used with SNES 5226cab3a1bSJed Brown 5236cab3a1bSJed Brown Output Arguments: 524f8b49ee9SBarry Smith + J - Jacobian evaluation function; see SNESJacobianFunction for all calling sequence 5256cab3a1bSJed Brown - ctx - context for residual evaluation 5266cab3a1bSJed Brown 5276cab3a1bSJed Brown Level: advanced 5286cab3a1bSJed Brown 5296cab3a1bSJed Brown Note: 5306cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 5316cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5326cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5336cab3a1bSJed Brown 534bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction 5356cab3a1bSJed Brown @*/ 536d1e9a80fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx) 5376cab3a1bSJed Brown { 5386cab3a1bSJed Brown PetscErrorCode ierr; 539942e3340SBarry Smith DMSNES sdm; 5406cab3a1bSJed Brown 5416cab3a1bSJed Brown PetscFunctionBegin; 5426cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 543942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 544f8b49ee9SBarry Smith if (J) *J = sdm->ops->computejacobian; 5456cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 5466cab3a1bSJed Brown PetscFunctionReturn(0); 5476cab3a1bSJed Brown } 5486cab3a1bSJed Brown 549e03ab78fSPeter Brune /*@C 550e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 551e03ab78fSPeter Brune 552e03ab78fSPeter Brune Not Collective 553e03ab78fSPeter Brune 554e03ab78fSPeter Brune Input Argument: 555e03ab78fSPeter Brune + dm - DM to be used with SNES 556f8b49ee9SBarry Smith . b - RHS evaluation function 557f8b49ee9SBarry Smith . J - Picard matrix evaluation function 558e03ab78fSPeter Brune - ctx - context for residual evaluation 559e03ab78fSPeter Brune 560e03ab78fSPeter Brune Level: advanced 561e03ab78fSPeter Brune 562e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 563e03ab78fSPeter Brune @*/ 564d1e9a80fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*b)(SNES,Vec,Vec,void*),PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) 565e03ab78fSPeter Brune { 566e03ab78fSPeter Brune PetscErrorCode ierr; 567942e3340SBarry Smith DMSNES sdm; 568e03ab78fSPeter Brune 569e03ab78fSPeter Brune PetscFunctionBegin; 570e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 571942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 572f8b49ee9SBarry Smith if (b) sdm->ops->computepfunction = b; 573f8b49ee9SBarry Smith if (J) sdm->ops->computepjacobian = J; 574e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 575e03ab78fSPeter Brune PetscFunctionReturn(0); 576e03ab78fSPeter Brune } 577e03ab78fSPeter Brune 5787971a8bfSPeter Brune /*@C 5797971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 5807971a8bfSPeter Brune 5817971a8bfSPeter Brune Not Collective 5827971a8bfSPeter Brune 5837971a8bfSPeter Brune Input Argument: 5847971a8bfSPeter Brune . dm - DM to be used with SNES 5857971a8bfSPeter Brune 5867971a8bfSPeter Brune Output Arguments: 587f8b49ee9SBarry Smith + b - RHS evaluation function; see SNESFunction for details 588f8b49ee9SBarry Smith . J - RHS evaluation function; see SNESJacobianFunction for detailsa 5897971a8bfSPeter Brune - ctx - context for residual evaluation 5907971a8bfSPeter Brune 5917971a8bfSPeter Brune Level: advanced 5927971a8bfSPeter Brune 5937971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 5947971a8bfSPeter Brune @*/ 595d1e9a80fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**b)(SNES,Vec,Vec,void*),PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx) 5967971a8bfSPeter Brune { 5977971a8bfSPeter Brune PetscErrorCode ierr; 598942e3340SBarry Smith DMSNES sdm; 5997971a8bfSPeter Brune 6007971a8bfSPeter Brune PetscFunctionBegin; 6017971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 602942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 603f8b49ee9SBarry Smith if (b) *b = sdm->ops->computepfunction; 604f8b49ee9SBarry Smith if (J) *J = sdm->ops->computepjacobian; 6057971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 6067971a8bfSPeter Brune PetscFunctionReturn(0); 6077971a8bfSPeter Brune } 608