1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2af0996ceSBarry Smith #include <petsc/private/dmimpl.h> 324989b8cSPeter Brune 4d74926cbSBarry Smith #undef __FUNCT__ 5d74926cbSBarry Smith #define __FUNCT__ "DMTSDestroy" 6d74926cbSBarry Smith static PetscErrorCode DMTSDestroy(DMTS *kdm) 7d74926cbSBarry Smith { 8d74926cbSBarry Smith PetscErrorCode ierr; 9d74926cbSBarry Smith 10d74926cbSBarry Smith PetscFunctionBegin; 11d74926cbSBarry Smith if (!*kdm) PetscFunctionReturn(0); 12d74926cbSBarry Smith PetscValidHeaderSpecific((*kdm),DMTS_CLASSID,1); 13d74926cbSBarry Smith if (--((PetscObject)(*kdm))->refct > 0) {*kdm = 0; PetscFunctionReturn(0);} 14d74926cbSBarry Smith if ((*kdm)->ops->destroy) {ierr = ((*kdm)->ops->destroy)(*kdm);CHKERRQ(ierr);} 15d74926cbSBarry Smith ierr = PetscHeaderDestroy(kdm);CHKERRQ(ierr); 16d74926cbSBarry Smith PetscFunctionReturn(0); 17d74926cbSBarry Smith } 18d74926cbSBarry Smith 19d74926cbSBarry Smith #undef __FUNCT__ 202d53ad75SBarry Smith #define __FUNCT__ "DMTSLoad" 212d53ad75SBarry Smith PetscErrorCode DMTSLoad(DMTS kdm,PetscViewer viewer) 222d53ad75SBarry Smith { 232d53ad75SBarry Smith PetscErrorCode ierr; 242d53ad75SBarry Smith 252d53ad75SBarry Smith PetscFunctionBegin; 26060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ifunction,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 27060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ifunctionview,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 28060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ifunctionload,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 29ad6bc421SBarry Smith if (kdm->ops->ifunctionload) { 30ad6bc421SBarry Smith ierr = (*kdm->ops->ifunctionload)(&kdm->ifunctionctx,viewer);CHKERRQ(ierr); 31ad6bc421SBarry Smith } 32060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ijacobian,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 33060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ijacobianview,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 34060da220SMatthew G. Knepley ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ijacobianload,1,NULL,PETSC_FUNCTION);CHKERRQ(ierr); 35ad6bc421SBarry Smith if (kdm->ops->ijacobianload) { 36ad6bc421SBarry Smith ierr = (*kdm->ops->ijacobianload)(&kdm->ijacobianctx,viewer);CHKERRQ(ierr); 37ad6bc421SBarry Smith } 382d53ad75SBarry Smith PetscFunctionReturn(0); 392d53ad75SBarry Smith } 402d53ad75SBarry Smith 412d53ad75SBarry Smith #undef __FUNCT__ 422d53ad75SBarry Smith #define __FUNCT__ "DMTSView" 432d53ad75SBarry Smith PetscErrorCode DMTSView(DMTS kdm,PetscViewer viewer) 442d53ad75SBarry Smith { 452d53ad75SBarry Smith PetscErrorCode ierr; 462d53ad75SBarry Smith PetscBool isascii,isbinary; 472d53ad75SBarry Smith 482d53ad75SBarry Smith PetscFunctionBegin; 492d53ad75SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 502d53ad75SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 512d53ad75SBarry Smith if (isascii) { 52c7a10e08SBarry Smith #if defined(PETSC_SERIALIZE_FUNCTIONS) 532d53ad75SBarry Smith const char *fname; 542d53ad75SBarry Smith 552d53ad75SBarry Smith ierr = PetscFPTFind(kdm->ops->ifunction,&fname);CHKERRQ(ierr); 562d53ad75SBarry Smith if (fname) { 572d53ad75SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," IFunction used by TS: %s\n",fname);CHKERRQ(ierr); 582d53ad75SBarry Smith } 592d53ad75SBarry Smith ierr = PetscFPTFind(kdm->ops->ijacobian,&fname);CHKERRQ(ierr); 602d53ad75SBarry Smith if (fname) { 612d53ad75SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," IJacobian function used by TS: %s\n",fname);CHKERRQ(ierr); 622d53ad75SBarry Smith } 63c7a10e08SBarry Smith #endif 642d53ad75SBarry Smith } else if (isbinary) { 653964eb88SJed Brown struct { 663964eb88SJed Brown TSIFunction ifunction; 679200755eSBarry Smith } funcstruct; 689200755eSBarry Smith struct { 693964eb88SJed Brown PetscErrorCode (*ifunctionview)(void*,PetscViewer); 709200755eSBarry Smith } funcviewstruct; 719200755eSBarry Smith struct { 723964eb88SJed Brown PetscErrorCode (*ifunctionload)(void**,PetscViewer); 739200755eSBarry Smith } funcloadstruct; 743964eb88SJed Brown struct { 753964eb88SJed Brown TSIJacobian ijacobian; 769200755eSBarry Smith } jacstruct; 779200755eSBarry Smith struct { 783964eb88SJed Brown PetscErrorCode (*ijacobianview)(void*,PetscViewer); 799200755eSBarry Smith } jacviewstruct; 809200755eSBarry Smith struct { 813964eb88SJed Brown PetscErrorCode (*ijacobianload)(void**,PetscViewer); 829200755eSBarry Smith } jacloadstruct; 833964eb88SJed Brown 849200755eSBarry Smith funcstruct.ifunction = kdm->ops->ifunction; 859200755eSBarry Smith funcviewstruct.ifunctionview = kdm->ops->ifunctionview; 869200755eSBarry Smith funcloadstruct.ifunctionload = kdm->ops->ifunctionload; 879200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&funcstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 889200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&funcviewstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 899200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&funcloadstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 90ad6bc421SBarry Smith if (kdm->ops->ifunctionview) { 91ad6bc421SBarry Smith ierr = (*kdm->ops->ifunctionview)(kdm->ifunctionctx,viewer);CHKERRQ(ierr); 92ad6bc421SBarry Smith } 939200755eSBarry Smith jacstruct.ijacobian = kdm->ops->ijacobian; 949200755eSBarry Smith jacviewstruct.ijacobianview = kdm->ops->ijacobianview; 959200755eSBarry Smith jacloadstruct.ijacobianload = kdm->ops->ijacobianload; 969200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&jacstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 979200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&jacviewstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 989200755eSBarry Smith ierr = PetscViewerBinaryWrite(viewer,&jacloadstruct,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr); 99ad6bc421SBarry Smith if (kdm->ops->ijacobianview) { 100ad6bc421SBarry Smith ierr = (*kdm->ops->ijacobianview)(kdm->ijacobianctx,viewer);CHKERRQ(ierr); 101ad6bc421SBarry Smith } 1022d53ad75SBarry Smith } 1032d53ad75SBarry Smith PetscFunctionReturn(0); 1042d53ad75SBarry Smith } 1052d53ad75SBarry Smith 1062d53ad75SBarry Smith #undef __FUNCT__ 107d74926cbSBarry Smith #define __FUNCT__ "DMTSCreate" 108d74926cbSBarry Smith static PetscErrorCode DMTSCreate(MPI_Comm comm,DMTS *kdm) 109d74926cbSBarry Smith { 110d74926cbSBarry Smith PetscErrorCode ierr; 111d74926cbSBarry Smith 112d74926cbSBarry Smith PetscFunctionBegin; 113607a6623SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 11473107ff1SLisandro Dalcin ierr = PetscHeaderCreate(*kdm, DMTS_CLASSID, "DMTS", "DMTS", "DMTS", comm, DMTSDestroy, DMTSView);CHKERRQ(ierr); 115d74926cbSBarry Smith PetscFunctionReturn(0); 116d74926cbSBarry Smith } 11724989b8cSPeter Brune 11824989b8cSPeter Brune #undef __FUNCT__ 119942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMTS" 1202a34c10cSBarry Smith /* Attaches the DMTS to the coarse level. 12124989b8cSPeter Brune * Under what conditions should we copy versus duplicate? 12224989b8cSPeter Brune */ 123942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMTS(DM dm,DM dmc,void *ctx) 12424989b8cSPeter Brune { 12524989b8cSPeter Brune PetscErrorCode ierr; 12624989b8cSPeter Brune 12724989b8cSPeter Brune PetscFunctionBegin; 128942e3340SBarry Smith ierr = DMCopyDMTS(dm,dmc);CHKERRQ(ierr); 12924989b8cSPeter Brune PetscFunctionReturn(0); 13024989b8cSPeter Brune } 13124989b8cSPeter Brune 13224989b8cSPeter Brune #undef __FUNCT__ 133942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMTS" 13424989b8cSPeter Brune /* This could restrict auxiliary information to the coarse level. 13524989b8cSPeter Brune */ 136942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMTS(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx) 13724989b8cSPeter Brune { 13824989b8cSPeter Brune 13924989b8cSPeter Brune PetscFunctionBegin; 14024989b8cSPeter Brune PetscFunctionReturn(0); 14124989b8cSPeter Brune } 14224989b8cSPeter Brune 14324989b8cSPeter Brune #undef __FUNCT__ 144258e1594SPeter Brune #define __FUNCT__ "DMSubDomainHook_DMTS" 145258e1594SPeter Brune static PetscErrorCode DMSubDomainHook_DMTS(DM dm,DM subdm,void *ctx) 146258e1594SPeter Brune { 147258e1594SPeter Brune PetscErrorCode ierr; 148258e1594SPeter Brune 149258e1594SPeter Brune PetscFunctionBegin; 150258e1594SPeter Brune ierr = DMCopyDMTS(dm,subdm);CHKERRQ(ierr); 151258e1594SPeter Brune PetscFunctionReturn(0); 152258e1594SPeter Brune } 153258e1594SPeter Brune 154258e1594SPeter Brune #undef __FUNCT__ 155258e1594SPeter Brune #define __FUNCT__ "DMSubDomainRestrictHook_DMTS" 156258e1594SPeter Brune /* This could restrict auxiliary information to the coarse level. 157258e1594SPeter Brune */ 158258e1594SPeter Brune static PetscErrorCode DMSubDomainRestrictHook_DMTS(DM dm,VecScatter gscat,VecScatter lscat,DM subdm,void *ctx) 159258e1594SPeter Brune { 160258e1594SPeter Brune PetscFunctionBegin; 161258e1594SPeter Brune PetscFunctionReturn(0); 162258e1594SPeter Brune } 163258e1594SPeter Brune 164258e1594SPeter Brune #undef __FUNCT__ 165d74926cbSBarry Smith #define __FUNCT__ "DMTSCopy" 166d74926cbSBarry Smith /*@C 167d74926cbSBarry Smith DMTSCopy - copies the information in a DMTS to another DMTS 168d74926cbSBarry Smith 169d74926cbSBarry Smith Not Collective 170d74926cbSBarry Smith 171d74926cbSBarry Smith Input Argument: 172d74926cbSBarry Smith + kdm - Original DMTS 173d74926cbSBarry Smith - nkdm - DMTS to receive the data, should have been created with DMTSCreate() 174d74926cbSBarry Smith 175d74926cbSBarry Smith Level: developer 176d74926cbSBarry Smith 177d74926cbSBarry Smith .seealso: DMTSCreate(), DMTSDestroy() 178d74926cbSBarry Smith @*/ 179d74926cbSBarry Smith PetscErrorCode DMTSCopy(DMTS kdm,DMTS nkdm) 18024989b8cSPeter Brune { 18124989b8cSPeter Brune PetscErrorCode ierr; 18224989b8cSPeter Brune 18324989b8cSPeter Brune PetscFunctionBegin; 184d74926cbSBarry Smith PetscValidHeaderSpecific(kdm,DMTS_CLASSID,1); 185d74926cbSBarry Smith PetscValidHeaderSpecific(nkdm,DMTS_CLASSID,2); 186d74926cbSBarry Smith nkdm->ops->rhsfunction = kdm->ops->rhsfunction; 187d74926cbSBarry Smith nkdm->ops->rhsjacobian = kdm->ops->rhsjacobian; 188d74926cbSBarry Smith nkdm->ops->ifunction = kdm->ops->ifunction; 189d74926cbSBarry Smith nkdm->ops->ijacobian = kdm->ops->ijacobian; 190d74926cbSBarry Smith nkdm->ops->solution = kdm->ops->solution; 191d74926cbSBarry Smith nkdm->ops->destroy = kdm->ops->destroy; 192d74926cbSBarry Smith nkdm->ops->duplicate = kdm->ops->duplicate; 193d74926cbSBarry Smith 194d74926cbSBarry Smith nkdm->rhsfunctionctx = kdm->rhsfunctionctx; 195d74926cbSBarry Smith nkdm->rhsjacobianctx = kdm->rhsjacobianctx; 196d74926cbSBarry Smith nkdm->ifunctionctx = kdm->ifunctionctx; 197d74926cbSBarry Smith nkdm->ijacobianctx = kdm->ijacobianctx; 198d74926cbSBarry Smith nkdm->solutionctx = kdm->solutionctx; 199d74926cbSBarry Smith 200d74926cbSBarry Smith nkdm->data = kdm->data; 201d74926cbSBarry Smith 202d74926cbSBarry Smith /* 203d74926cbSBarry Smith nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0]; 204d74926cbSBarry Smith nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1]; 205d74926cbSBarry Smith nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2]; 206d74926cbSBarry Smith */ 207d74926cbSBarry Smith 208d74926cbSBarry Smith /* implementation specific copy hooks */ 209d74926cbSBarry Smith if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);} 21024989b8cSPeter Brune PetscFunctionReturn(0); 21124989b8cSPeter Brune } 21224989b8cSPeter Brune 21324989b8cSPeter Brune #undef __FUNCT__ 214942e3340SBarry Smith #define __FUNCT__ "DMGetDMTS" 21524989b8cSPeter Brune /*@C 216942e3340SBarry Smith DMGetDMTS - get read-only private DMTS context from a DM 21724989b8cSPeter Brune 21824989b8cSPeter Brune Not Collective 21924989b8cSPeter Brune 22024989b8cSPeter Brune Input Argument: 22124989b8cSPeter Brune . dm - DM to be used with TS 22224989b8cSPeter Brune 22324989b8cSPeter Brune Output Argument: 224942e3340SBarry Smith . tsdm - private DMTS context 22524989b8cSPeter Brune 22624989b8cSPeter Brune Level: developer 22724989b8cSPeter Brune 22824989b8cSPeter Brune Notes: 229942e3340SBarry Smith Use DMGetDMTSWrite() if write access is needed. The DMTSSetXXX API should be used wherever possible. 23024989b8cSPeter Brune 231942e3340SBarry Smith .seealso: DMGetDMTSWrite() 23224989b8cSPeter Brune @*/ 233942e3340SBarry Smith PetscErrorCode DMGetDMTS(DM dm,DMTS *tsdm) 23424989b8cSPeter Brune { 23524989b8cSPeter Brune PetscErrorCode ierr; 23624989b8cSPeter Brune 23724989b8cSPeter Brune PetscFunctionBegin; 23824989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 2392a34c10cSBarry Smith *tsdm = (DMTS) dm->dmts; 240d74926cbSBarry Smith if (!*tsdm) { 241942e3340SBarry Smith ierr = PetscInfo(dm,"Creating new DMTS\n");CHKERRQ(ierr); 242ce94432eSBarry Smith ierr = DMTSCreate(PetscObjectComm((PetscObject)dm),tsdm);CHKERRQ(ierr); 2432a34c10cSBarry Smith dm->dmts = (PetscObject) *tsdm; 2440298fd71SBarry Smith ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMTS,DMRestrictHook_DMTS,NULL);CHKERRQ(ierr); 2450298fd71SBarry Smith ierr = DMSubDomainHookAdd(dm,DMSubDomainHook_DMTS,DMSubDomainRestrictHook_DMTS,NULL);CHKERRQ(ierr); 24624989b8cSPeter Brune } 24724989b8cSPeter Brune PetscFunctionReturn(0); 24824989b8cSPeter Brune } 24924989b8cSPeter Brune 25024989b8cSPeter Brune #undef __FUNCT__ 251942e3340SBarry Smith #define __FUNCT__ "DMGetDMTSWrite" 25224989b8cSPeter Brune /*@C 253942e3340SBarry Smith DMGetDMTSWrite - get write access to private DMTS context from a DM 25424989b8cSPeter Brune 25524989b8cSPeter Brune Not Collective 25624989b8cSPeter Brune 25724989b8cSPeter Brune Input Argument: 25824989b8cSPeter Brune . dm - DM to be used with TS 25924989b8cSPeter Brune 26024989b8cSPeter Brune Output Argument: 261942e3340SBarry Smith . tsdm - private DMTS context 26224989b8cSPeter Brune 26324989b8cSPeter Brune Level: developer 26424989b8cSPeter Brune 265942e3340SBarry Smith .seealso: DMGetDMTS() 26624989b8cSPeter Brune @*/ 267942e3340SBarry Smith PetscErrorCode DMGetDMTSWrite(DM dm,DMTS *tsdm) 26824989b8cSPeter Brune { 26924989b8cSPeter Brune PetscErrorCode ierr; 270942e3340SBarry Smith DMTS sdm; 27124989b8cSPeter Brune 27224989b8cSPeter Brune PetscFunctionBegin; 27324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 274942e3340SBarry Smith ierr = DMGetDMTS(dm,&sdm);CHKERRQ(ierr); 27524989b8cSPeter Brune if (!sdm->originaldm) sdm->originaldm = dm; 27624989b8cSPeter Brune if (sdm->originaldm != dm) { /* Copy on write */ 2772a34c10cSBarry Smith DMTS oldsdm = sdm; 278942e3340SBarry Smith ierr = PetscInfo(dm,"Copying DMTS due to write\n");CHKERRQ(ierr); 279ce94432eSBarry Smith ierr = DMTSCreate(PetscObjectComm((PetscObject)dm),&sdm);CHKERRQ(ierr); 280d74926cbSBarry Smith ierr = DMTSCopy(oldsdm,sdm);CHKERRQ(ierr); 2812a34c10cSBarry Smith ierr = DMTSDestroy((DMTS*)&dm->dmts);CHKERRQ(ierr); 2822a34c10cSBarry Smith dm->dmts = (PetscObject) sdm; 28324989b8cSPeter Brune } 28424989b8cSPeter Brune *tsdm = sdm; 28524989b8cSPeter Brune PetscFunctionReturn(0); 28624989b8cSPeter Brune } 28724989b8cSPeter Brune 28824989b8cSPeter Brune #undef __FUNCT__ 289942e3340SBarry Smith #define __FUNCT__ "DMCopyDMTS" 29024989b8cSPeter Brune /*@C 291942e3340SBarry Smith DMCopyDMTS - copies a DM context to a new DM 29224989b8cSPeter Brune 29324989b8cSPeter Brune Logically Collective 29424989b8cSPeter Brune 29524989b8cSPeter Brune Input Arguments: 29624989b8cSPeter Brune + dmsrc - DM to obtain context from 29724989b8cSPeter Brune - dmdest - DM to add context to 29824989b8cSPeter Brune 29924989b8cSPeter Brune Level: developer 30024989b8cSPeter Brune 30124989b8cSPeter Brune Note: 30224989b8cSPeter Brune The context is copied by reference. This function does not ensure that a context exists. 30324989b8cSPeter Brune 304942e3340SBarry Smith .seealso: DMGetDMTS(), TSSetDM() 30524989b8cSPeter Brune @*/ 306942e3340SBarry Smith PetscErrorCode DMCopyDMTS(DM dmsrc,DM dmdest) 30724989b8cSPeter Brune { 30824989b8cSPeter Brune PetscErrorCode ierr; 30924989b8cSPeter Brune 31024989b8cSPeter Brune PetscFunctionBegin; 31124989b8cSPeter Brune PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1); 31224989b8cSPeter Brune PetscValidHeaderSpecific(dmdest,DM_CLASSID,2); 3132a34c10cSBarry Smith ierr = DMTSDestroy((DMTS*)&dmdest->dmts);CHKERRQ(ierr); 3142a34c10cSBarry Smith dmdest->dmts = dmsrc->dmts; 3152a34c10cSBarry Smith ierr = PetscObjectReference(dmdest->dmts);CHKERRQ(ierr); 3160298fd71SBarry Smith ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMTS,DMRestrictHook_DMTS,NULL);CHKERRQ(ierr); 3170298fd71SBarry Smith ierr = DMSubDomainHookAdd(dmdest,DMSubDomainHook_DMTS,DMSubDomainRestrictHook_DMTS,NULL);CHKERRQ(ierr); 31824989b8cSPeter Brune PetscFunctionReturn(0); 31924989b8cSPeter Brune } 32024989b8cSPeter Brune 32124989b8cSPeter Brune #undef __FUNCT__ 32224989b8cSPeter Brune #define __FUNCT__ "DMTSSetIFunction" 32324989b8cSPeter Brune /*@C 32424989b8cSPeter Brune DMTSSetIFunction - set TS implicit function evaluation function 32524989b8cSPeter Brune 32624989b8cSPeter Brune Not Collective 32724989b8cSPeter Brune 32824989b8cSPeter Brune Input Arguments: 32924989b8cSPeter Brune + dm - DM to be used with TS 33024989b8cSPeter Brune . func - function evaluation function, see TSSetIFunction() for calling sequence 33124989b8cSPeter Brune - ctx - context for residual evaluation 33224989b8cSPeter Brune 33324989b8cSPeter Brune Level: advanced 33424989b8cSPeter Brune 33524989b8cSPeter Brune Note: 33624989b8cSPeter Brune TSSetFunction() is normally used, but it calls this function internally because the user context is actually 33724989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 33824989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 33924989b8cSPeter Brune 34024989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 34124989b8cSPeter Brune @*/ 34224989b8cSPeter Brune PetscErrorCode DMTSSetIFunction(DM dm,TSIFunction func,void *ctx) 34324989b8cSPeter Brune { 34424989b8cSPeter Brune PetscErrorCode ierr; 345942e3340SBarry Smith DMTS tsdm; 34624989b8cSPeter Brune 34724989b8cSPeter Brune PetscFunctionBegin; 34824989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 349942e3340SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 350d74926cbSBarry Smith if (func) tsdm->ops->ifunction = func; 35124989b8cSPeter Brune if (ctx) tsdm->ifunctionctx = ctx; 35224989b8cSPeter Brune PetscFunctionReturn(0); 35324989b8cSPeter Brune } 35424989b8cSPeter Brune 35524989b8cSPeter Brune #undef __FUNCT__ 35624989b8cSPeter Brune #define __FUNCT__ "DMTSGetIFunction" 35724989b8cSPeter Brune /*@C 35824989b8cSPeter Brune DMTSGetIFunction - get TS implicit residual evaluation function 35924989b8cSPeter Brune 36024989b8cSPeter Brune Not Collective 36124989b8cSPeter Brune 36224989b8cSPeter Brune Input Argument: 36324989b8cSPeter Brune . dm - DM to be used with TS 36424989b8cSPeter Brune 36524989b8cSPeter Brune Output Arguments: 36624989b8cSPeter Brune + func - function evaluation function, see TSSetIFunction() for calling sequence 36724989b8cSPeter Brune - ctx - context for residual evaluation 36824989b8cSPeter Brune 36924989b8cSPeter Brune Level: advanced 37024989b8cSPeter Brune 37124989b8cSPeter Brune Note: 37224989b8cSPeter Brune TSGetFunction() is normally used, but it calls this function internally because the user context is actually 37324989b8cSPeter Brune associated with the DM. 37424989b8cSPeter Brune 37524989b8cSPeter Brune .seealso: DMTSSetContext(), DMTSSetFunction(), TSSetFunction() 37624989b8cSPeter Brune @*/ 37724989b8cSPeter Brune PetscErrorCode DMTSGetIFunction(DM dm,TSIFunction *func,void **ctx) 37824989b8cSPeter Brune { 37924989b8cSPeter Brune PetscErrorCode ierr; 380942e3340SBarry Smith DMTS tsdm; 38124989b8cSPeter Brune 38224989b8cSPeter Brune PetscFunctionBegin; 38324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 384942e3340SBarry Smith ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr); 385d74926cbSBarry Smith if (func) *func = tsdm->ops->ifunction; 38624989b8cSPeter Brune if (ctx) *ctx = tsdm->ifunctionctx; 38724989b8cSPeter Brune PetscFunctionReturn(0); 38824989b8cSPeter Brune } 38924989b8cSPeter Brune 39024989b8cSPeter Brune 39124989b8cSPeter Brune #undef __FUNCT__ 39224989b8cSPeter Brune #define __FUNCT__ "DMTSSetRHSFunction" 39324989b8cSPeter Brune /*@C 39424989b8cSPeter Brune DMTSSetRHSFunction - set TS explicit residual evaluation function 39524989b8cSPeter Brune 39624989b8cSPeter Brune Not Collective 39724989b8cSPeter Brune 39824989b8cSPeter Brune Input Arguments: 39924989b8cSPeter Brune + dm - DM to be used with TS 40024989b8cSPeter Brune . func - RHS function evaluation function, see TSSetRHSFunction() for calling sequence 40124989b8cSPeter Brune - ctx - context for residual evaluation 40224989b8cSPeter Brune 40324989b8cSPeter Brune Level: advanced 40424989b8cSPeter Brune 40524989b8cSPeter Brune Note: 406ef20d060SBarry Smith TSSetRSHFunction() is normally used, but it calls this function internally because the user context is actually 40724989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 40824989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 40924989b8cSPeter Brune 41024989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 41124989b8cSPeter Brune @*/ 41224989b8cSPeter Brune PetscErrorCode DMTSSetRHSFunction(DM dm,TSRHSFunction func,void *ctx) 41324989b8cSPeter Brune { 41424989b8cSPeter Brune PetscErrorCode ierr; 415942e3340SBarry Smith DMTS tsdm; 41624989b8cSPeter Brune 41724989b8cSPeter Brune PetscFunctionBegin; 41824989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 419942e3340SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 420d74926cbSBarry Smith if (func) tsdm->ops->rhsfunction = func; 42124989b8cSPeter Brune if (ctx) tsdm->rhsfunctionctx = ctx; 42224989b8cSPeter Brune PetscFunctionReturn(0); 42324989b8cSPeter Brune } 42424989b8cSPeter Brune 42524989b8cSPeter Brune #undef __FUNCT__ 426ef20d060SBarry Smith #define __FUNCT__ "DMTSGetSolutionFunction" 427ef20d060SBarry Smith /*@C 428ef20d060SBarry Smith DMTSGetSolutionFunction - gets the TS solution evaluation function 429ef20d060SBarry Smith 430ef20d060SBarry Smith Not Collective 431ef20d060SBarry Smith 432ef20d060SBarry Smith Input Arguments: 433ef20d060SBarry Smith . dm - DM to be used with TS 434ef20d060SBarry Smith 435ef20d060SBarry Smith Output Parameters: 436ef20d060SBarry Smith + func - solution function evaluation function, see TSSetSolution() for calling sequence 437ef20d060SBarry Smith - ctx - context for solution evaluation 438ef20d060SBarry Smith 439ef20d060SBarry Smith Level: advanced 440ef20d060SBarry Smith 441ef20d060SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 442ef20d060SBarry Smith @*/ 443ef20d060SBarry Smith PetscErrorCode DMTSGetSolutionFunction(DM dm,TSSolutionFunction *func,void **ctx) 444ef20d060SBarry Smith { 445ef20d060SBarry Smith PetscErrorCode ierr; 446942e3340SBarry Smith DMTS tsdm; 447ef20d060SBarry Smith 448ef20d060SBarry Smith PetscFunctionBegin; 449ef20d060SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 450942e3340SBarry Smith ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr); 451d74926cbSBarry Smith if (func) *func = tsdm->ops->solution; 452ef20d060SBarry Smith if (ctx) *ctx = tsdm->solutionctx; 453ef20d060SBarry Smith PetscFunctionReturn(0); 454ef20d060SBarry Smith } 455ef20d060SBarry Smith 456ef20d060SBarry Smith #undef __FUNCT__ 457ef20d060SBarry Smith #define __FUNCT__ "DMTSSetSolutionFunction" 458ef20d060SBarry Smith /*@C 459ef20d060SBarry Smith DMTSSetSolutionFunction - set TS solution evaluation function 460ef20d060SBarry Smith 461ef20d060SBarry Smith Not Collective 462ef20d060SBarry Smith 463ef20d060SBarry Smith Input Arguments: 464ef20d060SBarry Smith + dm - DM to be used with TS 465ef20d060SBarry Smith . func - solution function evaluation function, see TSSetSolution() for calling sequence 466ef20d060SBarry Smith - ctx - context for solution evaluation 467ef20d060SBarry Smith 468ef20d060SBarry Smith Level: advanced 469ef20d060SBarry Smith 470ef20d060SBarry Smith Note: 471ef20d060SBarry Smith TSSetSolutionFunction() is normally used, but it calls this function internally because the user context is actually 472ef20d060SBarry Smith associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 473ef20d060SBarry Smith not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 474ef20d060SBarry Smith 475ef20d060SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 476ef20d060SBarry Smith @*/ 477ef20d060SBarry Smith PetscErrorCode DMTSSetSolutionFunction(DM dm,TSSolutionFunction func,void *ctx) 478ef20d060SBarry Smith { 479ef20d060SBarry Smith PetscErrorCode ierr; 480942e3340SBarry Smith DMTS tsdm; 481ef20d060SBarry Smith 482ef20d060SBarry Smith PetscFunctionBegin; 483ef20d060SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 484942e3340SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 485d74926cbSBarry Smith if (func) tsdm->ops->solution = func; 486ef20d060SBarry Smith if (ctx) tsdm->solutionctx = ctx; 487ef20d060SBarry Smith PetscFunctionReturn(0); 488ef20d060SBarry Smith } 489ef20d060SBarry Smith 490ef20d060SBarry Smith #undef __FUNCT__ 4919b7cd975SBarry Smith #define __FUNCT__ "DMTSSetForcingFunction" 4929b7cd975SBarry Smith /*@C 4939b7cd975SBarry Smith DMTSSetForcingFunction - set TS forcing function evaluation function 4949b7cd975SBarry Smith 4959b7cd975SBarry Smith Not Collective 4969b7cd975SBarry Smith 4979b7cd975SBarry Smith Input Arguments: 4989b7cd975SBarry Smith + dm - DM to be used with TS 499f8b49ee9SBarry Smith . f - forcing function evaluation function; see TSForcingFunction 5009b7cd975SBarry Smith - ctx - context for solution evaluation 5019b7cd975SBarry Smith 5029b7cd975SBarry Smith Level: advanced 5039b7cd975SBarry Smith 5049b7cd975SBarry Smith Note: 5059b7cd975SBarry Smith TSSetForcingFunction() is normally used, but it calls this function internally because the user context is actually 5069b7cd975SBarry Smith associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5079b7cd975SBarry Smith not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 5089b7cd975SBarry Smith 5099b7cd975SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian(), TSSetForcingFunction(), DMTSGetForcingFunction() 5109b7cd975SBarry Smith @*/ 511*d56366bfSLisandro Dalcin PetscErrorCode DMTSSetForcingFunction(DM dm,TSForcingFunction f,void *ctx) 5129b7cd975SBarry Smith { 5139b7cd975SBarry Smith PetscErrorCode ierr; 5149b7cd975SBarry Smith DMTS tsdm; 5159b7cd975SBarry Smith 5169b7cd975SBarry Smith PetscFunctionBegin; 5179b7cd975SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5189b7cd975SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 519f8b49ee9SBarry Smith if (f) tsdm->ops->forcing = f; 5209b7cd975SBarry Smith if (ctx) tsdm->forcingctx = ctx; 5219b7cd975SBarry Smith PetscFunctionReturn(0); 5229b7cd975SBarry Smith } 5239b7cd975SBarry Smith 5249b7cd975SBarry Smith 5259b7cd975SBarry Smith #undef __FUNCT__ 5269b7cd975SBarry Smith #define __FUNCT__ "DMTSGetForcingFunction" 5279b7cd975SBarry Smith /*@C 5289b7cd975SBarry Smith DMTSGetForcingFunction - get TS forcing function evaluation function 5299b7cd975SBarry Smith 5309b7cd975SBarry Smith Not Collective 5319b7cd975SBarry Smith 5329b7cd975SBarry Smith Input Argument: 5339b7cd975SBarry Smith . dm - DM to be used with TS 5349b7cd975SBarry Smith 5359b7cd975SBarry Smith Output Arguments: 536f8b49ee9SBarry Smith + f - forcing function evaluation function; see TSForcingFunction for details 5379b7cd975SBarry Smith - ctx - context for solution evaluation 5389b7cd975SBarry Smith 5399b7cd975SBarry Smith Level: advanced 5409b7cd975SBarry Smith 5419b7cd975SBarry Smith Note: 5429b7cd975SBarry Smith TSSetForcingFunction() is normally used, but it calls this function internally because the user context is actually 5439b7cd975SBarry Smith associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 5449b7cd975SBarry Smith not. If DM took a more central role at some later date, this could become the primary method of setting the residual. 5459b7cd975SBarry Smith 5469b7cd975SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian(), TSSetForcingFunction(), DMTSGetForcingFunction() 5479b7cd975SBarry Smith @*/ 548*d56366bfSLisandro Dalcin PetscErrorCode DMTSGetForcingFunction(DM dm,TSForcingFunction *f,void **ctx) 5499b7cd975SBarry Smith { 5509b7cd975SBarry Smith PetscErrorCode ierr; 5519b7cd975SBarry Smith DMTS tsdm; 5529b7cd975SBarry Smith 5539b7cd975SBarry Smith PetscFunctionBegin; 5549b7cd975SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 5559b7cd975SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 556f8b49ee9SBarry Smith if (f) *f = tsdm->ops->forcing; 5579b7cd975SBarry Smith if (ctx) *ctx = tsdm->forcingctx; 5589b7cd975SBarry Smith PetscFunctionReturn(0); 5599b7cd975SBarry Smith } 5609b7cd975SBarry Smith 5619b7cd975SBarry Smith #undef __FUNCT__ 56224989b8cSPeter Brune #define __FUNCT__ "DMTSGetRHSFunction" 56324989b8cSPeter Brune /*@C 56424989b8cSPeter Brune DMTSGetRHSFunction - get TS explicit residual evaluation function 56524989b8cSPeter Brune 56624989b8cSPeter Brune Not Collective 56724989b8cSPeter Brune 56824989b8cSPeter Brune Input Argument: 56924989b8cSPeter Brune . dm - DM to be used with TS 57024989b8cSPeter Brune 57124989b8cSPeter Brune Output Arguments: 57224989b8cSPeter Brune + func - residual evaluation function, see TSSetRHSFunction() for calling sequence 57324989b8cSPeter Brune - ctx - context for residual evaluation 57424989b8cSPeter Brune 57524989b8cSPeter Brune Level: advanced 57624989b8cSPeter Brune 57724989b8cSPeter Brune Note: 57824989b8cSPeter Brune TSGetFunction() is normally used, but it calls this function internally because the user context is actually 57924989b8cSPeter Brune associated with the DM. 58024989b8cSPeter Brune 58124989b8cSPeter Brune .seealso: DMTSSetContext(), DMTSSetFunction(), TSSetFunction() 58224989b8cSPeter Brune @*/ 58324989b8cSPeter Brune PetscErrorCode DMTSGetRHSFunction(DM dm,TSRHSFunction *func,void **ctx) 58424989b8cSPeter Brune { 58524989b8cSPeter Brune PetscErrorCode ierr; 586942e3340SBarry Smith DMTS tsdm; 58724989b8cSPeter Brune 58824989b8cSPeter Brune PetscFunctionBegin; 58924989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 590942e3340SBarry Smith ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr); 591d74926cbSBarry Smith if (func) *func = tsdm->ops->rhsfunction; 59224989b8cSPeter Brune if (ctx) *ctx = tsdm->rhsfunctionctx; 59324989b8cSPeter Brune PetscFunctionReturn(0); 59424989b8cSPeter Brune } 59524989b8cSPeter Brune 59624989b8cSPeter Brune #undef __FUNCT__ 59724989b8cSPeter Brune #define __FUNCT__ "DMTSSetIJacobian" 59824989b8cSPeter Brune /*@C 59924989b8cSPeter Brune DMTSSetIJacobian - set TS Jacobian evaluation function 60024989b8cSPeter Brune 60124989b8cSPeter Brune Not Collective 60224989b8cSPeter Brune 60324989b8cSPeter Brune Input Argument: 60424989b8cSPeter Brune + dm - DM to be used with TS 60524989b8cSPeter Brune . func - Jacobian evaluation function, see TSSetIJacobian() for calling sequence 60624989b8cSPeter Brune - ctx - context for residual evaluation 60724989b8cSPeter Brune 60824989b8cSPeter Brune Level: advanced 60924989b8cSPeter Brune 61024989b8cSPeter Brune Note: 61124989b8cSPeter Brune TSSetJacobian() is normally used, but it calls this function internally because the user context is actually 61224989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 61324989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 61424989b8cSPeter Brune 61524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSGetJacobian(), TSSetJacobian() 61624989b8cSPeter Brune @*/ 61724989b8cSPeter Brune PetscErrorCode DMTSSetIJacobian(DM dm,TSIJacobian func,void *ctx) 61824989b8cSPeter Brune { 61924989b8cSPeter Brune PetscErrorCode ierr; 620942e3340SBarry Smith DMTS sdm; 62124989b8cSPeter Brune 62224989b8cSPeter Brune PetscFunctionBegin; 62324989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 624942e3340SBarry Smith ierr = DMGetDMTSWrite(dm,&sdm);CHKERRQ(ierr); 625d74926cbSBarry Smith if (func) sdm->ops->ijacobian = func; 62624989b8cSPeter Brune if (ctx) sdm->ijacobianctx = ctx; 62724989b8cSPeter Brune PetscFunctionReturn(0); 62824989b8cSPeter Brune } 62924989b8cSPeter Brune 63024989b8cSPeter Brune #undef __FUNCT__ 63124989b8cSPeter Brune #define __FUNCT__ "DMTSGetIJacobian" 63224989b8cSPeter Brune /*@C 63324989b8cSPeter Brune DMTSGetIJacobian - get TS Jacobian evaluation function 63424989b8cSPeter Brune 63524989b8cSPeter Brune Not Collective 63624989b8cSPeter Brune 63724989b8cSPeter Brune Input Argument: 63824989b8cSPeter Brune . dm - DM to be used with TS 63924989b8cSPeter Brune 64024989b8cSPeter Brune Output Arguments: 64124989b8cSPeter Brune + func - Jacobian evaluation function, see TSSetIJacobian() for calling sequence 64224989b8cSPeter Brune - ctx - context for residual evaluation 64324989b8cSPeter Brune 64424989b8cSPeter Brune Level: advanced 64524989b8cSPeter Brune 64624989b8cSPeter Brune Note: 64724989b8cSPeter Brune TSGetJacobian() is normally used, but it calls this function internally because the user context is actually 64824989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 64924989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 65024989b8cSPeter Brune 65124989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 65224989b8cSPeter Brune @*/ 65324989b8cSPeter Brune PetscErrorCode DMTSGetIJacobian(DM dm,TSIJacobian *func,void **ctx) 65424989b8cSPeter Brune { 65524989b8cSPeter Brune PetscErrorCode ierr; 656942e3340SBarry Smith DMTS tsdm; 65724989b8cSPeter Brune 65824989b8cSPeter Brune PetscFunctionBegin; 65924989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 660942e3340SBarry Smith ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr); 661d74926cbSBarry Smith if (func) *func = tsdm->ops->ijacobian; 66224989b8cSPeter Brune if (ctx) *ctx = tsdm->ijacobianctx; 66324989b8cSPeter Brune PetscFunctionReturn(0); 66424989b8cSPeter Brune } 66524989b8cSPeter Brune 66624989b8cSPeter Brune 66724989b8cSPeter Brune #undef __FUNCT__ 66824989b8cSPeter Brune #define __FUNCT__ "DMTSSetRHSJacobian" 66924989b8cSPeter Brune /*@C 67024989b8cSPeter Brune DMTSSetRHSJacobian - set TS Jacobian evaluation function 67124989b8cSPeter Brune 67224989b8cSPeter Brune Not Collective 67324989b8cSPeter Brune 67424989b8cSPeter Brune Input Argument: 67524989b8cSPeter Brune + dm - DM to be used with TS 67624989b8cSPeter Brune . func - Jacobian evaluation function, see TSSetRHSJacobian() for calling sequence 67724989b8cSPeter Brune - ctx - context for residual evaluation 67824989b8cSPeter Brune 67924989b8cSPeter Brune Level: advanced 68024989b8cSPeter Brune 68124989b8cSPeter Brune Note: 68224989b8cSPeter Brune TSSetJacobian() is normally used, but it calls this function internally because the user context is actually 68324989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 68424989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 68524989b8cSPeter Brune 68624989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSGetJacobian(), TSSetJacobian() 68724989b8cSPeter Brune @*/ 68824989b8cSPeter Brune PetscErrorCode DMTSSetRHSJacobian(DM dm,TSRHSJacobian func,void *ctx) 68924989b8cSPeter Brune { 69024989b8cSPeter Brune PetscErrorCode ierr; 691942e3340SBarry Smith DMTS tsdm; 69224989b8cSPeter Brune 69324989b8cSPeter Brune PetscFunctionBegin; 69424989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 695942e3340SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 696d74926cbSBarry Smith if (func) tsdm->ops->rhsjacobian = func; 69724989b8cSPeter Brune if (ctx) tsdm->rhsjacobianctx = ctx; 69824989b8cSPeter Brune PetscFunctionReturn(0); 69924989b8cSPeter Brune } 70024989b8cSPeter Brune 70124989b8cSPeter Brune #undef __FUNCT__ 70224989b8cSPeter Brune #define __FUNCT__ "DMTSGetRHSJacobian" 70324989b8cSPeter Brune /*@C 70424989b8cSPeter Brune DMTSGetRHSJacobian - get TS Jacobian evaluation function 70524989b8cSPeter Brune 70624989b8cSPeter Brune Not Collective 70724989b8cSPeter Brune 70824989b8cSPeter Brune Input Argument: 70924989b8cSPeter Brune . dm - DM to be used with TS 71024989b8cSPeter Brune 71124989b8cSPeter Brune Output Arguments: 71224989b8cSPeter Brune + func - Jacobian evaluation function, see TSSetRHSJacobian() for calling sequence 71324989b8cSPeter Brune - ctx - context for residual evaluation 71424989b8cSPeter Brune 71524989b8cSPeter Brune Level: advanced 71624989b8cSPeter Brune 71724989b8cSPeter Brune Note: 71824989b8cSPeter Brune TSGetJacobian() is normally used, but it calls this function internally because the user context is actually 71924989b8cSPeter Brune associated with the DM. This makes the interface consistent regardless of whether the user interacts with a DM or 72024989b8cSPeter Brune not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian. 72124989b8cSPeter Brune 72224989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 72324989b8cSPeter Brune @*/ 72424989b8cSPeter Brune PetscErrorCode DMTSGetRHSJacobian(DM dm,TSRHSJacobian *func,void **ctx) 72524989b8cSPeter Brune { 72624989b8cSPeter Brune PetscErrorCode ierr; 727942e3340SBarry Smith DMTS tsdm; 72824989b8cSPeter Brune 72924989b8cSPeter Brune PetscFunctionBegin; 73024989b8cSPeter Brune PetscValidHeaderSpecific(dm,DM_CLASSID,1); 731942e3340SBarry Smith ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr); 732d74926cbSBarry Smith if (func) *func = tsdm->ops->rhsjacobian; 73324989b8cSPeter Brune if (ctx) *ctx = tsdm->rhsjacobianctx; 73424989b8cSPeter Brune PetscFunctionReturn(0); 73524989b8cSPeter Brune } 736ad6bc421SBarry Smith 737ad6bc421SBarry Smith #undef __FUNCT__ 738ad6bc421SBarry Smith #define __FUNCT__ "DMTSSetIFunctionSerialize" 739ad6bc421SBarry Smith /*@C 740ad6bc421SBarry Smith DMTSSetIFunctionSerialize - sets functions used to view and load a IFunction context 741ad6bc421SBarry Smith 742ad6bc421SBarry Smith Not Collective 743ad6bc421SBarry Smith 744ad6bc421SBarry Smith Input Arguments: 745ad6bc421SBarry Smith + dm - DM to be used with TS 746ad6bc421SBarry Smith . view - viewer function 747ad6bc421SBarry Smith - load - loading function 748ad6bc421SBarry Smith 749ad6bc421SBarry Smith Level: advanced 750ad6bc421SBarry Smith 751ad6bc421SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 752ad6bc421SBarry Smith @*/ 753ad6bc421SBarry Smith PetscErrorCode DMTSSetIFunctionSerialize(DM dm,PetscErrorCode (*view)(void*,PetscViewer),PetscErrorCode (*load)(void**,PetscViewer)) 754ad6bc421SBarry Smith { 755ad6bc421SBarry Smith PetscErrorCode ierr; 756ad6bc421SBarry Smith DMTS tsdm; 757ad6bc421SBarry Smith 758ad6bc421SBarry Smith PetscFunctionBegin; 759ad6bc421SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 760ad6bc421SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 761ad6bc421SBarry Smith tsdm->ops->ifunctionview = view; 762ad6bc421SBarry Smith tsdm->ops->ifunctionload = load; 763ad6bc421SBarry Smith PetscFunctionReturn(0); 764ad6bc421SBarry Smith } 765ad6bc421SBarry Smith 766ad6bc421SBarry Smith #undef __FUNCT__ 767ad6bc421SBarry Smith #define __FUNCT__ "DMTSSetIJacobianSerialize" 768ad6bc421SBarry Smith /*@C 769ad6bc421SBarry Smith DMTSSetIJacobianSerialize - sets functions used to view and load a IJacobian context 770ad6bc421SBarry Smith 771ad6bc421SBarry Smith Not Collective 772ad6bc421SBarry Smith 773ad6bc421SBarry Smith Input Arguments: 774ad6bc421SBarry Smith + dm - DM to be used with TS 775ad6bc421SBarry Smith . view - viewer function 776ad6bc421SBarry Smith - load - loading function 777ad6bc421SBarry Smith 778ad6bc421SBarry Smith Level: advanced 779ad6bc421SBarry Smith 780ad6bc421SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian() 781ad6bc421SBarry Smith @*/ 782ad6bc421SBarry Smith PetscErrorCode DMTSSetIJacobianSerialize(DM dm,PetscErrorCode (*view)(void*,PetscViewer),PetscErrorCode (*load)(void**,PetscViewer)) 783ad6bc421SBarry Smith { 784ad6bc421SBarry Smith PetscErrorCode ierr; 785ad6bc421SBarry Smith DMTS tsdm; 786ad6bc421SBarry Smith 787ad6bc421SBarry Smith PetscFunctionBegin; 788ad6bc421SBarry Smith PetscValidHeaderSpecific(dm,DM_CLASSID,1); 789ad6bc421SBarry Smith ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr); 790ad6bc421SBarry Smith tsdm->ops->ijacobianview = view; 791ad6bc421SBarry Smith tsdm->ops->ijacobianload = load; 792ad6bc421SBarry Smith PetscFunctionReturn(0); 793ad6bc421SBarry Smith } 794