xref: /petsc/src/ts/adapt/impls/history/adapthist.c (revision 3c633725528e547aaaa9b672a746f5d686a276e1)
1d949e4a4SStefano Zampini #include <petsc/private/tshistoryimpl.h> /*I "petscts.h" I*/
2d949e4a4SStefano Zampini 
3d949e4a4SStefano Zampini typedef struct {
4d949e4a4SStefano Zampini   TSHistory hist;
5d949e4a4SStefano Zampini   PetscBool bw;
6d949e4a4SStefano Zampini } TSAdapt_History;
7d949e4a4SStefano Zampini 
8d949e4a4SStefano Zampini static PetscErrorCode TSAdaptChoose_History(TSAdapt adapt,TS ts,PetscReal h,PetscInt *next_sc,PetscReal *next_h,PetscBool *accept,PetscReal *wlte,PetscReal *wltea,PetscReal *wlter)
9d949e4a4SStefano Zampini {
10d949e4a4SStefano Zampini   PetscErrorCode  ierr;
11d949e4a4SStefano Zampini   PetscInt        step;
12d949e4a4SStefano Zampini   TSAdapt_History *thadapt = (TSAdapt_History*)adapt->data;
13d949e4a4SStefano Zampini 
14d949e4a4SStefano Zampini   PetscFunctionBegin;
15*3c633725SBarry Smith   PetscCheck(thadapt->hist,PetscObjectComm((PetscObject)adapt),PETSC_ERR_ORDER,"Need to call TSAdaptHistorySetHistory() first");
16d949e4a4SStefano Zampini   ierr = TSGetStepNumber(ts,&step);CHKERRQ(ierr);
17d949e4a4SStefano Zampini   ierr = TSHistoryGetTimeStep(thadapt->hist,thadapt->bw,step+1,next_h);CHKERRQ(ierr);
18d949e4a4SStefano Zampini   *accept  = PETSC_TRUE;
19d949e4a4SStefano Zampini   *next_sc = 0;
20d949e4a4SStefano Zampini   *wlte    = -1;
21d949e4a4SStefano Zampini   *wltea   = -1;
22d949e4a4SStefano Zampini   *wlter   = -1;
23d949e4a4SStefano Zampini   PetscFunctionReturn(0);
24d949e4a4SStefano Zampini }
25d949e4a4SStefano Zampini 
26d949e4a4SStefano Zampini static PetscErrorCode TSAdaptReset_History(TSAdapt adapt)
27d949e4a4SStefano Zampini {
28d949e4a4SStefano Zampini   TSAdapt_History *thadapt = (TSAdapt_History*)adapt->data;
29d949e4a4SStefano Zampini   PetscErrorCode  ierr;
30d949e4a4SStefano Zampini 
31d949e4a4SStefano Zampini   PetscFunctionBegin;
32d949e4a4SStefano Zampini   ierr = TSHistoryDestroy(&thadapt->hist);CHKERRQ(ierr);
33d949e4a4SStefano Zampini   PetscFunctionReturn(0);
34d949e4a4SStefano Zampini }
35d949e4a4SStefano Zampini 
36d949e4a4SStefano Zampini static PetscErrorCode TSAdaptDestroy_History(TSAdapt adapt)
37d949e4a4SStefano Zampini {
38d949e4a4SStefano Zampini   PetscErrorCode ierr;
39d949e4a4SStefano Zampini 
40d949e4a4SStefano Zampini   PetscFunctionBegin;
41d949e4a4SStefano Zampini   ierr = TSAdaptReset_History(adapt);CHKERRQ(ierr);
42d949e4a4SStefano Zampini   ierr = PetscFree(adapt->data);CHKERRQ(ierr);
43d949e4a4SStefano Zampini   PetscFunctionReturn(0);
44d949e4a4SStefano Zampini }
45d949e4a4SStefano Zampini 
46d949e4a4SStefano Zampini /* this is not public, as TSHistory is not a public object */
47d949e4a4SStefano Zampini PetscErrorCode TSAdaptHistorySetTSHistory(TSAdapt adapt, TSHistory hist, PetscBool backward)
48d949e4a4SStefano Zampini {
49d949e4a4SStefano Zampini   PetscReal      *hist_t;
50d949e4a4SStefano Zampini   PetscInt       n;
51d949e4a4SStefano Zampini   PetscBool      flg;
52d949e4a4SStefano Zampini   PetscErrorCode ierr;
53d949e4a4SStefano Zampini 
54d949e4a4SStefano Zampini   PetscFunctionBegin;
55d949e4a4SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
56d949e4a4SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,3);
57d949e4a4SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
58d949e4a4SStefano Zampini   if (!flg) PetscFunctionReturn(0);
59d949e4a4SStefano Zampini   ierr = TSHistoryGetHistory(hist,&n,(const PetscReal**)&hist_t,NULL,NULL);CHKERRQ(ierr);
60d949e4a4SStefano Zampini   ierr = TSAdaptHistorySetHistory(adapt,n,hist_t,backward);CHKERRQ(ierr);
61d949e4a4SStefano Zampini   PetscFunctionReturn(0);
62d949e4a4SStefano Zampini }
63d949e4a4SStefano Zampini 
64d949e4a4SStefano Zampini /*@
6575017583SStefano Zampini    TSAdaptHistoryGetStep - Gets time and time step for a given step number in the history
6675017583SStefano Zampini 
6775017583SStefano Zampini    Logically Collective on TSAdapt
6875017583SStefano Zampini 
6975017583SStefano Zampini    Input Parameters:
7075017583SStefano Zampini +  adapt    - the TSAdapt context
7175017583SStefano Zampini -  step     - the step number
7275017583SStefano Zampini 
7375017583SStefano Zampini    Output Parameters:
7475017583SStefano Zampini +  t  - the time corresponding to the requested step (can be NULL)
7575017583SStefano Zampini -  dt - the time step to be taken at the requested step (can be NULL)
7675017583SStefano Zampini 
7775017583SStefano Zampini    Notes: The time history is internally copied, and the user can free the hist array. The user still needs to specify the termination of the solve via TSSetMaxSteps().
7875017583SStefano Zampini 
7975017583SStefano Zampini    Level: advanced
8075017583SStefano Zampini 
8175017583SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSAdaptHistorySetTrajectory(), TSADAPTHISTORY
8275017583SStefano Zampini @*/
8375017583SStefano Zampini PetscErrorCode TSAdaptHistoryGetStep(TSAdapt adapt, PetscInt step, PetscReal *t, PetscReal *dt)
8475017583SStefano Zampini {
8575017583SStefano Zampini   TSAdapt_History *thadapt;
8675017583SStefano Zampini   PetscBool       flg;
8775017583SStefano Zampini   PetscErrorCode  ierr;
8875017583SStefano Zampini 
8975017583SStefano Zampini   PetscFunctionBegin;
9075017583SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
9175017583SStefano Zampini   PetscValidLogicalCollectiveInt(adapt,step,2);
9275017583SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
93*3c633725SBarry Smith   PetscCheck(flg,PetscObjectComm((PetscObject)adapt),PETSC_ERR_SUP,"Not for type %s",((PetscObject)adapt)->type_name);
9475017583SStefano Zampini   thadapt = (TSAdapt_History*)adapt->data;
9575017583SStefano Zampini   ierr = TSHistoryGetTimeStep(thadapt->hist,thadapt->bw,step,dt);CHKERRQ(ierr);
9675017583SStefano Zampini   ierr = TSHistoryGetTime(thadapt->hist,thadapt->bw,step,t);CHKERRQ(ierr);
9775017583SStefano Zampini   PetscFunctionReturn(0);
9875017583SStefano Zampini }
9975017583SStefano Zampini 
10075017583SStefano Zampini /*@
101d949e4a4SStefano Zampini    TSAdaptHistorySetHistory - Sets a time history in the adaptor
102d949e4a4SStefano Zampini 
103d949e4a4SStefano Zampini    Logically Collective on TSAdapt
104d949e4a4SStefano Zampini 
105d949e4a4SStefano Zampini    Input Parameters:
106d949e4a4SStefano Zampini +  adapt    - the TSAdapt context
107d949e4a4SStefano Zampini .  n        - size of the time history
108d949e4a4SStefano Zampini .  hist     - the time history
109d949e4a4SStefano Zampini -  backward - if the time history has to be followed backward
110d949e4a4SStefano Zampini 
111d949e4a4SStefano Zampini    Notes: The time history is internally copied, and the user can free the hist array. The user still needs to specify the termination of the solve via TSSetMaxSteps().
112d949e4a4SStefano Zampini 
113d949e4a4SStefano Zampini    Level: advanced
114d949e4a4SStefano Zampini 
11575017583SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSAdaptHistorySetTrajectory(), TSADAPTHISTORY
116d949e4a4SStefano Zampini @*/
117d949e4a4SStefano Zampini PetscErrorCode TSAdaptHistorySetHistory(TSAdapt adapt, PetscInt n, PetscReal hist[], PetscBool backward)
118d949e4a4SStefano Zampini {
119d949e4a4SStefano Zampini   TSAdapt_History *thadapt;
120d949e4a4SStefano Zampini   PetscBool       flg;
121d949e4a4SStefano Zampini   PetscErrorCode  ierr;
122d949e4a4SStefano Zampini 
123d949e4a4SStefano Zampini   PetscFunctionBegin;
124d949e4a4SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
125d949e4a4SStefano Zampini   PetscValidLogicalCollectiveInt(adapt,n,2);
126d949e4a4SStefano Zampini   PetscValidRealPointer(hist,3);
127d949e4a4SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,4);
128d949e4a4SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
129d949e4a4SStefano Zampini   if (!flg) PetscFunctionReturn(0);
130d949e4a4SStefano Zampini   thadapt = (TSAdapt_History*)adapt->data;
131d949e4a4SStefano Zampini   ierr = TSHistoryDestroy(&thadapt->hist);CHKERRQ(ierr);
132d949e4a4SStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)adapt),&thadapt->hist);CHKERRQ(ierr);
133d949e4a4SStefano Zampini   ierr = TSHistorySetHistory(thadapt->hist,n,hist,NULL,PETSC_FALSE);CHKERRQ(ierr);
134d949e4a4SStefano Zampini   thadapt->bw = backward;
135d949e4a4SStefano Zampini   PetscFunctionReturn(0);
136d949e4a4SStefano Zampini }
137d949e4a4SStefano Zampini 
13875017583SStefano Zampini /*@
13975017583SStefano Zampini    TSAdaptHistorySetTrajectory - Sets a time history in the adaptor from a given TSTrajectory
14075017583SStefano Zampini 
14175017583SStefano Zampini    Logically Collective on TSAdapt
14275017583SStefano Zampini 
14375017583SStefano Zampini    Input Parameters:
14475017583SStefano Zampini +  adapt    - the TSAdapt context
14575017583SStefano Zampini .  tj       - the TSTrajectory context
14675017583SStefano Zampini -  backward - if the time history has to be followed backward
14775017583SStefano Zampini 
14875017583SStefano Zampini    Notes: The time history is internally copied, and the user can destroy the TSTrajectory if not needed. The user still needs to specify the termination of the solve via TSSetMaxSteps().
14975017583SStefano Zampini 
15075017583SStefano Zampini    Level: advanced
15175017583SStefano Zampini 
15275017583SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSAdaptHistorySetHistory(), TSADAPTHISTORY
15375017583SStefano Zampini @*/
15475017583SStefano Zampini PetscErrorCode TSAdaptHistorySetTrajectory(TSAdapt adapt, TSTrajectory tj, PetscBool backward)
15575017583SStefano Zampini {
15675017583SStefano Zampini   PetscBool       flg;
15775017583SStefano Zampini   PetscErrorCode  ierr;
15875017583SStefano Zampini 
15975017583SStefano Zampini   PetscFunctionBegin;
16075017583SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
16175017583SStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,2);
16275017583SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,3);
16375017583SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
16475017583SStefano Zampini   if (!flg) PetscFunctionReturn(0);
16575017583SStefano Zampini   ierr = TSAdaptHistorySetTSHistory(adapt,tj->tsh,backward);CHKERRQ(ierr);
16675017583SStefano Zampini   PetscFunctionReturn(0);
16775017583SStefano Zampini }
16875017583SStefano Zampini 
169d949e4a4SStefano Zampini /*MC
170d949e4a4SStefano Zampini    TSADAPTHISTORY - Time stepping controller that follows a given time history, used for Tangent Linear Model simulations
171d949e4a4SStefano Zampini 
172d949e4a4SStefano Zampini    Level: developer
173d949e4a4SStefano Zampini 
174d949e4a4SStefano Zampini .seealso: TS, TSAdapt, TSGetAdapt(), TSAdaptHistorySetHistory()
175d949e4a4SStefano Zampini M*/
176d949e4a4SStefano Zampini PETSC_EXTERN PetscErrorCode TSAdaptCreate_History(TSAdapt adapt)
177d949e4a4SStefano Zampini {
178d949e4a4SStefano Zampini   PetscErrorCode     ierr;
179d949e4a4SStefano Zampini   TSAdapt_History *thadapt;
180d949e4a4SStefano Zampini 
181d949e4a4SStefano Zampini   PetscFunctionBegin;
182d949e4a4SStefano Zampini   ierr = PetscNew(&thadapt);CHKERRQ(ierr);
183d949e4a4SStefano Zampini   adapt->matchstepfac[0] = PETSC_SMALL; /* prevent from accumulation errors */
184d949e4a4SStefano Zampini   adapt->matchstepfac[1] = 0.0;         /* we will always match the final step, prevent TSAdaptChoose to mess with it */
185d949e4a4SStefano Zampini   adapt->data            = thadapt;
186d949e4a4SStefano Zampini 
187d949e4a4SStefano Zampini   adapt->ops->choose  = TSAdaptChoose_History;
188d949e4a4SStefano Zampini   adapt->ops->reset   = TSAdaptReset_History;
189d949e4a4SStefano Zampini   adapt->ops->destroy = TSAdaptDestroy_History;
190d949e4a4SStefano Zampini   PetscFunctionReturn(0);
191d949e4a4SStefano Zampini }
192