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) { 55*3964eb88SJed Brown struct { 56*3964eb88SJed Brown PetscErrorCode (*func)(SNES,Vec,Vec,void*); 57*3964eb88SJed Brown PetscErrorCode (*jac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*); 58*3964eb88SJed Brown } funcstruct = {kdm->ops->computefunction,kdm->ops->computejacobian}; 59*3964eb88SJed Brown ierr = PetscViewerBinaryWrite(viewer,&funcstruct,2,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 602d53ad75SBarry Smith } 612d53ad75SBarry Smith PetscFunctionReturn(0); 622d53ad75SBarry Smith } 632d53ad75SBarry Smith 642d53ad75SBarry Smith #undef __FUNCT__ 6522c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate" 6622c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm) 6722c6f798SBarry Smith { 6822c6f798SBarry Smith PetscErrorCode ierr; 6922c6f798SBarry Smith 7022c6f798SBarry Smith PetscFunctionBegin; 71519f805aSKarl Rupp #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 720298fd71SBarry Smith ierr = SNESInitializePackage(NULL);CHKERRQ(ierr); 7322c6f798SBarry Smith #endif 7467c2884eSBarry Smith ierr = PetscHeaderCreate(*kdm, _p_DMSNES, struct _DMSNESOps, DMSNES_CLASSID, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr); 7522c6f798SBarry Smith ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMSNESOps));CHKERRQ(ierr); 766cab3a1bSJed Brown PetscFunctionReturn(0); 776cab3a1bSJed Brown } 786cab3a1bSJed Brown 796cab3a1bSJed Brown #undef __FUNCT__ 80942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES" 81942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 826cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 836cab3a1bSJed Brown */ 84942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 856cab3a1bSJed Brown { 866cab3a1bSJed Brown PetscErrorCode ierr; 876cab3a1bSJed Brown 886cab3a1bSJed Brown PetscFunctionBegin; 89942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr); 906cab3a1bSJed Brown PetscFunctionReturn(0); 916cab3a1bSJed Brown } 926cab3a1bSJed Brown 936cab3a1bSJed Brown #undef __FUNCT__ 94942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES" 95dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 96caa4e7f2SJed Brown */ 97942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 98caa4e7f2SJed Brown { 99caa4e7f2SJed Brown 100caa4e7f2SJed Brown PetscFunctionBegin; 101caa4e7f2SJed Brown PetscFunctionReturn(0); 102caa4e7f2SJed Brown } 103caa4e7f2SJed Brown 104caa4e7f2SJed Brown #undef __FUNCT__ 105be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES" 106be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */ 107be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx) 108be081cd6SPeter Brune { 109be081cd6SPeter Brune PetscErrorCode ierr; 110be081cd6SPeter Brune 111be081cd6SPeter Brune PetscFunctionBegin; 112be081cd6SPeter Brune ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr); 113be081cd6SPeter Brune PetscFunctionReturn(0); 114be081cd6SPeter Brune } 115be081cd6SPeter Brune 116be081cd6SPeter Brune #undef __FUNCT__ 117be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES" 118be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level. 119be081cd6SPeter Brune */ 120be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx) 121be081cd6SPeter Brune { 122be081cd6SPeter Brune 123be081cd6SPeter Brune PetscFunctionBegin; 124be081cd6SPeter Brune PetscFunctionReturn(0); 125be081cd6SPeter Brune } 126be081cd6SPeter Brune 127be081cd6SPeter Brune #undef __FUNCT__ 128942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES" 129942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 13003a0fabfSPeter Brune { 13103a0fabfSPeter Brune PetscErrorCode ierr; 13203a0fabfSPeter Brune 13303a0fabfSPeter Brune PetscFunctionBegin; 134942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr); 13503a0fabfSPeter Brune PetscFunctionReturn(0); 13603a0fabfSPeter Brune } 13703a0fabfSPeter Brune 13803a0fabfSPeter Brune #undef __FUNCT__ 139942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES" 14003a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 14103a0fabfSPeter Brune */ 142942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 14303a0fabfSPeter Brune { 14403a0fabfSPeter Brune 14503a0fabfSPeter Brune PetscFunctionBegin; 14603a0fabfSPeter Brune PetscFunctionReturn(0); 14703a0fabfSPeter Brune } 14803a0fabfSPeter Brune 14903a0fabfSPeter Brune #undef __FUNCT__ 15022c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy" 15122c6f798SBarry Smith /*@C 15222c6f798SBarry Smith DMSNESCopy - copies the information in a DMSNES to another DMSNES 15322c6f798SBarry Smith 15422c6f798SBarry Smith Not Collective 15522c6f798SBarry Smith 15622c6f798SBarry Smith Input Argument: 15722c6f798SBarry Smith + kdm - Original DMSNES 15822c6f798SBarry Smith - nkdm - DMSNES to receive the data, should have been created with DMSNESCreate() 15922c6f798SBarry Smith 16022c6f798SBarry Smith Level: developer 16122c6f798SBarry Smith 16222c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy() 16322c6f798SBarry Smith @*/ 16422c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm) 16522c6f798SBarry Smith { 16622c6f798SBarry Smith PetscErrorCode ierr; 16722c6f798SBarry Smith 16822c6f798SBarry Smith PetscFunctionBegin; 16922c6f798SBarry Smith PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1); 17022c6f798SBarry Smith PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2); 17122c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 1722bc4d0c4SPeter Brune nkdm->ops->computejacobian = kdm->ops->computejacobian; 17322c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 17422c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 17522c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 17622c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 17722c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 17822c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 17922c6f798SBarry Smith 18022c6f798SBarry Smith nkdm->functionctx = kdm->functionctx; 18122c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 18222c6f798SBarry Smith nkdm->pctx = kdm->pctx; 18322c6f798SBarry Smith nkdm->jacobianctx = kdm->jacobianctx; 18422c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 18522c6f798SBarry Smith nkdm->data = kdm->data; 18622c6f798SBarry Smith 18722c6f798SBarry Smith /* 18822c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 18922c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 19022c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 19122c6f798SBarry Smith */ 19222c6f798SBarry Smith 19322c6f798SBarry Smith /* implementation specific copy hooks */ 19422c6f798SBarry Smith if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);} 19522c6f798SBarry Smith PetscFunctionReturn(0); 19622c6f798SBarry Smith } 19722c6f798SBarry Smith 19822c6f798SBarry Smith #undef __FUNCT__ 199942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES" 2006cab3a1bSJed Brown /*@C 201942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 2026cab3a1bSJed Brown 2036cab3a1bSJed Brown Not Collective 2046cab3a1bSJed Brown 2056cab3a1bSJed Brown Input Argument: 2066cab3a1bSJed Brown . dm - DM to be used with SNES 2076cab3a1bSJed Brown 2086cab3a1bSJed Brown Output Argument: 209942e3340SBarry Smith . snesdm - private DMSNES context 2106cab3a1bSJed Brown 2116cab3a1bSJed Brown Level: developer 2126cab3a1bSJed Brown 2136cab3a1bSJed Brown Notes: 214942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 2156cab3a1bSJed Brown 216942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 2176cab3a1bSJed Brown @*/ 218942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 2196cab3a1bSJed Brown { 2206cab3a1bSJed Brown PetscErrorCode ierr; 2216cab3a1bSJed Brown 2226cab3a1bSJed Brown PetscFunctionBegin; 2236cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 224b4615a05SBarry Smith *snesdm = (DMSNES) dm->dmsnes; 22522c6f798SBarry Smith if (!*snesdm) { 226942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr); 227ce94432eSBarry Smith ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm);CHKERRQ(ierr); 2281aa26658SKarl Rupp 229b4615a05SBarry Smith dm->dmsnes = (PetscObject) *snesdm; 2301aa26658SKarl Rupp 2310298fd71SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2320298fd71SBarry Smith ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr); 2330298fd71SBarry Smith ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2346cab3a1bSJed Brown } 2356cab3a1bSJed Brown PetscFunctionReturn(0); 2366cab3a1bSJed Brown } 2376cab3a1bSJed Brown 2386cab3a1bSJed Brown #undef __FUNCT__ 239942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite" 2406cab3a1bSJed Brown /*@C 241942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 2426cab3a1bSJed Brown 2436cab3a1bSJed Brown Not Collective 2446cab3a1bSJed Brown 2456cab3a1bSJed Brown Input Argument: 2466cab3a1bSJed Brown . dm - DM to be used with SNES 2476cab3a1bSJed Brown 2486cab3a1bSJed Brown Output Argument: 249942e3340SBarry Smith . snesdm - private DMSNES context 2506cab3a1bSJed Brown 2516cab3a1bSJed Brown Level: developer 2526cab3a1bSJed Brown 253942e3340SBarry Smith .seealso: DMGetDMSNES() 2546cab3a1bSJed Brown @*/ 255942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 2566cab3a1bSJed Brown { 2576cab3a1bSJed Brown PetscErrorCode ierr; 258942e3340SBarry Smith DMSNES sdm; 2596cab3a1bSJed Brown 2606cab3a1bSJed Brown PetscFunctionBegin; 2616cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 262942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 2636cab3a1bSJed Brown if (!sdm->originaldm) sdm->originaldm = dm; 2646cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 265b4615a05SBarry Smith DMSNES oldsdm = sdm; 266942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr); 267ce94432eSBarry Smith ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr); 26822c6f798SBarry Smith ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr); 269b4615a05SBarry Smith ierr = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr); 270b4615a05SBarry Smith dm->dmsnes = (PetscObject)sdm; 2716cab3a1bSJed Brown } 2726cab3a1bSJed Brown *snesdm = sdm; 2736cab3a1bSJed Brown PetscFunctionReturn(0); 2746cab3a1bSJed Brown } 2756cab3a1bSJed Brown 2766cab3a1bSJed Brown #undef __FUNCT__ 277942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES" 2786cab3a1bSJed Brown /*@C 279942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 2806cab3a1bSJed Brown 2816cab3a1bSJed Brown Logically Collective 2826cab3a1bSJed Brown 2836cab3a1bSJed Brown Input Arguments: 2846cab3a1bSJed Brown + dmsrc - DM to obtain context from 2856cab3a1bSJed Brown - dmdest - DM to add context to 2866cab3a1bSJed Brown 2876cab3a1bSJed Brown Level: developer 2886cab3a1bSJed Brown 2896cab3a1bSJed Brown Note: 2906cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2916cab3a1bSJed Brown 292942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 2936cab3a1bSJed Brown @*/ 294942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 2956cab3a1bSJed Brown { 2966cab3a1bSJed Brown PetscErrorCode ierr; 2976cab3a1bSJed Brown 2986cab3a1bSJed Brown PetscFunctionBegin; 2996cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 3006cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 301b4615a05SBarry Smith ierr = DMSNESDestroy((DMSNES*)&dmdest->dmsnes);CHKERRQ(ierr); 3021aa26658SKarl Rupp 303b4615a05SBarry Smith dmdest->dmsnes = dmsrc->dmsnes; 3041aa26658SKarl Rupp 305b4615a05SBarry Smith ierr = PetscObjectReference(dmdest->dmsnes);CHKERRQ(ierr); 3060298fd71SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 3070298fd71SBarry Smith ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 3080298fd71SBarry Smith ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 3096cab3a1bSJed Brown PetscFunctionReturn(0); 3106cab3a1bSJed Brown } 3116cab3a1bSJed Brown 3126cab3a1bSJed Brown #undef __FUNCT__ 3136cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction" 3146cab3a1bSJed Brown /*@C 3156cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 3166cab3a1bSJed Brown 3176cab3a1bSJed Brown Not Collective 3186cab3a1bSJed Brown 3196cab3a1bSJed Brown Input Arguments: 3206cab3a1bSJed Brown + dm - DM to be used with SNES 321bf388a1fSBarry Smith . SNESFunction - residual evaluation function 3226cab3a1bSJed Brown - ctx - context for residual evaluation 3236cab3a1bSJed Brown 3246cab3a1bSJed Brown Level: advanced 3256cab3a1bSJed Brown 3266cab3a1bSJed Brown Note: 3276cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 3286cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 3296cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 3306cab3a1bSJed Brown 331bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction 3326cab3a1bSJed Brown @*/ 333bf388a1fSBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),void *ctx) 3346cab3a1bSJed Brown { 3356cab3a1bSJed Brown PetscErrorCode ierr; 336942e3340SBarry Smith DMSNES sdm; 3376cab3a1bSJed Brown 3386cab3a1bSJed Brown PetscFunctionBegin; 3396cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 340bf388a1fSBarry Smith if (SNESFunction || ctx) { 341942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 342fdaff8d6SPeter Brune } 343bf388a1fSBarry Smith if (SNESFunction) sdm->ops->computefunction = SNESFunction; 3446cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 3456cab3a1bSJed Brown PetscFunctionReturn(0); 3466cab3a1bSJed Brown } 3476cab3a1bSJed Brown 3486cab3a1bSJed Brown #undef __FUNCT__ 3496cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction" 3506cab3a1bSJed Brown /*@C 3516cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 3526cab3a1bSJed Brown 3536cab3a1bSJed Brown Not Collective 3546cab3a1bSJed Brown 3556cab3a1bSJed Brown Input Argument: 3566cab3a1bSJed Brown . dm - DM to be used with SNES 3576cab3a1bSJed Brown 3586cab3a1bSJed Brown Output Arguments: 359bf388a1fSBarry Smith + SNESFunction - residual evaluation function 3606cab3a1bSJed Brown - ctx - context for residual evaluation 3616cab3a1bSJed Brown 3626cab3a1bSJed Brown Level: advanced 3636cab3a1bSJed Brown 3646cab3a1bSJed Brown Note: 3656cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3666cab3a1bSJed Brown associated with the DM. 3676cab3a1bSJed Brown 368bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction 3696cab3a1bSJed Brown @*/ 370bf388a1fSBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),void **ctx) 3716cab3a1bSJed Brown { 3726cab3a1bSJed Brown PetscErrorCode ierr; 373942e3340SBarry Smith DMSNES sdm; 3746cab3a1bSJed Brown 3756cab3a1bSJed Brown PetscFunctionBegin; 3766cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 377942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 378bf388a1fSBarry Smith if (SNESFunction) *SNESFunction = sdm->ops->computefunction; 3796cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 3806cab3a1bSJed Brown PetscFunctionReturn(0); 3816cab3a1bSJed Brown } 3826cab3a1bSJed Brown 3836cab3a1bSJed Brown #undef __FUNCT__ 3842a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective" 3852a4ee8f2SPeter Brune /*@C 386081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 3872a4ee8f2SPeter Brune 3882a4ee8f2SPeter Brune Not Collective 3892a4ee8f2SPeter Brune 3902a4ee8f2SPeter Brune Input Arguments: 3912a4ee8f2SPeter Brune + dm - DM to be used with SNES 392075cc632SBarry Smith . SNESObjectiveFunction - residual evaluation function 3932a4ee8f2SPeter Brune - ctx - context for residual evaluation 3942a4ee8f2SPeter Brune 3952a4ee8f2SPeter Brune Level: advanced 3962a4ee8f2SPeter Brune 3972a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 3982a4ee8f2SPeter Brune @*/ 399075cc632SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*SNESObjectiveFunction)(SNES,Vec,PetscReal*,void*),void *ctx) 4002a4ee8f2SPeter Brune { 4012a4ee8f2SPeter Brune PetscErrorCode ierr; 402942e3340SBarry Smith DMSNES sdm; 4032a4ee8f2SPeter Brune 4042a4ee8f2SPeter Brune PetscFunctionBegin; 4052a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 406075cc632SBarry Smith if (SNESObjectiveFunction || ctx) { 407942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 408fdaff8d6SPeter Brune } 409075cc632SBarry Smith if (SNESObjectiveFunction) sdm->ops->computeobjective = SNESObjectiveFunction; 4102a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 4112a4ee8f2SPeter Brune PetscFunctionReturn(0); 4122a4ee8f2SPeter Brune } 4132a4ee8f2SPeter Brune 4142a4ee8f2SPeter Brune #undef __FUNCT__ 4152a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective" 4162a4ee8f2SPeter Brune /*@C 4172a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 4182a4ee8f2SPeter Brune 4192a4ee8f2SPeter Brune Not Collective 4202a4ee8f2SPeter Brune 4212a4ee8f2SPeter Brune Input Argument: 4222a4ee8f2SPeter Brune . dm - DM to be used with SNES 4232a4ee8f2SPeter Brune 4242a4ee8f2SPeter Brune Output Arguments: 425075cc632SBarry Smith + SNESObjectiveFunction- residual evaluation function 4262a4ee8f2SPeter Brune - ctx - context for residual evaluation 4272a4ee8f2SPeter Brune 4282a4ee8f2SPeter Brune Level: advanced 4292a4ee8f2SPeter Brune 4302a4ee8f2SPeter Brune Note: 4312a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 4322a4ee8f2SPeter Brune associated with the DM. 4332a4ee8f2SPeter Brune 4342a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 4352a4ee8f2SPeter Brune @*/ 436075cc632SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**SNESObjectiveFunction)(SNES,Vec,PetscReal*,void*),void **ctx) 4372a4ee8f2SPeter Brune { 4382a4ee8f2SPeter Brune PetscErrorCode ierr; 439942e3340SBarry Smith DMSNES sdm; 4402a4ee8f2SPeter Brune 4412a4ee8f2SPeter Brune PetscFunctionBegin; 4422a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 443942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 444075cc632SBarry Smith if (SNESObjectiveFunction) *SNESObjectiveFunction = sdm->ops->computeobjective; 4452a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 4462a4ee8f2SPeter Brune PetscFunctionReturn(0); 4472a4ee8f2SPeter Brune } 4482a4ee8f2SPeter Brune 4492a4ee8f2SPeter Brune #undef __FUNCT__ 4506cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS" 4516cab3a1bSJed Brown /*@C 4526cab3a1bSJed Brown DMSNESSetGS - set SNES Gauss-Seidel relaxation function 4536cab3a1bSJed Brown 4546cab3a1bSJed Brown Not Collective 4556cab3a1bSJed Brown 4566cab3a1bSJed Brown Input Argument: 4576cab3a1bSJed Brown + dm - DM to be used with SNES 458bf388a1fSBarry Smith . SNESGSFunction - relaxation function 4596cab3a1bSJed Brown - ctx - context for residual evaluation 4606cab3a1bSJed Brown 4616cab3a1bSJed Brown Level: advanced 4626cab3a1bSJed Brown 4636cab3a1bSJed Brown Note: 4646cab3a1bSJed Brown SNESSetGS() is normally used, but it calls this function internally because the user context is actually 4656cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4666cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4676cab3a1bSJed Brown 468bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction 4696cab3a1bSJed Brown @*/ 470bf388a1fSBarry Smith PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*SNESGSFunction)(SNES,Vec,Vec,void*),void *ctx) 4716cab3a1bSJed Brown { 4726cab3a1bSJed Brown PetscErrorCode ierr; 473942e3340SBarry Smith DMSNES sdm; 4746cab3a1bSJed Brown 4756cab3a1bSJed Brown PetscFunctionBegin; 4766cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 477bf388a1fSBarry Smith if (SNESGSFunction || ctx) { 478942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 479fdaff8d6SPeter Brune } 480bf388a1fSBarry Smith if (SNESGSFunction) sdm->ops->computegs = SNESGSFunction; 4816cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 4826cab3a1bSJed Brown PetscFunctionReturn(0); 4836cab3a1bSJed Brown } 4846cab3a1bSJed Brown 4856cab3a1bSJed Brown #undef __FUNCT__ 4866cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS" 4876cab3a1bSJed Brown /*@C 4886cab3a1bSJed Brown DMSNESGetGS - get SNES Gauss-Seidel relaxation function 4896cab3a1bSJed Brown 4906cab3a1bSJed Brown Not Collective 4916cab3a1bSJed Brown 4926cab3a1bSJed Brown Input Argument: 4936cab3a1bSJed Brown . dm - DM to be used with SNES 4946cab3a1bSJed Brown 4956cab3a1bSJed Brown Output Arguments: 496bf388a1fSBarry Smith + SNESGSFunction - relaxation function which performs Gauss-Seidel sweeps 4976cab3a1bSJed Brown - ctx - context for residual evaluation 4986cab3a1bSJed Brown 4996cab3a1bSJed Brown Level: advanced 5006cab3a1bSJed Brown 5016cab3a1bSJed Brown Note: 5026cab3a1bSJed Brown SNESGetGS() is normally used, but it calls this function internally because the user context is actually 5036cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5046cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 5056cab3a1bSJed Brown 506bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESGSFunction 5076cab3a1bSJed Brown @*/ 508bf388a1fSBarry Smith PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**SNESGSFunction)(SNES,Vec,Vec,void*),void **ctx) 5096cab3a1bSJed Brown { 5106cab3a1bSJed Brown PetscErrorCode ierr; 511942e3340SBarry Smith DMSNES sdm; 5126cab3a1bSJed Brown 5136cab3a1bSJed Brown PetscFunctionBegin; 5146cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 515942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 516bf388a1fSBarry Smith if (SNESGSFunction) *SNESGSFunction = sdm->ops->computegs; 5176cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 5186cab3a1bSJed Brown PetscFunctionReturn(0); 5196cab3a1bSJed Brown } 5206cab3a1bSJed Brown 5216cab3a1bSJed Brown #undef __FUNCT__ 5226cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian" 5236cab3a1bSJed Brown /*@C 524ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 5256cab3a1bSJed Brown 5266cab3a1bSJed Brown Not Collective 5276cab3a1bSJed Brown 5286cab3a1bSJed Brown Input Argument: 5296cab3a1bSJed Brown + dm - DM to be used with SNES 530bf388a1fSBarry Smith . SNESJacobianFunction - Jacobian evaluation function 5316cab3a1bSJed Brown - ctx - context for residual evaluation 5326cab3a1bSJed Brown 5336cab3a1bSJed Brown Level: advanced 5346cab3a1bSJed Brown 5356cab3a1bSJed Brown Note: 5366cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 5376cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5386cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5396cab3a1bSJed Brown 540bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction 5416cab3a1bSJed Brown @*/ 542bf388a1fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 5436cab3a1bSJed Brown { 5446cab3a1bSJed Brown PetscErrorCode ierr; 545942e3340SBarry Smith DMSNES sdm; 5466cab3a1bSJed Brown 5476cab3a1bSJed Brown PetscFunctionBegin; 5486cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 549bf388a1fSBarry Smith if (SNESJacobianFunction || ctx) { 550942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 5511fdfe764SBarry Smith } 552bf388a1fSBarry Smith if (SNESJacobianFunction) sdm->ops->computejacobian = SNESJacobianFunction; 5536cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 5546cab3a1bSJed Brown PetscFunctionReturn(0); 5556cab3a1bSJed Brown } 5566cab3a1bSJed Brown 5576cab3a1bSJed Brown #undef __FUNCT__ 5586cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian" 5596cab3a1bSJed Brown /*@C 560ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 5616cab3a1bSJed Brown 5626cab3a1bSJed Brown Not Collective 5636cab3a1bSJed Brown 5646cab3a1bSJed Brown Input Argument: 5656cab3a1bSJed Brown . dm - DM to be used with SNES 5666cab3a1bSJed Brown 5676cab3a1bSJed Brown Output Arguments: 568bf388a1fSBarry Smith + SNESJacobianFunction - Jacobian evaluation function 5696cab3a1bSJed Brown - ctx - context for residual evaluation 5706cab3a1bSJed Brown 5716cab3a1bSJed Brown Level: advanced 5726cab3a1bSJed Brown 5736cab3a1bSJed Brown Note: 5746cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 5756cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5766cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5776cab3a1bSJed Brown 578bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction 5796cab3a1bSJed Brown @*/ 580bf388a1fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 5816cab3a1bSJed Brown { 5826cab3a1bSJed Brown PetscErrorCode ierr; 583942e3340SBarry Smith DMSNES sdm; 5846cab3a1bSJed Brown 5856cab3a1bSJed Brown PetscFunctionBegin; 5866cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 587942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 588bf388a1fSBarry Smith if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computejacobian; 5896cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 5906cab3a1bSJed Brown PetscFunctionReturn(0); 5916cab3a1bSJed Brown } 5926cab3a1bSJed Brown 5936cab3a1bSJed Brown #undef __FUNCT__ 594e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard" 595e03ab78fSPeter Brune /*@C 596e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 597e03ab78fSPeter Brune 598e03ab78fSPeter Brune Not Collective 599e03ab78fSPeter Brune 600e03ab78fSPeter Brune Input Argument: 601e03ab78fSPeter Brune + dm - DM to be used with SNES 602bf388a1fSBarry Smith . SNESFunction - RHS evaluation function 603bf388a1fSBarry Smith . SNESJacobianFunction - Picard matrix evaluation function 604e03ab78fSPeter Brune - ctx - context for residual evaluation 605e03ab78fSPeter Brune 606e03ab78fSPeter Brune Level: advanced 607e03ab78fSPeter Brune 608e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 609e03ab78fSPeter Brune @*/ 610bf388a1fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (*SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 611e03ab78fSPeter Brune { 612e03ab78fSPeter Brune PetscErrorCode ierr; 613942e3340SBarry Smith DMSNES sdm; 614e03ab78fSPeter Brune 615e03ab78fSPeter Brune PetscFunctionBegin; 616e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 617942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 618bf388a1fSBarry Smith if (SNESFunction) sdm->ops->computepfunction = SNESFunction; 619bf388a1fSBarry Smith if (SNESJacobianFunction) sdm->ops->computepjacobian = SNESJacobianFunction; 620e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 621e03ab78fSPeter Brune PetscFunctionReturn(0); 622e03ab78fSPeter Brune } 623e03ab78fSPeter Brune 6247971a8bfSPeter Brune #undef __FUNCT__ 6257971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard" 6267971a8bfSPeter Brune /*@C 6277971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 6287971a8bfSPeter Brune 6297971a8bfSPeter Brune Not Collective 6307971a8bfSPeter Brune 6317971a8bfSPeter Brune Input Argument: 6327971a8bfSPeter Brune . dm - DM to be used with SNES 6337971a8bfSPeter Brune 6347971a8bfSPeter Brune Output Arguments: 635bf388a1fSBarry Smith + SNESFunction - Jacobian evaluation function; 636bf388a1fSBarry Smith . SNESJacobianFunction - RHS evaluation function; 6377971a8bfSPeter Brune - ctx - context for residual evaluation 6387971a8bfSPeter Brune 6397971a8bfSPeter Brune Level: advanced 6407971a8bfSPeter Brune 6417971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 6427971a8bfSPeter Brune @*/ 643bf388a1fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**SNESFunction)(SNES,Vec,Vec,void*),PetscErrorCode (**SNESJacobianFunction)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 6447971a8bfSPeter Brune { 6457971a8bfSPeter Brune PetscErrorCode ierr; 646942e3340SBarry Smith DMSNES sdm; 6477971a8bfSPeter Brune 6487971a8bfSPeter Brune PetscFunctionBegin; 6497971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 650942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 651bf388a1fSBarry Smith if (SNESFunction) *SNESFunction = sdm->ops->computepfunction; 652bf388a1fSBarry Smith if (SNESJacobianFunction) *SNESJacobianFunction = sdm->ops->computepjacobian; 6537971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 6547971a8bfSPeter Brune PetscFunctionReturn(0); 6557971a8bfSPeter Brune } 656