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