xref: /petsc/src/ts/utils/dmts.c (revision d56366bf689ad38ed4c91ced3a09178b102ca1a1)
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