1af0996ceSBarry Smith #include <petsc/private/snesimpl.h> /*I "petscsnes.h" I*/ 2af0996ceSBarry Smith #include <petsc/private/dmimpl.h> /*I "petscdm.h" I*/ 36cab3a1bSJed Brown 4d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSNESUnsetFunctionContext_DMSNES(DMSNES sdm) 5d71ae5a4SJacob Faibussowitsch { 6800f99ffSJeremy L Thompson PetscFunctionBegin; 7800f99ffSJeremy L Thompson PetscCall(PetscObjectCompose((PetscObject)sdm, "function ctx", NULL)); 8800f99ffSJeremy L Thompson sdm->functionctxcontainer = NULL; 9800f99ffSJeremy L Thompson PetscFunctionReturn(0); 10800f99ffSJeremy L Thompson } 11800f99ffSJeremy L Thompson 12d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSNESUnsetJacobianContext_DMSNES(DMSNES sdm) 13d71ae5a4SJacob Faibussowitsch { 14800f99ffSJeremy L Thompson PetscFunctionBegin; 15800f99ffSJeremy L Thompson PetscCall(PetscObjectCompose((PetscObject)sdm, "jacobian ctx", NULL)); 16800f99ffSJeremy L Thompson sdm->jacobianctxcontainer = NULL; 17800f99ffSJeremy L Thompson PetscFunctionReturn(0); 18800f99ffSJeremy L Thompson } 19800f99ffSJeremy L Thompson 20d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSNESDestroy(DMSNES *kdm) 21d71ae5a4SJacob Faibussowitsch { 226cab3a1bSJed Brown PetscFunctionBegin; 2322c6f798SBarry Smith if (!*kdm) PetscFunctionReturn(0); 2422c6f798SBarry Smith PetscValidHeaderSpecific((*kdm), DMSNES_CLASSID, 1); 259371c9d4SSatish Balay if (--((PetscObject)(*kdm))->refct > 0) { 269371c9d4SSatish Balay *kdm = NULL; 279371c9d4SSatish Balay PetscFunctionReturn(0); 289371c9d4SSatish Balay } 29800f99ffSJeremy L Thompson PetscCall(DMSNESUnsetFunctionContext_DMSNES(*kdm)); 30800f99ffSJeremy L Thompson PetscCall(DMSNESUnsetJacobianContext_DMSNES(*kdm)); 319566063dSJacob Faibussowitsch if ((*kdm)->ops->destroy) PetscCall(((*kdm)->ops->destroy)(*kdm)); 329566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(kdm)); 3322c6f798SBarry Smith PetscFunctionReturn(0); 3422c6f798SBarry Smith } 3522c6f798SBarry Smith 36d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESLoad(DMSNES kdm, PetscViewer viewer) 37d71ae5a4SJacob Faibussowitsch { 382d53ad75SBarry Smith PetscFunctionBegin; 399566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &kdm->ops->computefunction, 1, NULL, PETSC_FUNCTION)); 409566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryRead(viewer, &kdm->ops->computejacobian, 1, NULL, PETSC_FUNCTION)); 412d53ad75SBarry Smith PetscFunctionReturn(0); 422d53ad75SBarry Smith } 432d53ad75SBarry Smith 44d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESView(DMSNES kdm, PetscViewer viewer) 45d71ae5a4SJacob Faibussowitsch { 462d53ad75SBarry Smith PetscBool isascii, isbinary; 472d53ad75SBarry Smith 482d53ad75SBarry Smith PetscFunctionBegin; 499566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii)); 509566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERBINARY, &isbinary)); 512d53ad75SBarry Smith if (isascii) { 52*d5bc873cSPierre Jolivet #if defined(PETSC_SERIALIZE_FUNCTIONS) 532d53ad75SBarry Smith const char *fname; 542d53ad75SBarry Smith 559566063dSJacob Faibussowitsch PetscCall(PetscFPTFind(kdm->ops->computefunction, &fname)); 5648a46eb9SPierre Jolivet if (fname) PetscCall(PetscViewerASCIIPrintf(viewer, "Function used by SNES: %s\n", fname)); 579566063dSJacob Faibussowitsch PetscCall(PetscFPTFind(kdm->ops->computejacobian, &fname)); 5848a46eb9SPierre Jolivet if (fname) PetscCall(PetscViewerASCIIPrintf(viewer, "Jacobian function used by SNES: %s\n", fname)); 59c7a10e08SBarry Smith #endif 602d53ad75SBarry Smith } else if (isbinary) { 613964eb88SJed Brown struct { 623964eb88SJed Brown PetscErrorCode (*func)(SNES, Vec, Vec, void *); 639200755eSBarry Smith } funcstruct; 649200755eSBarry Smith struct { 65d1e9a80fSBarry Smith PetscErrorCode (*jac)(SNES, Vec, Mat, Mat, void *); 669200755eSBarry Smith } jacstruct; 679200755eSBarry Smith funcstruct.func = kdm->ops->computefunction; 689200755eSBarry Smith jacstruct.jac = kdm->ops->computejacobian; 699566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, &funcstruct, 1, PETSC_FUNCTION)); 709566063dSJacob Faibussowitsch PetscCall(PetscViewerBinaryWrite(viewer, &jacstruct, 1, PETSC_FUNCTION)); 712d53ad75SBarry Smith } 722d53ad75SBarry Smith PetscFunctionReturn(0); 732d53ad75SBarry Smith } 742d53ad75SBarry Smith 75d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSNESCreate(MPI_Comm comm, DMSNES *kdm) 76d71ae5a4SJacob Faibussowitsch { 7722c6f798SBarry Smith PetscFunctionBegin; 789566063dSJacob Faibussowitsch PetscCall(SNESInitializePackage()); 799566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(*kdm, DMSNES_CLASSID, "DMSNES", "DMSNES", "DMSNES", comm, DMSNESDestroy, DMSNESView)); 806cab3a1bSJed Brown PetscFunctionReturn(0); 816cab3a1bSJed Brown } 826cab3a1bSJed Brown 83942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 846cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 856cab3a1bSJed Brown */ 86d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMCoarsenHook_DMSNES(DM dm, DM dmc, void *ctx) 87d71ae5a4SJacob Faibussowitsch { 886cab3a1bSJed Brown PetscFunctionBegin; 899566063dSJacob Faibussowitsch PetscCall(DMCopyDMSNES(dm, dmc)); 906cab3a1bSJed Brown PetscFunctionReturn(0); 916cab3a1bSJed Brown } 926cab3a1bSJed Brown 93dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 94caa4e7f2SJed Brown */ 95d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRestrictHook_DMSNES(DM dm, Mat Restrict, Vec rscale, Mat Inject, DM dmc, void *ctx) 96d71ae5a4SJacob Faibussowitsch { 97caa4e7f2SJed Brown PetscFunctionBegin; 98caa4e7f2SJed Brown PetscFunctionReturn(0); 99caa4e7f2SJed Brown } 100caa4e7f2SJed Brown 101be081cd6SPeter Brune /* Attaches the DMSNES to the subdomain. */ 102d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainHook_DMSNES(DM dm, DM subdm, void *ctx) 103d71ae5a4SJacob Faibussowitsch { 104be081cd6SPeter Brune PetscFunctionBegin; 1059566063dSJacob Faibussowitsch PetscCall(DMCopyDMSNES(dm, subdm)); 106be081cd6SPeter Brune PetscFunctionReturn(0); 107be081cd6SPeter Brune } 108be081cd6SPeter Brune 109be081cd6SPeter Brune /* This could restrict auxiliary information to the coarse level. 110be081cd6SPeter Brune */ 111d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMSubDomainRestrictHook_DMSNES(DM dm, VecScatter gscat, VecScatter lscat, DM subdm, void *ctx) 112d71ae5a4SJacob Faibussowitsch { 113be081cd6SPeter Brune PetscFunctionBegin; 114be081cd6SPeter Brune PetscFunctionReturn(0); 115be081cd6SPeter Brune } 116be081cd6SPeter Brune 117d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMRefineHook_DMSNES(DM dm, DM dmf, void *ctx) 118d71ae5a4SJacob Faibussowitsch { 11903a0fabfSPeter Brune PetscFunctionBegin; 1209566063dSJacob Faibussowitsch PetscCall(DMCopyDMSNES(dm, dmf)); 12103a0fabfSPeter Brune PetscFunctionReturn(0); 12203a0fabfSPeter Brune } 12303a0fabfSPeter Brune 12403a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 12503a0fabfSPeter Brune */ 126d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMInterpolateHook_DMSNES(DM dm, Mat Interp, DM dmf, void *ctx) 127d71ae5a4SJacob Faibussowitsch { 12803a0fabfSPeter Brune PetscFunctionBegin; 12903a0fabfSPeter Brune PetscFunctionReturn(0); 13003a0fabfSPeter Brune } 13103a0fabfSPeter Brune 13222c6f798SBarry Smith /*@C 133f6dfbefdSBarry Smith DMSNESCopy - copies the information in a `DMSNES` to another `DMSNES` 13422c6f798SBarry Smith 13522c6f798SBarry Smith Not Collective 13622c6f798SBarry Smith 1374165533cSJose E. Roman Input Parameters: 138f6dfbefdSBarry Smith + kdm - Original `DMSNES` 139f6dfbefdSBarry Smith - nkdm - `DMSNES` to receive the data, should have been created with `DMSNESCreate()` 14022c6f798SBarry Smith 14122c6f798SBarry Smith Level: developer 14222c6f798SBarry Smith 143f6dfbefdSBarry Smith .seealso: `DMSNES`, `DMSNESCreate()`, `DMSNESDestroy()` 14422c6f798SBarry Smith @*/ 145d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESCopy(DMSNES kdm, DMSNES nkdm) 146d71ae5a4SJacob Faibussowitsch { 14722c6f798SBarry Smith PetscFunctionBegin; 14822c6f798SBarry Smith PetscValidHeaderSpecific(kdm, DMSNES_CLASSID, 1); 14922c6f798SBarry Smith PetscValidHeaderSpecific(nkdm, DMSNES_CLASSID, 2); 15022c6f798SBarry Smith nkdm->ops->computefunction = kdm->ops->computefunction; 1512bc4d0c4SPeter Brune nkdm->ops->computejacobian = kdm->ops->computejacobian; 15222c6f798SBarry Smith nkdm->ops->computegs = kdm->ops->computegs; 15322c6f798SBarry Smith nkdm->ops->computeobjective = kdm->ops->computeobjective; 15422c6f798SBarry Smith nkdm->ops->computepjacobian = kdm->ops->computepjacobian; 15522c6f798SBarry Smith nkdm->ops->computepfunction = kdm->ops->computepfunction; 15622c6f798SBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 15722c6f798SBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 15822c6f798SBarry Smith 15922c6f798SBarry Smith nkdm->gsctx = kdm->gsctx; 16022c6f798SBarry Smith nkdm->pctx = kdm->pctx; 16122c6f798SBarry Smith nkdm->objectivectx = kdm->objectivectx; 162af903c1dSJunchao Zhang nkdm->originaldm = kdm->originaldm; 163800f99ffSJeremy L Thompson nkdm->functionctxcontainer = kdm->functionctxcontainer; 164800f99ffSJeremy L Thompson nkdm->jacobianctxcontainer = kdm->jacobianctxcontainer; 165800f99ffSJeremy L Thompson if (nkdm->functionctxcontainer) PetscCall(PetscObjectCompose((PetscObject)nkdm, "function ctx", (PetscObject)nkdm->functionctxcontainer)); 166800f99ffSJeremy L Thompson if (nkdm->jacobianctxcontainer) PetscCall(PetscObjectCompose((PetscObject)nkdm, "jacobian ctx", (PetscObject)nkdm->jacobianctxcontainer)); 16722c6f798SBarry Smith 16822c6f798SBarry Smith /* 16922c6f798SBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 17022c6f798SBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 17122c6f798SBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 17222c6f798SBarry Smith */ 17322c6f798SBarry Smith 17422c6f798SBarry Smith /* implementation specific copy hooks */ 175dbbe0bcdSBarry Smith PetscTryTypeMethod(kdm, duplicate, nkdm); 17622c6f798SBarry Smith PetscFunctionReturn(0); 17722c6f798SBarry Smith } 17822c6f798SBarry Smith 1796cab3a1bSJed Brown /*@C 180f6dfbefdSBarry Smith DMGetDMSNES - get read-only private `DMSNES` context from a `DM` 1816cab3a1bSJed Brown 1826cab3a1bSJed Brown Not Collective 1836cab3a1bSJed Brown 1844165533cSJose E. Roman Input Parameter: 185f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 1866cab3a1bSJed Brown 1874165533cSJose E. Roman Output Parameter: 188f6dfbefdSBarry Smith . snesdm - private `DMSNES` context 1896cab3a1bSJed Brown 1906cab3a1bSJed Brown Level: developer 1916cab3a1bSJed Brown 192f6dfbefdSBarry Smith Note: 193f6dfbefdSBarry Smith Use `DMGetDMSNESWrite()` if write access is needed. The DMSNESSetXXX API should be used wherever possible. 1946cab3a1bSJed Brown 195db781477SPatrick Sanan .seealso: `DMGetDMSNESWrite()` 1966cab3a1bSJed Brown @*/ 197d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetDMSNES(DM dm, DMSNES *snesdm) 198d71ae5a4SJacob Faibussowitsch { 1996cab3a1bSJed Brown PetscFunctionBegin; 2006cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 201b4615a05SBarry Smith *snesdm = (DMSNES)dm->dmsnes; 20222c6f798SBarry Smith if (!*snesdm) { 2039566063dSJacob Faibussowitsch PetscCall(PetscInfo(dm, "Creating new DMSNES\n")); 2049566063dSJacob Faibussowitsch PetscCall(DMSNESCreate(PetscObjectComm((PetscObject)dm), snesdm)); 2051aa26658SKarl Rupp 206b4615a05SBarry Smith dm->dmsnes = (PetscObject)*snesdm; 207af903c1dSJunchao Zhang (*snesdm)->originaldm = dm; 2089566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookAdd(dm, DMCoarsenHook_DMSNES, DMRestrictHook_DMSNES, NULL)); 2099566063dSJacob Faibussowitsch PetscCall(DMRefineHookAdd(dm, DMRefineHook_DMSNES, DMInterpolateHook_DMSNES, NULL)); 2109566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookAdd(dm, DMSubDomainHook_DMSNES, DMSubDomainRestrictHook_DMSNES, NULL)); 2116cab3a1bSJed Brown } 2126cab3a1bSJed Brown PetscFunctionReturn(0); 2136cab3a1bSJed Brown } 2146cab3a1bSJed Brown 2156cab3a1bSJed Brown /*@C 216f6dfbefdSBarry Smith DMGetDMSNESWrite - get write access to private `DMSNES` context from a `DM` 2176cab3a1bSJed Brown 2186cab3a1bSJed Brown Not Collective 2196cab3a1bSJed Brown 2204165533cSJose E. Roman Input Parameter: 221f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 2226cab3a1bSJed Brown 2234165533cSJose E. Roman Output Parameter: 224f6dfbefdSBarry Smith . snesdm - private `DMSNES` context 2256cab3a1bSJed Brown 2266cab3a1bSJed Brown Level: developer 2276cab3a1bSJed Brown 228db781477SPatrick Sanan .seealso: `DMGetDMSNES()` 2296cab3a1bSJed Brown @*/ 230d71ae5a4SJacob Faibussowitsch PetscErrorCode DMGetDMSNESWrite(DM dm, DMSNES *snesdm) 231d71ae5a4SJacob Faibussowitsch { 232942e3340SBarry Smith DMSNES sdm; 2336cab3a1bSJed Brown 2346cab3a1bSJed Brown PetscFunctionBegin; 2356cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2369566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 23728b400f6SJacob Faibussowitsch PetscCheck(sdm->originaldm, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "DMSNES has a NULL originaldm"); 2386cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 239b4615a05SBarry Smith DMSNES oldsdm = sdm; 2409566063dSJacob Faibussowitsch PetscCall(PetscInfo(dm, "Copying DMSNES due to write\n")); 2419566063dSJacob Faibussowitsch PetscCall(DMSNESCreate(PetscObjectComm((PetscObject)dm), &sdm)); 2429566063dSJacob Faibussowitsch PetscCall(DMSNESCopy(oldsdm, sdm)); 2439566063dSJacob Faibussowitsch PetscCall(DMSNESDestroy((DMSNES *)&dm->dmsnes)); 244b4615a05SBarry Smith dm->dmsnes = (PetscObject)sdm; 245af903c1dSJunchao Zhang sdm->originaldm = dm; 2466cab3a1bSJed Brown } 2476cab3a1bSJed Brown *snesdm = sdm; 2486cab3a1bSJed Brown PetscFunctionReturn(0); 2496cab3a1bSJed Brown } 2506cab3a1bSJed Brown 2516cab3a1bSJed Brown /*@C 252f6dfbefdSBarry Smith DMCopyDMSNES - copies a `DMSNES` context to a new `DM` 2536cab3a1bSJed Brown 2546cab3a1bSJed Brown Logically Collective 2556cab3a1bSJed Brown 2564165533cSJose E. Roman Input Parameters: 257f6dfbefdSBarry Smith + dmsrc - `DM` to obtain context from 258f6dfbefdSBarry Smith - dmdest - `DM` to add context to 2596cab3a1bSJed Brown 2606cab3a1bSJed Brown Level: developer 2616cab3a1bSJed Brown 2626cab3a1bSJed Brown Note: 2636cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 2646cab3a1bSJed Brown 265db781477SPatrick Sanan .seealso: `DMGetDMSNES()`, `SNESSetDM()` 2666cab3a1bSJed Brown @*/ 267d71ae5a4SJacob Faibussowitsch PetscErrorCode DMCopyDMSNES(DM dmsrc, DM dmdest) 268d71ae5a4SJacob Faibussowitsch { 2696cab3a1bSJed Brown PetscFunctionBegin; 2706cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc, DM_CLASSID, 1); 2716cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest, DM_CLASSID, 2); 2729566063dSJacob Faibussowitsch if (!dmdest->dmsnes) PetscCall(DMSNESCreate(PetscObjectComm((PetscObject)dmdest), (DMSNES *)&dmdest->dmsnes)); 2739566063dSJacob Faibussowitsch PetscCall(DMSNESCopy((DMSNES)dmsrc->dmsnes, (DMSNES)dmdest->dmsnes)); 2749566063dSJacob Faibussowitsch PetscCall(DMCoarsenHookAdd(dmdest, DMCoarsenHook_DMSNES, NULL, NULL)); 2759566063dSJacob Faibussowitsch PetscCall(DMRefineHookAdd(dmdest, DMRefineHook_DMSNES, NULL, NULL)); 2769566063dSJacob Faibussowitsch PetscCall(DMSubDomainHookAdd(dmdest, DMSubDomainHook_DMSNES, DMSubDomainRestrictHook_DMSNES, NULL)); 2776cab3a1bSJed Brown PetscFunctionReturn(0); 2786cab3a1bSJed Brown } 2796cab3a1bSJed Brown 2806cab3a1bSJed Brown /*@C 281f6dfbefdSBarry Smith DMSNESSetFunction - set `SNES` residual evaluation function 2826cab3a1bSJed Brown 2836cab3a1bSJed Brown Not Collective 2846cab3a1bSJed Brown 2854165533cSJose E. Roman Input Parameters: 286f6dfbefdSBarry Smith + dm - DM to be used with `SNES` 287f6dfbefdSBarry Smith . f - residual evaluation function; see `SNESFunction` for details 2886cab3a1bSJed Brown - ctx - context for residual evaluation 2896cab3a1bSJed Brown 2906cab3a1bSJed Brown Level: advanced 2916cab3a1bSJed Brown 2926cab3a1bSJed Brown Note: 293f6dfbefdSBarry Smith `SNESSetFunction()` is normally used, but it calls this function internally because the user context is actually 294f6dfbefdSBarry Smith associated with the `DM`. This makes the interface consistent regardless of whether the user interacts with a `DM` or 295f6dfbefdSBarry Smith not. 296f6dfbefdSBarry Smith 297f6dfbefdSBarry Smith Developer Note: 298f6dfbefdSBarry Smith If `DM` took a more central role at some later date, this could become the primary method of setting the residual. 2996cab3a1bSJed Brown 300db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESSetFunction()`, `DMSNESSetJacobian()`, `SNESFunction` 3016cab3a1bSJed Brown @*/ 302d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetFunction(DM dm, PetscErrorCode (*f)(SNES, Vec, Vec, void *), void *ctx) 303d71ae5a4SJacob Faibussowitsch { 304942e3340SBarry Smith DMSNES sdm; 3056cab3a1bSJed Brown 3066cab3a1bSJed Brown PetscFunctionBegin; 3076cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 3089566063dSJacob Faibussowitsch PetscCall(DMGetDMSNESWrite(dm, &sdm)); 309f8b49ee9SBarry Smith if (f) sdm->ops->computefunction = f; 310800f99ffSJeremy L Thompson if (ctx) { 311800f99ffSJeremy L Thompson PetscContainer ctxcontainer; 312800f99ffSJeremy L Thompson PetscCall(PetscContainerCreate(PetscObjectComm((PetscObject)sdm), &ctxcontainer)); 313800f99ffSJeremy L Thompson PetscCall(PetscContainerSetPointer(ctxcontainer, ctx)); 314800f99ffSJeremy L Thompson PetscCall(PetscObjectCompose((PetscObject)sdm, "function ctx", (PetscObject)ctxcontainer)); 315800f99ffSJeremy L Thompson sdm->functionctxcontainer = ctxcontainer; 316800f99ffSJeremy L Thompson PetscCall(PetscContainerDestroy(&ctxcontainer)); 317800f99ffSJeremy L Thompson } 318800f99ffSJeremy L Thompson PetscFunctionReturn(0); 319800f99ffSJeremy L Thompson } 320800f99ffSJeremy L Thompson 321800f99ffSJeremy L Thompson /*@C 3225cb80ecdSBarry Smith DMSNESSetFunctionContextDestroy - set `SNES` residual evaluation context destroy function 323800f99ffSJeremy L Thompson 324800f99ffSJeremy L Thompson Not Collective 325800f99ffSJeremy L Thompson 326800f99ffSJeremy L Thompson Input Parameters: 3275cb80ecdSBarry Smith + dm - `DM` to be used with `SNES` 3285cb80ecdSBarry Smith - f - residual evaluation context destroy function 329800f99ffSJeremy L Thompson 330800f99ffSJeremy L Thompson Level: advanced 331800f99ffSJeremy L Thompson 332800f99ffSJeremy L Thompson .seealso: `DMSNESSetFunction()`, `SNESSetFunction()` 333800f99ffSJeremy L Thompson @*/ 334d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetFunctionContextDestroy(DM dm, PetscErrorCode (*f)(void *)) 335d71ae5a4SJacob Faibussowitsch { 336800f99ffSJeremy L Thompson DMSNES sdm; 337800f99ffSJeremy L Thompson 338800f99ffSJeremy L Thompson PetscFunctionBegin; 339800f99ffSJeremy L Thompson PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 340800f99ffSJeremy L Thompson PetscCall(DMGetDMSNESWrite(dm, &sdm)); 341800f99ffSJeremy L Thompson if (sdm->functionctxcontainer) PetscCall(PetscContainerSetUserDestroy(sdm->functionctxcontainer, f)); 342800f99ffSJeremy L Thompson PetscFunctionReturn(0); 343800f99ffSJeremy L Thompson } 344800f99ffSJeremy L Thompson 345d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESUnsetFunctionContext_Internal(DM dm) 346d71ae5a4SJacob Faibussowitsch { 347800f99ffSJeremy L Thompson DMSNES sdm; 348800f99ffSJeremy L Thompson 349800f99ffSJeremy L Thompson PetscFunctionBegin; 350800f99ffSJeremy L Thompson PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 351800f99ffSJeremy L Thompson PetscCall(DMGetDMSNESWrite(dm, &sdm)); 352800f99ffSJeremy L Thompson PetscCall(DMSNESUnsetFunctionContext_DMSNES(sdm)); 3536cab3a1bSJed Brown PetscFunctionReturn(0); 3546cab3a1bSJed Brown } 3556cab3a1bSJed Brown 3566cab3a1bSJed Brown /*@C 357f6dfbefdSBarry Smith DMSNESSetMFFunction - set `SNES` residual evaluation function used in applying the matrix-free Jacobian with -snes_mf_operator 358bbc1464cSBarry Smith 359c3339decSBarry Smith Logically Collective 360bbc1464cSBarry Smith 3614165533cSJose E. Roman Input Parameters: 362f6dfbefdSBarry Smith + dm - `DM` to be used with `SNES` 363f6dfbefdSBarry Smith - f - residual evaluation function; see `SNESFunction` for details 364bbc1464cSBarry Smith 365bbc1464cSBarry Smith Level: advanced 366bbc1464cSBarry Smith 367db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESSetFunction()`, `DMSNESSetJacobian()`, `SNESFunction`, `DMSNESSetFunction()` 368bbc1464cSBarry Smith @*/ 369d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetMFFunction(DM dm, PetscErrorCode (*f)(SNES, Vec, Vec, void *), void *ctx) 370d71ae5a4SJacob Faibussowitsch { 371bbc1464cSBarry Smith DMSNES sdm; 372bbc1464cSBarry Smith 373bbc1464cSBarry Smith PetscFunctionBegin; 374bbc1464cSBarry Smith PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 37548a46eb9SPierre Jolivet if (f || ctx) PetscCall(DMGetDMSNESWrite(dm, &sdm)); 376bbc1464cSBarry Smith if (f) sdm->ops->computemffunction = f; 377bbc1464cSBarry Smith if (ctx) sdm->mffunctionctx = ctx; 378bbc1464cSBarry Smith PetscFunctionReturn(0); 379bbc1464cSBarry Smith } 380bbc1464cSBarry Smith 381bbc1464cSBarry Smith /*@C 382f6dfbefdSBarry Smith DMSNESGetFunction - get `SNES` residual evaluation function 3836cab3a1bSJed Brown 3846cab3a1bSJed Brown Not Collective 3856cab3a1bSJed Brown 3864165533cSJose E. Roman Input Parameter: 387f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 3886cab3a1bSJed Brown 3894165533cSJose E. Roman Output Parameters: 390f6dfbefdSBarry Smith + f - residual evaluation function; see `SNESFunction` for details 3916cab3a1bSJed Brown - ctx - context for residual evaluation 3926cab3a1bSJed Brown 3936cab3a1bSJed Brown Level: advanced 3946cab3a1bSJed Brown 3956cab3a1bSJed Brown Note: 396f6dfbefdSBarry Smith `SNESGetFunction()` is normally used, but it calls this function internally because the user context is actually 397f6dfbefdSBarry Smith associated with the `DM`. 3986cab3a1bSJed Brown 399db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `DMSNESSetFunction()`, `SNESSetFunction()`, `SNESFunction` 4006cab3a1bSJed Brown @*/ 401d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESGetFunction(DM dm, PetscErrorCode (**f)(SNES, Vec, Vec, void *), void **ctx) 402d71ae5a4SJacob Faibussowitsch { 403942e3340SBarry Smith DMSNES sdm; 4046cab3a1bSJed Brown 4056cab3a1bSJed Brown PetscFunctionBegin; 4066cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4079566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 408f8b49ee9SBarry Smith if (f) *f = sdm->ops->computefunction; 409800f99ffSJeremy L Thompson if (ctx) { 410800f99ffSJeremy L Thompson if (sdm->functionctxcontainer) PetscCall(PetscContainerGetPointer(sdm->functionctxcontainer, ctx)); 411800f99ffSJeremy L Thompson else *ctx = NULL; 412800f99ffSJeremy L Thompson } 4136cab3a1bSJed Brown PetscFunctionReturn(0); 4146cab3a1bSJed Brown } 4156cab3a1bSJed Brown 4162a4ee8f2SPeter Brune /*@C 417f6dfbefdSBarry Smith DMSNESSetObjective - set `SNES` objective evaluation function 4182a4ee8f2SPeter Brune 4192a4ee8f2SPeter Brune Not Collective 4202a4ee8f2SPeter Brune 4214165533cSJose E. Roman Input Parameters: 422f6dfbefdSBarry Smith + dm - `DM` to be used with `SNES` 423f6dfbefdSBarry Smith . obj - objective evaluation function; see `SNESObjectiveFunction` for details 4242a4ee8f2SPeter Brune - ctx - context for residual evaluation 4252a4ee8f2SPeter Brune 4262a4ee8f2SPeter Brune Level: advanced 4272a4ee8f2SPeter Brune 428db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESGetObjective()`, `DMSNESSetFunction()` 4292a4ee8f2SPeter Brune @*/ 430d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetObjective(DM dm, PetscErrorCode (*obj)(SNES, Vec, PetscReal *, void *), void *ctx) 431d71ae5a4SJacob Faibussowitsch { 432942e3340SBarry Smith DMSNES sdm; 4332a4ee8f2SPeter Brune 4342a4ee8f2SPeter Brune PetscFunctionBegin; 4352a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 43648a46eb9SPierre Jolivet if (obj || ctx) PetscCall(DMGetDMSNESWrite(dm, &sdm)); 437f8b49ee9SBarry Smith if (obj) sdm->ops->computeobjective = obj; 4382a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 4392a4ee8f2SPeter Brune PetscFunctionReturn(0); 4402a4ee8f2SPeter Brune } 4412a4ee8f2SPeter Brune 4422a4ee8f2SPeter Brune /*@C 443f6dfbefdSBarry Smith DMSNESGetObjective - get `SNES` objective evaluation function 4442a4ee8f2SPeter Brune 4452a4ee8f2SPeter Brune Not Collective 4462a4ee8f2SPeter Brune 4474165533cSJose E. Roman Input Parameter: 448f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 4492a4ee8f2SPeter Brune 4504165533cSJose E. Roman Output Parameters: 451f6dfbefdSBarry Smith + obj- residual evaluation function; see `SNESObjectiveFunction` for details 4522a4ee8f2SPeter Brune - ctx - context for residual evaluation 4532a4ee8f2SPeter Brune 4542a4ee8f2SPeter Brune Level: advanced 4552a4ee8f2SPeter Brune 4562a4ee8f2SPeter Brune Note: 457f6dfbefdSBarry Smith `SNESGetFunction()` is normally used, but it calls this function internally because the user context is actually 458f6dfbefdSBarry Smith associated with the `DM`. 4592a4ee8f2SPeter Brune 460db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `DMSNESSetObjective()`, `SNESSetFunction()` 4612a4ee8f2SPeter Brune @*/ 462d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESGetObjective(DM dm, PetscErrorCode (**obj)(SNES, Vec, PetscReal *, void *), void **ctx) 463d71ae5a4SJacob Faibussowitsch { 464942e3340SBarry Smith DMSNES sdm; 4652a4ee8f2SPeter Brune 4662a4ee8f2SPeter Brune PetscFunctionBegin; 4672a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4689566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 469f8b49ee9SBarry Smith if (obj) *obj = sdm->ops->computeobjective; 4702a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 4712a4ee8f2SPeter Brune PetscFunctionReturn(0); 4722a4ee8f2SPeter Brune } 4732a4ee8f2SPeter Brune 4746cab3a1bSJed Brown /*@C 475f6dfbefdSBarry Smith DMSNESSetNGS - set `SNES` Gauss-Seidel relaxation function 4766cab3a1bSJed Brown 4776cab3a1bSJed Brown Not Collective 4786cab3a1bSJed Brown 4794165533cSJose E. Roman Input Parameters: 480f6dfbefdSBarry Smith + dm - `DM` to be used with `SNES` 481f6dfbefdSBarry Smith . f - relaxation function, see `SNESGSFunction` 4826cab3a1bSJed Brown - ctx - context for residual evaluation 4836cab3a1bSJed Brown 4846cab3a1bSJed Brown Level: advanced 4856cab3a1bSJed Brown 4866cab3a1bSJed Brown Note: 487f6dfbefdSBarry Smith `SNESSetNGS()` is normally used, but it calls this function internally because the user context is actually 488f6dfbefdSBarry Smith associated with the `DM`. This makes the interface consistent regardless of whether the user interacts with a `DM` or 489f6dfbefdSBarry Smith not. 490f6dfbefdSBarry Smith 491f6dfbefdSBarry Smith Dveloper Note: 492f6dfbefdSBarry Smith If `DM `took a more central role at some later date, this could become the primary method of supplying the smoother 4936cab3a1bSJed Brown 494db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESSetFunction()`, `DMSNESSetJacobian()`, `DMSNESSetFunction()`, `SNESGSFunction` 4956cab3a1bSJed Brown @*/ 496d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetNGS(DM dm, PetscErrorCode (*f)(SNES, Vec, Vec, void *), void *ctx) 497d71ae5a4SJacob Faibussowitsch { 498942e3340SBarry Smith DMSNES sdm; 4996cab3a1bSJed Brown 5006cab3a1bSJed Brown PetscFunctionBegin; 5016cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 50248a46eb9SPierre Jolivet if (f || ctx) PetscCall(DMGetDMSNESWrite(dm, &sdm)); 503be95d8f1SBarry Smith if (f) sdm->ops->computegs = f; 5046cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 5056cab3a1bSJed Brown PetscFunctionReturn(0); 5066cab3a1bSJed Brown } 5076cab3a1bSJed Brown 5086cab3a1bSJed Brown /*@C 509f6dfbefdSBarry Smith DMSNESGetNGS - get `SNES` Gauss-Seidel relaxation function 5106cab3a1bSJed Brown 5116cab3a1bSJed Brown Not Collective 5126cab3a1bSJed Brown 5134165533cSJose E. Roman Input Parameter: 514f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 5156cab3a1bSJed Brown 5164165533cSJose E. Roman Output Parameters: 517f6dfbefdSBarry Smith + f - relaxation function which performs Gauss-Seidel sweeps, see `SNESGSFunction` 5186cab3a1bSJed Brown - ctx - context for residual evaluation 5196cab3a1bSJed Brown 5206cab3a1bSJed Brown Level: advanced 5216cab3a1bSJed Brown 5226cab3a1bSJed Brown Note: 523f6dfbefdSBarry Smith `SNESGetNGS()` is normally used, but it calls this function internally because the user context is actually 524f6dfbefdSBarry Smith associated with the `DM`. 525f6dfbefdSBarry Smith 526f6dfbefdSBarry Smith Developer Note: 527f6dfbefdSBarry Smith This makes the interface consistent regardless of whether the user interacts with a `DM` or 528f6dfbefdSBarry Smith not. If `DM` took a more central role at some later date, this could become the primary method of setting the residual. 5296cab3a1bSJed Brown 530db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESGetNGS()`, `DMSNESGetJacobian()`, `DMSNESGetFunction()`, `SNESNGSFunction` 5316cab3a1bSJed Brown @*/ 532d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESGetNGS(DM dm, PetscErrorCode (**f)(SNES, Vec, Vec, void *), void **ctx) 533d71ae5a4SJacob Faibussowitsch { 534942e3340SBarry Smith DMSNES sdm; 5356cab3a1bSJed Brown 5366cab3a1bSJed Brown PetscFunctionBegin; 5376cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5389566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 539be95d8f1SBarry Smith if (f) *f = sdm->ops->computegs; 5406cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 5416cab3a1bSJed Brown PetscFunctionReturn(0); 5426cab3a1bSJed Brown } 5436cab3a1bSJed Brown 5446cab3a1bSJed Brown /*@C 545f6dfbefdSBarry Smith DMSNESSetJacobian - set `SNES` Jacobian evaluation function 5466cab3a1bSJed Brown 5476cab3a1bSJed Brown Not Collective 5486cab3a1bSJed Brown 5494165533cSJose E. Roman Input Parameters: 550f6dfbefdSBarry Smith + dm - `DM` to be used with `SNES` 551f8b49ee9SBarry Smith . J - Jacobian evaluation function 5526cab3a1bSJed Brown - ctx - context for residual evaluation 5536cab3a1bSJed Brown 5546cab3a1bSJed Brown Level: advanced 5556cab3a1bSJed Brown 5566cab3a1bSJed Brown Note: 557f6dfbefdSBarry Smith `SNESSetJacobian()` is normally used, but it calls this function internally because the user context is actually 558f6dfbefdSBarry Smith associated with the `DM`. 559f6dfbefdSBarry Smith 560f6dfbefdSBarry Smith Developer Note: 561f6dfbefdSBarry Smith This makes the interface consistent regardless of whether the user interacts with a `DM` or 562f6dfbefdSBarry Smith not. If `DM` took a more central role at some later date, this could become the primary method of setting the Jacobian. 5636cab3a1bSJed Brown 564db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESSetFunction()`, `DMSNESGetJacobian()`, `SNESSetJacobian()`, `SNESJacobianFunction` 5656cab3a1bSJed Brown @*/ 566d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetJacobian(DM dm, PetscErrorCode (*J)(SNES, Vec, Mat, Mat, void *), void *ctx) 567d71ae5a4SJacob Faibussowitsch { 568942e3340SBarry Smith DMSNES sdm; 5696cab3a1bSJed Brown 5706cab3a1bSJed Brown PetscFunctionBegin; 5716cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 572800f99ffSJeremy L Thompson if (J || ctx) PetscCall(DMGetDMSNESWrite(dm, &sdm)); 573f8b49ee9SBarry Smith if (J) sdm->ops->computejacobian = J; 574800f99ffSJeremy L Thompson if (ctx) { 575800f99ffSJeremy L Thompson PetscContainer ctxcontainer; 576800f99ffSJeremy L Thompson PetscCall(PetscContainerCreate(PetscObjectComm((PetscObject)sdm), &ctxcontainer)); 577800f99ffSJeremy L Thompson PetscCall(PetscContainerSetPointer(ctxcontainer, ctx)); 578800f99ffSJeremy L Thompson PetscCall(PetscObjectCompose((PetscObject)sdm, "jacobian ctx", (PetscObject)ctxcontainer)); 579800f99ffSJeremy L Thompson sdm->jacobianctxcontainer = ctxcontainer; 580800f99ffSJeremy L Thompson PetscCall(PetscContainerDestroy(&ctxcontainer)); 581800f99ffSJeremy L Thompson } 582800f99ffSJeremy L Thompson PetscFunctionReturn(0); 583800f99ffSJeremy L Thompson } 584800f99ffSJeremy L Thompson 585800f99ffSJeremy L Thompson /*@C 5865cb80ecdSBarry Smith DMSNESSetJacobianContextDestroy - set `SNES` Jacobian evaluation context destroy function 587800f99ffSJeremy L Thompson 588800f99ffSJeremy L Thompson Not Collective 589800f99ffSJeremy L Thompson 590800f99ffSJeremy L Thompson Input Parameters: 5915cb80ecdSBarry Smith + dm - `DM` to be used with `SNES` 59235cb6cd3SPierre Jolivet - f - Jacobian evaluation context destroy function 593800f99ffSJeremy L Thompson 594800f99ffSJeremy L Thompson Level: advanced 595800f99ffSJeremy L Thompson 59690f54644SBarry Smith .seealso: `DMSNESSetJacobian()` 597800f99ffSJeremy L Thompson @*/ 598d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetJacobianContextDestroy(DM dm, PetscErrorCode (*f)(void *)) 599d71ae5a4SJacob Faibussowitsch { 600800f99ffSJeremy L Thompson DMSNES sdm; 601800f99ffSJeremy L Thompson 602800f99ffSJeremy L Thompson PetscFunctionBegin; 603800f99ffSJeremy L Thompson PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 604800f99ffSJeremy L Thompson PetscCall(DMGetDMSNESWrite(dm, &sdm)); 605800f99ffSJeremy L Thompson if (sdm->jacobianctxcontainer) PetscCall(PetscContainerSetUserDestroy(sdm->jacobianctxcontainer, f)); 606800f99ffSJeremy L Thompson PetscFunctionReturn(0); 607800f99ffSJeremy L Thompson } 608800f99ffSJeremy L Thompson 609d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESUnsetJacobianContext_Internal(DM dm) 610d71ae5a4SJacob Faibussowitsch { 611800f99ffSJeremy L Thompson DMSNES sdm; 612800f99ffSJeremy L Thompson 613800f99ffSJeremy L Thompson PetscFunctionBegin; 614800f99ffSJeremy L Thompson PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 615800f99ffSJeremy L Thompson PetscCall(DMGetDMSNESWrite(dm, &sdm)); 616800f99ffSJeremy L Thompson PetscCall(DMSNESUnsetJacobianContext_DMSNES(sdm)); 6176cab3a1bSJed Brown PetscFunctionReturn(0); 6186cab3a1bSJed Brown } 6196cab3a1bSJed Brown 6206cab3a1bSJed Brown /*@C 621f6dfbefdSBarry Smith DMSNESGetJacobian - get `SNES` Jacobian evaluation function 6226cab3a1bSJed Brown 6236cab3a1bSJed Brown Not Collective 6246cab3a1bSJed Brown 6254165533cSJose E. Roman Input Parameter: 626f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 6276cab3a1bSJed Brown 6284165533cSJose E. Roman Output Parameters: 629f6dfbefdSBarry Smith + J - Jacobian evaluation function; see `SNESJacobianFunction` for all calling sequence 6306cab3a1bSJed Brown - ctx - context for residual evaluation 6316cab3a1bSJed Brown 6326cab3a1bSJed Brown Level: advanced 6336cab3a1bSJed Brown 6346cab3a1bSJed Brown Note: 635f6dfbefdSBarry Smith `SNESGetJacobian()` is normally used, but it calls this function internally because the user context is actually 636f6dfbefdSBarry Smith associated with the `DM`. This makes the interface consistent regardless of whether the user interacts with a `DM` or 637f6dfbefdSBarry Smith not. 638f6dfbefdSBarry Smith 639f6dfbefdSBarry Smith Developer Note: 640f6dfbefdSBarry Smith If `DM` took a more central role at some later date, this could become the primary method of setting the Jacobian. 6416cab3a1bSJed Brown 642db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESSetFunction()`, `DMSNESSetJacobian()`, `SNESJacobianFunction` 6436cab3a1bSJed Brown @*/ 644d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESGetJacobian(DM dm, PetscErrorCode (**J)(SNES, Vec, Mat, Mat, void *), void **ctx) 645d71ae5a4SJacob Faibussowitsch { 646942e3340SBarry Smith DMSNES sdm; 6476cab3a1bSJed Brown 6486cab3a1bSJed Brown PetscFunctionBegin; 6496cab3a1bSJed Brown PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6509566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 651f8b49ee9SBarry Smith if (J) *J = sdm->ops->computejacobian; 652800f99ffSJeremy L Thompson if (ctx) { 653800f99ffSJeremy L Thompson if (sdm->jacobianctxcontainer) PetscCall(PetscContainerGetPointer(sdm->jacobianctxcontainer, ctx)); 654800f99ffSJeremy L Thompson else *ctx = NULL; 655800f99ffSJeremy L Thompson } 6566cab3a1bSJed Brown PetscFunctionReturn(0); 6576cab3a1bSJed Brown } 6586cab3a1bSJed Brown 659e03ab78fSPeter Brune /*@C 660e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 661e03ab78fSPeter Brune 662e03ab78fSPeter Brune Not Collective 663e03ab78fSPeter Brune 6644165533cSJose E. Roman Input Parameters: 665f6dfbefdSBarry Smith + dm - `DM` to be used with `SNES` 666f8b49ee9SBarry Smith . b - RHS evaluation function 667f8b49ee9SBarry Smith . J - Picard matrix evaluation function 668e03ab78fSPeter Brune - ctx - context for residual evaluation 669e03ab78fSPeter Brune 670e03ab78fSPeter Brune Level: advanced 671e03ab78fSPeter Brune 672db781477SPatrick Sanan .seealso: `SNESSetPicard()`, `DMSNESSetFunction()`, `DMSNESSetJacobian()` 673e03ab78fSPeter Brune @*/ 674d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESSetPicard(DM dm, PetscErrorCode (*b)(SNES, Vec, Vec, void *), PetscErrorCode (*J)(SNES, Vec, Mat, Mat, void *), void *ctx) 675d71ae5a4SJacob Faibussowitsch { 676942e3340SBarry Smith DMSNES sdm; 677e03ab78fSPeter Brune 678e03ab78fSPeter Brune PetscFunctionBegin; 679e03ab78fSPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 6809566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 681f8b49ee9SBarry Smith if (b) sdm->ops->computepfunction = b; 682f8b49ee9SBarry Smith if (J) sdm->ops->computepjacobian = J; 683e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 684e03ab78fSPeter Brune PetscFunctionReturn(0); 685e03ab78fSPeter Brune } 686e03ab78fSPeter Brune 6877971a8bfSPeter Brune /*@C 688f6dfbefdSBarry Smith DMSNESGetPicard - get `SNES` Picard iteration evaluation functions 6897971a8bfSPeter Brune 6907971a8bfSPeter Brune Not Collective 6917971a8bfSPeter Brune 6924165533cSJose E. Roman Input Parameter: 693f6dfbefdSBarry Smith . dm - `DM` to be used with `SNES` 6947971a8bfSPeter Brune 6954165533cSJose E. Roman Output Parameters: 696f6dfbefdSBarry Smith + b - RHS evaluation function; see `SNESFunction` for details 697f6dfbefdSBarry Smith . J - RHS evaluation function; see `SNESJacobianFunction` for detailsa 6987971a8bfSPeter Brune - ctx - context for residual evaluation 6997971a8bfSPeter Brune 7007971a8bfSPeter Brune Level: advanced 7017971a8bfSPeter Brune 702db781477SPatrick Sanan .seealso: `DMSNESSetContext()`, `SNESSetFunction()`, `DMSNESSetJacobian()` 7037971a8bfSPeter Brune @*/ 704d71ae5a4SJacob Faibussowitsch PetscErrorCode DMSNESGetPicard(DM dm, PetscErrorCode (**b)(SNES, Vec, Vec, void *), PetscErrorCode (**J)(SNES, Vec, Mat, Mat, void *), void **ctx) 705d71ae5a4SJacob Faibussowitsch { 706942e3340SBarry Smith DMSNES sdm; 7077971a8bfSPeter Brune 7087971a8bfSPeter Brune PetscFunctionBegin; 7097971a8bfSPeter Brune PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 7109566063dSJacob Faibussowitsch PetscCall(DMGetDMSNES(dm, &sdm)); 711f8b49ee9SBarry Smith if (b) *b = sdm->ops->computepfunction; 712f8b49ee9SBarry Smith if (J) *J = sdm->ops->computepjacobian; 7137971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 7147971a8bfSPeter Brune PetscFunctionReturn(0); 7157971a8bfSPeter Brune } 716