124989b8cSPeter Brune #include <petsc-private/tsimpl.h> /*I "petscts.h" I*/ 224989b8cSPeter Brune #include <petsc-private/dmimpl.h> /*I "petscdm.h" I*/ 324989b8cSPeter Brune 424989b8cSPeter Brune 524989b8cSPeter Brune #undef __FUNCT__ 624989b8cSPeter Brune #define __FUNCT__ "DMCoarsenHook_TSDM" 724989b8cSPeter Brune /* Attaches the SNESDM to the coarse level. 824989b8cSPeter Brune * Under what conditions should we copy versus duplicate? 924989b8cSPeter Brune */ 1024989b8cSPeter Brune static PetscErrorCode DMCoarsenHook_TSDM(DM dm,DM dmc,void *ctx) 1124989b8cSPeter Brune { 1224989b8cSPeter Brune PetscErrorCode ierr; 1324989b8cSPeter Brune 1424989b8cSPeter Brune PetscFunctionBegin; 1524989b8cSPeter Brune ierr = DMTSCopyContext(dm,dmc);CHKERRQ(ierr); 1624989b8cSPeter Brune PetscFunctionReturn(0); 1724989b8cSPeter Brune } 1824989b8cSPeter Brune 1924989b8cSPeter Brune #undef __FUNCT__ 2031ad16ddSPeter Brune #define __FUNCT__ "DMRestrictHook_TSDM" 2124989b8cSPeter Brune /* This could restrict auxiliary information to the coarse level. 2224989b8cSPeter Brune */ 2324989b8cSPeter Brune static PetscErrorCode DMRestrictHook_TSDM(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 2424989b8cSPeter Brune { 2524989b8cSPeter Brune 2624989b8cSPeter Brune PetscFunctionBegin; 2724989b8cSPeter Brune PetscFunctionReturn(0); 2824989b8cSPeter Brune } 2924989b8cSPeter Brune 3024989b8cSPeter Brune 3124989b8cSPeter Brune #undef __FUNCT__ 3224989b8cSPeter Brune #define __FUNCT__ "PetscContainerDestroy_TSDM" 3324989b8cSPeter Brune static PetscErrorCode PetscContainerDestroy_TSDM(void *ctx) 3424989b8cSPeter Brune { 3524989b8cSPeter Brune PetscErrorCode ierr; 3624989b8cSPeter Brune TSDM tsdm = (TSDM)ctx; 3724989b8cSPeter Brune 3824989b8cSPeter Brune PetscFunctionBegin; 3924989b8cSPeter Brune if (tsdm->destroy) {ierr = (*tsdm->destroy)(tsdm);CHKERRQ(ierr);} 4024989b8cSPeter Brune ierr = PetscFree(tsdm);CHKERRQ(ierr); 4124989b8cSPeter Brune PetscFunctionReturn(0); 4224989b8cSPeter Brune } 4324989b8cSPeter Brune 4424989b8cSPeter Brune #undef __FUNCT__ 4524989b8cSPeter Brune #define __FUNCT__ "DMTSGetContext" 4624989b8cSPeter Brune /*@C 4724989b8cSPeter Brune DMTSGetContext - get read-only private TSDM context from a DM 4824989b8cSPeter Brune 4924989b8cSPeter Brune Not Collective 5024989b8cSPeter Brune 5124989b8cSPeter Brune Input Argument: 5224989b8cSPeter Brune . dm - DM to be used with TS 5324989b8cSPeter Brune 5424989b8cSPeter Brune Output Argument: 5524989b8cSPeter Brune . tsdm - private TSDM context 5624989b8cSPeter Brune 5724989b8cSPeter Brune Level: developer 5824989b8cSPeter Brune 5924989b8cSPeter Brune Notes: 6024989b8cSPeter Brune Use DMTSGetContextWrite() if write access is needed. The DMTSSetXXX API should be used wherever possible. 6124989b8cSPeter Brune 6224989b8cSPeter Brune .seealso: DMTSGetContextWrite() 6324989b8cSPeter Brune @*/ 6424989b8cSPeter Brune PetscErrorCode DMTSGetContext(DM dm,TSDM *tsdm) 6524989b8cSPeter Brune { 6624989b8cSPeter Brune PetscErrorCode ierr; 6724989b8cSPeter Brune PetscContainer container; 6824989b8cSPeter Brune TSDM tsdmnew; 6924989b8cSPeter Brune 7024989b8cSPeter Brune 7124989b8cSPeter Brune PetscFunctionBegin; 7224989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 7324989b8cSPeter Brune ierr = PetscObjectQuery((PetscObject)dm,"TSDM",(PetscObject*)&container);CHKERRQ(ierr); 7424989b8cSPeter Brune if (container) { 7524989b8cSPeter Brune ierr = PetscContainerGetPointer(container,(void**)tsdm);CHKERRQ(ierr); 7624989b8cSPeter Brune } else { 7724989b8cSPeter Brune ierr = PetscInfo(dm,"Creating new TSDM\n");CHKERRQ(ierr); 7824989b8cSPeter Brune ierr = PetscContainerCreate(((PetscObject)dm)->comm,&container);CHKERRQ(ierr); 7924989b8cSPeter Brune ierr = PetscNewLog(dm,struct _n_TSDM,&tsdmnew);CHKERRQ(ierr); 8024989b8cSPeter Brune ierr = PetscContainerSetPointer(container,tsdmnew);CHKERRQ(ierr); 8124989b8cSPeter Brune ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_TSDM);CHKERRQ(ierr); 8224989b8cSPeter Brune ierr = PetscObjectCompose((PetscObject)dm,"TSDM",(PetscObject)container);CHKERRQ(ierr); 8331ad16ddSPeter Brune ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_TSDM,DMRestrictHook_TSDM,PETSC_NULL);CHKERRQ(ierr); 8424989b8cSPeter Brune ierr = PetscContainerGetPointer(container,(void**)tsdm);CHKERRQ(ierr); 8524989b8cSPeter Brune ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 8624989b8cSPeter Brune } 8724989b8cSPeter Brune PetscFunctionReturn(0); 8824989b8cSPeter Brune } 8924989b8cSPeter Brune 9024989b8cSPeter Brune #undef __FUNCT__ 9124989b8cSPeter Brune #define __FUNCT__ "DMTSGetContextWrite" 9224989b8cSPeter Brune /*@C 9324989b8cSPeter Brune DMTSGetContextWrite - get write access to private TSDM context from a DM 9424989b8cSPeter Brune 9524989b8cSPeter Brune Not Collective 9624989b8cSPeter Brune 9724989b8cSPeter Brune Input Argument: 9824989b8cSPeter Brune . dm - DM to be used with TS 9924989b8cSPeter Brune 10024989b8cSPeter Brune Output Argument: 10124989b8cSPeter Brune . tsdm - private TSDM context 10224989b8cSPeter Brune 10324989b8cSPeter Brune Level: developer 10424989b8cSPeter Brune 10524989b8cSPeter Brune .seealso: DMTSGetContext() 10624989b8cSPeter Brune @*/ 10724989b8cSPeter Brune PetscErrorCode DMTSGetContextWrite(DM dm,TSDM *tsdm) 10824989b8cSPeter Brune { 10924989b8cSPeter Brune PetscErrorCode ierr; 11024989b8cSPeter Brune TSDM sdm; 11124989b8cSPeter Brune 11224989b8cSPeter Brune PetscFunctionBegin; 11324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 11424989b8cSPeter Brune ierr = DMTSGetContext(dm,&sdm);CHKERRQ(ierr); 11524989b8cSPeter Brune if (!sdm->originaldm) sdm->originaldm = dm; 11624989b8cSPeter Brune if (sdm->originaldm != dm) { /* Copy on write */ 11724989b8cSPeter Brune PetscContainer container; 11824989b8cSPeter Brune TSDM oldsdm = sdm; 11924989b8cSPeter Brune ierr = PetscInfo(dm,"Copying TSDM due to write\n");CHKERRQ(ierr); 12024989b8cSPeter Brune ierr = PetscContainerCreate(((PetscObject)dm)->comm,&container);CHKERRQ(ierr); 12124989b8cSPeter Brune ierr = PetscNewLog(dm,struct _n_TSDM,&sdm);CHKERRQ(ierr); 1228caf3d72SBarry Smith ierr = PetscMemcpy(sdm,oldsdm,sizeof(*sdm));CHKERRQ(ierr); 12324989b8cSPeter Brune ierr = PetscContainerSetPointer(container,sdm);CHKERRQ(ierr); 12424989b8cSPeter Brune ierr = PetscContainerSetUserDestroy(container,PetscContainerDestroy_TSDM);CHKERRQ(ierr); 12524989b8cSPeter Brune ierr = PetscObjectCompose((PetscObject)dm,"TSDM",(PetscObject)container);CHKERRQ(ierr); 12624989b8cSPeter Brune ierr = PetscContainerDestroy(&container);CHKERRQ(ierr); 12724989b8cSPeter Brune } 12824989b8cSPeter Brune *tsdm = sdm; 12924989b8cSPeter Brune PetscFunctionReturn(0); 13024989b8cSPeter Brune } 13124989b8cSPeter Brune 13224989b8cSPeter Brune #undef __FUNCT__ 13324989b8cSPeter Brune #define __FUNCT__ "DMTSCopyContext" 13424989b8cSPeter Brune /*@C 13524989b8cSPeter Brune DMTSCopyContext - copies a DM context to a new DM 13624989b8cSPeter Brune 13724989b8cSPeter Brune Logically Collective 13824989b8cSPeter Brune 13924989b8cSPeter Brune Input Arguments: 14024989b8cSPeter Brune + dmsrc - DM to obtain context from 14124989b8cSPeter Brune - dmdest - DM to add context to 14224989b8cSPeter Brune 14324989b8cSPeter Brune Level: developer 14424989b8cSPeter Brune 14524989b8cSPeter Brune Note: 14624989b8cSPeter Brune The context is copied by reference. This function does not ensure that a context exists. 14724989b8cSPeter Brune 14824989b8cSPeter Brune .seealso: DMTSGetContext(), TSSetDM() 14924989b8cSPeter Brune @*/ 15024989b8cSPeter Brune PetscErrorCode DMTSCopyContext(DM dmsrc,DM dmdest) 15124989b8cSPeter Brune { 15224989b8cSPeter Brune PetscErrorCode ierr; 15324989b8cSPeter Brune PetscContainer container; 15424989b8cSPeter Brune 15524989b8cSPeter Brune PetscFunctionBegin; 15624989b8cSPeter Brune PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 15724989b8cSPeter Brune PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 15824989b8cSPeter Brune ierr = PetscObjectQuery((PetscObject)dmsrc,"TSDM",(PetscObject*)&container);CHKERRQ(ierr); 15924989b8cSPeter Brune if (container) { 16024989b8cSPeter Brune ierr = PetscObjectCompose((PetscObject)dmdest,"TSDM",(PetscObject)container);CHKERRQ(ierr); 16124989b8cSPeter Brune ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_TSDM,DMRestrictHook_TSDM,PETSC_NULL);CHKERRQ(ierr); 16224989b8cSPeter Brune } 16324989b8cSPeter Brune PetscFunctionReturn(0); 16424989b8cSPeter Brune } 16524989b8cSPeter Brune 16624989b8cSPeter Brune #undef __FUNCT__ 16724989b8cSPeter Brune #define __FUNCT__ "DMTSSetIFunction" 16824989b8cSPeter Brune /*@C 16924989b8cSPeter Brune DMTSSetIFunction - set TS implicit function evaluation function 17024989b8cSPeter Brune 17124989b8cSPeter Brune Not Collective 17224989b8cSPeter Brune 17324989b8cSPeter Brune Input Arguments: 17424989b8cSPeter Brune + dm - DM to be used with TS 17524989b8cSPeter Brune . func - function evaluation function, see TSSetIFunction() for calling sequence 17624989b8cSPeter Brune - ctx - context for residual evaluation 17724989b8cSPeter Brune 17824989b8cSPeter Brune Level: advanced 17924989b8cSPeter Brune 18024989b8cSPeter Brune Note: 18124989b8cSPeter Brune TSSetFunction() is normally used, but it calls this function internally because the user context is actually 18224989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 18324989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 18424989b8cSPeter Brune 18524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 18624989b8cSPeter Brune @*/ 18724989b8cSPeter Brune PetscErrorCode DMTSSetIFunction(DM dm,TSIFunction func,void *ctx) 18824989b8cSPeter Brune { 18924989b8cSPeter Brune PetscErrorCode ierr; 19024989b8cSPeter Brune TSDM tsdm; 19124989b8cSPeter Brune 19224989b8cSPeter Brune PetscFunctionBegin; 19324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 19424989b8cSPeter Brune ierr = DMTSGetContextWrite(dm,&tsdm);CHKERRQ(ierr); 19524989b8cSPeter Brune if (func) tsdm->ifunction = func; 19624989b8cSPeter Brune if (ctx) tsdm->ifunctionctx = ctx; 19724989b8cSPeter Brune PetscFunctionReturn(0); 19824989b8cSPeter Brune } 19924989b8cSPeter Brune 20024989b8cSPeter Brune #undef __FUNCT__ 20124989b8cSPeter Brune #define __FUNCT__ "DMTSGetIFunction" 20224989b8cSPeter Brune /*@C 20324989b8cSPeter Brune DMTSGetIFunction - get TS implicit residual evaluation function 20424989b8cSPeter Brune 20524989b8cSPeter Brune Not Collective 20624989b8cSPeter Brune 20724989b8cSPeter Brune Input Argument: 20824989b8cSPeter Brune . dm - DM to be used with TS 20924989b8cSPeter Brune 21024989b8cSPeter Brune Output Arguments: 21124989b8cSPeter Brune + func - function evaluation function, see TSSetIFunction() for calling sequence 21224989b8cSPeter Brune - ctx - context for residual evaluation 21324989b8cSPeter Brune 21424989b8cSPeter Brune Level: advanced 21524989b8cSPeter Brune 21624989b8cSPeter Brune Note: 21724989b8cSPeter Brune TSGetFunction() is normally used, but it calls this function internally because the user context is actually 21824989b8cSPeter Brune associated with the DM. 21924989b8cSPeter Brune 22024989b8cSPeter Brune .seealso: DMTSSetContext(), DMTSSetFunction(), TSSetFunction() 22124989b8cSPeter Brune @*/ 22224989b8cSPeter Brune PetscErrorCode DMTSGetIFunction(DM dm,TSIFunction *func,void **ctx) 22324989b8cSPeter Brune { 22424989b8cSPeter Brune PetscErrorCode ierr; 22524989b8cSPeter Brune TSDM tsdm; 22624989b8cSPeter Brune 22724989b8cSPeter Brune PetscFunctionBegin; 22824989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 22924989b8cSPeter Brune ierr = DMTSGetContext(dm,&tsdm);CHKERRQ(ierr); 23024989b8cSPeter Brune if (func) *func = tsdm->ifunction; 23124989b8cSPeter Brune if (ctx) *ctx = tsdm->ifunctionctx; 23224989b8cSPeter Brune PetscFunctionReturn(0); 23324989b8cSPeter Brune } 23424989b8cSPeter Brune 23524989b8cSPeter Brune 23624989b8cSPeter Brune #undef __FUNCT__ 23724989b8cSPeter Brune #define __FUNCT__ "DMTSSetRHSFunction" 23824989b8cSPeter Brune /*@C 23924989b8cSPeter Brune DMTSSetRHSFunction - set TS explicit residual evaluation function 24024989b8cSPeter Brune 24124989b8cSPeter Brune Not Collective 24224989b8cSPeter Brune 24324989b8cSPeter Brune Input Arguments: 24424989b8cSPeter Brune + dm - DM to be used with TS 24524989b8cSPeter Brune . func - RHS function evaluation function, see TSSetRHSFunction() for calling sequence 24624989b8cSPeter Brune - ctx - context for residual evaluation 24724989b8cSPeter Brune 24824989b8cSPeter Brune Level: advanced 24924989b8cSPeter Brune 25024989b8cSPeter Brune Note: 251*ef20d060SBarry Smith TSSetRSHFunction() is normally used, but it calls this function internally because the user context is actually 25224989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 25324989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 25424989b8cSPeter Brune 25524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 25624989b8cSPeter Brune @*/ 25724989b8cSPeter Brune PetscErrorCode DMTSSetRHSFunction(DM dm,TSRHSFunction func,void *ctx) 25824989b8cSPeter Brune { 25924989b8cSPeter Brune PetscErrorCode ierr; 26024989b8cSPeter Brune TSDM tsdm; 26124989b8cSPeter Brune 26224989b8cSPeter Brune PetscFunctionBegin; 26324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 26424989b8cSPeter Brune ierr = DMTSGetContextWrite(dm,&tsdm);CHKERRQ(ierr); 26524989b8cSPeter Brune if (func) tsdm->rhsfunction = func; 26624989b8cSPeter Brune if (ctx) tsdm->rhsfunctionctx = ctx; 26724989b8cSPeter Brune PetscFunctionReturn(0); 26824989b8cSPeter Brune } 26924989b8cSPeter Brune 27024989b8cSPeter Brune #undef __FUNCT__ 271*ef20d060SBarry Smith #define __FUNCT__ "DMTSGetSolutionFunction" 272*ef20d060SBarry Smith /*@C 273*ef20d060SBarry Smith DMTSGetSolutionFunction - gets the TS solution evaluation function 274*ef20d060SBarry Smith 275*ef20d060SBarry Smith Not Collective 276*ef20d060SBarry Smith 277*ef20d060SBarry Smith Input Arguments: 278*ef20d060SBarry Smith . dm - DM to be used with TS 279*ef20d060SBarry Smith 280*ef20d060SBarry Smith Output Parameters: 281*ef20d060SBarry Smith + func - solution function evaluation function, see TSSetSolution() for calling sequence 282*ef20d060SBarry Smith - ctx - context for solution evaluation 283*ef20d060SBarry Smith 284*ef20d060SBarry Smith Level: advanced 285*ef20d060SBarry Smith 286*ef20d060SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 287*ef20d060SBarry Smith @*/ 288*ef20d060SBarry Smith PetscErrorCode DMTSGetSolutionFunction(DM dm,TSSolutionFunction *func,void **ctx) 289*ef20d060SBarry Smith { 290*ef20d060SBarry Smith PetscErrorCode ierr; 291*ef20d060SBarry Smith TSDM tsdm; 292*ef20d060SBarry Smith 293*ef20d060SBarry Smith PetscFunctionBegin; 294*ef20d060SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 295*ef20d060SBarry Smith ierr = DMTSGetContext(dm,&tsdm);CHKERRQ(ierr); 296*ef20d060SBarry Smith if (func) *func = tsdm->solution; 297*ef20d060SBarry Smith if (ctx) *ctx = tsdm->solutionctx; 298*ef20d060SBarry Smith PetscFunctionReturn(0); 299*ef20d060SBarry Smith } 300*ef20d060SBarry Smith 301*ef20d060SBarry Smith #undef __FUNCT__ 302*ef20d060SBarry Smith #define __FUNCT__ "DMTSSetSolutionFunction" 303*ef20d060SBarry Smith /*@C 304*ef20d060SBarry Smith DMTSSetSolutionFunction - set TS solution evaluation function 305*ef20d060SBarry Smith 306*ef20d060SBarry Smith Not Collective 307*ef20d060SBarry Smith 308*ef20d060SBarry Smith Input Arguments: 309*ef20d060SBarry Smith + dm - DM to be used with TS 310*ef20d060SBarry Smith . func - solution function evaluation function, see TSSetSolution() for calling sequence 311*ef20d060SBarry Smith - ctx - context for solution evaluation 312*ef20d060SBarry Smith 313*ef20d060SBarry Smith Level: advanced 314*ef20d060SBarry Smith 315*ef20d060SBarry Smith Note: 316*ef20d060SBarry Smith TSSetSolutionFunction() is normally used, but it calls this function internally because the user context is actually 317*ef20d060SBarry Smith associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 318*ef20d060SBarry Smith not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 319*ef20d060SBarry Smith 320*ef20d060SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 321*ef20d060SBarry Smith @*/ 322*ef20d060SBarry Smith PetscErrorCode DMTSSetSolutionFunction(DM dm,TSSolutionFunction func,void *ctx) 323*ef20d060SBarry Smith { 324*ef20d060SBarry Smith PetscErrorCode ierr; 325*ef20d060SBarry Smith TSDM tsdm; 326*ef20d060SBarry Smith 327*ef20d060SBarry Smith PetscFunctionBegin; 328*ef20d060SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 329*ef20d060SBarry Smith ierr = DMTSGetContextWrite(dm,&tsdm);CHKERRQ(ierr); 330*ef20d060SBarry Smith if (func) tsdm->solution = func; 331*ef20d060SBarry Smith if (ctx) tsdm->solutionctx = ctx; 332*ef20d060SBarry Smith PetscFunctionReturn(0); 333*ef20d060SBarry Smith } 334*ef20d060SBarry Smith 335*ef20d060SBarry Smith #undef __FUNCT__ 33624989b8cSPeter Brune #define __FUNCT__ "DMTSGetRHSFunction" 33724989b8cSPeter Brune /*@C 33824989b8cSPeter Brune DMTSGetRHSFunction - get TS explicit residual evaluation function 33924989b8cSPeter Brune 34024989b8cSPeter Brune Not Collective 34124989b8cSPeter Brune 34224989b8cSPeter Brune Input Argument: 34324989b8cSPeter Brune . dm - DM to be used with TS 34424989b8cSPeter Brune 34524989b8cSPeter Brune Output Arguments: 34624989b8cSPeter Brune + func - residual evaluation function, see TSSetRHSFunction() for calling sequence 34724989b8cSPeter Brune - ctx - context for residual evaluation 34824989b8cSPeter Brune 34924989b8cSPeter Brune Level: advanced 35024989b8cSPeter Brune 35124989b8cSPeter Brune Note: 35224989b8cSPeter Brune TSGetFunction() is normally used, but it calls this function internally because the user context is actually 35324989b8cSPeter Brune associated with the DM. 35424989b8cSPeter Brune 35524989b8cSPeter Brune .seealso: DMTSSetContext(), DMTSSetFunction(), TSSetFunction() 35624989b8cSPeter Brune @*/ 35724989b8cSPeter Brune PetscErrorCode DMTSGetRHSFunction(DM dm,TSRHSFunction *func,void **ctx) 35824989b8cSPeter Brune { 35924989b8cSPeter Brune PetscErrorCode ierr; 36024989b8cSPeter Brune TSDM tsdm; 36124989b8cSPeter Brune 36224989b8cSPeter Brune PetscFunctionBegin; 36324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 36424989b8cSPeter Brune ierr = DMTSGetContext(dm,&tsdm);CHKERRQ(ierr); 36524989b8cSPeter Brune if (func) *func = tsdm->rhsfunction; 36624989b8cSPeter Brune if (ctx) *ctx = tsdm->rhsfunctionctx; 36724989b8cSPeter Brune PetscFunctionReturn(0); 36824989b8cSPeter Brune } 36924989b8cSPeter Brune 37024989b8cSPeter Brune #undef __FUNCT__ 37124989b8cSPeter Brune #define __FUNCT__ "DMTSSetIJacobian" 37224989b8cSPeter Brune /*@C 37324989b8cSPeter Brune DMTSSetIJacobian - set TS Jacobian evaluation function 37424989b8cSPeter Brune 37524989b8cSPeter Brune Not Collective 37624989b8cSPeter Brune 37724989b8cSPeter Brune Input Argument: 37824989b8cSPeter Brune + dm - DM to be used with TS 37924989b8cSPeter Brune . func - Jacobian evaluation function, see TSSetIJacobian() for calling sequence 38024989b8cSPeter Brune - ctx - context for residual evaluation 38124989b8cSPeter Brune 38224989b8cSPeter Brune Level: advanced 38324989b8cSPeter Brune 38424989b8cSPeter Brune Note: 38524989b8cSPeter Brune TSSetJacobian() is normally used, but it calls this function internally because the user context is actually 38624989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 38724989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 38824989b8cSPeter Brune 38924989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSGetJacobian(), TSSetJacobian() 39024989b8cSPeter Brune @*/ 39124989b8cSPeter Brune PetscErrorCode DMTSSetIJacobian(DM dm,TSIJacobian func,void *ctx) 39224989b8cSPeter Brune { 39324989b8cSPeter Brune PetscErrorCode ierr; 39424989b8cSPeter Brune TSDM sdm; 39524989b8cSPeter Brune 39624989b8cSPeter Brune PetscFunctionBegin; 39724989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 39824989b8cSPeter Brune ierr = DMTSGetContextWrite(dm,&sdm);CHKERRQ(ierr); 39924989b8cSPeter Brune if (func) sdm->ijacobian = func; 40024989b8cSPeter Brune if (ctx) sdm->ijacobianctx = ctx; 40124989b8cSPeter Brune PetscFunctionReturn(0); 40224989b8cSPeter Brune } 40324989b8cSPeter Brune 40424989b8cSPeter Brune #undef __FUNCT__ 40524989b8cSPeter Brune #define __FUNCT__ "DMTSGetIJacobian" 40624989b8cSPeter Brune /*@C 40724989b8cSPeter Brune DMTSGetIJacobian - get TS Jacobian evaluation function 40824989b8cSPeter Brune 40924989b8cSPeter Brune Not Collective 41024989b8cSPeter Brune 41124989b8cSPeter Brune Input Argument: 41224989b8cSPeter Brune . dm - DM to be used with TS 41324989b8cSPeter Brune 41424989b8cSPeter Brune Output Arguments: 41524989b8cSPeter Brune + func - Jacobian evaluation function, see TSSetIJacobian() for calling sequence 41624989b8cSPeter Brune - ctx - context for residual evaluation 41724989b8cSPeter Brune 41824989b8cSPeter Brune Level: advanced 41924989b8cSPeter Brune 42024989b8cSPeter Brune Note: 42124989b8cSPeter Brune TSGetJacobian() is normally used, but it calls this function internally because the user context is actually 42224989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 42324989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 42424989b8cSPeter Brune 42524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 42624989b8cSPeter Brune @*/ 42724989b8cSPeter Brune PetscErrorCode DMTSGetIJacobian(DM dm,TSIJacobian *func,void **ctx) 42824989b8cSPeter Brune { 42924989b8cSPeter Brune PetscErrorCode ierr; 43024989b8cSPeter Brune TSDM tsdm; 43124989b8cSPeter Brune 43224989b8cSPeter Brune PetscFunctionBegin; 43324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 43424989b8cSPeter Brune ierr = DMTSGetContext(dm,&tsdm);CHKERRQ(ierr); 43524989b8cSPeter Brune if (func) *func = tsdm->ijacobian; 43624989b8cSPeter Brune if (ctx) *ctx = tsdm->ijacobianctx; 43724989b8cSPeter Brune PetscFunctionReturn(0); 43824989b8cSPeter Brune } 43924989b8cSPeter Brune 44024989b8cSPeter Brune 44124989b8cSPeter Brune #undef __FUNCT__ 44224989b8cSPeter Brune #define __FUNCT__ "DMTSSetRHSJacobian" 44324989b8cSPeter Brune /*@C 44424989b8cSPeter Brune DMTSSetRHSJacobian - set TS Jacobian evaluation function 44524989b8cSPeter Brune 44624989b8cSPeter Brune Not Collective 44724989b8cSPeter Brune 44824989b8cSPeter Brune Input Argument: 44924989b8cSPeter Brune + dm - DM to be used with TS 45024989b8cSPeter Brune . func - Jacobian evaluation function, see TSSetRHSJacobian() for calling sequence 45124989b8cSPeter Brune - ctx - context for residual evaluation 45224989b8cSPeter Brune 45324989b8cSPeter Brune Level: advanced 45424989b8cSPeter Brune 45524989b8cSPeter Brune Note: 45624989b8cSPeter Brune TSSetJacobian() is normally used, but it calls this function internally because the user context is actually 45724989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 45824989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 45924989b8cSPeter Brune 46024989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSGetJacobian(), TSSetJacobian() 46124989b8cSPeter Brune @*/ 46224989b8cSPeter Brune PetscErrorCode DMTSSetRHSJacobian(DM dm,TSRHSJacobian func,void *ctx) 46324989b8cSPeter Brune { 46424989b8cSPeter Brune PetscErrorCode ierr; 46524989b8cSPeter Brune TSDM tsdm; 46624989b8cSPeter Brune 46724989b8cSPeter Brune PetscFunctionBegin; 46824989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 46924989b8cSPeter Brune ierr = DMTSGetContextWrite(dm,&tsdm);CHKERRQ(ierr); 47024989b8cSPeter Brune if (func) tsdm->rhsjacobian = func; 47124989b8cSPeter Brune if (ctx) tsdm->rhsjacobianctx = ctx; 47224989b8cSPeter Brune PetscFunctionReturn(0); 47324989b8cSPeter Brune } 47424989b8cSPeter Brune 47524989b8cSPeter Brune #undef __FUNCT__ 47624989b8cSPeter Brune #define __FUNCT__ "DMTSGetRHSJacobian" 47724989b8cSPeter Brune /*@C 47824989b8cSPeter Brune DMTSGetRHSJacobian - get TS Jacobian evaluation function 47924989b8cSPeter Brune 48024989b8cSPeter Brune Not Collective 48124989b8cSPeter Brune 48224989b8cSPeter Brune Input Argument: 48324989b8cSPeter Brune . dm - DM to be used with TS 48424989b8cSPeter Brune 48524989b8cSPeter Brune Output Arguments: 48624989b8cSPeter Brune + func - Jacobian evaluation function, see TSSetRHSJacobian() for calling sequence 48724989b8cSPeter Brune - ctx - context for residual evaluation 48824989b8cSPeter Brune 48924989b8cSPeter Brune Level: advanced 49024989b8cSPeter Brune 49124989b8cSPeter Brune Note: 49224989b8cSPeter Brune TSGetJacobian() is normally used, but it calls this function internally because the user context is actually 49324989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 49424989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 49524989b8cSPeter Brune 49624989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 49724989b8cSPeter Brune @*/ 49824989b8cSPeter Brune PetscErrorCode DMTSGetRHSJacobian(DM dm,TSRHSJacobian *func,void **ctx) 49924989b8cSPeter Brune { 50024989b8cSPeter Brune PetscErrorCode ierr; 50124989b8cSPeter Brune TSDM tsdm; 50224989b8cSPeter Brune 50324989b8cSPeter Brune PetscFunctionBegin; 50424989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 50524989b8cSPeter Brune ierr = DMTSGetContext(dm,&tsdm);CHKERRQ(ierr); 50624989b8cSPeter Brune if (func) *func = tsdm->rhsjacobian; 50724989b8cSPeter Brune if (ctx) *ctx = tsdm->rhsjacobianctx; 50824989b8cSPeter Brune PetscFunctionReturn(0); 50924989b8cSPeter Brune } 510