xref: /petsc/src/ts/adapt/impls/history/adapthist.c (revision d949e4a4c5f818bf70c408031d71566a072630bc)
1*d949e4a4SStefano Zampini #include <petsc/private/tshistoryimpl.h> /*I "petscts.h" I*/
2*d949e4a4SStefano Zampini 
3*d949e4a4SStefano Zampini typedef struct {
4*d949e4a4SStefano Zampini   TSHistory hist;
5*d949e4a4SStefano Zampini   PetscBool bw;
6*d949e4a4SStefano Zampini } TSAdapt_History;
7*d949e4a4SStefano Zampini 
8*d949e4a4SStefano 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)
9*d949e4a4SStefano Zampini {
10*d949e4a4SStefano Zampini   PetscErrorCode  ierr;
11*d949e4a4SStefano Zampini   PetscInt        step;
12*d949e4a4SStefano Zampini   TSAdapt_History *thadapt = (TSAdapt_History*)adapt->data;
13*d949e4a4SStefano Zampini 
14*d949e4a4SStefano Zampini   PetscFunctionBegin;
15*d949e4a4SStefano Zampini   if (!thadapt->hist) SETERRQ(PetscObjectComm((PetscObject)adapt),PETSC_ERR_USER,"Need call TSAdaptHistorySetHistory()");
16*d949e4a4SStefano Zampini   ierr = TSGetStepNumber(ts,&step);CHKERRQ(ierr);
17*d949e4a4SStefano Zampini   ierr = TSHistoryGetTimeStep(thadapt->hist,thadapt->bw,step+1,next_h);CHKERRQ(ierr);
18*d949e4a4SStefano Zampini   *accept  = PETSC_TRUE;
19*d949e4a4SStefano Zampini   *next_sc = 0;
20*d949e4a4SStefano Zampini   *wlte    = -1;
21*d949e4a4SStefano Zampini   *wltea   = -1;
22*d949e4a4SStefano Zampini   *wlter   = -1;
23*d949e4a4SStefano Zampini   PetscFunctionReturn(0);
24*d949e4a4SStefano Zampini }
25*d949e4a4SStefano Zampini 
26*d949e4a4SStefano Zampini static PetscErrorCode TSAdaptReset_History(TSAdapt adapt)
27*d949e4a4SStefano Zampini {
28*d949e4a4SStefano Zampini   TSAdapt_History *thadapt = (TSAdapt_History*)adapt->data;
29*d949e4a4SStefano Zampini   PetscErrorCode  ierr;
30*d949e4a4SStefano Zampini 
31*d949e4a4SStefano Zampini   PetscFunctionBegin;
32*d949e4a4SStefano Zampini   ierr = TSHistoryDestroy(&thadapt->hist);CHKERRQ(ierr);
33*d949e4a4SStefano Zampini   PetscFunctionReturn(0);
34*d949e4a4SStefano Zampini }
35*d949e4a4SStefano Zampini 
36*d949e4a4SStefano Zampini static PetscErrorCode TSAdaptDestroy_History(TSAdapt adapt)
37*d949e4a4SStefano Zampini {
38*d949e4a4SStefano Zampini   PetscErrorCode ierr;
39*d949e4a4SStefano Zampini 
40*d949e4a4SStefano Zampini   PetscFunctionBegin;
41*d949e4a4SStefano Zampini   ierr = TSAdaptReset_History(adapt);CHKERRQ(ierr);
42*d949e4a4SStefano Zampini   ierr = PetscFree(adapt->data);CHKERRQ(ierr);
43*d949e4a4SStefano Zampini   PetscFunctionReturn(0);
44*d949e4a4SStefano Zampini }
45*d949e4a4SStefano Zampini 
46*d949e4a4SStefano Zampini /* this is not public, as TSHistory is not a public object */
47*d949e4a4SStefano Zampini PetscErrorCode TSAdaptHistorySetTSHistory(TSAdapt adapt, TSHistory hist, PetscBool backward)
48*d949e4a4SStefano Zampini {
49*d949e4a4SStefano Zampini   PetscReal      *hist_t;
50*d949e4a4SStefano Zampini   PetscInt       n;
51*d949e4a4SStefano Zampini   PetscBool      flg;
52*d949e4a4SStefano Zampini   PetscErrorCode ierr;
53*d949e4a4SStefano Zampini 
54*d949e4a4SStefano Zampini   PetscFunctionBegin;
55*d949e4a4SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
56*d949e4a4SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,3);
57*d949e4a4SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
58*d949e4a4SStefano Zampini   if (!flg) PetscFunctionReturn(0);
59*d949e4a4SStefano Zampini   ierr = TSHistoryGetHistory(hist,&n,(const PetscReal**)&hist_t,NULL,NULL);CHKERRQ(ierr);
60*d949e4a4SStefano Zampini   ierr = TSAdaptHistorySetHistory(adapt,n,hist_t,backward);CHKERRQ(ierr);
61*d949e4a4SStefano Zampini   PetscFunctionReturn(0);
62*d949e4a4SStefano Zampini }
63*d949e4a4SStefano Zampini 
64*d949e4a4SStefano Zampini /*@
65*d949e4a4SStefano Zampini    TSAdaptHistorySetHistory - Sets a time history in the adaptor
66*d949e4a4SStefano Zampini 
67*d949e4a4SStefano Zampini    Logically Collective on TSAdapt
68*d949e4a4SStefano Zampini 
69*d949e4a4SStefano Zampini    Input Parameters:
70*d949e4a4SStefano Zampini +  adapt    - the TSAdapt context
71*d949e4a4SStefano Zampini .  n        - size of the time history
72*d949e4a4SStefano Zampini .  hist     - the time history
73*d949e4a4SStefano Zampini -  backward - if the time history has to be followed backward
74*d949e4a4SStefano Zampini 
75*d949e4a4SStefano 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().
76*d949e4a4SStefano Zampini 
77*d949e4a4SStefano Zampini    Level: advanced
78*d949e4a4SStefano Zampini 
79*d949e4a4SStefano Zampini .keywords: TSAdapt
80*d949e4a4SStefano Zampini .seealso: TSGetAdapt(), TSAdaptSetType(), TSADAPTHISTORY
81*d949e4a4SStefano Zampini @*/
82*d949e4a4SStefano Zampini PetscErrorCode TSAdaptHistorySetHistory(TSAdapt adapt, PetscInt n, PetscReal hist[], PetscBool backward)
83*d949e4a4SStefano Zampini {
84*d949e4a4SStefano Zampini   TSAdapt_History *thadapt;
85*d949e4a4SStefano Zampini   PetscBool       flg;
86*d949e4a4SStefano Zampini   PetscErrorCode  ierr;
87*d949e4a4SStefano Zampini 
88*d949e4a4SStefano Zampini   PetscFunctionBegin;
89*d949e4a4SStefano Zampini   PetscValidHeaderSpecific(adapt,TSADAPT_CLASSID,1);
90*d949e4a4SStefano Zampini   PetscValidLogicalCollectiveInt(adapt,n,2);
91*d949e4a4SStefano Zampini   PetscValidRealPointer(hist,3);
92*d949e4a4SStefano Zampini   PetscValidLogicalCollectiveBool(adapt,backward,4);
93*d949e4a4SStefano Zampini   ierr = PetscObjectTypeCompare((PetscObject)adapt,TSADAPTHISTORY,&flg);CHKERRQ(ierr);
94*d949e4a4SStefano Zampini   if (!flg) PetscFunctionReturn(0);
95*d949e4a4SStefano Zampini   thadapt = (TSAdapt_History*)adapt->data;
96*d949e4a4SStefano Zampini   ierr = TSHistoryDestroy(&thadapt->hist);CHKERRQ(ierr);
97*d949e4a4SStefano Zampini   ierr = TSHistoryCreate(PetscObjectComm((PetscObject)adapt),&thadapt->hist);CHKERRQ(ierr);
98*d949e4a4SStefano Zampini   ierr = TSHistorySetHistory(thadapt->hist,n,hist,NULL,PETSC_FALSE);CHKERRQ(ierr);
99*d949e4a4SStefano Zampini   thadapt->bw = backward;
100*d949e4a4SStefano Zampini   PetscFunctionReturn(0);
101*d949e4a4SStefano Zampini }
102*d949e4a4SStefano Zampini 
103*d949e4a4SStefano Zampini /*MC
104*d949e4a4SStefano Zampini    TSADAPTHISTORY - Time stepping controller that follows a given time history, used for Tangent Linear Model simulations
105*d949e4a4SStefano Zampini 
106*d949e4a4SStefano Zampini    Level: developer
107*d949e4a4SStefano Zampini 
108*d949e4a4SStefano Zampini .seealso: TS, TSAdapt, TSGetAdapt(), TSAdaptHistorySetHistory()
109*d949e4a4SStefano Zampini M*/
110*d949e4a4SStefano Zampini PETSC_EXTERN PetscErrorCode TSAdaptCreate_History(TSAdapt adapt)
111*d949e4a4SStefano Zampini {
112*d949e4a4SStefano Zampini   PetscErrorCode     ierr;
113*d949e4a4SStefano Zampini   TSAdapt_History *thadapt;
114*d949e4a4SStefano Zampini 
115*d949e4a4SStefano Zampini   PetscFunctionBegin;
116*d949e4a4SStefano Zampini   ierr = PetscNew(&thadapt);CHKERRQ(ierr);
117*d949e4a4SStefano Zampini   adapt->matchstepfac[0] = PETSC_SMALL; /* prevent from accumulation errors */
118*d949e4a4SStefano Zampini   adapt->matchstepfac[1] = 0.0;         /* we will always match the final step, prevent TSAdaptChoose to mess with it */
119*d949e4a4SStefano Zampini   adapt->data            = thadapt;
120*d949e4a4SStefano Zampini 
121*d949e4a4SStefano Zampini   adapt->ops->choose  = TSAdaptChoose_History;
122*d949e4a4SStefano Zampini   adapt->ops->reset   = TSAdaptReset_History;
123*d949e4a4SStefano Zampini   adapt->ops->destroy = TSAdaptDestroy_History;
124*d949e4a4SStefano Zampini   PetscFunctionReturn(0);
125*d949e4a4SStefano Zampini }
126