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