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