1af0996ceSBarry Smith #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/ 2af0996ceSBarry Smith #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; 26060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computefunction,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 27060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->computejacobian,1,NULL,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) { 553964eb88SJed Brown struct { 563964eb88SJed Brown PetscErrorCode (*func)(SNES,Vec,Vec,void*); 579200755eSBarry Smith } funcstruct; 589200755eSBarry Smith struct { 59d1e9a80fSBarry Smith PetscErrorCode (*jac)(SNES,Vec,Mat,Mat,void*); 609200755eSBarry Smith } jacstruct; 619200755eSBarry Smith funcstruct.func = kdm->ops->computefunction; 629200755eSBarry Smith jacstruct.jac = kdm->ops->computejacobian; 639200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 649200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 652d53ad75SBarry Smith } 662d53ad75SBarry Smith PetscFunctionReturn(0); 672d53ad75SBarry Smith } 682d53ad75SBarry Smith 692d53ad75SBarry Smith #undef __FUNCT__ 7022c6f798SBarry Smith #define __FUNCT__ "DMSNESCreate" 7122c6f798SBarry Smith static PetscErrorCode DMSNESCreate(MPI_Comm comm,DMSNES *kdm) 7222c6f798SBarry Smith { 7322c6f798SBarry Smith PetscErrorCode ierr; 7422c6f798SBarry Smith 7522c6f798SBarry Smith PetscFunctionBegin; 76607a6623SBarry Smith ierr = SNESInitializePackage();CHKERRQ(ierr); 77*73107ff1SLisandro Dalcin ierr = PetscHeaderCreate(*kdm, DMSNES_CLASSID, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView);CHKERRQ(ierr); 786cab3a1bSJed Brown PetscFunctionReturn(0); 796cab3a1bSJed Brown } 806cab3a1bSJed Brown 816cab3a1bSJed Brown #undef __FUNCT__ 82942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES" 83942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 846cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 856cab3a1bSJed Brown */ 86942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 876cab3a1bSJed Brown { 886cab3a1bSJed Brown PetscErrorCode ierr; 896cab3a1bSJed Brown 906cab3a1bSJed Brown PetscFunctionBegin; 91942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr); 926cab3a1bSJed Brown PetscFunctionReturn(0); 936cab3a1bSJed Brown } 946cab3a1bSJed Brown 956cab3a1bSJed Brown #undef __FUNCT__ 96942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES" 97dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 98caa4e7f2SJed Brown */ 99942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 100caa4e7f2SJed Brown { 101caa4e7f2SJed Brown 102caa4e7f2SJed Brown PetscFunctionBegin; 103caa4e7f2SJed Brown PetscFunctionReturn(0); 104caa4e7f2SJed Brown } 105caa4e7f2SJed Brown 106caa4e7f2SJed Brown #undef __FUNCT__ 107be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMSNES" 108be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */ 109be081cd6SPeter Brune static PetscErrorCode DMSubDomainHook_DMSNES(DM dm,DM subdm,void *ctx) 110be081cd6SPeter Brune { 111be081cd6SPeter Brune PetscErrorCode ierr; 112be081cd6SPeter Brune 113be081cd6SPeter Brune PetscFunctionBegin; 114be081cd6SPeter Brune ierr = DMCopyDMSNES(dm,subdm);CHKERRQ(ierr); 115be081cd6SPeter Brune PetscFunctionReturn(0); 116be081cd6SPeter Brune } 117be081cd6SPeter Brune 118be081cd6SPeter Brune #undef __FUNCT__ 119be081cd6SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMSNES" 120be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level. 121be081cd6SPeter Brune */ 122be081cd6SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx) 123be081cd6SPeter Brune { 124be081cd6SPeter Brune 125be081cd6SPeter Brune PetscFunctionBegin; 126be081cd6SPeter Brune PetscFunctionReturn(0); 127be081cd6SPeter Brune } 128be081cd6SPeter Brune 129be081cd6SPeter Brune #undef __FUNCT__ 130942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES" 131942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 13203a0fabfSPeter Brune { 13303a0fabfSPeter Brune PetscErrorCode ierr; 13403a0fabfSPeter Brune 13503a0fabfSPeter Brune PetscFunctionBegin; 136942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr); 13703a0fabfSPeter Brune PetscFunctionReturn(0); 13803a0fabfSPeter Brune } 13903a0fabfSPeter Brune 14003a0fabfSPeter Brune #undef __FUNCT__ 141942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES" 14203a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 14303a0fabfSPeter Brune */ 144942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 14503a0fabfSPeter Brune { 14603a0fabfSPeter Brune 14703a0fabfSPeter Brune PetscFunctionBegin; 14803a0fabfSPeter Brune PetscFunctionReturn(0); 14903a0fabfSPeter Brune } 15003a0fabfSPeter Brune 15103a0fabfSPeter Brune #undef __FUNCT__ 15222c6f798SBarry Smith #define __FUNCT__ "DMSNESCopy" 15322c6f798SBarry Smith /*@C 15422c6f798SBarry Smith DMSNESCopy - copies the information in a DMSNES to another DMSNES 15522c6f798SBarry Smith 15622c6f798SBarry Smith Not Collective 15722c6f798SBarry Smith 15822c6f798SBarry Smith Input Argument: 15922c6f798SBarry Smith + kdm - Original DMSNES 16022c6f798SBarry Smith - nkdm - DMSNES to receive the data, should have been created with DMSNESCreate() 16122c6f798SBarry Smith 16222c6f798SBarry Smith Level: developer 16322c6f798SBarry Smith 16422c6f798SBarry Smith .seealso: DMSNESCreate(), DMSNESDestroy() 16522c6f798SBarry Smith @*/ 16622c6f798SBarry Smith PetscErrorCode DMSNESCopy(DMSNES kdm,DMSNES nkdm) 16722c6f798SBarry Smith { 16822c6f798SBarry Smith PetscErrorCode ierr; 16922c6f798SBarry Smith 17022c6f798SBarry Smith PetscFunctionBegin; 17122c6f798SBarry Smith PetscValidHeaderSpecific(kdm,DMSNES_CLASSID,1); 17222c6f798SBarry Smith PetscValidHeaderSpecific(nkdm,DMSNES_CLASSID,2); 17322c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 1742bc4d0c4SPeter Brune nkdm->ops->computejacobian = kdm->ops->computejacobian; 17522c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 17622c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 17722c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 17822c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 17922c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 18022c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 18122c6f798SBarry Smith 18222c6f798SBarry Smith nkdm->functionctx = kdm->functionctx; 18322c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 18422c6f798SBarry Smith nkdm->pctx = kdm->pctx; 18522c6f798SBarry Smith nkdm->jacobianctx = kdm->jacobianctx; 18622c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 18722c6f798SBarry Smith nkdm->data = kdm->data; 18822c6f798SBarry Smith 18922c6f798SBarry Smith /* 19022c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 19122c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 19222c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 19322c6f798SBarry Smith */ 19422c6f798SBarry Smith 19522c6f798SBarry Smith /* implementation specific copy hooks */ 19622c6f798SBarry Smith if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);} 19722c6f798SBarry Smith PetscFunctionReturn(0); 19822c6f798SBarry Smith } 19922c6f798SBarry Smith 20022c6f798SBarry Smith #undef __FUNCT__ 201942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES" 2026cab3a1bSJed Brown /*@C 203942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 2046cab3a1bSJed Brown 2056cab3a1bSJed Brown Not Collective 2066cab3a1bSJed Brown 2076cab3a1bSJed Brown Input Argument: 2086cab3a1bSJed Brown . dm - DM to be used with SNES 2096cab3a1bSJed Brown 2106cab3a1bSJed Brown Output Argument: 211942e3340SBarry Smith . snesdm - private DMSNES context 2126cab3a1bSJed Brown 2136cab3a1bSJed Brown Level: developer 2146cab3a1bSJed Brown 2156cab3a1bSJed Brown Notes: 216942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 2176cab3a1bSJed Brown 218942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 2196cab3a1bSJed Brown @*/ 220942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 2216cab3a1bSJed Brown { 2226cab3a1bSJed Brown PetscErrorCode ierr; 2236cab3a1bSJed Brown 2246cab3a1bSJed Brown PetscFunctionBegin; 2256cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 226b4615a05SBarry Smith *snesdm = (DMSNES) dm->dmsnes; 22722c6f798SBarry Smith if (!*snesdm) { 228942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr); 229ce94432eSBarry Smith ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),snesdm);CHKERRQ(ierr); 2301aa26658SKarl Rupp 231b4615a05SBarry Smith dm->dmsnes = (PetscObject) *snesdm; 2321aa26658SKarl Rupp 2330298fd71SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2340298fd71SBarry Smith ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,NULL);CHKERRQ(ierr); 2350298fd71SBarry Smith ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 2366cab3a1bSJed Brown } 2376cab3a1bSJed Brown PetscFunctionReturn(0); 2386cab3a1bSJed Brown } 2396cab3a1bSJed Brown 2406cab3a1bSJed Brown #undef __FUNCT__ 241942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite" 2426cab3a1bSJed Brown /*@C 243942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 2446cab3a1bSJed Brown 2456cab3a1bSJed Brown Not Collective 2466cab3a1bSJed Brown 2476cab3a1bSJed Brown Input Argument: 2486cab3a1bSJed Brown . dm - DM to be used with SNES 2496cab3a1bSJed Brown 2506cab3a1bSJed Brown Output Argument: 251942e3340SBarry Smith . snesdm - private DMSNES context 2526cab3a1bSJed Brown 2536cab3a1bSJed Brown Level: developer 2546cab3a1bSJed Brown 255942e3340SBarry Smith .seealso: DMGetDMSNES() 2566cab3a1bSJed Brown @*/ 257942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 2586cab3a1bSJed Brown { 2596cab3a1bSJed Brown PetscErrorCode ierr; 260942e3340SBarry Smith DMSNES sdm; 2616cab3a1bSJed Brown 2626cab3a1bSJed Brown PetscFunctionBegin; 2636cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 264942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 2656cab3a1bSJed Brown if (!sdm->originaldm) sdm->originaldm = dm; 2666cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 267b4615a05SBarry Smith DMSNES oldsdm = sdm; 268942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr); 269ce94432eSBarry Smith ierr = DMSNESCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr); 27022c6f798SBarry Smith ierr = DMSNESCopy(oldsdm,sdm);CHKERRQ(ierr); 271b4615a05SBarry Smith ierr = DMSNESDestroy((DMSNES*)&dm->dmsnes);CHKERRQ(ierr); 272b4615a05SBarry Smith dm->dmsnes = (PetscObject)sdm; 2736cab3a1bSJed Brown } 2746cab3a1bSJed Brown *snesdm = sdm; 2756cab3a1bSJed Brown PetscFunctionReturn(0); 2766cab3a1bSJed Brown } 2776cab3a1bSJed Brown 2786cab3a1bSJed Brown #undef __FUNCT__ 279942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES" 2806cab3a1bSJed Brown /*@C 281942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 2826cab3a1bSJed Brown 2836cab3a1bSJed Brown Logically Collective 2846cab3a1bSJed Brown 2856cab3a1bSJed Brown Input Arguments: 2866cab3a1bSJed Brown + dmsrc - DM to obtain context from 2876cab3a1bSJed Brown - dmdest - DM to add context to 2886cab3a1bSJed Brown 2896cab3a1bSJed Brown Level: developer 2906cab3a1bSJed Brown 2916cab3a1bSJed Brown Note: 2926cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2936cab3a1bSJed Brown 294942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 2956cab3a1bSJed Brown @*/ 296942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 2976cab3a1bSJed Brown { 2986cab3a1bSJed Brown PetscErrorCode ierr; 2996cab3a1bSJed Brown 3006cab3a1bSJed Brown PetscFunctionBegin; 3016cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 3026cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 30353705c30SMatthew G. Knepley if (!dmdest->dmsnes) {ierr = DMSNESCreate(PetscObjectComm((PetscObject) dmdest), (DMSNES *) &dmdest->dmsnes);CHKERRQ(ierr);} 30453705c30SMatthew G. Knepley ierr = DMSNESCopy((DMSNES) dmsrc->dmsnes, (DMSNES) dmdest->dmsnes);CHKERRQ(ierr); 3050298fd71SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 3060298fd71SBarry Smith ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,NULL,NULL);CHKERRQ(ierr); 3070298fd71SBarry Smith ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMSNES,DMSubDomainRestrictHook_DMSNES,NULL);CHKERRQ(ierr); 3086cab3a1bSJed Brown PetscFunctionReturn(0); 3096cab3a1bSJed Brown } 3106cab3a1bSJed Brown 3116cab3a1bSJed Brown #undef __FUNCT__ 3126cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction" 3136cab3a1bSJed Brown /*@C 3146cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 3156cab3a1bSJed Brown 3166cab3a1bSJed Brown Not Collective 3176cab3a1bSJed Brown 3186cab3a1bSJed Brown Input Arguments: 3196cab3a1bSJed Brown + dm - DM to be used with SNES 320f8b49ee9SBarry Smith . f - residual evaluation function; see SNESFunction for details 3216cab3a1bSJed Brown - ctx - context for residual evaluation 3226cab3a1bSJed Brown 3236cab3a1bSJed Brown Level: advanced 3246cab3a1bSJed Brown 3256cab3a1bSJed Brown Note: 3266cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 3276cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 3286cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 3296cab3a1bSJed Brown 330bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESFunction 3316cab3a1bSJed Brown @*/ 332f8b49ee9SBarry Smith PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx) 3336cab3a1bSJed Brown { 3346cab3a1bSJed Brown PetscErrorCode ierr; 335942e3340SBarry Smith DMSNES sdm; 3366cab3a1bSJed Brown 3376cab3a1bSJed Brown PetscFunctionBegin; 3386cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 339f8b49ee9SBarry Smith if (f || ctx) { 340942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 341fdaff8d6SPeter Brune } 342f8b49ee9SBarry Smith if (f) sdm->ops->computefunction = f; 3436cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 3446cab3a1bSJed Brown PetscFunctionReturn(0); 3456cab3a1bSJed Brown } 3466cab3a1bSJed Brown 3476cab3a1bSJed Brown #undef __FUNCT__ 3486cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction" 3496cab3a1bSJed Brown /*@C 3506cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 3516cab3a1bSJed Brown 3526cab3a1bSJed Brown Not Collective 3536cab3a1bSJed Brown 3546cab3a1bSJed Brown Input Argument: 3556cab3a1bSJed Brown . dm - DM to be used with SNES 3566cab3a1bSJed Brown 3576cab3a1bSJed Brown Output Arguments: 358f8b49ee9SBarry Smith + f - residual evaluation function; see SNESFunction for details 3596cab3a1bSJed Brown - ctx - context for residual evaluation 3606cab3a1bSJed Brown 3616cab3a1bSJed Brown Level: advanced 3626cab3a1bSJed Brown 3636cab3a1bSJed Brown Note: 3646cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3656cab3a1bSJed Brown associated with the DM. 3666cab3a1bSJed Brown 367bf388a1fSBarry Smith .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction(), SNESFunction 3686cab3a1bSJed Brown @*/ 369f8b49ee9SBarry Smith PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx) 3706cab3a1bSJed Brown { 3716cab3a1bSJed Brown PetscErrorCode ierr; 372942e3340SBarry Smith DMSNES sdm; 3736cab3a1bSJed Brown 3746cab3a1bSJed Brown PetscFunctionBegin; 3756cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 376942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 377f8b49ee9SBarry Smith if (f) *f = sdm->ops->computefunction; 3786cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 3796cab3a1bSJed Brown PetscFunctionReturn(0); 3806cab3a1bSJed Brown } 3816cab3a1bSJed Brown 3826cab3a1bSJed Brown #undef __FUNCT__ 3832a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective" 3842a4ee8f2SPeter Brune /*@C 385081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 3862a4ee8f2SPeter Brune 3872a4ee8f2SPeter Brune Not Collective 3882a4ee8f2SPeter Brune 3892a4ee8f2SPeter Brune Input Arguments: 3902a4ee8f2SPeter Brune + dm - DM to be used with SNES 391f8b49ee9SBarry Smith . obj - objective evaluation function; see SNESObjectiveFunction for details 3922a4ee8f2SPeter Brune - ctx - context for residual evaluation 3932a4ee8f2SPeter Brune 3942a4ee8f2SPeter Brune Level: advanced 3952a4ee8f2SPeter Brune 3962a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 3972a4ee8f2SPeter Brune @*/ 398f8b49ee9SBarry Smith PetscErrorCode DMSNESSetObjective(DM dm,PetscErrorCode (*obj)(SNES,Vec,PetscReal*,void*),void *ctx) 3992a4ee8f2SPeter Brune { 4002a4ee8f2SPeter Brune PetscErrorCode ierr; 401942e3340SBarry Smith DMSNES sdm; 4022a4ee8f2SPeter Brune 4032a4ee8f2SPeter Brune PetscFunctionBegin; 4042a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 405f8b49ee9SBarry Smith if (obj || ctx) { 406942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 407fdaff8d6SPeter Brune } 408f8b49ee9SBarry Smith if (obj) sdm->ops->computeobjective = obj; 4092a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 4102a4ee8f2SPeter Brune PetscFunctionReturn(0); 4112a4ee8f2SPeter Brune } 4122a4ee8f2SPeter Brune 4132a4ee8f2SPeter Brune #undef __FUNCT__ 4142a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective" 4152a4ee8f2SPeter Brune /*@C 4162a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 4172a4ee8f2SPeter Brune 4182a4ee8f2SPeter Brune Not Collective 4192a4ee8f2SPeter Brune 4202a4ee8f2SPeter Brune Input Argument: 4212a4ee8f2SPeter Brune . dm - DM to be used with SNES 4222a4ee8f2SPeter Brune 4232a4ee8f2SPeter Brune Output Arguments: 424f8b49ee9SBarry Smith + obj- residual evaluation function; see SNESObjectiveFunction for details 4252a4ee8f2SPeter Brune - ctx - context for residual evaluation 4262a4ee8f2SPeter Brune 4272a4ee8f2SPeter Brune Level: advanced 4282a4ee8f2SPeter Brune 4292a4ee8f2SPeter Brune Note: 4302a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 4312a4ee8f2SPeter Brune associated with the DM. 4322a4ee8f2SPeter Brune 4332a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 4342a4ee8f2SPeter Brune @*/ 435f8b49ee9SBarry Smith PetscErrorCode DMSNESGetObjective(DM dm,PetscErrorCode (**obj)(SNES,Vec,PetscReal*,void*),void **ctx) 4362a4ee8f2SPeter Brune { 4372a4ee8f2SPeter Brune PetscErrorCode ierr; 438942e3340SBarry Smith DMSNES sdm; 4392a4ee8f2SPeter Brune 4402a4ee8f2SPeter Brune PetscFunctionBegin; 4412a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 442942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 443f8b49ee9SBarry Smith if (obj) *obj = sdm->ops->computeobjective; 4442a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 4452a4ee8f2SPeter Brune PetscFunctionReturn(0); 4462a4ee8f2SPeter Brune } 4472a4ee8f2SPeter Brune 4482a4ee8f2SPeter Brune #undef __FUNCT__ 449be95d8f1SBarry Smith #define __FUNCT__ "DMSNESSetNGS" 4506cab3a1bSJed Brown /*@C 451be95d8f1SBarry Smith DMSNESSetNGS - set SNES Gauss-Seidel relaxation function 4526cab3a1bSJed Brown 4536cab3a1bSJed Brown Not Collective 4546cab3a1bSJed Brown 4556cab3a1bSJed Brown Input Argument: 4566cab3a1bSJed Brown + dm - DM to be used with SNES 457be95d8f1SBarry Smith . f - relaxation function, see SNESGSFunction 4586cab3a1bSJed Brown - ctx - context for residual evaluation 4596cab3a1bSJed Brown 4606cab3a1bSJed Brown Level: advanced 4616cab3a1bSJed Brown 4626cab3a1bSJed Brown Note: 463be95d8f1SBarry Smith SNESSetNGS() is normally used, but it calls this function internally because the user context is actually 4646cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4656cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 4666cab3a1bSJed Brown 467bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction(), SNESGSFunction 4686cab3a1bSJed Brown @*/ 469be95d8f1SBarry Smith PetscErrorCode DMSNESSetNGS(DM dm,PetscErrorCode (*f)(SNES,Vec,Vec,void*),void *ctx) 4706cab3a1bSJed Brown { 4716cab3a1bSJed Brown PetscErrorCode ierr; 472942e3340SBarry Smith DMSNES sdm; 4736cab3a1bSJed Brown 4746cab3a1bSJed Brown PetscFunctionBegin; 4756cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 476be95d8f1SBarry Smith if (f || ctx) { 477942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 478fdaff8d6SPeter Brune } 479be95d8f1SBarry Smith if (f) sdm->ops->computegs = f; 4806cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 4816cab3a1bSJed Brown PetscFunctionReturn(0); 4826cab3a1bSJed Brown } 4836cab3a1bSJed Brown 4846cab3a1bSJed Brown #undef __FUNCT__ 485be95d8f1SBarry Smith #define __FUNCT__ "DMSNESGetNGS" 4866cab3a1bSJed Brown /*@C 487be95d8f1SBarry Smith DMSNESGetNGS - get SNES Gauss-Seidel relaxation function 4886cab3a1bSJed Brown 4896cab3a1bSJed Brown Not Collective 4906cab3a1bSJed Brown 4916cab3a1bSJed Brown Input Argument: 4926cab3a1bSJed Brown . dm - DM to be used with SNES 4936cab3a1bSJed Brown 4946cab3a1bSJed Brown Output Arguments: 495be95d8f1SBarry Smith + f - relaxation function which performs Gauss-Seidel sweeps, see SNESGSFunction 4966cab3a1bSJed Brown - ctx - context for residual evaluation 4976cab3a1bSJed Brown 4986cab3a1bSJed Brown Level: advanced 4996cab3a1bSJed Brown 5006cab3a1bSJed Brown Note: 501be95d8f1SBarry Smith SNESGetNGS() is normally used, but it calls this function internally because the user context is actually 5026cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5036cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 5046cab3a1bSJed Brown 505be95d8f1SBarry Smith .seealso: DMSNESSetContext(), SNESGetNGS(), DMSNESGetJacobian(), DMSNESGetFunction(), SNESNGSFunction 5066cab3a1bSJed Brown @*/ 507be95d8f1SBarry Smith PetscErrorCode DMSNESGetNGS(DM dm,PetscErrorCode (**f)(SNES,Vec,Vec,void*),void **ctx) 5086cab3a1bSJed Brown { 5096cab3a1bSJed Brown PetscErrorCode ierr; 510942e3340SBarry Smith DMSNES sdm; 5116cab3a1bSJed Brown 5126cab3a1bSJed Brown PetscFunctionBegin; 5136cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 514942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 515be95d8f1SBarry Smith if (f) *f = sdm->ops->computegs; 5166cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 5176cab3a1bSJed Brown PetscFunctionReturn(0); 5186cab3a1bSJed Brown } 5196cab3a1bSJed Brown 5206cab3a1bSJed Brown #undef __FUNCT__ 5216cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian" 5226cab3a1bSJed Brown /*@C 523ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 5246cab3a1bSJed Brown 5256cab3a1bSJed Brown Not Collective 5266cab3a1bSJed Brown 5276cab3a1bSJed Brown Input Argument: 5286cab3a1bSJed Brown + dm - DM to be used with SNES 529f8b49ee9SBarry Smith . J - Jacobian evaluation function 5306cab3a1bSJed Brown - ctx - context for residual evaluation 5316cab3a1bSJed Brown 5326cab3a1bSJed Brown Level: advanced 5336cab3a1bSJed Brown 5346cab3a1bSJed Brown Note: 5356cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 5366cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5376cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5386cab3a1bSJed Brown 539bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian(), SNESJacobianFunction 5406cab3a1bSJed Brown @*/ 541d1e9a80fSBarry Smith PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) 5426cab3a1bSJed Brown { 5436cab3a1bSJed Brown PetscErrorCode ierr; 544942e3340SBarry Smith DMSNES sdm; 5456cab3a1bSJed Brown 5466cab3a1bSJed Brown PetscFunctionBegin; 5476cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 548f8b49ee9SBarry Smith if (J || ctx) { 549942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 5501fdfe764SBarry Smith } 551f8b49ee9SBarry Smith if (J) sdm->ops->computejacobian = J; 5526cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 5536cab3a1bSJed Brown PetscFunctionReturn(0); 5546cab3a1bSJed Brown } 5556cab3a1bSJed Brown 5566cab3a1bSJed Brown #undef __FUNCT__ 5576cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian" 5586cab3a1bSJed Brown /*@C 559ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 5606cab3a1bSJed Brown 5616cab3a1bSJed Brown Not Collective 5626cab3a1bSJed Brown 5636cab3a1bSJed Brown Input Argument: 5646cab3a1bSJed Brown . dm - DM to be used with SNES 5656cab3a1bSJed Brown 5666cab3a1bSJed Brown Output Arguments: 567f8b49ee9SBarry Smith + J - Jacobian evaluation function; see SNESJacobianFunction for all calling sequence 5686cab3a1bSJed Brown - ctx - context for residual evaluation 5696cab3a1bSJed Brown 5706cab3a1bSJed Brown Level: advanced 5716cab3a1bSJed Brown 5726cab3a1bSJed Brown Note: 5736cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 5746cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5756cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 5766cab3a1bSJed Brown 577bf388a1fSBarry Smith .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), SNESJacobianFunction 5786cab3a1bSJed Brown @*/ 579d1e9a80fSBarry Smith PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx) 5806cab3a1bSJed Brown { 5816cab3a1bSJed Brown PetscErrorCode ierr; 582942e3340SBarry Smith DMSNES sdm; 5836cab3a1bSJed Brown 5846cab3a1bSJed Brown PetscFunctionBegin; 5856cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 586942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 587f8b49ee9SBarry Smith if (J) *J = sdm->ops->computejacobian; 5886cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 5896cab3a1bSJed Brown PetscFunctionReturn(0); 5906cab3a1bSJed Brown } 5916cab3a1bSJed Brown 5926cab3a1bSJed Brown #undef __FUNCT__ 593e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard" 594e03ab78fSPeter Brune /*@C 595e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 596e03ab78fSPeter Brune 597e03ab78fSPeter Brune Not Collective 598e03ab78fSPeter Brune 599e03ab78fSPeter Brune Input Argument: 600e03ab78fSPeter Brune + dm - DM to be used with SNES 601f8b49ee9SBarry Smith . b - RHS evaluation function 602f8b49ee9SBarry Smith . J - Picard matrix evaluation function 603e03ab78fSPeter Brune - ctx - context for residual evaluation 604e03ab78fSPeter Brune 605e03ab78fSPeter Brune Level: advanced 606e03ab78fSPeter Brune 607e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 608e03ab78fSPeter Brune @*/ 609d1e9a80fSBarry Smith PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*b)(SNES,Vec,Vec,void*),PetscErrorCode (*J)(SNES,Vec,Mat,Mat,void*),void *ctx) 610e03ab78fSPeter Brune { 611e03ab78fSPeter Brune PetscErrorCode ierr; 612942e3340SBarry Smith DMSNES sdm; 613e03ab78fSPeter Brune 614e03ab78fSPeter Brune PetscFunctionBegin; 615e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 616942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 617f8b49ee9SBarry Smith if (b) sdm->ops->computepfunction = b; 618f8b49ee9SBarry Smith if (J) sdm->ops->computepjacobian = J; 619e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 620e03ab78fSPeter Brune PetscFunctionReturn(0); 621e03ab78fSPeter Brune } 622e03ab78fSPeter Brune 6237971a8bfSPeter Brune #undef __FUNCT__ 6247971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard" 6257971a8bfSPeter Brune /*@C 6267971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 6277971a8bfSPeter Brune 6287971a8bfSPeter Brune Not Collective 6297971a8bfSPeter Brune 6307971a8bfSPeter Brune Input Argument: 6317971a8bfSPeter Brune . dm - DM to be used with SNES 6327971a8bfSPeter Brune 6337971a8bfSPeter Brune Output Arguments: 634f8b49ee9SBarry Smith + b - RHS evaluation function; see SNESFunction for details 635f8b49ee9SBarry Smith . J - RHS evaluation function; see SNESJacobianFunction for detailsa 6367971a8bfSPeter Brune - ctx - context for residual evaluation 6377971a8bfSPeter Brune 6387971a8bfSPeter Brune Level: advanced 6397971a8bfSPeter Brune 6407971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 6417971a8bfSPeter Brune @*/ 642d1e9a80fSBarry Smith PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**b)(SNES,Vec,Vec,void*),PetscErrorCode (**J)(SNES,Vec,Mat,Mat,void*),void **ctx) 6437971a8bfSPeter Brune { 6447971a8bfSPeter Brune PetscErrorCode ierr; 645942e3340SBarry Smith DMSNES sdm; 6467971a8bfSPeter Brune 6477971a8bfSPeter Brune PetscFunctionBegin; 6487971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 649942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 650f8b49ee9SBarry Smith if (b) *b = sdm->ops->computepfunction; 651f8b49ee9SBarry Smith if (J) *J = sdm->ops->computepjacobian; 6527971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 6537971a8bfSPeter Brune PetscFunctionReturn(0); 6547971a8bfSPeter Brune } 655