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