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__ 5*942e3340SBarry Smith #define __FUNCT__ "PetscContainerDestroy_DMSNES" 6*942e3340SBarry Smith static PetscErrorCode PetscContainerDestroy_DMSNES(void *ctx) 76cab3a1bSJed Brown { 86cab3a1bSJed Brown PetscErrorCode ierr; 9*942e3340SBarry Smith DMSNES sdm = (DMSNES)ctx; 106cab3a1bSJed Brown 116cab3a1bSJed Brown PetscFunctionBegin; 126cab3a1bSJed Brown if (sdm->destroy) {ierr = (*sdm->destroy)(sdm);CHKERRQ(ierr);} 136cab3a1bSJed Brown ierr = PetscFree(sdm);CHKERRQ(ierr); 146cab3a1bSJed Brown PetscFunctionReturn(0); 156cab3a1bSJed Brown } 166cab3a1bSJed Brown 176cab3a1bSJed Brown #undef __FUNCT__ 18*942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMSNES" 19*942e3340SBarry Smith /* Attaches the DMSNES to the coarse level. 206cab3a1bSJed Brown * Under what conditions should we copy versus duplicate? 216cab3a1bSJed Brown */ 22*942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMSNES(DM dm,DM dmc,void *ctx) 236cab3a1bSJed Brown { 246cab3a1bSJed Brown PetscErrorCode ierr; 256cab3a1bSJed Brown 266cab3a1bSJed Brown PetscFunctionBegin; 27*942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmc);CHKERRQ(ierr); 286cab3a1bSJed Brown PetscFunctionReturn(0); 296cab3a1bSJed Brown } 306cab3a1bSJed Brown 316cab3a1bSJed Brown #undef __FUNCT__ 32*942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMSNES" 33dfe15315SJed Brown /* This could restrict auxiliary information to the coarse level. 34caa4e7f2SJed Brown */ 35*942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMSNES(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 36caa4e7f2SJed Brown { 37caa4e7f2SJed Brown 38caa4e7f2SJed Brown PetscFunctionBegin; 39caa4e7f2SJed Brown PetscFunctionReturn(0); 40caa4e7f2SJed Brown } 41caa4e7f2SJed Brown 42caa4e7f2SJed Brown #undef __FUNCT__ 43*942e3340SBarry Smith #define __FUNCT__ "DMRefineHook_DMSNES" 44*942e3340SBarry Smith static PetscErrorCode DMRefineHook_DMSNES(DM dm,DM dmf,void *ctx) 4503a0fabfSPeter Brune { 4603a0fabfSPeter Brune PetscErrorCode ierr; 4703a0fabfSPeter Brune 4803a0fabfSPeter Brune PetscFunctionBegin; 49*942e3340SBarry Smith ierr = DMCopyDMSNES(dm,dmf);CHKERRQ(ierr); 5003a0fabfSPeter Brune PetscFunctionReturn(0); 5103a0fabfSPeter Brune } 5203a0fabfSPeter Brune 5303a0fabfSPeter Brune #undef __FUNCT__ 54*942e3340SBarry Smith #define __FUNCT__ "DMInterpolateHook_DMSNES" 5503a0fabfSPeter Brune /* This could restrict auxiliary information to the coarse level. 5603a0fabfSPeter Brune */ 57*942e3340SBarry Smith static PetscErrorCode DMInterpolateHook_DMSNES(DM dm,Mat Interp,DM dmf,void *ctx) 5803a0fabfSPeter Brune { 5903a0fabfSPeter Brune 6003a0fabfSPeter Brune PetscFunctionBegin; 6103a0fabfSPeter Brune PetscFunctionReturn(0); 6203a0fabfSPeter Brune } 6303a0fabfSPeter Brune 6403a0fabfSPeter Brune #undef __FUNCT__ 65*942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNES" 666cab3a1bSJed Brown /*@C 67*942e3340SBarry Smith DMGetDMSNES - get read-only private DMSNES context from a DM 686cab3a1bSJed Brown 696cab3a1bSJed Brown Not Collective 706cab3a1bSJed Brown 716cab3a1bSJed Brown Input Argument: 726cab3a1bSJed Brown . dm - DM to be used with SNES 736cab3a1bSJed Brown 746cab3a1bSJed Brown Output Argument: 75*942e3340SBarry Smith . snesdm - private DMSNES context 766cab3a1bSJed Brown 776cab3a1bSJed Brown Level: developer 786cab3a1bSJed Brown 796cab3a1bSJed Brown Notes: 80*942e3340SBarry Smith Use DMGetDMSNESWrite() if write access is needed. The DMSNESSetXXX API should be used wherever possible. 816cab3a1bSJed Brown 82*942e3340SBarry Smith .seealso: DMGetDMSNESWrite() 836cab3a1bSJed Brown @*/ 84*942e3340SBarry Smith PetscErrorCode DMGetDMSNES(DM dm,DMSNES *snesdm) 856cab3a1bSJed Brown { 866cab3a1bSJed Brown PetscErrorCode ierr; 876cab3a1bSJed Brown PetscContainer container; 88*942e3340SBarry Smith DMSNES sdm; 896cab3a1bSJed Brown 906cab3a1bSJed Brown PetscFunctionBegin; 916cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 92*942e3340SBarry Smith ierr = PetscObjectQuery((PetscObject)dm,"DMSNES",(PetscObject*)&container);CHKERRQ(ierr); 936cab3a1bSJed Brown if (container) { 946cab3a1bSJed Brown ierr = PetscContainerGetPointer(container,(void**)snesdm);CHKERRQ(ierr); 956cab3a1bSJed Brown } else { 96*942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMSNES\n");CHKERRQ(ierr); 976cab3a1bSJed Brown ierr = PetscContainerCreate(((PetscObject)dm)->comm,&container);CHKERRQ(ierr); 98*942e3340SBarry Smith ierr = PetscNewLog(dm,struct _n_DMSNES,&sdm);CHKERRQ(ierr); 996cab3a1bSJed Brown ierr = PetscContainerSetPointer(container,sdm);CHKERRQ(ierr); 100*942e3340SBarry Smith ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_DMSNES);CHKERRQ(ierr); 101*942e3340SBarry Smith ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)container);CHKERRQ(ierr); 102*942e3340SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr); 103*942e3340SBarry Smith ierr = DMRefineHookAdd(dm,DMRefineHook_DMSNES,PETSC_NULL,PETSC_NULL);CHKERRQ(ierr); 1046cab3a1bSJed Brown ierr = PetscContainerGetPointer(container,(void**)snesdm);CHKERRQ(ierr); 1056cab3a1bSJed Brown ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 1066cab3a1bSJed Brown } 1076cab3a1bSJed Brown PetscFunctionReturn(0); 1086cab3a1bSJed Brown } 1096cab3a1bSJed Brown 1106cab3a1bSJed Brown #undef __FUNCT__ 111*942e3340SBarry Smith #define __FUNCT__ "DMGetDMSNESWrite" 1126cab3a1bSJed Brown /*@C 113*942e3340SBarry Smith DMGetDMSNESWrite - get write access to private DMSNES context from a DM 1146cab3a1bSJed Brown 1156cab3a1bSJed Brown Not Collective 1166cab3a1bSJed Brown 1176cab3a1bSJed Brown Input Argument: 1186cab3a1bSJed Brown . dm - DM to be used with SNES 1196cab3a1bSJed Brown 1206cab3a1bSJed Brown Output Argument: 121*942e3340SBarry Smith . snesdm - private DMSNES context 1226cab3a1bSJed Brown 1236cab3a1bSJed Brown Level: developer 1246cab3a1bSJed Brown 125*942e3340SBarry Smith .seealso: DMGetDMSNES() 1266cab3a1bSJed Brown @*/ 127*942e3340SBarry Smith PetscErrorCode DMGetDMSNESWrite(DM dm,DMSNES *snesdm) 1286cab3a1bSJed Brown { 1296cab3a1bSJed Brown PetscErrorCode ierr; 130*942e3340SBarry Smith DMSNES sdm; 1316cab3a1bSJed Brown 1326cab3a1bSJed Brown PetscFunctionBegin; 1336cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 134*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 1356cab3a1bSJed Brown if (!sdm->originaldm) sdm->originaldm = dm; 1366cab3a1bSJed Brown if (sdm->originaldm != dm) { /* Copy on write */ 1376cab3a1bSJed Brown PetscContainer container; 138*942e3340SBarry Smith DMSNES oldsdm = sdm; 139*942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMSNES due to write\n");CHKERRQ(ierr); 1406cab3a1bSJed Brown ierr = PetscContainerCreate(((PetscObject)dm)->comm,&container);CHKERRQ(ierr); 141*942e3340SBarry Smith ierr = PetscNewLog(dm,struct _n_DMSNES,&sdm);CHKERRQ(ierr); 1428caf3d72SBarry Smith ierr = PetscMemcpy(sdm,oldsdm,sizeof(*sdm));CHKERRQ(ierr); 1436cab3a1bSJed Brown ierr = PetscContainerSetPointer(container,sdm);CHKERRQ(ierr); 144*942e3340SBarry Smith ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_DMSNES);CHKERRQ(ierr); 145*942e3340SBarry Smith ierr = PetscObjectCompose((PetscObject)dm,"DMSNES",(PetscObject)container);CHKERRQ(ierr); 1466cab3a1bSJed Brown ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 147e3c0b8a2SPeter Brune /* implementation specific copy hooks */ 148c9058dfbSJed Brown if (sdm->duplicate) {ierr = (*sdm->duplicate)(oldsdm,dm);CHKERRQ(ierr);} 1496cab3a1bSJed Brown } 1506cab3a1bSJed Brown *snesdm = sdm; 1516cab3a1bSJed Brown PetscFunctionReturn(0); 1526cab3a1bSJed Brown } 1536cab3a1bSJed Brown 1546cab3a1bSJed Brown #undef __FUNCT__ 155*942e3340SBarry Smith #define __FUNCT__ "DMCopyDMSNES" 1566cab3a1bSJed Brown /*@C 157*942e3340SBarry Smith DMCopyDMSNES - copies a DM context to a new DM 1586cab3a1bSJed Brown 1596cab3a1bSJed Brown Logically Collective 1606cab3a1bSJed Brown 1616cab3a1bSJed Brown Input Arguments: 1626cab3a1bSJed Brown + dmsrc - DM to obtain context from 1636cab3a1bSJed Brown - dmdest - DM to add context to 1646cab3a1bSJed Brown 1656cab3a1bSJed Brown Level: developer 1666cab3a1bSJed Brown 1676cab3a1bSJed Brown Note: 1686cab3a1bSJed Brown The context is copied by reference. This function does not ensure that a context exists. 1696cab3a1bSJed Brown 170*942e3340SBarry Smith .seealso: DMGetDMSNES(), SNESSetDM() 1716cab3a1bSJed Brown @*/ 172*942e3340SBarry Smith PetscErrorCode DMCopyDMSNES(DM dmsrc,DM dmdest) 1736cab3a1bSJed Brown { 1746cab3a1bSJed Brown PetscErrorCode ierr; 1756cab3a1bSJed Brown PetscContainer container; 1766cab3a1bSJed Brown 1776cab3a1bSJed Brown PetscFunctionBegin; 1786cab3a1bSJed Brown PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 1796cab3a1bSJed Brown PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 180*942e3340SBarry Smith ierr = PetscObjectQuery((PetscObject)dmsrc,"DMSNES",(PetscObject*)&container);CHKERRQ(ierr); 1816cab3a1bSJed Brown if (container) { 182*942e3340SBarry Smith ierr = PetscObjectCompose((PetscObject)dmdest,"DMSNES",(PetscObject)container);CHKERRQ(ierr); 183*942e3340SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMSNES,DMRestrictHook_DMSNES,PETSC_NULL);CHKERRQ(ierr); 184*942e3340SBarry Smith ierr = DMRefineHookAdd(dmdest,DMRefineHook_DMSNES,DMInterpolateHook_DMSNES,PETSC_NULL);CHKERRQ(ierr); 1856cab3a1bSJed Brown } 1866cab3a1bSJed Brown PetscFunctionReturn(0); 1876cab3a1bSJed Brown } 1886cab3a1bSJed Brown 1896cab3a1bSJed Brown #undef __FUNCT__ 1906cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetFunction" 1916cab3a1bSJed Brown /*@C 1926cab3a1bSJed Brown DMSNESSetFunction - set SNES residual evaluation function 1936cab3a1bSJed Brown 1946cab3a1bSJed Brown Not Collective 1956cab3a1bSJed Brown 1966cab3a1bSJed Brown Input Arguments: 1976cab3a1bSJed Brown + dm - DM to be used with SNES 1986cab3a1bSJed Brown . func - residual evaluation function, see SNESSetFunction() for calling sequence 1996cab3a1bSJed Brown - ctx - context for residual evaluation 2006cab3a1bSJed Brown 2016cab3a1bSJed Brown Level: advanced 2026cab3a1bSJed Brown 2036cab3a1bSJed Brown Note: 2046cab3a1bSJed Brown SNESSetFunction() is normally used, but it calls this function internally because the user context is actually 2056cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 2066cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 2076cab3a1bSJed Brown 2086cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 2096cab3a1bSJed Brown @*/ 2106cab3a1bSJed Brown PetscErrorCode DMSNESSetFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 2116cab3a1bSJed Brown { 2126cab3a1bSJed Brown PetscErrorCode ierr; 213*942e3340SBarry Smith DMSNES sdm; 2146cab3a1bSJed Brown 2156cab3a1bSJed Brown PetscFunctionBegin; 2166cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 217fdaff8d6SPeter Brune if (func || ctx) { 218*942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 219fdaff8d6SPeter Brune } 2206cab3a1bSJed Brown if (func) sdm->computefunction = func; 2216cab3a1bSJed Brown if (ctx) sdm->functionctx = ctx; 2226cab3a1bSJed Brown PetscFunctionReturn(0); 2236cab3a1bSJed Brown } 2246cab3a1bSJed Brown 2256cab3a1bSJed Brown #undef __FUNCT__ 2266cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetFunction" 2276cab3a1bSJed Brown /*@C 2286cab3a1bSJed Brown DMSNESGetFunction - get SNES residual evaluation function 2296cab3a1bSJed Brown 2306cab3a1bSJed Brown Not Collective 2316cab3a1bSJed Brown 2326cab3a1bSJed Brown Input Argument: 2336cab3a1bSJed Brown . dm - DM to be used with SNES 2346cab3a1bSJed Brown 2356cab3a1bSJed Brown Output Arguments: 2366cab3a1bSJed Brown + func - residual evaluation function, see SNESSetFunction() for calling sequence 2376cab3a1bSJed Brown - ctx - context for residual evaluation 2386cab3a1bSJed Brown 2396cab3a1bSJed Brown Level: advanced 2406cab3a1bSJed Brown 2416cab3a1bSJed Brown Note: 2426cab3a1bSJed Brown SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 2436cab3a1bSJed Brown associated with the DM. 2446cab3a1bSJed Brown 2456cab3a1bSJed Brown .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction() 2466cab3a1bSJed Brown @*/ 2476cab3a1bSJed Brown PetscErrorCode DMSNESGetFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 2486cab3a1bSJed Brown { 2496cab3a1bSJed Brown PetscErrorCode ierr; 250*942e3340SBarry Smith DMSNES sdm; 2516cab3a1bSJed Brown 2526cab3a1bSJed Brown PetscFunctionBegin; 2536cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 254*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 2556cab3a1bSJed Brown if (func) *func = sdm->computefunction; 2566cab3a1bSJed Brown if (ctx) *ctx = sdm->functionctx; 2576cab3a1bSJed Brown PetscFunctionReturn(0); 2586cab3a1bSJed Brown } 2596cab3a1bSJed Brown 2606cab3a1bSJed Brown #undef __FUNCT__ 2612a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESSetObjective" 2622a4ee8f2SPeter Brune /*@C 263081a7dcdSPeter Brune DMSNESSetObjective - set SNES objective evaluation function 2642a4ee8f2SPeter Brune 2652a4ee8f2SPeter Brune Not Collective 2662a4ee8f2SPeter Brune 2672a4ee8f2SPeter Brune Input Arguments: 2682a4ee8f2SPeter Brune + dm - DM to be used with SNES 2692a4ee8f2SPeter Brune . func - residual evaluation function, see SNESSetObjective() for calling sequence 2702a4ee8f2SPeter Brune - ctx - context for residual evaluation 2712a4ee8f2SPeter Brune 2722a4ee8f2SPeter Brune Level: advanced 2732a4ee8f2SPeter Brune 2742a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), SNESGetObjective(), DMSNESSetFunction() 2752a4ee8f2SPeter Brune @*/ 2762a4ee8f2SPeter Brune PetscErrorCode DMSNESSetObjective(DM dm,SNESObjective func,void *ctx) 2772a4ee8f2SPeter Brune { 2782a4ee8f2SPeter Brune PetscErrorCode ierr; 279*942e3340SBarry Smith DMSNES sdm; 2802a4ee8f2SPeter Brune 2812a4ee8f2SPeter Brune PetscFunctionBegin; 2822a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 283fdaff8d6SPeter Brune if (func || ctx) { 284*942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 285fdaff8d6SPeter Brune } 2862a4ee8f2SPeter Brune if (func) sdm->computeobjective = func; 2872a4ee8f2SPeter Brune if (ctx) sdm->objectivectx = ctx; 2882a4ee8f2SPeter Brune PetscFunctionReturn(0); 2892a4ee8f2SPeter Brune } 2902a4ee8f2SPeter Brune 2912a4ee8f2SPeter Brune #undef __FUNCT__ 2922a4ee8f2SPeter Brune #define __FUNCT__ "DMSNESGetObjective" 2932a4ee8f2SPeter Brune /*@C 2942a4ee8f2SPeter Brune DMSNESGetObjective - get SNES objective evaluation function 2952a4ee8f2SPeter Brune 2962a4ee8f2SPeter Brune Not Collective 2972a4ee8f2SPeter Brune 2982a4ee8f2SPeter Brune Input Argument: 2992a4ee8f2SPeter Brune . dm - DM to be used with SNES 3002a4ee8f2SPeter Brune 3012a4ee8f2SPeter Brune Output Arguments: 3022a4ee8f2SPeter Brune + func - residual evaluation function, see SNESSetObjective() for calling sequence 3032a4ee8f2SPeter Brune - ctx - context for residual evaluation 3042a4ee8f2SPeter Brune 3052a4ee8f2SPeter Brune Level: advanced 3062a4ee8f2SPeter Brune 3072a4ee8f2SPeter Brune Note: 3082a4ee8f2SPeter Brune SNESGetFunction() is normally used, but it calls this function internally because the user context is actually 3092a4ee8f2SPeter Brune associated with the DM. 3102a4ee8f2SPeter Brune 3112a4ee8f2SPeter Brune .seealso: DMSNESSetContext(), DMSNESSetObjective(), SNESSetFunction() 3122a4ee8f2SPeter Brune @*/ 3132a4ee8f2SPeter Brune PetscErrorCode DMSNESGetObjective(DM dm,SNESObjective *func,void **ctx) 3142a4ee8f2SPeter Brune { 3152a4ee8f2SPeter Brune PetscErrorCode ierr; 316*942e3340SBarry Smith DMSNES sdm; 3172a4ee8f2SPeter Brune 3182a4ee8f2SPeter Brune PetscFunctionBegin; 3192a4ee8f2SPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 320*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 3212a4ee8f2SPeter Brune if (func) *func = sdm->computeobjective; 3222a4ee8f2SPeter Brune if (ctx) *ctx = sdm->objectivectx; 3232a4ee8f2SPeter Brune PetscFunctionReturn(0); 3242a4ee8f2SPeter Brune } 3252a4ee8f2SPeter Brune 3262a4ee8f2SPeter Brune #undef __FUNCT__ 3276cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetGS" 3286cab3a1bSJed Brown /*@C 3296cab3a1bSJed Brown DMSNESSetGS - set SNES Gauss-Seidel relaxation function 3306cab3a1bSJed Brown 3316cab3a1bSJed Brown Not Collective 3326cab3a1bSJed Brown 3336cab3a1bSJed Brown Input Argument: 3346cab3a1bSJed Brown + dm - DM to be used with SNES 3356cab3a1bSJed Brown . func - relaxation function, see SNESSetGS() for calling sequence 3366cab3a1bSJed Brown - ctx - context for residual evaluation 3376cab3a1bSJed Brown 3386cab3a1bSJed Brown Level: advanced 3396cab3a1bSJed Brown 3406cab3a1bSJed Brown Note: 3416cab3a1bSJed Brown SNESSetGS() is normally used, but it calls this function internally because the user context is actually 3426cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 3436cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 3446cab3a1bSJed Brown 3456cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian(), DMSNESSetFunction() 3466cab3a1bSJed Brown @*/ 3476cab3a1bSJed Brown PetscErrorCode DMSNESSetGS(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 3486cab3a1bSJed Brown { 3496cab3a1bSJed Brown PetscErrorCode ierr; 350*942e3340SBarry Smith DMSNES sdm; 3516cab3a1bSJed Brown 3526cab3a1bSJed Brown PetscFunctionBegin; 3536cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 354fdaff8d6SPeter Brune if (func || ctx) { 355*942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 356fdaff8d6SPeter Brune } 3576cab3a1bSJed Brown if (func) sdm->computegs = func; 3586cab3a1bSJed Brown if (ctx) sdm->gsctx = ctx; 3596cab3a1bSJed Brown PetscFunctionReturn(0); 3606cab3a1bSJed Brown } 3616cab3a1bSJed Brown 3626cab3a1bSJed Brown #undef __FUNCT__ 3636cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetGS" 3646cab3a1bSJed Brown /*@C 3656cab3a1bSJed Brown DMSNESGetGS - get SNES Gauss-Seidel relaxation function 3666cab3a1bSJed Brown 3676cab3a1bSJed Brown Not Collective 3686cab3a1bSJed Brown 3696cab3a1bSJed Brown Input Argument: 3706cab3a1bSJed Brown . dm - DM to be used with SNES 3716cab3a1bSJed Brown 3726cab3a1bSJed Brown Output Arguments: 3736cab3a1bSJed Brown + func - relaxation function, see SNESSetGS() for calling sequence 3746cab3a1bSJed Brown - ctx - context for residual evaluation 3756cab3a1bSJed Brown 3766cab3a1bSJed Brown Level: advanced 3776cab3a1bSJed Brown 3786cab3a1bSJed Brown Note: 3796cab3a1bSJed Brown SNESGetGS() is normally used, but it calls this function internally because the user context is actually 3806cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 3816cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 3826cab3a1bSJed Brown 3836cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESGetGS(), DMSNESGetJacobian(), DMSNESGetFunction() 3846cab3a1bSJed Brown @*/ 3856cab3a1bSJed Brown PetscErrorCode DMSNESGetGS(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 3866cab3a1bSJed Brown { 3876cab3a1bSJed Brown PetscErrorCode ierr; 388*942e3340SBarry Smith DMSNES sdm; 3896cab3a1bSJed Brown 3906cab3a1bSJed Brown PetscFunctionBegin; 3916cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 392*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 3936cab3a1bSJed Brown if (func) *func = sdm->computegs; 3946cab3a1bSJed Brown if (ctx) *ctx = sdm->gsctx; 3956cab3a1bSJed Brown PetscFunctionReturn(0); 3966cab3a1bSJed Brown } 3976cab3a1bSJed Brown 3986cab3a1bSJed Brown #undef __FUNCT__ 3996cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetJacobian" 4006cab3a1bSJed Brown /*@C 401ecfdb398SPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 4026cab3a1bSJed Brown 4036cab3a1bSJed Brown Not Collective 4046cab3a1bSJed Brown 4056cab3a1bSJed Brown Input Argument: 4066cab3a1bSJed Brown + dm - DM to be used with SNES 4076cab3a1bSJed Brown . func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 4086cab3a1bSJed Brown - ctx - context for residual evaluation 4096cab3a1bSJed Brown 4106cab3a1bSJed Brown Level: advanced 4116cab3a1bSJed Brown 4126cab3a1bSJed Brown Note: 4136cab3a1bSJed Brown SNESSetJacobian() is normally used, but it calls this function internally because the user context is actually 4146cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4156cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 4166cab3a1bSJed Brown 4176cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian() 4186cab3a1bSJed Brown @*/ 4196cab3a1bSJed Brown PetscErrorCode DMSNESSetJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 4206cab3a1bSJed Brown { 4216cab3a1bSJed Brown PetscErrorCode ierr; 422*942e3340SBarry Smith DMSNES sdm; 4236cab3a1bSJed Brown 4246cab3a1bSJed Brown PetscFunctionBegin; 4256cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 4261fdfe764SBarry Smith if (func || ctx) { 427*942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 4281fdfe764SBarry Smith } 4296cab3a1bSJed Brown if (func) sdm->computejacobian = func; 4306cab3a1bSJed Brown if (ctx) sdm->jacobianctx = ctx; 4316cab3a1bSJed Brown PetscFunctionReturn(0); 4326cab3a1bSJed Brown } 4336cab3a1bSJed Brown 4346cab3a1bSJed Brown #undef __FUNCT__ 4356cab3a1bSJed Brown #define __FUNCT__ "DMSNESGetJacobian" 4366cab3a1bSJed Brown /*@C 437ecfdb398SPeter Brune DMSNESGetJacobian - get SNES Jacobian evaluation function 4386cab3a1bSJed Brown 4396cab3a1bSJed Brown Not Collective 4406cab3a1bSJed Brown 4416cab3a1bSJed Brown Input Argument: 4426cab3a1bSJed Brown . dm - DM to be used with SNES 4436cab3a1bSJed Brown 4446cab3a1bSJed Brown Output Arguments: 4456cab3a1bSJed Brown + func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 4466cab3a1bSJed Brown - ctx - context for residual evaluation 4476cab3a1bSJed Brown 4486cab3a1bSJed Brown Level: advanced 4496cab3a1bSJed Brown 4506cab3a1bSJed Brown Note: 4516cab3a1bSJed Brown SNESGetJacobian() is normally used, but it calls this function internally because the user context is actually 4526cab3a1bSJed Brown associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 4536cab3a1bSJed Brown not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 4546cab3a1bSJed Brown 4556cab3a1bSJed Brown .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 4566cab3a1bSJed Brown @*/ 4576cab3a1bSJed Brown PetscErrorCode DMSNESGetJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 4586cab3a1bSJed Brown { 4596cab3a1bSJed Brown PetscErrorCode ierr; 460*942e3340SBarry Smith DMSNES sdm; 4616cab3a1bSJed Brown 4626cab3a1bSJed Brown PetscFunctionBegin; 4636cab3a1bSJed Brown PetscValidHeaderSpecific(dm,DM_CLASSID,1); 464*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 4656cab3a1bSJed Brown if (func) *func = sdm->computejacobian; 4666cab3a1bSJed Brown if (ctx) *ctx = sdm->jacobianctx; 4676cab3a1bSJed Brown PetscFunctionReturn(0); 4686cab3a1bSJed Brown } 4696cab3a1bSJed Brown 4706cab3a1bSJed Brown #undef __FUNCT__ 471e03ab78fSPeter Brune #define __FUNCT__ "DMSNESSetPicard" 472e03ab78fSPeter Brune /*@C 473e03ab78fSPeter Brune DMSNESSetPicard - set SNES Picard iteration matrix and RHS evaluation functions. 474e03ab78fSPeter Brune 475e03ab78fSPeter Brune Not Collective 476e03ab78fSPeter Brune 477e03ab78fSPeter Brune Input Argument: 478e03ab78fSPeter Brune + dm - DM to be used with SNES 479e03ab78fSPeter Brune . func - RHS evaluation function, see SNESSetFunction() for calling sequence 480e03ab78fSPeter Brune . pjac - Picard matrix evaluation function, see SNESSetJacobian() for calling sequence 481e03ab78fSPeter Brune - ctx - context for residual evaluation 482e03ab78fSPeter Brune 483e03ab78fSPeter Brune Level: advanced 484e03ab78fSPeter Brune 485e03ab78fSPeter Brune .seealso: SNESSetPicard(), DMSNESSetFunction(), DMSNESSetJacobian() 486e03ab78fSPeter Brune @*/ 487e03ab78fSPeter Brune PetscErrorCode DMSNESSetPicard(DM dm,PetscErrorCode (*pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (*pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 488e03ab78fSPeter Brune { 489e03ab78fSPeter Brune PetscErrorCode ierr; 490*942e3340SBarry Smith DMSNES sdm; 491e03ab78fSPeter Brune 492e03ab78fSPeter Brune PetscFunctionBegin; 493e03ab78fSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 494*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 495e03ab78fSPeter Brune if (pfunc) sdm->computepfunction = pfunc; 496e03ab78fSPeter Brune if (pjac) sdm->computepjacobian = pjac; 497e03ab78fSPeter Brune if (ctx) sdm->pctx = ctx; 498e03ab78fSPeter Brune PetscFunctionReturn(0); 499e03ab78fSPeter Brune } 500e03ab78fSPeter Brune 5017971a8bfSPeter Brune 5027971a8bfSPeter Brune #undef __FUNCT__ 5037971a8bfSPeter Brune #define __FUNCT__ "DMSNESGetPicard" 5047971a8bfSPeter Brune /*@C 5057971a8bfSPeter Brune DMSNESGetPicard - get SNES Picard iteration evaluation functions 5067971a8bfSPeter Brune 5077971a8bfSPeter Brune Not Collective 5087971a8bfSPeter Brune 5097971a8bfSPeter Brune Input Argument: 5107971a8bfSPeter Brune . dm - DM to be used with SNES 5117971a8bfSPeter Brune 5127971a8bfSPeter Brune Output Arguments: 5137971a8bfSPeter Brune + pfunc - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 5147971a8bfSPeter Brune . pjac - RHS evaluation function, see SNESSetFunction() for calling sequence 5157971a8bfSPeter Brune - ctx - context for residual evaluation 5167971a8bfSPeter Brune 5177971a8bfSPeter Brune Level: advanced 5187971a8bfSPeter Brune 5197971a8bfSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 5207971a8bfSPeter Brune @*/ 5217971a8bfSPeter Brune PetscErrorCode DMSNESGetPicard(DM dm,PetscErrorCode (**pfunc)(SNES,Vec,Vec,void*),PetscErrorCode (**pjac)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 5227971a8bfSPeter Brune { 5237971a8bfSPeter Brune PetscErrorCode ierr; 524*942e3340SBarry Smith DMSNES sdm; 5257971a8bfSPeter Brune 5267971a8bfSPeter Brune PetscFunctionBegin; 5277971a8bfSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 528*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 5297971a8bfSPeter Brune if (pfunc) *pfunc = sdm->computepfunction; 5307971a8bfSPeter Brune if (pjac) *pjac = sdm->computepjacobian; 5317971a8bfSPeter Brune if (ctx) *ctx = sdm->pctx; 5327971a8bfSPeter Brune PetscFunctionReturn(0); 5337971a8bfSPeter Brune } 5347971a8bfSPeter Brune 5356cab3a1bSJed Brown #undef __FUNCT__ 5366cab3a1bSJed Brown #define __FUNCT__ "DMSNESSetUpLegacy" 5376cab3a1bSJed Brown /* Sets up calling of legacy DM routines */ 5386cab3a1bSJed Brown PetscErrorCode DMSNESSetUpLegacy(DM dm) 5396cab3a1bSJed Brown { 5406cab3a1bSJed Brown PetscErrorCode ierr; 541*942e3340SBarry Smith DMSNES sdm; 5426cab3a1bSJed Brown 5436cab3a1bSJed Brown PetscFunctionBegin; 544*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 54574e1e8c1SBarry Smith if (!sdm->computefunction) SETERRQ(((PetscObject)dm)->comm,PETSC_ERR_ARG_WRONGSTATE,"Function never provided to SNES object"); 546679f678eSPeter Brune if (!sdm->computejacobian) { 547679f678eSPeter Brune ierr = DMSNESSetJacobian(dm,SNESDefaultComputeJacobianColor,PETSC_NULL);CHKERRQ(ierr); 548679f678eSPeter Brune } 5496cab3a1bSJed Brown PetscFunctionReturn(0); 5506cab3a1bSJed Brown } 5516427ad5bSPeter Brune 5526427ad5bSPeter Brune /* block functions */ 5536427ad5bSPeter Brune 5546427ad5bSPeter Brune #undef __FUNCT__ 5556427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockFunction" 5566427ad5bSPeter Brune /*@C 5576427ad5bSPeter Brune DMSNESSetBlockFunction - set SNES residual evaluation function 5586427ad5bSPeter Brune 5596427ad5bSPeter Brune Not Collective 5606427ad5bSPeter Brune 5616427ad5bSPeter Brune Input Arguments: 5626427ad5bSPeter Brune + dm - DM to be used with SNES 5636427ad5bSPeter Brune . func - residual evaluation function, see SNESSetFunction() for calling sequence 5646427ad5bSPeter Brune - ctx - context for residual evaluation 5656427ad5bSPeter Brune 5666427ad5bSPeter Brune Level: developer 5676427ad5bSPeter Brune 5686427ad5bSPeter Brune Note: 5696427ad5bSPeter Brune Mostly for use in DM implementations and transferred to a block function rather than being called from here. 5706427ad5bSPeter Brune 5716427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 5726427ad5bSPeter Brune @*/ 5736427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockFunction(DM dm,PetscErrorCode (*func)(SNES,Vec,Vec,void*),void *ctx) 5746427ad5bSPeter Brune { 5756427ad5bSPeter Brune PetscErrorCode ierr; 576*942e3340SBarry Smith DMSNES sdm; 5776427ad5bSPeter Brune 5786427ad5bSPeter Brune PetscFunctionBegin; 5796427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 580fdaff8d6SPeter Brune if (func || ctx) { 581*942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 582fdaff8d6SPeter Brune } 5836427ad5bSPeter Brune if (func) sdm->computeblockfunction = func; 5846427ad5bSPeter Brune if (ctx) sdm->blockfunctionctx = ctx; 5856427ad5bSPeter Brune PetscFunctionReturn(0); 5866427ad5bSPeter Brune } 5876427ad5bSPeter Brune 5886427ad5bSPeter Brune #undef __FUNCT__ 5896427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockFunction" 5906427ad5bSPeter Brune /*@C 5916427ad5bSPeter Brune DMSNESGetBlockFunction - get SNES residual evaluation function 5926427ad5bSPeter Brune 5936427ad5bSPeter Brune Not Collective 5946427ad5bSPeter Brune 5956427ad5bSPeter Brune Input Argument: 5966427ad5bSPeter Brune . dm - DM to be used with SNES 5976427ad5bSPeter Brune 5986427ad5bSPeter Brune Output Arguments: 5996427ad5bSPeter Brune + func - residual evaluation function, see SNESSetFunction() for calling sequence 6006427ad5bSPeter Brune - ctx - context for residual evaluation 6016427ad5bSPeter Brune 6026427ad5bSPeter Brune Level: developer 6036427ad5bSPeter Brune 6046427ad5bSPeter Brune .seealso: DMSNESSetContext(), DMSNESSetFunction(), SNESSetFunction() 6056427ad5bSPeter Brune @*/ 6066427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockFunction(DM dm,PetscErrorCode (**func)(SNES,Vec,Vec,void*),void **ctx) 6076427ad5bSPeter Brune { 6086427ad5bSPeter Brune PetscErrorCode ierr; 609*942e3340SBarry Smith DMSNES sdm; 6106427ad5bSPeter Brune 6116427ad5bSPeter Brune PetscFunctionBegin; 6126427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 613*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 6146427ad5bSPeter Brune if (func) *func = sdm->computeblockfunction; 6156427ad5bSPeter Brune if (ctx) *ctx = sdm->blockfunctionctx; 6166427ad5bSPeter Brune PetscFunctionReturn(0); 6176427ad5bSPeter Brune } 6186427ad5bSPeter Brune 6196427ad5bSPeter Brune 6206427ad5bSPeter Brune #undef __FUNCT__ 6216427ad5bSPeter Brune #define __FUNCT__ "DMSNESSetBlockJacobian" 6226427ad5bSPeter Brune /*@C 6236427ad5bSPeter Brune DMSNESSetJacobian - set SNES Jacobian evaluation function 6246427ad5bSPeter Brune 6256427ad5bSPeter Brune Not Collective 6266427ad5bSPeter Brune 6276427ad5bSPeter Brune Input Argument: 6286427ad5bSPeter Brune + dm - DM to be used with SNES 6296427ad5bSPeter Brune . func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 6306427ad5bSPeter Brune - ctx - context for residual evaluation 6316427ad5bSPeter Brune 6326427ad5bSPeter Brune Level: advanced 6336427ad5bSPeter Brune 6346427ad5bSPeter Brune Note: 6356427ad5bSPeter Brune Mostly for use in DM implementations and transferred to a block function rather than being called from here. 6366427ad5bSPeter Brune 6376427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESGetJacobian(), SNESSetJacobian() 6386427ad5bSPeter Brune @*/ 6396427ad5bSPeter Brune PetscErrorCode DMSNESSetBlockJacobian(DM dm,PetscErrorCode (*func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void *ctx) 6406427ad5bSPeter Brune { 6416427ad5bSPeter Brune PetscErrorCode ierr; 642*942e3340SBarry Smith DMSNES sdm; 6436427ad5bSPeter Brune 6446427ad5bSPeter Brune PetscFunctionBegin; 6456427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 646fdaff8d6SPeter Brune if (func || ctx) { 647*942e3340SBarry Smith ierr = DMGetDMSNESWrite(dm,&sdm);CHKERRQ(ierr); 648fdaff8d6SPeter Brune } 6496427ad5bSPeter Brune if (func) sdm->computeblockjacobian = func; 6506427ad5bSPeter Brune if (ctx) sdm->blockjacobianctx = ctx; 6516427ad5bSPeter Brune PetscFunctionReturn(0); 6526427ad5bSPeter Brune } 6536427ad5bSPeter Brune 6546427ad5bSPeter Brune #undef __FUNCT__ 6556427ad5bSPeter Brune #define __FUNCT__ "DMSNESGetBlockJacobian" 6566427ad5bSPeter Brune /*@C 6576427ad5bSPeter Brune DMSNESGetBlockJacobian - get SNES Jacobian evaluation function 6586427ad5bSPeter Brune 6596427ad5bSPeter Brune Not Collective 6606427ad5bSPeter Brune 6616427ad5bSPeter Brune Input Argument: 6626427ad5bSPeter Brune . dm - DM to be used with SNES 6636427ad5bSPeter Brune 6646427ad5bSPeter Brune Output Arguments: 6656427ad5bSPeter Brune + func - Jacobian evaluation function, see SNESSetJacobian() for calling sequence 6666427ad5bSPeter Brune - ctx - context for residual evaluation 6676427ad5bSPeter Brune 6686427ad5bSPeter Brune Level: advanced 6696427ad5bSPeter Brune 6706427ad5bSPeter Brune .seealso: DMSNESSetContext(), SNESSetFunction(), DMSNESSetJacobian() 6716427ad5bSPeter Brune @*/ 6726427ad5bSPeter Brune PetscErrorCode DMSNESGetBlockJacobian(DM dm,PetscErrorCode (**func)(SNES,Vec,Mat*,Mat*,MatStructure*,void*),void **ctx) 6736427ad5bSPeter Brune { 6746427ad5bSPeter Brune PetscErrorCode ierr; 675*942e3340SBarry Smith DMSNES sdm; 6766427ad5bSPeter Brune 6776427ad5bSPeter Brune PetscFunctionBegin; 6786427ad5bSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 679*942e3340SBarry Smith ierr = DMGetDMSNES(dm,&sdm);CHKERRQ(ierr); 6806427ad5bSPeter Brune if (func) *func = sdm->computeblockjacobian; 6816427ad5bSPeter Brune if (ctx) *ctx = sdm->blockjacobianctx; 6826427ad5bSPeter Brune PetscFunctionReturn(0); 6836427ad5bSPeter Brune } 684