1b45d2f2cSJed Brown #include <petsc-private/snesimpl.h> /*I "petscsnes.h" I*/ 2679f678eSPeter Brune #include <petsc-private/dmimpl.h> /*I "petscdm.h" I*/ 36cab3a1bSJed Brown 46cab3a1bSJed Brown #undef __FUNCT__ 522c6f798SBarry Smith #define __FUNCT__ "DMSNESDestroy" 622c6f798SBarry Smith static PetscErrorCode DMSNESDestroy(DMSNES *kdm) 76cab3a1bSJed Brown { 86cab3a1bSJed Brown PetscErrorCode ierr; 96cab3a1bSJed Brown 106cab3a1bSJed Brown PetscFunctionBegin; 1122c6f798SBarry Smith if (!*kdm) PetscFunctionReturn(0); 1222c6f798SBarry Smith PetscValidHeaderSpecific((*kdm),DMSNES_CLASSID,1); 1322c6f798SBarry Smith if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);} 1422c6f798SBarry Smith if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);} 1522c6f798SBarry Smith ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr); 1622c6f798SBarry Smith PetscFunctionReturn(0); 1722c6f798SBarry Smith } 1822c6f798SBarry Smith 1922c6f798SBarry Smith #undef __FUNCT__ 202d53ad75SBarry Smith #define __FUNCT__ "DMSNESLoad" 212d53ad75SBarry Smith PetscErrorCode DMSNESLoad(DMSNES kdm,PetscViewer viewer) 222d53ad75SBarry Smith { 232d53ad75SBarry Smith PetscErrorCode ierr; 242d53ad75SBarry Smith 252d53ad75SBarry Smith PetscFunctionBegin; 262d53ad75SBarry Smith ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,PETSC_FUNCTION);CHKERRQ(ierr); 272d53ad75SBarry Smith ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,PETSC_FUNCTION);CHKERRQ(ierr); 282d53ad75SBarry Smith PetscFunctionReturn(0); 292d53ad75SBarry Smith } 302d53ad75SBarry Smith 312d53ad75SBarry Smith #undef __FUNCT__ 322d53ad75SBarry Smith #define __FUNCT__ "DMSNESView" 332d53ad75SBarry Smith PetscErrorCode DMSNESView(DMSNES kdm,PetscViewer viewer) 342d53ad75SBarry Smith { 352d53ad75SBarry Smith PetscErrorCode ierr; 362d53ad75SBarry Smith PetscBool isascii,isbinary; 372d53ad75SBarry Smith 382d53ad75SBarry Smith PetscFunctionBegin; 392d53ad75SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 402d53ad75SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 412d53ad75SBarry Smith if (isascii) { 42c7a10e08SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) 432d53ad75SBarry Smith const char *fname; 442d53ad75SBarry Smith 452d53ad75SBarry Smith ierr = PetscFPTFind(kdm->ops->computefunction,&fname);CHKERRQ(ierr); 462d53ad75SBarry Smith if (fname) { 472d53ad75SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Function used by SNES: %s\n",fname);CHKERRQ(ierr); 482d53ad75SBarry Smith } 492d53ad75SBarry Smith ierr = PetscFPTFind(kdm->ops->computejacobian,&fname);CHKERRQ(ierr); 502d53ad75SBarry Smith if (fname) { 512d53ad75SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"Jacobian function used by SNES: %s\n",fname);CHKERRQ(ierr); 522d53ad75SBarry Smith } 53c7a10e08SBarry Smith #endif 542d53ad75SBarry Smith } else if (isbinary) { 5598da9c48SSatish Balay ierr = PetscViewerBinaryWrite(viewer,(void*)kdm->ops->computefunction,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 5698da9c48SSatish Balay ierr = PetscViewerBinaryWrite(viewer,(void*)kdm->ops->computejacobian,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 572d53ad75SBarry Smith } 582d53ad75SBarry Smith PetscFunctionReturn(0); 592d53ad75SBarry Smith } 602d53ad75SBarry Smith 612d53ad75SBarry Smith #undef __FUNCT__ 6222c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate" 6322c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm) 6422c6f798SBarry Smith { 6522c6f798SBarry Smith PetscErrorCode ierr; 6622c6f798SBarry Smith 6722c6f798SBarry Smith PetscFunctionBegin; 68519f805aSKarl Rupp #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 690298fd71SBarry Smith ierr = SNESInitializePackage(NULL);CHKERRQ(ierr); 7022c6f798SBarry Smith #endif 71*67c2884eSBarry Smith ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr); 7222c6f798SBarry Smith ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMSNESOps));CHKERRQ(ierr); 736cab3a1bSJed Brown PetscFunctionReturn(0); 746cab3a1bSJed Brown } 756cab3a1bSJed Brown 766cab3a1bSJed Brown #undef __FUNCT__ 77942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES" 78942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 796cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 806cab3a1bSJed Brown */ 81942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 826cab3a1bSJed Brown { 836cab3a1bSJed Brown PetscErrorCode ierr; 846cab3a1bSJed Brown 856cab3a1bSJed Brown PetscFunctionBegin; 86942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr); 876cab3a1bSJed Brown PetscFunctionReturn(0); 886cab3a1bSJed Brown } 896cab3a1bSJed Brown 906cab3a1bSJed Brown #undef __FUNCT__ 91942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES" 92dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 93caa4e7f2SJed Brown */ 94942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 95caa4e7f2SJed Brown { 96caa4e7f2SJed Brown 97caa4e7f2SJed Brown PetscFunctionBegin; 98caa4e7f2SJed Brown PetscFunctionReturn(0); 99caa4e7f2SJed Brown } 100caa4e7f2SJed Brown 101caa4e7f2SJed Brown #undef __FUNCT__ 102be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES" 103be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */ 104be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx) 105be081cd6SPeter Brune { 106be081cd6SPeter Brune PetscErrorCode ierr; 107be081cd6SPeter Brune 108be081cd6SPeter Brune PetscFunctionBegin; 109be081cd6SPeter Brune ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr); 110be081cd6SPeter Brune PetscFunctionReturn(0); 111be081cd6SPeter Brune } 112be081cd6SPeter Brune 113be081cd6SPeter Brune #undef __FUNCT__ 114be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES" 115be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level. 116be081cd6SPeter Brune */ 117be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx) 118be081cd6SPeter Brune { 119be081cd6SPeter Brune 120be081cd6SPeter Brune PetscFunctionBegin; 121be081cd6SPeter Brune PetscFunctionReturn(0); 122be081cd6SPeter Brune } 123be081cd6SPeter Brune 124be081cd6SPeter Brune #undef __FUNCT__ 125942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES" 126942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 12703a0fabfSPeter Brune { 12803a0fabfSPeter Brune PetscErrorCode ierr; 12903a0fabfSPeter Brune 13003a0fabfSPeter Brune PetscFunctionBegin; 131942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr); 13203a0fabfSPeter Brune PetscFunctionReturn(0); 13303a0fabfSPeter Brune } 13403a0fabfSPeter Brune 13503a0fabfSPeter Brune #undef __FUNCT__ 136942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES" 13703a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 13803a0fabfSPeter Brune */ 139942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 14003a0fabfSPeter Brune { 14103a0fabfSPeter Brune 14203a0fabfSPeter Brune PetscFunctionBegin; 14303a0fabfSPeter Brune PetscFunctionReturn(0); 14403a0fabfSPeter Brune } 14503a0fabfSPeter Brune 14603a0fabfSPeter Brune #undef __FUNCT__ 14722c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy" 14822c6f798SBarry Smith /*@C 14922c6f798SBarry Smith DMSNESCopy - copies the information in a DMSNES to another DMSNES 15022c6f798SBarry Smith 15122c6f798SBarry Smith Not Collective 15222c6f798SBarry Smith 15322c6f798SBarry Smith Input Argument: 15422c6f798SBarry Smith + kdm - Original DMSNES 15522c6f798SBarry Smith - nkdm - DMSNES to receive the data, should have been created with DMSNESCreate() 15622c6f798SBarry Smith 15722c6f798SBarry Smith Level: developer 15822c6f798SBarry Smith 15922c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy() 16022c6f798SBarry Smith @*/ 16122c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm) 16222c6f798SBarry Smith { 16322c6f798SBarry Smith PetscErrorCode ierr; 16422c6f798SBarry Smith 16522c6f798SBarry Smith PetscFunctionBegin; 16622c6f798SBarry Smith PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1); 16722c6f798SBarry Smith PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2); 16822c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 1692bc4d0c4SPeter Brune nkdm->ops->computejacobian = kdm->ops->computejacobian; 17022c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 17122c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 17222c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 17322c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 17422c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 17522c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 17622c6f798SBarry Smith 17722c6f798SBarry Smith nkdm->functionctx = kdm->functionctx; 17822c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 17922c6f798SBarry Smith nkdm->pctx = kdm->pctx; 18022c6f798SBarry Smith nkdm->jacobianctx = kdm->jacobianctx; 18122c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 18222c6f798SBarry Smith nkdm->data = kdm->data; 18322c6f798SBarry Smith 18422c6f798SBarry Smith /* 18522c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 18622c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 18722c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 18822c6f798SBarry Smith */ 18922c6f798SBarry Smith 19022c6f798SBarry Smith /* implementation specific copy hooks */ 19122c6f798SBarry Smith if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);} 19222c6f798SBarry Smith PetscFunctionReturn(0); 19322c6f798SBarry Smith } 19422c6f798SBarry Smith 19522c6f798SBarry Smith #undef __FUNCT__ 196942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES" 1976cab3a1bSJed Brown /*@C 198942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 1996cab3a1bSJed Brown 2006cab3a1bSJed Brown Not Collective 2016cab3a1bSJed Brown 2026cab3a1bSJed Brown Input Argument: 2036cab3a1bSJed Brown . dm - DM to be used with SNES 2046cab3a1bSJed Brown 2056cab3a1bSJed Brown Output Argument: 206942e3340SBarry Smith . snesdm - private DMSNES context 2076cab3a1bSJed Brown 2086cab3a1bSJed Brown Level: developer 2096cab3a1bSJed Brown 2106cab3a1bSJed Brown Notes: 211942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 2126cab3a1bSJed Brown 213942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 2146cab3a1bSJed Brown @*/ 215942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 2166cab3a1bSJed Brown { 2176cab3a1bSJed Brown PetscErrorCode ierr; 2186cab3a1bSJed Brown 2196cab3a1bSJed Brown PetscFunctionBegin; 2206cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 221b4615a05SBarry Smith *snesdm = (DMSNES) dm->dmsnes; 22222c6f798SBarry Smith if (!*snesdm) { 223942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr); 22422c6f798SBarry Smith ierr = DMSNESCreate(((PetscObject)dm)->comm,snesdm);CHKERRQ(ierr); 2251aa26658SKarl Rupp 226b4615a05SBarry Smith dm->dmsnes = (PetscObject) *snesdm; 2271aa26658SKarl Rupp 2280298fd71SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2290298fd71SBarry Smith ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr); 2300298fd71SBarry Smith ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2316cab3a1bSJed Brown } 2326cab3a1bSJed Brown PetscFunctionReturn(0); 2336cab3a1bSJed Brown } 2346cab3a1bSJed Brown 2356cab3a1bSJed Brown #undef __FUNCT__ 236942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite" 2376cab3a1bSJed Brown /*@C 238942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 2396cab3a1bSJed Brown 2406cab3a1bSJed Brown Not Collective 2416cab3a1bSJed Brown 2426cab3a1bSJed Brown Input Argument: 2436cab3a1bSJed Brown . dm - DM to be used with SNES 2446cab3a1bSJed Brown 2456cab3a1bSJed Brown Output Argument: 246942e3340SBarry Smith . snesdm - private DMSNES context 2476cab3a1bSJed Brown 2486cab3a1bSJed Brown Level: developer 2496cab3a1bSJed Brown 250942e3340SBarry Smith .seealso: DMGetDMSNES() 2516cab3a1bSJed Brown @*/ 252942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 2536cab3a1bSJed Brown { 2546cab3a1bSJed Brown PetscErrorCode ierr; 255942e3340SBarry Smith DMSNES sdm; 2566cab3a1bSJed Brown 2576cab3a1bSJed Brown PetscFunctionBegin; 2586cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 259942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 2606cab3a1bSJed Brown if (!sdm->originaldm) sdm->originaldm = dm; 2616cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 262b4615a05SBarry Smith DMSNES oldsdm = sdm; 263942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr); 26422c6f798SBarry Smith ierr = DMSNESCreate(((PetscObject)dm)->comm,&sdm);CHKERRQ(ierr); 26522c6f798SBarry Smith ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr); 266b4615a05SBarry Smith ierr = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr); 267b4615a05SBarry Smith dm->dmsnes = (PetscObject)sdm; 2686cab3a1bSJed Brown } 2696cab3a1bSJed Brown *snesdm = sdm; 2706cab3a1bSJed Brown PetscFunctionReturn(0); 2716cab3a1bSJed Brown } 2726cab3a1bSJed Brown 2736cab3a1bSJed Brown #undef __FUNCT__ 274942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES" 2756cab3a1bSJed Brown /*@C 276942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 2776cab3a1bSJed Brown 2786cab3a1bSJed Brown Logically Collective 2796cab3a1bSJed Brown 2806cab3a1bSJed Brown Input Arguments: 2816cab3a1bSJed Brown + dmsrc - DM to obtain context from 2826cab3a1bSJed Brown - dmdest - DM to add context to 2836cab3a1bSJed Brown 2846cab3a1bSJed Brown Level: developer 2856cab3a1bSJed Brown 2866cab3a1bSJed Brown Note: 2876cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2886cab3a1bSJed Brown 289942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 2906cab3a1bSJed Brown @*/ 291942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 2926cab3a1bSJed Brown { 2936cab3a1bSJed Brown PetscErrorCode ierr; 2946cab3a1bSJed Brown 2956cab3a1bSJed Brown PetscFunctionBegin; 2966cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 2976cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 298b4615a05SBarry Smith ierr = DMSNESDestroy((DMSNES*)&dmdest->dmsnes);CHKERRQ(ierr); 2991aa26658SKarl Rupp 300b4615a05SBarry Smith dmdest->dmsnes = dmsrc->dmsnes; 3011aa26658SKarl Rupp 302b4615a05SBarry Smith ierr = PetscObjectReference(dmdest->dmsnes);CHKERRQ(ierr); 3030298fd71SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 3040298fd71SBarry Smith ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 3050298fd71SBarry Smith ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 3066cab3a1bSJed Brown PetscFunctionReturn(0); 3076cab3a1bSJed Brown } 3086cab3a1bSJed Brown 3096cab3a1bSJed Brown #undef __FUNCT__ 3106cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction" 3116cab3a1bSJed Brown /*@C 3126cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 3136cab3a1bSJed Brown 3146cab3a1bSJed Brown Not Collective 3156cab3a1bSJed Brown 3166cab3a1bSJed Brown Input Arguments: 3176cab3a1bSJed Brown + dm - DM to be used with SNES 318bf388a1fSBarry Smith . SNESFunction - residual evaluation function 3196cab3a1bSJed Brown - ctx - context for residual evaluation 3206cab3a1bSJed Brown 3216cab3a1bSJed Brown Level: advanced 3226cab3a1bSJed Brown 3236cab3a1bSJed Brown Note: 3246cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 3256cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 3266cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 3276cab3a1bSJed Brown 328bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction 3296cab3a1bSJed Brown @*/ 330bf388a1fSBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),void *ctx) 3316cab3a1bSJed Brown { 3326cab3a1bSJed Brown PetscErrorCode ierr; 333942e3340SBarry Smith DMSNES sdm; 3346cab3a1bSJed Brown 3356cab3a1bSJed Brown PetscFunctionBegin; 3366cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 337bf388a1fSBarry Smith if (SNESFunction || ctx) { 338942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 339fdaff8d6SPeter Brune } 340bf388a1fSBarry Smith if (SNESFunction) sdm->ops->computefunction = SNESFunction; 3416cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 3426cab3a1bSJed Brown PetscFunctionReturn(0); 3436cab3a1bSJed Brown } 3446cab3a1bSJed Brown 3456cab3a1bSJed Brown #undef __FUNCT__ 3466cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction" 3476cab3a1bSJed Brown /*@C 3486cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 3496cab3a1bSJed Brown 3506cab3a1bSJed Brown Not Collective 3516cab3a1bSJed Brown 3526cab3a1bSJed Brown Input Argument: 3536cab3a1bSJed Brown . dm - DM to be used with SNES 3546cab3a1bSJed Brown 3556cab3a1bSJed Brown Output Arguments: 356bf388a1fSBarry Smith + SNESFunction - residual evaluation function 3576cab3a1bSJed Brown - ctx - context for residual evaluation 3586cab3a1bSJed Brown 3596cab3a1bSJed Brown Level: advanced 3606cab3a1bSJed Brown 3616cab3a1bSJed Brown Note: 3626cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3636cab3a1bSJed Brown associated with the DM. 3646cab3a1bSJed Brown 365bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction 3666cab3a1bSJed Brown @*/ 367bf388a1fSBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),void **ctx) 3686cab3a1bSJed Brown { 3696cab3a1bSJed Brown PetscErrorCode ierr; 370942e3340SBarry Smith DMSNES sdm; 3716cab3a1bSJed Brown 3726cab3a1bSJed Brown PetscFunctionBegin; 3736cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 374942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 375bf388a1fSBarry Smith if (SNESFunction) *SNESFunction = sdm->ops->computefunction; 3766cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 3776cab3a1bSJed Brown PetscFunctionReturn(0); 3786cab3a1bSJed Brown } 3796cab3a1bSJed Brown 3806cab3a1bSJed Brown #undef __FUNCT__ 3812a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective" 3822a4ee8f2SPeter Brune /*@C 383081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 3842a4ee8f2SPeter Brune 3852a4ee8f2SPeter Brune Not Collective 3862a4ee8f2SPeter Brune 3872a4ee8f2SPeter Brune Input Arguments: 3882a4ee8f2SPeter Brune + dm - DM to be used with SNES 389075cc632SBarry Smith . SNESObjectiveFunction - residual evaluation function 3902a4ee8f2SPeter Brune - ctx - context for residual evaluation 3912a4ee8f2SPeter Brune 3922a4ee8f2SPeter Brune Level: advanced 3932a4ee8f2SPeter Brune 3942a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 3952a4ee8f2SPeter Brune @*/ 396075cc632SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*SNESObjectiveFunction)(SNES,Vec,PetscReal*,void*),void *ctx) 3972a4ee8f2SPeter Brune { 3982a4ee8f2SPeter Brune PetscErrorCode ierr; 399942e3340SBarry Smith DMSNES sdm; 4002a4ee8f2SPeter Brune 4012a4ee8f2SPeter Brune PetscFunctionBegin; 4022a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 403075cc632SBarry Smith if (SNESObjectiveFunction || ctx) { 404942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 405fdaff8d6SPeter Brune } 406075cc632SBarry Smith if (SNESObjectiveFunction) sdm->ops->computeobjective = SNESObjectiveFunction; 4072a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 4082a4ee8f2SPeter Brune PetscFunctionReturn(0); 4092a4ee8f2SPeter Brune } 4102a4ee8f2SPeter Brune 4112a4ee8f2SPeter Brune #undef __FUNCT__ 4122a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective" 4132a4ee8f2SPeter Brune /*@C 4142a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 4152a4ee8f2SPeter Brune 4162a4ee8f2SPeter Brune Not Collective 4172a4ee8f2SPeter Brune 4182a4ee8f2SPeter Brune Input Argument: 4192a4ee8f2SPeter Brune . dm - DM to be used with SNES 4202a4ee8f2SPeter Brune 4212a4ee8f2SPeter Brune Output Arguments: 422075cc632SBarry Smith + SNESObjectiveFunction- residual evaluation function 4232a4ee8f2SPeter Brune - ctx - context for residual evaluation 4242a4ee8f2SPeter Brune 4252a4ee8f2SPeter Brune Level: advanced 4262a4ee8f2SPeter Brune 4272a4ee8f2SPeter Brune Note: 4282a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 4292a4ee8f2SPeter Brune associated with the DM. 4302a4ee8f2SPeter Brune 4312a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 4322a4ee8f2SPeter Brune @*/ 433075cc632SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**SNESObjectiveFunction)(SNES,Vec,PetscReal*,void*),void **ctx) 4342a4ee8f2SPeter Brune { 4352a4ee8f2SPeter Brune PetscErrorCode ierr; 436942e3340SBarry Smith DMSNES sdm; 4372a4ee8f2SPeter Brune 4382a4ee8f2SPeter Brune PetscFunctionBegin; 4392a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 440942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 441075cc632SBarry Smith if (SNESObjectiveFunction) *SNESObjectiveFunction = sdm->ops->computeobjective; 4422a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 4432a4ee8f2SPeter Brune PetscFunctionReturn(0); 4442a4ee8f2SPeter Brune } 4452a4ee8f2SPeter Brune 4462a4ee8f2SPeter Brune #undef __FUNCT__ 4476cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS" 4486cab3a1bSJed Brown /*@C 4496cab3a1bSJed Brown DMSNESSetGS - set SNES Gauss-Seidel relaxation function 4506cab3a1bSJed Brown 4516cab3a1bSJed Brown Not Collective 4526cab3a1bSJed Brown 4536cab3a1bSJed Brown Input Argument: 4546cab3a1bSJed Brown + dm - DM to be used with SNES 455bf388a1fSBarry Smith . SNESGSFunction - relaxation function 4566cab3a1bSJed Brown - ctx - context for residual evaluation 4576cab3a1bSJed Brown 4586cab3a1bSJed Brown Level: advanced 4596cab3a1bSJed Brown 4606cab3a1bSJed Brown Note: 4616cab3a1bSJed Brown SNESSetGS() 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 465bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction 4666cab3a1bSJed Brown @*/ 467bf388a1fSBarry Smith PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*SNESGSFunction)(SNES,Vec,Vec,void*),void *ctx) 4686cab3a1bSJed Brown { 4696cab3a1bSJed Brown PetscErrorCode ierr; 470942e3340SBarry Smith DMSNES sdm; 4716cab3a1bSJed Brown 4726cab3a1bSJed Brown PetscFunctionBegin; 4736cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 474bf388a1fSBarry Smith if (SNESGSFunction || ctx) { 475942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 476fdaff8d6SPeter Brune } 477bf388a1fSBarry Smith if (SNESGSFunction) sdm->ops->computegs = SNESGSFunction; 4786cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 4796cab3a1bSJed Brown PetscFunctionReturn(0); 4806cab3a1bSJed Brown } 4816cab3a1bSJed Brown 4826cab3a1bSJed Brown #undef __FUNCT__ 4836cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS" 4846cab3a1bSJed Brown /*@C 4856cab3a1bSJed Brown DMSNESGetGS - get SNES Gauss-Seidel relaxation function 4866cab3a1bSJed Brown 4876cab3a1bSJed Brown Not Collective 4886cab3a1bSJed Brown 4896cab3a1bSJed Brown Input Argument: 4906cab3a1bSJed Brown . dm - DM to be used with SNES 4916cab3a1bSJed Brown 4926cab3a1bSJed Brown Output Arguments: 493bf388a1fSBarry Smith + SNESGSFunction - relaxation function which performs Gauss-Seidel sweeps 4946cab3a1bSJed Brown - ctx - context for residual evaluation 4956cab3a1bSJed Brown 4966cab3a1bSJed Brown Level: advanced 4976cab3a1bSJed Brown 4986cab3a1bSJed Brown Note: 4996cab3a1bSJed Brown SNESGetGS() is normally used, but it calls this function internally because the user context is actually 5006cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5016cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 5026cab3a1bSJed Brown 503bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESGSFunction 5046cab3a1bSJed Brown @*/ 505bf388a1fSBarry Smith PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**SNESGSFunction)(SNES,Vec,Vec,void*),void **ctx) 5066cab3a1bSJed Brown { 5076cab3a1bSJed Brown PetscErrorCode ierr; 508942e3340SBarry Smith DMSNES sdm; 5096cab3a1bSJed Brown 5106cab3a1bSJed Brown PetscFunctionBegin; 5116cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 512942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 513bf388a1fSBarry Smith if (SNESGSFunction) *SNESGSFunction = sdm->ops->computegs; 5146cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 5156cab3a1bSJed Brown PetscFunctionReturn(0); 5166cab3a1bSJed Brown } 5176cab3a1bSJed Brown 5186cab3a1bSJed Brown #undef __FUNCT__ 5196cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian" 5206cab3a1bSJed Brown /*@C 521ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 5226cab3a1bSJed Brown 5236cab3a1bSJed Brown Not Collective 5246cab3a1bSJed Brown 5256cab3a1bSJed Brown Input Argument: 5266cab3a1bSJed Brown + dm - DM to be used with SNES 527bf388a1fSBarry Smith . SNESJacobianFunction - Jacobian evaluation function 5286cab3a1bSJed Brown - ctx - context for residual evaluation 5296cab3a1bSJed Brown 5306cab3a1bSJed Brown Level: advanced 5316cab3a1bSJed Brown 5326cab3a1bSJed Brown Note: 5336cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 5346cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5356cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5366cab3a1bSJed Brown 537bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction 5386cab3a1bSJed Brown @*/ 539bf388a1fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 5406cab3a1bSJed Brown { 5416cab3a1bSJed Brown PetscErrorCode ierr; 542942e3340SBarry Smith DMSNES sdm; 5436cab3a1bSJed Brown 5446cab3a1bSJed Brown PetscFunctionBegin; 5456cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 546bf388a1fSBarry Smith if (SNESJacobianFunction || ctx) { 547942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 5481fdfe764SBarry Smith } 549bf388a1fSBarry Smith if (SNESJacobianFunction) sdm->ops->computejacobian = SNESJacobianFunction; 5506cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 5516cab3a1bSJed Brown PetscFunctionReturn(0); 5526cab3a1bSJed Brown } 5536cab3a1bSJed Brown 5546cab3a1bSJed Brown #undef __FUNCT__ 5556cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian" 5566cab3a1bSJed Brown /*@C 557ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 5586cab3a1bSJed Brown 5596cab3a1bSJed Brown Not Collective 5606cab3a1bSJed Brown 5616cab3a1bSJed Brown Input Argument: 5626cab3a1bSJed Brown . dm - DM to be used with SNES 5636cab3a1bSJed Brown 5646cab3a1bSJed Brown Output Arguments: 565bf388a1fSBarry Smith + SNESJacobianFunction - Jacobian evaluation function 5666cab3a1bSJed Brown - ctx - context for residual evaluation 5676cab3a1bSJed Brown 5686cab3a1bSJed Brown Level: advanced 5696cab3a1bSJed Brown 5706cab3a1bSJed Brown Note: 5716cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 5726cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5736cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5746cab3a1bSJed Brown 575bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction 5766cab3a1bSJed Brown @*/ 577bf388a1fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 5786cab3a1bSJed Brown { 5796cab3a1bSJed Brown PetscErrorCode ierr; 580942e3340SBarry Smith DMSNES sdm; 5816cab3a1bSJed Brown 5826cab3a1bSJed Brown PetscFunctionBegin; 5836cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 584942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 585bf388a1fSBarry Smith if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computejacobian; 5866cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 5876cab3a1bSJed Brown PetscFunctionReturn(0); 5886cab3a1bSJed Brown } 5896cab3a1bSJed Brown 5906cab3a1bSJed Brown #undef __FUNCT__ 591e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard" 592e03ab78fSPeter Brune /*@C 593e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 594e03ab78fSPeter Brune 595e03ab78fSPeter Brune Not Collective 596e03ab78fSPeter Brune 597e03ab78fSPeter Brune Input Argument: 598e03ab78fSPeter Brune + dm - DM to be used with SNES 599bf388a1fSBarry Smith . SNESFunction - RHS evaluation function 600bf388a1fSBarry Smith . SNESJacobianFunction - Picard matrix evaluation function 601e03ab78fSPeter Brune - ctx - context for residual evaluation 602e03ab78fSPeter Brune 603e03ab78fSPeter Brune Level: advanced 604e03ab78fSPeter Brune 605e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 606e03ab78fSPeter Brune @*/ 607bf388a1fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 608e03ab78fSPeter Brune { 609e03ab78fSPeter Brune PetscErrorCode ierr; 610942e3340SBarry Smith DMSNES sdm; 611e03ab78fSPeter Brune 612e03ab78fSPeter Brune PetscFunctionBegin; 613e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 614942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 615bf388a1fSBarry Smith if (SNESFunction) sdm->ops->computepfunction = SNESFunction; 616bf388a1fSBarry Smith if (SNESJacobianFunction) sdm->ops->computepjacobian = SNESJacobianFunction; 617e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 618e03ab78fSPeter Brune PetscFunctionReturn(0); 619e03ab78fSPeter Brune } 620e03ab78fSPeter Brune 6217971a8bfSPeter Brune #undef __FUNCT__ 6227971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard" 6237971a8bfSPeter Brune /*@C 6247971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 6257971a8bfSPeter Brune 6267971a8bfSPeter Brune Not Collective 6277971a8bfSPeter Brune 6287971a8bfSPeter Brune Input Argument: 6297971a8bfSPeter Brune . dm - DM to be used with SNES 6307971a8bfSPeter Brune 6317971a8bfSPeter Brune Output Arguments: 632bf388a1fSBarry Smith + SNESFunction - Jacobian evaluation function; 633bf388a1fSBarry Smith . SNESJacobianFunction - RHS evaluation function; 6347971a8bfSPeter Brune - ctx - context for residual evaluation 6357971a8bfSPeter Brune 6367971a8bfSPeter Brune Level: advanced 6377971a8bfSPeter Brune 6387971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 6397971a8bfSPeter Brune @*/ 640bf388a1fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 6417971a8bfSPeter Brune { 6427971a8bfSPeter Brune PetscErrorCode ierr; 643942e3340SBarry Smith DMSNES sdm; 6447971a8bfSPeter Brune 6457971a8bfSPeter Brune PetscFunctionBegin; 6467971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 647942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 648bf388a1fSBarry Smith if (SNESFunction) *SNESFunction = sdm->ops->computepfunction; 649bf388a1fSBarry Smith if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computepjacobian; 6507971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 6517971a8bfSPeter Brune PetscFunctionReturn(0); 6527971a8bfSPeter Brune } 653