xref: /petsc/src/ts/utils/dmts.c (revision c7a10e08591f5a3773572f14db2d1653e42f2f38)
124989b8cSPeter Brune #include <petsc-private/tsimpl.h>     /*I "petscts.h" I*/
224989b8cSPeter Brune #include <petsc-private/dmimpl.h>     /*I "petscdm.h" I*/
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;
262d53ad75SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ifunction,1,PETSC_FUNCTION);CHKERRQ(ierr);
27ad6bc421SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ifunctionview,1,PETSC_FUNCTION);CHKERRQ(ierr);
28ad6bc421SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ifunctionload,1,PETSC_FUNCTION);CHKERRQ(ierr);
29ad6bc421SBarry Smith   if (kdm->ops->ifunctionload) {
30ad6bc421SBarry Smith     ierr = (*kdm->ops->ifunctionload)(&kdm->ifunctionctx,viewer);CHKERRQ(ierr);
31ad6bc421SBarry Smith   }
322d53ad75SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ijacobian,1,PETSC_FUNCTION);CHKERRQ(ierr);
33ad6bc421SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ijacobianview,1,PETSC_FUNCTION);CHKERRQ(ierr);
34ad6bc421SBarry Smith   ierr = PetscViewerBinaryRead(viewer,&kdm->ops->ijacobianload,1,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) {
52*c7a10e08SBarry 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     }
63*c7a10e08SBarry Smith #endif
642d53ad75SBarry Smith   } else if (isbinary) {
652d53ad75SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,kdm->ops->ifunction,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
66ad6bc421SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,kdm->ops->ifunctionview,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
67ad6bc421SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,kdm->ops->ifunctionload,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
68ad6bc421SBarry Smith     if (kdm->ops->ifunctionview) {
69ad6bc421SBarry Smith       ierr = (*kdm->ops->ifunctionview)(kdm->ifunctionctx,viewer);CHKERRQ(ierr);
70ad6bc421SBarry Smith     }
712d53ad75SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,kdm->ops->ijacobian,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
72ad6bc421SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,kdm->ops->ijacobianview,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
73ad6bc421SBarry Smith     ierr = PetscViewerBinaryWrite(viewer,kdm->ops->ijacobianload,1,PETSC_FUNCTION,PETSC_FALSE);CHKERRQ(ierr);
74ad6bc421SBarry Smith     if (kdm->ops->ijacobianview) {
75ad6bc421SBarry Smith       ierr = (*kdm->ops->ijacobianview)(kdm->ijacobianctx,viewer);CHKERRQ(ierr);
76ad6bc421SBarry Smith     }
772d53ad75SBarry Smith   }
782d53ad75SBarry Smith   PetscFunctionReturn(0);
792d53ad75SBarry Smith }
802d53ad75SBarry Smith 
812d53ad75SBarry Smith #undef __FUNCT__
82d74926cbSBarry Smith #define __FUNCT__ "DMTSCreate"
83d74926cbSBarry Smith static PetscErrorCode DMTSCreate(MPI_Comm comm,DMTS *kdm)
84d74926cbSBarry Smith {
85d74926cbSBarry Smith   PetscErrorCode ierr;
86d74926cbSBarry Smith 
87d74926cbSBarry Smith   PetscFunctionBegin;
88d74926cbSBarry Smith #ifndef PETSC_USE_DYNAMIC_LIBRARIES
89d74926cbSBarry Smith   ierr = TSInitializePackage(PETSC_NULL);CHKERRQ(ierr);
90d74926cbSBarry Smith #endif
912d53ad75SBarry Smith   ierr = PetscHeaderCreate(*kdm, _p_DMTS, struct _DMTSOps, DMTS_CLASSID, -1, "DMTS", "DMTS", "DMTS", comm, DMTSDestroy, DMTSView);CHKERRQ(ierr);
92d74926cbSBarry Smith   ierr = PetscMemzero((*kdm)->ops, sizeof(struct _DMTSOps));CHKERRQ(ierr);
93d74926cbSBarry Smith   PetscFunctionReturn(0);
94d74926cbSBarry Smith }
9524989b8cSPeter Brune 
9624989b8cSPeter Brune #undef __FUNCT__
97942e3340SBarry Smith #define __FUNCT__ "DMCoarsenHook_DMTS"
982a34c10cSBarry Smith /* Attaches the DMTS to the coarse level.
9924989b8cSPeter Brune  * Under what conditions should we copy versus duplicate?
10024989b8cSPeter Brune  */
101942e3340SBarry Smith static PetscErrorCode DMCoarsenHook_DMTS(DM dm,DM dmc,void *ctx)
10224989b8cSPeter Brune {
10324989b8cSPeter Brune   PetscErrorCode ierr;
10424989b8cSPeter Brune 
10524989b8cSPeter Brune   PetscFunctionBegin;
106942e3340SBarry Smith   ierr = DMCopyDMTS(dm,dmc);CHKERRQ(ierr);
10724989b8cSPeter Brune   PetscFunctionReturn(0);
10824989b8cSPeter Brune }
10924989b8cSPeter Brune 
11024989b8cSPeter Brune #undef __FUNCT__
111942e3340SBarry Smith #define __FUNCT__ "DMRestrictHook_DMTS"
11224989b8cSPeter Brune /* This could restrict auxiliary information to the coarse level.
11324989b8cSPeter Brune  */
114942e3340SBarry Smith static PetscErrorCode DMRestrictHook_DMTS(DM dm,Mat Restrict,Vec rscale,Mat Inject,DM dmc,void *ctx)
11524989b8cSPeter Brune {
11624989b8cSPeter Brune 
11724989b8cSPeter Brune   PetscFunctionBegin;
11824989b8cSPeter Brune   PetscFunctionReturn(0);
11924989b8cSPeter Brune }
12024989b8cSPeter Brune 
12124989b8cSPeter Brune #undef __FUNCT__
122d74926cbSBarry Smith #define __FUNCT__ "DMTSCopy"
123d74926cbSBarry Smith /*@C
124d74926cbSBarry Smith    DMTSCopy - copies the information in a DMTS to another DMTS
125d74926cbSBarry Smith 
126d74926cbSBarry Smith    Not Collective
127d74926cbSBarry Smith 
128d74926cbSBarry Smith    Input Argument:
129d74926cbSBarry Smith +  kdm - Original DMTS
130d74926cbSBarry Smith -  nkdm - DMTS to receive the data, should have been created with DMTSCreate()
131d74926cbSBarry Smith 
132d74926cbSBarry Smith    Level: developer
133d74926cbSBarry Smith 
134d74926cbSBarry Smith .seealso: DMTSCreate(), DMTSDestroy()
135d74926cbSBarry Smith @*/
136d74926cbSBarry Smith PetscErrorCode DMTSCopy(DMTS kdm,DMTS nkdm)
13724989b8cSPeter Brune {
13824989b8cSPeter Brune   PetscErrorCode ierr;
13924989b8cSPeter Brune 
14024989b8cSPeter Brune   PetscFunctionBegin;
141d74926cbSBarry Smith   PetscValidHeaderSpecific(kdm,DMTS_CLASSID,1);
142d74926cbSBarry Smith   PetscValidHeaderSpecific(nkdm,DMTS_CLASSID,2);
143d74926cbSBarry Smith   nkdm->ops->rhsfunction    = kdm->ops->rhsfunction;
144d74926cbSBarry Smith   nkdm->ops->rhsjacobian    = kdm->ops->rhsjacobian;
145d74926cbSBarry Smith   nkdm->ops->ifunction      = kdm->ops->ifunction;
146d74926cbSBarry Smith   nkdm->ops->ijacobian      = kdm->ops->ijacobian;
147d74926cbSBarry Smith   nkdm->ops->solution       = kdm->ops->solution;
148d74926cbSBarry Smith   nkdm->ops->destroy        = kdm->ops->destroy;
149d74926cbSBarry Smith   nkdm->ops->duplicate      = kdm->ops->duplicate;
150d74926cbSBarry Smith 
151d74926cbSBarry Smith   nkdm->rhsfunctionctx      = kdm->rhsfunctionctx;
152d74926cbSBarry Smith   nkdm->rhsjacobianctx      = kdm->rhsjacobianctx;
153d74926cbSBarry Smith   nkdm->ifunctionctx        = kdm->ifunctionctx;
154d74926cbSBarry Smith   nkdm->ijacobianctx        = kdm->ijacobianctx;
155d74926cbSBarry Smith   nkdm->solutionctx         = kdm->solutionctx;
156d74926cbSBarry Smith 
157d74926cbSBarry Smith   nkdm->data             = kdm->data;
158d74926cbSBarry Smith 
159d74926cbSBarry Smith   /*
160d74926cbSBarry Smith   nkdm->fortran_func_pointers[0] = kdm->fortran_func_pointers[0];
161d74926cbSBarry Smith   nkdm->fortran_func_pointers[1] = kdm->fortran_func_pointers[1];
162d74926cbSBarry Smith   nkdm->fortran_func_pointers[2] = kdm->fortran_func_pointers[2];
163d74926cbSBarry Smith   */
164d74926cbSBarry Smith 
165d74926cbSBarry Smith   /* implementation specific copy hooks */
166d74926cbSBarry Smith   if (kdm->ops->duplicate) {ierr = (*kdm->ops->duplicate)(kdm,nkdm);CHKERRQ(ierr);}
16724989b8cSPeter Brune   PetscFunctionReturn(0);
16824989b8cSPeter Brune }
16924989b8cSPeter Brune 
17024989b8cSPeter Brune #undef __FUNCT__
171942e3340SBarry Smith #define __FUNCT__ "DMGetDMTS"
17224989b8cSPeter Brune /*@C
173942e3340SBarry Smith    DMGetDMTS - get read-only private DMTS context from a DM
17424989b8cSPeter Brune 
17524989b8cSPeter Brune    Not Collective
17624989b8cSPeter Brune 
17724989b8cSPeter Brune    Input Argument:
17824989b8cSPeter Brune .  dm - DM to be used with TS
17924989b8cSPeter Brune 
18024989b8cSPeter Brune    Output Argument:
181942e3340SBarry Smith .  tsdm - private DMTS context
18224989b8cSPeter Brune 
18324989b8cSPeter Brune    Level: developer
18424989b8cSPeter Brune 
18524989b8cSPeter Brune    Notes:
186942e3340SBarry Smith    Use DMGetDMTSWrite() if write access is needed. The DMTSSetXXX API should be used wherever possible.
18724989b8cSPeter Brune 
188942e3340SBarry Smith .seealso: DMGetDMTSWrite()
18924989b8cSPeter Brune @*/
190942e3340SBarry Smith PetscErrorCode DMGetDMTS(DM dm,DMTS *tsdm)
19124989b8cSPeter Brune {
19224989b8cSPeter Brune   PetscErrorCode ierr;
19324989b8cSPeter Brune 
19424989b8cSPeter Brune   PetscFunctionBegin;
19524989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1962a34c10cSBarry Smith   *tsdm = (DMTS) dm->dmts;
197d74926cbSBarry Smith   if (!*tsdm) {
198942e3340SBarry Smith     ierr = PetscInfo(dm,"Creating new DMTS\n");CHKERRQ(ierr);
199d74926cbSBarry Smith     ierr = DMTSCreate(((PetscObject)dm)->comm,tsdm);CHKERRQ(ierr);
2002a34c10cSBarry Smith     dm->dmts = (PetscObject) *tsdm;
201942e3340SBarry Smith     ierr = DMCoarsenHookAdd(dm,DMCoarsenHook_DMTS,DMRestrictHook_DMTS,PETSC_NULL);CHKERRQ(ierr);
20224989b8cSPeter Brune   }
20324989b8cSPeter Brune   PetscFunctionReturn(0);
20424989b8cSPeter Brune }
20524989b8cSPeter Brune 
20624989b8cSPeter Brune #undef __FUNCT__
207942e3340SBarry Smith #define __FUNCT__ "DMGetDMTSWrite"
20824989b8cSPeter Brune /*@C
209942e3340SBarry Smith    DMGetDMTSWrite - get write access to private DMTS context from a DM
21024989b8cSPeter Brune 
21124989b8cSPeter Brune    Not Collective
21224989b8cSPeter Brune 
21324989b8cSPeter Brune    Input Argument:
21424989b8cSPeter Brune .  dm - DM to be used with TS
21524989b8cSPeter Brune 
21624989b8cSPeter Brune    Output Argument:
217942e3340SBarry Smith .  tsdm - private DMTS context
21824989b8cSPeter Brune 
21924989b8cSPeter Brune    Level: developer
22024989b8cSPeter Brune 
221942e3340SBarry Smith .seealso: DMGetDMTS()
22224989b8cSPeter Brune @*/
223942e3340SBarry Smith PetscErrorCode DMGetDMTSWrite(DM dm,DMTS *tsdm)
22424989b8cSPeter Brune {
22524989b8cSPeter Brune   PetscErrorCode ierr;
226942e3340SBarry Smith   DMTS           sdm;
22724989b8cSPeter Brune 
22824989b8cSPeter Brune   PetscFunctionBegin;
22924989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
230942e3340SBarry Smith   ierr = DMGetDMTS(dm,&sdm);CHKERRQ(ierr);
23124989b8cSPeter Brune   if (!sdm->originaldm) sdm->originaldm = dm;
23224989b8cSPeter Brune   if (sdm->originaldm != dm) {  /* Copy on write */
2332a34c10cSBarry Smith     DMTS          oldsdm = sdm;
234942e3340SBarry Smith     ierr = PetscInfo(dm,"Copying DMTS due to write\n");CHKERRQ(ierr);
235d74926cbSBarry Smith     ierr = DMTSCreate(((PetscObject)dm)->comm,&sdm);CHKERRQ(ierr);
236d74926cbSBarry Smith     ierr = DMTSCopy(oldsdm,sdm);CHKERRQ(ierr);
2372a34c10cSBarry Smith     ierr = DMTSDestroy((DMTS*)&dm->dmts);CHKERRQ(ierr);
2382a34c10cSBarry Smith     dm->dmts = (PetscObject) sdm;
23924989b8cSPeter Brune   }
24024989b8cSPeter Brune   *tsdm = sdm;
24124989b8cSPeter Brune   PetscFunctionReturn(0);
24224989b8cSPeter Brune }
24324989b8cSPeter Brune 
24424989b8cSPeter Brune #undef __FUNCT__
245942e3340SBarry Smith #define __FUNCT__ "DMCopyDMTS"
24624989b8cSPeter Brune /*@C
247942e3340SBarry Smith    DMCopyDMTS - copies a DM context to a new DM
24824989b8cSPeter Brune 
24924989b8cSPeter Brune    Logically Collective
25024989b8cSPeter Brune 
25124989b8cSPeter Brune    Input Arguments:
25224989b8cSPeter Brune +  dmsrc - DM to obtain context from
25324989b8cSPeter Brune -  dmdest - DM to add context to
25424989b8cSPeter Brune 
25524989b8cSPeter Brune    Level: developer
25624989b8cSPeter Brune 
25724989b8cSPeter Brune    Note:
25824989b8cSPeter Brune    The context is copied by reference. This function does not ensure that a context exists.
25924989b8cSPeter Brune 
260942e3340SBarry Smith .seealso: DMGetDMTS(), TSSetDM()
26124989b8cSPeter Brune @*/
262942e3340SBarry Smith PetscErrorCode DMCopyDMTS(DM dmsrc,DM dmdest)
26324989b8cSPeter Brune {
26424989b8cSPeter Brune   PetscErrorCode ierr;
26524989b8cSPeter Brune 
26624989b8cSPeter Brune   PetscFunctionBegin;
26724989b8cSPeter Brune   PetscValidHeaderSpecific(dmsrc,DM_CLASSID,1);
26824989b8cSPeter Brune   PetscValidHeaderSpecific(dmdest,DM_CLASSID,2);
2692a34c10cSBarry Smith   ierr = DMTSDestroy((DMTS*)&dmdest->dmts);CHKERRQ(ierr);
2702a34c10cSBarry Smith   dmdest->dmts = dmsrc->dmts;
2712a34c10cSBarry Smith   ierr = PetscObjectReference(dmdest->dmts);CHKERRQ(ierr);
272942e3340SBarry Smith   ierr = DMCoarsenHookAdd(dmdest,DMCoarsenHook_DMTS,DMRestrictHook_DMTS,PETSC_NULL);CHKERRQ(ierr);
27324989b8cSPeter Brune   PetscFunctionReturn(0);
27424989b8cSPeter Brune }
27524989b8cSPeter Brune 
27624989b8cSPeter Brune #undef __FUNCT__
27724989b8cSPeter Brune #define __FUNCT__ "DMTSSetIFunction"
27824989b8cSPeter Brune /*@C
27924989b8cSPeter Brune    DMTSSetIFunction - set TS implicit function evaluation function
28024989b8cSPeter Brune 
28124989b8cSPeter Brune    Not Collective
28224989b8cSPeter Brune 
28324989b8cSPeter Brune    Input Arguments:
28424989b8cSPeter Brune +  dm - DM to be used with TS
28524989b8cSPeter Brune .  func - function evaluation function, see TSSetIFunction() for calling sequence
28624989b8cSPeter Brune -  ctx - context for residual evaluation
28724989b8cSPeter Brune 
28824989b8cSPeter Brune    Level: advanced
28924989b8cSPeter Brune 
29024989b8cSPeter Brune    Note:
29124989b8cSPeter Brune    TSSetFunction() is normally used, but it calls this function internally because the user context is actually
29224989b8cSPeter Brune    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
29324989b8cSPeter Brune    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
29424989b8cSPeter Brune 
29524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
29624989b8cSPeter Brune @*/
29724989b8cSPeter Brune PetscErrorCode DMTSSetIFunction(DM dm,TSIFunction func,void *ctx)
29824989b8cSPeter Brune {
29924989b8cSPeter Brune   PetscErrorCode ierr;
300942e3340SBarry Smith   DMTS           tsdm;
30124989b8cSPeter Brune 
30224989b8cSPeter Brune   PetscFunctionBegin;
30324989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
304942e3340SBarry Smith   ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr);
305d74926cbSBarry Smith   if (func) tsdm->ops->ifunction = func;
30624989b8cSPeter Brune   if (ctx)  tsdm->ifunctionctx = ctx;
30724989b8cSPeter Brune   PetscFunctionReturn(0);
30824989b8cSPeter Brune }
30924989b8cSPeter Brune 
31024989b8cSPeter Brune #undef __FUNCT__
31124989b8cSPeter Brune #define __FUNCT__ "DMTSGetIFunction"
31224989b8cSPeter Brune /*@C
31324989b8cSPeter Brune    DMTSGetIFunction - get TS implicit residual evaluation function
31424989b8cSPeter Brune 
31524989b8cSPeter Brune    Not Collective
31624989b8cSPeter Brune 
31724989b8cSPeter Brune    Input Argument:
31824989b8cSPeter Brune .  dm - DM to be used with TS
31924989b8cSPeter Brune 
32024989b8cSPeter Brune    Output Arguments:
32124989b8cSPeter Brune +  func - function evaluation function, see TSSetIFunction() for calling sequence
32224989b8cSPeter Brune -  ctx - context for residual evaluation
32324989b8cSPeter Brune 
32424989b8cSPeter Brune    Level: advanced
32524989b8cSPeter Brune 
32624989b8cSPeter Brune    Note:
32724989b8cSPeter Brune    TSGetFunction() is normally used, but it calls this function internally because the user context is actually
32824989b8cSPeter Brune    associated with the DM.
32924989b8cSPeter Brune 
33024989b8cSPeter Brune .seealso: DMTSSetContext(), DMTSSetFunction(), TSSetFunction()
33124989b8cSPeter Brune @*/
33224989b8cSPeter Brune PetscErrorCode DMTSGetIFunction(DM dm,TSIFunction *func,void **ctx)
33324989b8cSPeter Brune {
33424989b8cSPeter Brune   PetscErrorCode ierr;
335942e3340SBarry Smith   DMTS           tsdm;
33624989b8cSPeter Brune 
33724989b8cSPeter Brune   PetscFunctionBegin;
33824989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
339942e3340SBarry Smith   ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr);
340d74926cbSBarry Smith   if (func) *func = tsdm->ops->ifunction;
34124989b8cSPeter Brune   if (ctx)  *ctx = tsdm->ifunctionctx;
34224989b8cSPeter Brune   PetscFunctionReturn(0);
34324989b8cSPeter Brune }
34424989b8cSPeter Brune 
34524989b8cSPeter Brune 
34624989b8cSPeter Brune #undef __FUNCT__
34724989b8cSPeter Brune #define __FUNCT__ "DMTSSetRHSFunction"
34824989b8cSPeter Brune /*@C
34924989b8cSPeter Brune    DMTSSetRHSFunction - set TS explicit residual evaluation function
35024989b8cSPeter Brune 
35124989b8cSPeter Brune    Not Collective
35224989b8cSPeter Brune 
35324989b8cSPeter Brune    Input Arguments:
35424989b8cSPeter Brune +  dm - DM to be used with TS
35524989b8cSPeter Brune .  func - RHS function evaluation function, see TSSetRHSFunction() for calling sequence
35624989b8cSPeter Brune -  ctx - context for residual evaluation
35724989b8cSPeter Brune 
35824989b8cSPeter Brune    Level: advanced
35924989b8cSPeter Brune 
36024989b8cSPeter Brune    Note:
361ef20d060SBarry Smith    TSSetRSHFunction() is normally used, but it calls this function internally because the user context is actually
36224989b8cSPeter Brune    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
36324989b8cSPeter Brune    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
36424989b8cSPeter Brune 
36524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
36624989b8cSPeter Brune @*/
36724989b8cSPeter Brune PetscErrorCode DMTSSetRHSFunction(DM dm,TSRHSFunction func,void *ctx)
36824989b8cSPeter Brune {
36924989b8cSPeter Brune   PetscErrorCode ierr;
370942e3340SBarry Smith   DMTS           tsdm;
37124989b8cSPeter Brune 
37224989b8cSPeter Brune   PetscFunctionBegin;
37324989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
374942e3340SBarry Smith   ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr);
375d74926cbSBarry Smith   if (func) tsdm->ops->rhsfunction = func;
37624989b8cSPeter Brune   if (ctx)  tsdm->rhsfunctionctx = ctx;
37724989b8cSPeter Brune   PetscFunctionReturn(0);
37824989b8cSPeter Brune }
37924989b8cSPeter Brune 
38024989b8cSPeter Brune #undef __FUNCT__
381ef20d060SBarry Smith #define __FUNCT__ "DMTSGetSolutionFunction"
382ef20d060SBarry Smith /*@C
383ef20d060SBarry Smith    DMTSGetSolutionFunction - gets the TS solution evaluation function
384ef20d060SBarry Smith 
385ef20d060SBarry Smith    Not Collective
386ef20d060SBarry Smith 
387ef20d060SBarry Smith    Input Arguments:
388ef20d060SBarry Smith .  dm - DM to be used with TS
389ef20d060SBarry Smith 
390ef20d060SBarry Smith    Output Parameters:
391ef20d060SBarry Smith +  func - solution function evaluation function, see TSSetSolution() for calling sequence
392ef20d060SBarry Smith -  ctx - context for solution evaluation
393ef20d060SBarry Smith 
394ef20d060SBarry Smith    Level: advanced
395ef20d060SBarry Smith 
396ef20d060SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
397ef20d060SBarry Smith @*/
398ef20d060SBarry Smith PetscErrorCode DMTSGetSolutionFunction(DM dm,TSSolutionFunction *func,void **ctx)
399ef20d060SBarry Smith {
400ef20d060SBarry Smith   PetscErrorCode ierr;
401942e3340SBarry Smith   DMTS           tsdm;
402ef20d060SBarry Smith 
403ef20d060SBarry Smith   PetscFunctionBegin;
404ef20d060SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
405942e3340SBarry Smith   ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr);
406d74926cbSBarry Smith   if (func) *func = tsdm->ops->solution;
407ef20d060SBarry Smith   if (ctx)  *ctx  = tsdm->solutionctx;
408ef20d060SBarry Smith   PetscFunctionReturn(0);
409ef20d060SBarry Smith }
410ef20d060SBarry Smith 
411ef20d060SBarry Smith #undef __FUNCT__
412ef20d060SBarry Smith #define __FUNCT__ "DMTSSetSolutionFunction"
413ef20d060SBarry Smith /*@C
414ef20d060SBarry Smith    DMTSSetSolutionFunction - set TS solution evaluation function
415ef20d060SBarry Smith 
416ef20d060SBarry Smith    Not Collective
417ef20d060SBarry Smith 
418ef20d060SBarry Smith    Input Arguments:
419ef20d060SBarry Smith +  dm - DM to be used with TS
420ef20d060SBarry Smith .  func - solution function evaluation function, see TSSetSolution() for calling sequence
421ef20d060SBarry Smith -  ctx - context for solution evaluation
422ef20d060SBarry Smith 
423ef20d060SBarry Smith    Level: advanced
424ef20d060SBarry Smith 
425ef20d060SBarry Smith    Note:
426ef20d060SBarry Smith    TSSetSolutionFunction() is normally used, but it calls this function internally because the user context is actually
427ef20d060SBarry Smith    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
428ef20d060SBarry Smith    not. If DM took a more central role at some later date, this could become the primary method of setting the residual.
429ef20d060SBarry Smith 
430ef20d060SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
431ef20d060SBarry Smith @*/
432ef20d060SBarry Smith PetscErrorCode DMTSSetSolutionFunction(DM dm,TSSolutionFunction func,void *ctx)
433ef20d060SBarry Smith {
434ef20d060SBarry Smith   PetscErrorCode ierr;
435942e3340SBarry Smith   DMTS           tsdm;
436ef20d060SBarry Smith 
437ef20d060SBarry Smith   PetscFunctionBegin;
438ef20d060SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
439942e3340SBarry Smith   ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr);
440d74926cbSBarry Smith   if (func) tsdm->ops->solution = func;
441ef20d060SBarry Smith   if (ctx)  tsdm->solutionctx   = ctx;
442ef20d060SBarry Smith   PetscFunctionReturn(0);
443ef20d060SBarry Smith }
444ef20d060SBarry Smith 
445ef20d060SBarry Smith #undef __FUNCT__
44624989b8cSPeter Brune #define __FUNCT__ "DMTSGetRHSFunction"
44724989b8cSPeter Brune /*@C
44824989b8cSPeter Brune    DMTSGetRHSFunction - get TS explicit residual evaluation function
44924989b8cSPeter Brune 
45024989b8cSPeter Brune    Not Collective
45124989b8cSPeter Brune 
45224989b8cSPeter Brune    Input Argument:
45324989b8cSPeter Brune .  dm - DM to be used with TS
45424989b8cSPeter Brune 
45524989b8cSPeter Brune    Output Arguments:
45624989b8cSPeter Brune +  func - residual evaluation function, see TSSetRHSFunction() for calling sequence
45724989b8cSPeter Brune -  ctx - context for residual evaluation
45824989b8cSPeter Brune 
45924989b8cSPeter Brune    Level: advanced
46024989b8cSPeter Brune 
46124989b8cSPeter Brune    Note:
46224989b8cSPeter Brune    TSGetFunction() is normally used, but it calls this function internally because the user context is actually
46324989b8cSPeter Brune    associated with the DM.
46424989b8cSPeter Brune 
46524989b8cSPeter Brune .seealso: DMTSSetContext(), DMTSSetFunction(), TSSetFunction()
46624989b8cSPeter Brune @*/
46724989b8cSPeter Brune PetscErrorCode DMTSGetRHSFunction(DM dm,TSRHSFunction *func,void **ctx)
46824989b8cSPeter Brune {
46924989b8cSPeter Brune   PetscErrorCode ierr;
470942e3340SBarry Smith   DMTS           tsdm;
47124989b8cSPeter Brune 
47224989b8cSPeter Brune   PetscFunctionBegin;
47324989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
474942e3340SBarry Smith   ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr);
475d74926cbSBarry Smith   if (func) *func = tsdm->ops->rhsfunction;
47624989b8cSPeter Brune   if (ctx)  *ctx = tsdm->rhsfunctionctx;
47724989b8cSPeter Brune   PetscFunctionReturn(0);
47824989b8cSPeter Brune }
47924989b8cSPeter Brune 
48024989b8cSPeter Brune #undef __FUNCT__
48124989b8cSPeter Brune #define __FUNCT__ "DMTSSetIJacobian"
48224989b8cSPeter Brune /*@C
48324989b8cSPeter Brune    DMTSSetIJacobian - set TS Jacobian evaluation function
48424989b8cSPeter Brune 
48524989b8cSPeter Brune    Not Collective
48624989b8cSPeter Brune 
48724989b8cSPeter Brune    Input Argument:
48824989b8cSPeter Brune +  dm - DM to be used with TS
48924989b8cSPeter Brune .  func - Jacobian evaluation function, see TSSetIJacobian() for calling sequence
49024989b8cSPeter Brune -  ctx - context for residual evaluation
49124989b8cSPeter Brune 
49224989b8cSPeter Brune    Level: advanced
49324989b8cSPeter Brune 
49424989b8cSPeter Brune    Note:
49524989b8cSPeter Brune    TSSetJacobian() is normally used, but it calls this function internally because the user context is actually
49624989b8cSPeter Brune    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
49724989b8cSPeter Brune    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
49824989b8cSPeter Brune 
49924989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSGetJacobian(), TSSetJacobian()
50024989b8cSPeter Brune @*/
50124989b8cSPeter Brune PetscErrorCode DMTSSetIJacobian(DM dm,TSIJacobian func,void *ctx)
50224989b8cSPeter Brune {
50324989b8cSPeter Brune   PetscErrorCode ierr;
504942e3340SBarry Smith   DMTS           sdm;
50524989b8cSPeter Brune 
50624989b8cSPeter Brune   PetscFunctionBegin;
50724989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
508942e3340SBarry Smith   ierr = DMGetDMTSWrite(dm,&sdm);CHKERRQ(ierr);
509d74926cbSBarry Smith   if (func) sdm->ops->ijacobian = func;
51024989b8cSPeter Brune   if (ctx)  sdm->ijacobianctx   = ctx;
51124989b8cSPeter Brune   PetscFunctionReturn(0);
51224989b8cSPeter Brune }
51324989b8cSPeter Brune 
51424989b8cSPeter Brune #undef __FUNCT__
51524989b8cSPeter Brune #define __FUNCT__ "DMTSGetIJacobian"
51624989b8cSPeter Brune /*@C
51724989b8cSPeter Brune    DMTSGetIJacobian - get TS Jacobian evaluation function
51824989b8cSPeter Brune 
51924989b8cSPeter Brune    Not Collective
52024989b8cSPeter Brune 
52124989b8cSPeter Brune    Input Argument:
52224989b8cSPeter Brune .  dm - DM to be used with TS
52324989b8cSPeter Brune 
52424989b8cSPeter Brune    Output Arguments:
52524989b8cSPeter Brune +  func - Jacobian evaluation function, see TSSetIJacobian() for calling sequence
52624989b8cSPeter Brune -  ctx - context for residual evaluation
52724989b8cSPeter Brune 
52824989b8cSPeter Brune    Level: advanced
52924989b8cSPeter Brune 
53024989b8cSPeter Brune    Note:
53124989b8cSPeter Brune    TSGetJacobian() is normally used, but it calls this function internally because the user context is actually
53224989b8cSPeter Brune    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
53324989b8cSPeter Brune    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
53424989b8cSPeter Brune 
53524989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
53624989b8cSPeter Brune @*/
53724989b8cSPeter Brune PetscErrorCode DMTSGetIJacobian(DM dm,TSIJacobian *func,void **ctx)
53824989b8cSPeter Brune {
53924989b8cSPeter Brune   PetscErrorCode ierr;
540942e3340SBarry Smith   DMTS           tsdm;
54124989b8cSPeter Brune 
54224989b8cSPeter Brune   PetscFunctionBegin;
54324989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
544942e3340SBarry Smith   ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr);
545d74926cbSBarry Smith   if (func) *func = tsdm->ops->ijacobian;
54624989b8cSPeter Brune   if (ctx)  *ctx = tsdm->ijacobianctx;
54724989b8cSPeter Brune   PetscFunctionReturn(0);
54824989b8cSPeter Brune }
54924989b8cSPeter Brune 
55024989b8cSPeter Brune 
55124989b8cSPeter Brune #undef __FUNCT__
55224989b8cSPeter Brune #define __FUNCT__ "DMTSSetRHSJacobian"
55324989b8cSPeter Brune /*@C
55424989b8cSPeter Brune    DMTSSetRHSJacobian - set TS Jacobian evaluation function
55524989b8cSPeter Brune 
55624989b8cSPeter Brune    Not Collective
55724989b8cSPeter Brune 
55824989b8cSPeter Brune    Input Argument:
55924989b8cSPeter Brune +  dm - DM to be used with TS
56024989b8cSPeter Brune .  func - Jacobian evaluation function, see TSSetRHSJacobian() for calling sequence
56124989b8cSPeter Brune -  ctx - context for residual evaluation
56224989b8cSPeter Brune 
56324989b8cSPeter Brune    Level: advanced
56424989b8cSPeter Brune 
56524989b8cSPeter Brune    Note:
56624989b8cSPeter Brune    TSSetJacobian() is normally used, but it calls this function internally because the user context is actually
56724989b8cSPeter Brune    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
56824989b8cSPeter Brune    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
56924989b8cSPeter Brune 
57024989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSGetJacobian(), TSSetJacobian()
57124989b8cSPeter Brune @*/
57224989b8cSPeter Brune PetscErrorCode DMTSSetRHSJacobian(DM dm,TSRHSJacobian func,void *ctx)
57324989b8cSPeter Brune {
57424989b8cSPeter Brune   PetscErrorCode ierr;
575942e3340SBarry Smith   DMTS           tsdm;
57624989b8cSPeter Brune 
57724989b8cSPeter Brune   PetscFunctionBegin;
57824989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
579942e3340SBarry Smith   ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr);
580d74926cbSBarry Smith   if (func) tsdm->ops->rhsjacobian = func;
58124989b8cSPeter Brune   if (ctx)  tsdm->rhsjacobianctx = ctx;
58224989b8cSPeter Brune   PetscFunctionReturn(0);
58324989b8cSPeter Brune }
58424989b8cSPeter Brune 
58524989b8cSPeter Brune #undef __FUNCT__
58624989b8cSPeter Brune #define __FUNCT__ "DMTSGetRHSJacobian"
58724989b8cSPeter Brune /*@C
58824989b8cSPeter Brune    DMTSGetRHSJacobian - get TS Jacobian evaluation function
58924989b8cSPeter Brune 
59024989b8cSPeter Brune    Not Collective
59124989b8cSPeter Brune 
59224989b8cSPeter Brune    Input Argument:
59324989b8cSPeter Brune .  dm - DM to be used with TS
59424989b8cSPeter Brune 
59524989b8cSPeter Brune    Output Arguments:
59624989b8cSPeter Brune +  func - Jacobian evaluation function, see TSSetRHSJacobian() for calling sequence
59724989b8cSPeter Brune -  ctx - context for residual evaluation
59824989b8cSPeter Brune 
59924989b8cSPeter Brune    Level: advanced
60024989b8cSPeter Brune 
60124989b8cSPeter Brune    Note:
60224989b8cSPeter Brune    TSGetJacobian() is normally used, but it calls this function internally because the user context is actually
60324989b8cSPeter Brune    associated with the DM.  This makes the interface consistent regardless of whether the user interacts with a DM or
60424989b8cSPeter Brune    not. If DM took a more central role at some later date, this could become the primary method of setting the Jacobian.
60524989b8cSPeter Brune 
60624989b8cSPeter Brune .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
60724989b8cSPeter Brune @*/
60824989b8cSPeter Brune PetscErrorCode DMTSGetRHSJacobian(DM dm,TSRHSJacobian *func,void **ctx)
60924989b8cSPeter Brune {
61024989b8cSPeter Brune   PetscErrorCode ierr;
611942e3340SBarry Smith   DMTS           tsdm;
61224989b8cSPeter Brune 
61324989b8cSPeter Brune   PetscFunctionBegin;
61424989b8cSPeter Brune   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
615942e3340SBarry Smith   ierr = DMGetDMTS(dm,&tsdm);CHKERRQ(ierr);
616d74926cbSBarry Smith   if (func) *func = tsdm->ops->rhsjacobian;
61724989b8cSPeter Brune   if (ctx)  *ctx = tsdm->rhsjacobianctx;
61824989b8cSPeter Brune   PetscFunctionReturn(0);
61924989b8cSPeter Brune }
620ad6bc421SBarry Smith 
621ad6bc421SBarry Smith #undef __FUNCT__
622ad6bc421SBarry Smith #define __FUNCT__ "DMTSSetIFunctionSerialize"
623ad6bc421SBarry Smith /*@C
624ad6bc421SBarry Smith    DMTSSetIFunctionSerialize - sets functions used to view and load a IFunction context
625ad6bc421SBarry Smith 
626ad6bc421SBarry Smith    Not Collective
627ad6bc421SBarry Smith 
628ad6bc421SBarry Smith    Input Arguments:
629ad6bc421SBarry Smith +  dm - DM to be used with TS
630ad6bc421SBarry Smith .  view - viewer function
631ad6bc421SBarry Smith -  load - loading function
632ad6bc421SBarry Smith 
633ad6bc421SBarry Smith    Level: advanced
634ad6bc421SBarry Smith 
635ad6bc421SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
636ad6bc421SBarry Smith @*/
637ad6bc421SBarry Smith PetscErrorCode DMTSSetIFunctionSerialize(DM dm,PetscErrorCode (*view)(void*,PetscViewer),PetscErrorCode (*load)(void**,PetscViewer))
638ad6bc421SBarry Smith {
639ad6bc421SBarry Smith   PetscErrorCode ierr;
640ad6bc421SBarry Smith   DMTS           tsdm;
641ad6bc421SBarry Smith 
642ad6bc421SBarry Smith   PetscFunctionBegin;
643ad6bc421SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
644ad6bc421SBarry Smith   ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr);
645ad6bc421SBarry Smith   tsdm->ops->ifunctionview = view;
646ad6bc421SBarry Smith   tsdm->ops->ifunctionload = load;
647ad6bc421SBarry Smith   PetscFunctionReturn(0);
648ad6bc421SBarry Smith }
649ad6bc421SBarry Smith 
650ad6bc421SBarry Smith #undef __FUNCT__
651ad6bc421SBarry Smith #define __FUNCT__ "DMTSSetIJacobianSerialize"
652ad6bc421SBarry Smith /*@C
653ad6bc421SBarry Smith    DMTSSetIJacobianSerialize - sets functions used to view and load a IJacobian context
654ad6bc421SBarry Smith 
655ad6bc421SBarry Smith    Not Collective
656ad6bc421SBarry Smith 
657ad6bc421SBarry Smith    Input Arguments:
658ad6bc421SBarry Smith +  dm - DM to be used with TS
659ad6bc421SBarry Smith .  view - viewer function
660ad6bc421SBarry Smith -  load - loading function
661ad6bc421SBarry Smith 
662ad6bc421SBarry Smith    Level: advanced
663ad6bc421SBarry Smith 
664ad6bc421SBarry Smith .seealso: DMTSSetContext(), TSSetFunction(), DMTSSetJacobian()
665ad6bc421SBarry Smith @*/
666ad6bc421SBarry Smith PetscErrorCode DMTSSetIJacobianSerialize(DM dm,PetscErrorCode (*view)(void*,PetscViewer),PetscErrorCode (*load)(void**,PetscViewer))
667ad6bc421SBarry Smith {
668ad6bc421SBarry Smith   PetscErrorCode ierr;
669ad6bc421SBarry Smith   DMTS           tsdm;
670ad6bc421SBarry Smith 
671ad6bc421SBarry Smith   PetscFunctionBegin;
672ad6bc421SBarry Smith   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
673ad6bc421SBarry Smith   ierr = DMGetDMTSWrite(dm,&tsdm);CHKERRQ(ierr);
674ad6bc421SBarry Smith   tsdm->ops->ijacobianview = view;
675ad6bc421SBarry Smith   tsdm->ops->ijacobianload = load;
676ad6bc421SBarry Smith   PetscFunctionReturn(0);
677ad6bc421SBarry Smith }
678