xref: /petsc/src/ts/adapt/impls/history/adapthist.c (revision 75017583c9412a99ab2b163ddc96a35e5a8036b8)
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;
15d949e4a4SStefano Zampini   if (!thadapt->hist) SETERRQ(PetscObjectComm((PetscObject)adapt),PETSC_ERR_USER,"Need call TSAdaptHistorySetHistory()");
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 /*@
65*75017583SStefano Zampini    TSAdaptHistoryGetStep - Gets time and time step for a given step number in the history
66*75017583SStefano Zampini 
67*75017583SStefano Zampini    Logically Collective on TSAdapt
68*75017583SStefano Zampini 
69*75017583SStefano Zampini    Input Parameters:
70*75017583SStefano Zampini +  adapt    - the TSAdapt context
71*75017583SStefano Zampini -  step     - the step number
72*75017583SStefano Zampini 
73*75017583SStefano Zampini    Output Parameters:
74*75017583SStefano Zampini +  t  - the time corresponding to the requested step (can be NULL)
75*75017583SStefano Zampini -  dt - the time step to be taken at the requested step (can be NULL)
76*75017583SStefano Zampini 
77*75017583SStefano 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().
78*75017583SStefano Zampini 
79*75017583SStefano Zampini    Level: advanced
80*75017583SStefano Zampini 
81*75017583SStefano Zampini .keywords: TSAdapt
82*75017583SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSAdaptHistorySetTrajectory(), TSADAPTHISTORY
83*75017583SStefano Zampini @*/
84*75017583SStefano Zampini PetscErrorCode TSAdaptHistoryGetStep(TSAdapt adapt, PetscInt step, PetscReal *t, PetscReal *dt)
85*75017583SStefano Zampini {
86*75017583SStefano Zampini   TSAdapt_History *thadapt;
87*75017583SStefano Zampini   PetscBool       flg;
88*75017583SStefano Zampini   PetscErrorCode  ierr;
89*75017583SStefano Zampini 
90*75017583SStefano Zampini   PetscFunctionBegin;
91*75017583SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
92*75017583SStefano Zampini   PetscValidLogicalCollectiveInt(adapt,step,2);
93*75017583SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
94*75017583SStefano Zampini   if (!flg) SETERRQ1(PetscObjectComm((PetscObject)adapt),PETSC_ERR_SUP,"Not for type %s",((PetscObject)adapt)->type_name);
95*75017583SStefano Zampini   thadapt = (TSAdapt_History*)adapt->data;
96*75017583SStefano Zampini   ierr = TSHistoryGetTimeStep(thadapt->hist,thadapt->bw,step,dt);CHKERRQ(ierr);
97*75017583SStefano Zampini   ierr = TSHistoryGetTime(thadapt->hist,thadapt->bw,step,t);CHKERRQ(ierr);
98*75017583SStefano Zampini   PetscFunctionReturn(0);
99*75017583SStefano Zampini }
100*75017583SStefano Zampini 
101*75017583SStefano Zampini /*@
102d949e4a4SStefano Zampini    TSAdaptHistorySetHistory - Sets a time history in the adaptor
103d949e4a4SStefano Zampini 
104d949e4a4SStefano Zampini    Logically Collective on TSAdapt
105d949e4a4SStefano Zampini 
106d949e4a4SStefano Zampini    Input Parameters:
107d949e4a4SStefano Zampini +  adapt    - the TSAdapt context
108d949e4a4SStefano Zampini .  n        - size of the time history
109d949e4a4SStefano Zampini .  hist     - the time history
110d949e4a4SStefano Zampini -  backward - if the time history has to be followed backward
111d949e4a4SStefano Zampini 
112d949e4a4SStefano 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().
113d949e4a4SStefano Zampini 
114d949e4a4SStefano Zampini    Level: advanced
115d949e4a4SStefano Zampini 
116d949e4a4SStefano Zampini .keywords: TSAdapt
117*75017583SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSAdaptHistorySetTrajectory(), TSADAPTHISTORY
118d949e4a4SStefano Zampini @*/
119d949e4a4SStefano Zampini PetscErrorCode TSAdaptHistorySetHistory(TSAdapt adapt, PetscInt n, PetscReal hist[], PetscBool backward)
120d949e4a4SStefano Zampini {
121d949e4a4SStefano Zampini   TSAdapt_History *thadapt;
122d949e4a4SStefano Zampini   PetscBool       flg;
123d949e4a4SStefano Zampini   PetscErrorCode  ierr;
124d949e4a4SStefano Zampini 
125d949e4a4SStefano Zampini   PetscFunctionBegin;
126d949e4a4SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
127d949e4a4SStefano Zampini   PetscValidLogicalCollectiveInt(adapt,n,2);
128d949e4a4SStefano Zampini   PetscValidRealPointer(hist,3);
129d949e4a4SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,4);
130d949e4a4SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
131d949e4a4SStefano Zampini   if (!flg) PetscFunctionReturn(0);
132d949e4a4SStefano Zampini   thadapt = (TSAdapt_History*)adapt->data;
133d949e4a4SStefano Zampini   ierr = TSHistoryDestroy(&thadapt->hist);CHKERRQ(ierr);
134d949e4a4SStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)adapt),&thadapt->hist);CHKERRQ(ierr);
135d949e4a4SStefano Zampini   ierr = TSHistorySetHistory(thadapt->hist,n,hist,NULL,PETSC_FALSE);CHKERRQ(ierr);
136d949e4a4SStefano Zampini   thadapt->bw = backward;
137d949e4a4SStefano Zampini   PetscFunctionReturn(0);
138d949e4a4SStefano Zampini }
139d949e4a4SStefano Zampini 
140*75017583SStefano Zampini /*@
141*75017583SStefano Zampini    TSAdaptHistorySetTrajectory - Sets a time history in the adaptor from a given TSTrajectory
142*75017583SStefano Zampini 
143*75017583SStefano Zampini    Logically Collective on TSAdapt
144*75017583SStefano Zampini 
145*75017583SStefano Zampini    Input Parameters:
146*75017583SStefano Zampini +  adapt    - the TSAdapt context
147*75017583SStefano Zampini .  tj       - the TSTrajectory context
148*75017583SStefano Zampini -  backward - if the time history has to be followed backward
149*75017583SStefano Zampini 
150*75017583SStefano 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().
151*75017583SStefano Zampini 
152*75017583SStefano Zampini    Level: advanced
153*75017583SStefano Zampini 
154*75017583SStefano Zampini .keywords: TSAdapt
155*75017583SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSAdaptHistorySetHistory(), TSADAPTHISTORY
156*75017583SStefano Zampini @*/
157*75017583SStefano Zampini PetscErrorCode TSAdaptHistorySetTrajectory(TSAdapt adapt, TSTrajectory tj, PetscBool backward)
158*75017583SStefano Zampini {
159*75017583SStefano Zampini   PetscBool       flg;
160*75017583SStefano Zampini   PetscErrorCode  ierr;
161*75017583SStefano Zampini 
162*75017583SStefano Zampini   PetscFunctionBegin;
163*75017583SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
164*75017583SStefano Zampini   PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,2);
165*75017583SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,3);
166*75017583SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
167*75017583SStefano Zampini   if (!flg) PetscFunctionReturn(0);
168*75017583SStefano Zampini   ierr = TSAdaptHistorySetTSHistory(adapt,tj->tsh,backward);CHKERRQ(ierr);
169*75017583SStefano Zampini   PetscFunctionReturn(0);
170*75017583SStefano Zampini }
171*75017583SStefano Zampini 
172*75017583SStefano Zampini 
173d949e4a4SStefano Zampini /*MC
174d949e4a4SStefano Zampini    TSADAPTHISTORY - Time stepping controller that follows a given time history, used for Tangent Linear Model simulations
175d949e4a4SStefano Zampini 
176d949e4a4SStefano Zampini    Level: developer
177d949e4a4SStefano Zampini 
178d949e4a4SStefano Zampini .seealso: TS, TSAdapt, TSGetAdapt(), TSAdaptHistorySetHistory()
179d949e4a4SStefano Zampini M*/
180d949e4a4SStefano Zampini PETSC_EXTERN PetscErrorCode TSAdaptCreate_History(TSAdapt adapt)
181d949e4a4SStefano Zampini {
182d949e4a4SStefano Zampini   PetscErrorCode     ierr;
183d949e4a4SStefano Zampini   TSAdapt_History *thadapt;
184d949e4a4SStefano Zampini 
185d949e4a4SStefano Zampini   PetscFunctionBegin;
186d949e4a4SStefano Zampini   ierr = PetscNew(&thadapt);CHKERRQ(ierr);
187d949e4a4SStefano Zampini   adapt->matchstepfac[0] = PETSC_SMALL; /* prevent from accumulation errors */
188d949e4a4SStefano Zampini   adapt->matchstepfac[1] = 0.0;         /* we will always match the final step, prevent TSAdaptChoose to mess with it */
189d949e4a4SStefano Zampini   adapt->data            = thadapt;
190d949e4a4SStefano Zampini 
191d949e4a4SStefano Zampini   adapt->ops->choose  = TSAdaptChoose_History;
192d949e4a4SStefano Zampini   adapt->ops->reset   = TSAdaptReset_History;
193d949e4a4SStefano Zampini   adapt->ops->destroy = TSAdaptDestroy_History;
194d949e4a4SStefano Zampini   PetscFunctionReturn(0);
195d949e4a4SStefano Zampini }
196