1af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 2fe8322adSStefano Zampini #include <petsc/private/tshistoryimpl.h> 3fe8322adSStefano Zampini #include <petscdm.h> 4bc952696SBarry Smith 5bc952696SBarry Smith PetscFunctionList TSTrajectoryList = NULL; 6bc952696SBarry Smith PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 7bc952696SBarry Smith PetscClassId TSTRAJECTORY_CLASSID; 82bf6d308SHong Zhang PetscLogEvent TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs, TSTrajectory_SetUp; 9bc952696SBarry Smith 10bc952696SBarry Smith /*@C 11bc952696SBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 12bc952696SBarry Smith 13bc952696SBarry Smith Not Collective 14bc952696SBarry Smith 15bc952696SBarry Smith Input Parameters: 163c0fce88SHong Zhang + name - the name of a new user-defined creation routine 173c0fce88SHong Zhang - create_func - the creation routine itself 18bc952696SBarry Smith 19bc952696SBarry Smith Notes: 20bc952696SBarry Smith TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 21bc952696SBarry Smith 22df5474d8SHong Zhang Level: developer 23bc952696SBarry Smith 24db781477SPatrick Sanan .seealso: `TSTrajectoryRegisterAll()` 25bc952696SBarry Smith @*/ 26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 27bc952696SBarry Smith { 28bc952696SBarry Smith PetscFunctionBegin; 299566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&TSTrajectoryList,sname,function)); 30bc952696SBarry Smith PetscFunctionReturn(0); 31bc952696SBarry Smith } 32bc952696SBarry Smith 33fe8322adSStefano Zampini /*@ 34fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 35fe8322adSStefano Zampini 36fe8322adSStefano Zampini Collective on TSTrajectory 37fe8322adSStefano Zampini 38fe8322adSStefano Zampini Input Parameters: 39fe8322adSStefano Zampini + tj - the trajectory object 40fe8322adSStefano Zampini . ts - the time stepper object (optional) 41fe8322adSStefano Zampini . stepnum - the step number 42fe8322adSStefano Zampini . time - the current time 43fe8322adSStefano Zampini - X - the current solution 44fe8322adSStefano Zampini 45fe8322adSStefano Zampini Level: developer 46fe8322adSStefano Zampini 47fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 48fe8322adSStefano Zampini 49db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectoryGet()`, `TSTrajectoryGetVecs()` 50fe8322adSStefano Zampini @*/ 51bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 52bc952696SBarry Smith { 53bc952696SBarry Smith PetscFunctionBegin; 54bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 55fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 56fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 57fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 58fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,4); 59fe8322adSStefano Zampini PetscValidHeaderSpecific(X,VEC_CLASSID,5); 603c633725SBarry Smith PetscCheck(tj->ops->set,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 613c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 62fe8322adSStefano Zampini if (tj->monitor) { 6363a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n",stepnum,(double)time,(PetscInt)!tj->solution_only)); 64fe8322adSStefano Zampini } 659566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0)); 669566063dSJacob Faibussowitsch PetscCall((*tj->ops->set)(tj,ts,stepnum,time,X)); 679566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0)); 681baa6e33SBarry Smith if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh,stepnum,time)); 69fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 70bc952696SBarry Smith PetscFunctionReturn(0); 71bc952696SBarry Smith } 72bc952696SBarry Smith 73fe8322adSStefano Zampini /*@ 74fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 75fe8322adSStefano Zampini 76fe8322adSStefano Zampini Not collective. 77fe8322adSStefano Zampini 78fe8322adSStefano Zampini Input Parameters: 79fe8322adSStefano Zampini . tj - the trajectory object 80fe8322adSStefano Zampini 81fe8322adSStefano Zampini Output Parameter: 82fe8322adSStefano Zampini . steps - the number of steps 83fe8322adSStefano Zampini 84fe8322adSStefano Zampini Level: developer 85fe8322adSStefano Zampini 86db781477SPatrick Sanan .seealso: `TSTrajectorySet()` 87fe8322adSStefano Zampini @*/ 88fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 89fe8322adSStefano Zampini { 90fe8322adSStefano Zampini PetscFunctionBegin; 91fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 92fe8322adSStefano Zampini PetscValidIntPointer(steps,2); 939566063dSJacob Faibussowitsch PetscCall(TSHistoryGetNumSteps(tj->tsh,steps)); 94fe8322adSStefano Zampini PetscFunctionReturn(0); 95fe8322adSStefano Zampini } 96fe8322adSStefano Zampini 97fe8322adSStefano Zampini /*@ 98fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 99fe8322adSStefano Zampini 100fe8322adSStefano Zampini Collective on TS 101fe8322adSStefano Zampini 102fe8322adSStefano Zampini Input Parameters: 103fe8322adSStefano Zampini + tj - the trajectory object 104fe8322adSStefano Zampini . ts - the time stepper object 105fe8322adSStefano Zampini - stepnum - the step number 106fe8322adSStefano Zampini 107fe8322adSStefano Zampini Output Parameter: 108fe8322adSStefano Zampini . time - the time associated with the step number 109fe8322adSStefano Zampini 110fe8322adSStefano Zampini Level: developer 111fe8322adSStefano Zampini 112fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 113fe8322adSStefano Zampini 114db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()` 115fe8322adSStefano Zampini @*/ 116c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 117bc952696SBarry Smith { 118bc952696SBarry Smith PetscFunctionBegin; 1193c633725SBarry Smith PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 120fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 121fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 122fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 123dadcf809SJacob Faibussowitsch PetscValidRealPointer(time,4); 1243c633725SBarry Smith PetscCheck(tj->ops->get,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 1253c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 1263c633725SBarry Smith PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 127fe8322adSStefano Zampini if (tj->monitor) { 12863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n",stepnum,(PetscInt)!tj->solution_only)); 1299566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 130fe8322adSStefano Zampini } 1319566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0)); 1329566063dSJacob Faibussowitsch PetscCall((*tj->ops->get)(tj,ts,stepnum,time)); 1339566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0)); 134bc952696SBarry Smith PetscFunctionReturn(0); 135bc952696SBarry Smith } 136bc952696SBarry Smith 137fe8322adSStefano Zampini /*@ 138fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 139fe8322adSStefano Zampini 140fe8322adSStefano Zampini Collective on TS 141fe8322adSStefano Zampini 142fe8322adSStefano Zampini Input Parameters: 143fe8322adSStefano Zampini + tj - the trajectory object 144fe8322adSStefano Zampini . ts - the time stepper object (optional) 145fe8322adSStefano Zampini - stepnum - the requested step number 146fe8322adSStefano Zampini 1476b867d5aSJose E. Roman Input/Output Parameter: 148fe8322adSStefano Zampini 149fe8322adSStefano Zampini Output Parameters: 150f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number 151f1a722f8SMatthew G. Knepley . U - state vector (can be NULL) 152fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 153fe8322adSStefano Zampini 154fe8322adSStefano Zampini Level: developer 155fe8322adSStefano Zampini 156fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 157fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 158fe8322adSStefano Zampini 159db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()` 160fe8322adSStefano Zampini @*/ 161fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot) 162fe8322adSStefano Zampini { 163fe8322adSStefano Zampini PetscFunctionBegin; 1643c633725SBarry Smith PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 165fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 166fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 167fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 168dadcf809SJacob Faibussowitsch PetscValidRealPointer(time,4); 169fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5); 170fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6); 171fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 1723c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 1739566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0)); 174fe8322adSStefano Zampini if (tj->monitor) { 175fe8322adSStefano Zampini PetscInt pU,pUdot; 176fe8322adSStefano Zampini pU = U ? 1 : 0; 177fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 17863a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n",pU,pUdot,stepnum,(double)*time)); 1799566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 180fe8322adSStefano Zampini } 181fe8322adSStefano Zampini if (U && tj->lag.caching) { 182fe8322adSStefano Zampini PetscObjectId id; 183fe8322adSStefano Zampini PetscObjectState state; 184fe8322adSStefano Zampini 1859566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U,&state)); 1869566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U,&id)); 187fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 188fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 189fe8322adSStefano Zampini } else { 190fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 191fe8322adSStefano Zampini } 192fe8322adSStefano Zampini if (tj->monitor && !U) { 1939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 1949566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n")); 1959566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 1969566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 197fe8322adSStefano Zampini } 198fe8322adSStefano Zampini } 199fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 200fe8322adSStefano Zampini PetscObjectId id; 201fe8322adSStefano Zampini PetscObjectState state; 202fe8322adSStefano Zampini 2039566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot,&state)); 2049566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot,&id)); 205fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 206fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 207fe8322adSStefano Zampini } else { 208fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 209fe8322adSStefano Zampini } 210fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 2129566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n")); 2139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2149566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 215fe8322adSStefano Zampini } 216fe8322adSStefano Zampini } 217fe8322adSStefano Zampini if (!U && !Udot) { 2189566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0)); 219fe8322adSStefano Zampini PetscFunctionReturn(0); 220fe8322adSStefano Zampini } 221fe8322adSStefano Zampini 222fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 2231baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 224fe8322adSStefano Zampini /* cached states will be updated in the function */ 2259566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot)); 226fe8322adSStefano Zampini if (tj->monitor) { 2279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2289566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 229fe8322adSStefano Zampini } 230fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 231fe8322adSStefano Zampini TS fakets = ts; 232fe8322adSStefano Zampini Vec U2; 233fe8322adSStefano Zampini 234fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 235fe8322adSStefano Zampini if (!ts) { 2369566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets)); 237fe8322adSStefano Zampini if (!fakets) { 2389566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj),&fakets)); 2399566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets)); 2409566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets)); 2419566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U,&U2)); 2429566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets,U2)); 2439566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2)); 244fe8322adSStefano Zampini } 245fe8322adSStefano Zampini } 2469566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj,fakets,stepnum,time)); 2479566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets,&U2)); 2489566063dSJacob Faibussowitsch PetscCall(VecCopy(U2,U)); 2499566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state)); 2509566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id)); 251fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 252fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 253fe8322adSStefano Zampini } 2549566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0)); 255fe8322adSStefano Zampini PetscFunctionReturn(0); 256fe8322adSStefano Zampini } 257fe8322adSStefano Zampini 258bc952696SBarry Smith /*@C 259fe2efc57SMark TSTrajectoryViewFromOptions - View from Options 260fe2efc57SMark 261fe2efc57SMark Collective on TSTrajectory 262fe2efc57SMark 263fe2efc57SMark Input Parameters: 264fe2efc57SMark + A - the TSTrajectory context 265736c3998SJose E. Roman . obj - Optional object 266736c3998SJose E. Roman - name - command line option 267fe2efc57SMark 268fe2efc57SMark Level: intermediate 269db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()` 270fe2efc57SMark @*/ 271fe2efc57SMark PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[]) 272fe2efc57SMark { 273fe2efc57SMark PetscFunctionBegin; 274fe2efc57SMark PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1); 2759566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name)); 276fe2efc57SMark PetscFunctionReturn(0); 277fe2efc57SMark } 278fe2efc57SMark 279fe2efc57SMark /*@C 280bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 281bc952696SBarry Smith 282bc952696SBarry Smith Collective on TSTrajectory 283bc952696SBarry Smith 284bc952696SBarry Smith Input Parameters: 285b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 286bc952696SBarry Smith - viewer - visualization context 287bc952696SBarry Smith 288bc952696SBarry Smith Options Database Key: 289e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 290bc952696SBarry Smith 291bc952696SBarry Smith Notes: 292bc952696SBarry Smith The available visualization contexts include 293bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 294bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 295bc952696SBarry Smith output where only the first processor opens 296bc952696SBarry Smith the file. All other processors send their 297bc952696SBarry Smith data to the first processor to print. 298bc952696SBarry Smith 299bc952696SBarry Smith The user can open an alternative visualization context with 300bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 301bc952696SBarry Smith 302df5474d8SHong Zhang Level: developer 303bc952696SBarry Smith 304db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()` 305bc952696SBarry Smith @*/ 306b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 307bc952696SBarry Smith { 308bc952696SBarry Smith PetscBool iascii; 309bc952696SBarry Smith 310bc952696SBarry Smith PetscFunctionBegin; 3111a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 312bc952696SBarry Smith if (!viewer) { 3139566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer)); 314bc952696SBarry Smith } 315bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 316b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 317bc952696SBarry Smith 3189566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii)); 319bc952696SBarry Smith if (iascii) { 3209566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer)); 32163a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n",tj->recomps)); 32263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %" PetscInt_FMT "\n",tj->diskreads)); 32363a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %" PetscInt_FMT "\n",tj->diskwrites)); 324b1d74d50SHong Zhang if (tj->ops->view) { 3259566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 3269566063dSJacob Faibussowitsch PetscCall((*tj->ops->view)(tj,viewer)); 3279566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 328bc952696SBarry Smith } 329bc952696SBarry Smith } 330bc952696SBarry Smith PetscFunctionReturn(0); 331bc952696SBarry Smith } 332bc952696SBarry Smith 333bc952696SBarry Smith /*@C 33478fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 33578fbdcc8SBarry Smith 33678fbdcc8SBarry Smith Collective on TSTrajectory 33778fbdcc8SBarry Smith 33878fbdcc8SBarry Smith Input Parameters: 33978fbdcc8SBarry Smith + tr - the trajectory context 34078fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 34178fbdcc8SBarry Smith 34278fbdcc8SBarry Smith Level: intermediate 34378fbdcc8SBarry Smith 344db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 345db901c5bSHong Zhang 346db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()` 34778fbdcc8SBarry Smith @*/ 34878fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 34978fbdcc8SBarry Smith { 35078fbdcc8SBarry Smith PetscFunctionBegin; 351fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1); 352fe8322adSStefano Zampini PetscValidPointer(names,2); 3539566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 3549566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names,&ctx->names)); 35578fbdcc8SBarry Smith PetscFunctionReturn(0); 35678fbdcc8SBarry Smith } 35778fbdcc8SBarry Smith 35878fbdcc8SBarry Smith /*@C 359fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 36008347785SBarry Smith 36108347785SBarry Smith Collective on TSLGCtx 36208347785SBarry Smith 36308347785SBarry Smith Input Parameters: 36408347785SBarry Smith + tj - the TSTrajectory context 36508347785SBarry Smith . transform - the transform function 36608347785SBarry Smith . destroy - function to destroy the optional context 36708347785SBarry Smith - ctx - optional context used by transform function 36808347785SBarry Smith 36908347785SBarry Smith Level: intermediate 37008347785SBarry Smith 371db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()` 37208347785SBarry Smith @*/ 37308347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 37408347785SBarry Smith { 37508347785SBarry Smith PetscFunctionBegin; 376fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 37708347785SBarry Smith tj->transform = transform; 37808347785SBarry Smith tj->transformdestroy = destroy; 37908347785SBarry Smith tj->transformctx = tctx; 38008347785SBarry Smith PetscFunctionReturn(0); 38108347785SBarry Smith } 38208347785SBarry Smith 383db901c5bSHong Zhang /*@ 384bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 385bc952696SBarry Smith 386d083f849SBarry Smith Collective 387bc952696SBarry Smith 388bc952696SBarry Smith Input Parameter: 3893c0fce88SHong Zhang . comm - the communicator 390bc952696SBarry Smith 391bc952696SBarry Smith Output Parameter: 3923c0fce88SHong Zhang . tj - the trajectory object 393bc952696SBarry Smith 394df5474d8SHong Zhang Level: developer 395bc952696SBarry Smith 39695452b02SPatrick Sanan Notes: 39795452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 398bc952696SBarry Smith 399db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()` 400bc952696SBarry Smith @*/ 401b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 402bc952696SBarry Smith { 403bc952696SBarry Smith TSTrajectory t; 404bc952696SBarry Smith 405bc952696SBarry Smith PetscFunctionBegin; 406b1d74d50SHong Zhang PetscValidPointer(tj,2); 407b1d74d50SHong Zhang *tj = NULL; 4089566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 409bc952696SBarry Smith 4109566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView)); 41168bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4129566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm,&t->tsh)); 413fe8322adSStefano Zampini 414fe8322adSStefano Zampini t->lag.order = 1; 415fe8322adSStefano Zampini t->lag.L = NULL; 416fe8322adSStefano Zampini t->lag.T = NULL; 417fe8322adSStefano Zampini t->lag.W = NULL; 418fe8322adSStefano Zampini t->lag.WW = NULL; 419fe8322adSStefano Zampini t->lag.TW = NULL; 420fe8322adSStefano Zampini t->lag.TT = NULL; 421fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 422fe8322adSStefano Zampini t->lag.Ucached.id = 0; 423fe8322adSStefano Zampini t->lag.Ucached.state = -1; 424fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 425fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 426fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 427fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 428fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 429fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 430fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 431fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 432fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 433ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 434b1d74d50SHong Zhang *tj = t; 43563a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t,"TS-%06" PetscInt_FMT ".bin")); 436bc952696SBarry Smith PetscFunctionReturn(0); 437bc952696SBarry Smith } 438bc952696SBarry Smith 439bc952696SBarry Smith /*@C 440bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 441bc952696SBarry Smith 442bc952696SBarry Smith Collective on TS 443bc952696SBarry Smith 444bc952696SBarry Smith Input Parameters: 4453c0fce88SHong Zhang + tj - the TSTrajectory context 4463c0fce88SHong Zhang . ts - the TS context 4473c0fce88SHong Zhang - type - a known method 448bc952696SBarry Smith 449bc952696SBarry Smith Options Database Command: 450e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 451bc952696SBarry Smith 452df5474d8SHong Zhang Level: developer 453bc952696SBarry Smith 454db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 455bc952696SBarry Smith 456bc952696SBarry Smith @*/ 457fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 458bc952696SBarry Smith { 459972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 460bc952696SBarry Smith PetscBool match; 461bc952696SBarry Smith 462bc952696SBarry Smith PetscFunctionBegin; 463972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 4649566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj,type,&match)); 465bc952696SBarry Smith if (match) PetscFunctionReturn(0); 466bc952696SBarry Smith 4679566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList,type,&r)); 4683c633725SBarry Smith PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 469972caf09SHong Zhang if (tj->ops->destroy) { 4709566063dSJacob Faibussowitsch PetscCall((*(tj)->ops->destroy)(tj)); 471bc952696SBarry Smith 472972caf09SHong Zhang tj->ops->destroy = NULL; 473bc952696SBarry Smith } 4749566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops,sizeof(*tj->ops))); 475bc952696SBarry Smith 4769566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj,type)); 4779566063dSJacob Faibussowitsch PetscCall((*r)(tj,ts)); 478bc952696SBarry Smith PetscFunctionReturn(0); 479bc952696SBarry Smith } 480bc952696SBarry Smith 481881c1a9bSHong Zhang /*@C 482881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 483881c1a9bSHong Zhang 484881c1a9bSHong Zhang Collective on TS 485881c1a9bSHong Zhang 486881c1a9bSHong Zhang Input Parameters: 487881c1a9bSHong Zhang + tj - the TSTrajectory context 488881c1a9bSHong Zhang - ts - the TS context 489881c1a9bSHong Zhang 490881c1a9bSHong Zhang Output Parameters: 491881c1a9bSHong Zhang . type - a known method 492881c1a9bSHong Zhang 493881c1a9bSHong Zhang Level: developer 494881c1a9bSHong Zhang 495db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 496881c1a9bSHong Zhang 497881c1a9bSHong Zhang @*/ 498881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type) 499881c1a9bSHong Zhang { 500881c1a9bSHong Zhang PetscFunctionBegin; 501881c1a9bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 502881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 503881c1a9bSHong Zhang PetscFunctionReturn(0); 504881c1a9bSHong Zhang } 505881c1a9bSHong Zhang 506972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 507972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 5089a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 5092b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 510bc952696SBarry Smith 511bc952696SBarry Smith /*@C 512bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 513bc952696SBarry Smith 514bc952696SBarry Smith Not Collective 515bc952696SBarry Smith 516df5474d8SHong Zhang Level: developer 517bc952696SBarry Smith 518db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()` 519bc952696SBarry Smith @*/ 520bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 521bc952696SBarry Smith { 522bc952696SBarry Smith PetscFunctionBegin; 523560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 524bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 525bc952696SBarry Smith 5269566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic)); 5279566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile)); 5289566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory)); 5299566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization)); 530bc952696SBarry Smith PetscFunctionReturn(0); 531bc952696SBarry Smith } 532bc952696SBarry Smith 533bc952696SBarry Smith /*@ 5341550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5351550c9b9SHong Zhang 5361550c9b9SHong Zhang Collective on TSTrajectory 5371550c9b9SHong Zhang 5381550c9b9SHong Zhang Input Parameter: 5391550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5401550c9b9SHong Zhang 5411550c9b9SHong Zhang Level: developer 5421550c9b9SHong Zhang 543db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5441550c9b9SHong Zhang @*/ 5459a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 5461550c9b9SHong Zhang { 5471550c9b9SHong Zhang PetscFunctionBegin; 5489a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5499a992471SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 5501baa6e33SBarry Smith if (tj->ops->reset) PetscCall((*tj->ops->reset)(tj)); 5519566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5529566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5539566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh)); 554fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5551550c9b9SHong Zhang PetscFunctionReturn(0); 5561550c9b9SHong Zhang } 5571550c9b9SHong Zhang 5581550c9b9SHong Zhang /*@ 559bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 560bc952696SBarry Smith 561bc952696SBarry Smith Collective on TSTrajectory 562bc952696SBarry Smith 563bc952696SBarry Smith Input Parameter: 5643c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 565bc952696SBarry Smith 566df5474d8SHong Zhang Level: developer 567bc952696SBarry Smith 568db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 569bc952696SBarry Smith @*/ 570972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 571bc952696SBarry Smith { 572bc952696SBarry Smith PetscFunctionBegin; 573972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 574972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 575c793f718SLisandro Dalcin if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);} 576bc952696SBarry Smith 5779566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5789566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5799566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W)); 5809566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW)); 5819566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5829566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5839a992471SHong Zhang 5849566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 5859566063dSJacob Faibussowitsch if ((*tj)->ops->destroy) PetscCall((*(*tj)->ops->destroy)((*tj))); 586fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 587fe8322adSStefano Zampini PetscMPIInt rank; 588fe8322adSStefano Zampini MPI_Comm comm; 589fe8322adSStefano Zampini 5909566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)(*tj),&comm)); 5919566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm,&rank)); 592dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5939566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 594fe8322adSStefano Zampini } 595fe8322adSStefano Zampini } 5969566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5979566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5989566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5999566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 600bc952696SBarry Smith PetscFunctionReturn(0); 601bc952696SBarry Smith } 602bc952696SBarry Smith 603bc952696SBarry Smith /* 604772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 605bc952696SBarry Smith 606bc952696SBarry Smith Collective on TSTrajectory 607bc952696SBarry Smith 608bc952696SBarry Smith Input Parameter: 6093c0fce88SHong Zhang + tj - the TSTrajectory context 6103c0fce88SHong Zhang - ts - the TS context 6113c0fce88SHong Zhang 6123c0fce88SHong Zhang Options Database Keys: 6133c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 614bc952696SBarry Smith 615df5474d8SHong Zhang Level: developer 616bc952696SBarry Smith 617db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 618bc952696SBarry Smith */ 6192bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 620bc952696SBarry Smith { 621bc952696SBarry Smith PetscBool opt; 622bc952696SBarry Smith const char *defaultType; 623bc952696SBarry Smith char typeName[256]; 624bc952696SBarry Smith 625bc952696SBarry Smith PetscFunctionBegin; 626b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 627bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 628bc952696SBarry Smith 6299566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6309566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt)); 631bc952696SBarry Smith if (opt) { 6329566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj,ts,typeName)); 633bc952696SBarry Smith } else { 6349566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj,ts,defaultType)); 635bc952696SBarry Smith } 636bc952696SBarry Smith PetscFunctionReturn(0); 637bc952696SBarry Smith } 638bc952696SBarry Smith 639ed695a29SHong Zhang /*@ 6409ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 6419ffb3502SHong Zhang 6429ffb3502SHong Zhang Collective on TSTrajectory 6439ffb3502SHong Zhang 6444165533cSJose E. Roman Input Parameters: 6459ffb3502SHong Zhang + tj - the TSTrajectory context 6469ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 6479ffb3502SHong Zhang 6489ffb3502SHong Zhang Options Database Keys: 6499ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 6509ffb3502SHong Zhang 6519ffb3502SHong Zhang Level: advanced 6529ffb3502SHong Zhang 653db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6549ffb3502SHong Zhang @*/ 6559ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg) 6569ffb3502SHong Zhang { 6579ffb3502SHong Zhang PetscFunctionBegin; 6589ffb3502SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 6599ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 6609ffb3502SHong Zhang tj->usehistory = flg; 6619ffb3502SHong Zhang PetscFunctionReturn(0); 6629ffb3502SHong Zhang } 6639ffb3502SHong Zhang 6649ffb3502SHong Zhang /*@ 665ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 666ed695a29SHong Zhang 667ed695a29SHong Zhang Collective on TSTrajectory 668ed695a29SHong Zhang 6694165533cSJose E. Roman Input Parameters: 670ed695a29SHong Zhang + tj - the TSTrajectory context 671ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 672ed695a29SHong Zhang 6733c0fce88SHong Zhang Options Database Keys: 674063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 6753c0fce88SHong Zhang 676df5474d8SHong Zhang Level: developer 677ed695a29SHong Zhang 678db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 679ed695a29SHong Zhang @*/ 6802bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 681ed695a29SHong Zhang { 682ed695a29SHong Zhang PetscFunctionBegin; 683ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 684ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 685fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 686fe8322adSStefano Zampini else tj->monitor = NULL; 687ed695a29SHong Zhang PetscFunctionReturn(0); 688ed695a29SHong Zhang } 689ed695a29SHong Zhang 690bc952696SBarry Smith /*@ 69164fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 69264fc91eeSBarry Smith 69364fc91eeSBarry Smith Collective on TSTrajectory 69464fc91eeSBarry Smith 6954165533cSJose E. Roman Input Parameters: 69664fc91eeSBarry Smith + tj - the TSTrajectory context 69764fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 69864fc91eeSBarry Smith 69964fc91eeSBarry Smith Options Database Keys: 70064fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 70164fc91eeSBarry Smith 70295452b02SPatrick Sanan Notes: 70395452b02SPatrick Sanan By default the TSTrajectory used for adjoint computations, TSTRAJECTORYBASIC, removes the files it generates at the end of the run. This causes the files to be kept. 70464fc91eeSBarry Smith 70564fc91eeSBarry Smith Level: advanced 70664fc91eeSBarry Smith 707db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70864fc91eeSBarry Smith @*/ 70964fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 71064fc91eeSBarry Smith { 71164fc91eeSBarry Smith PetscFunctionBegin; 71264fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 71364fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 71464fc91eeSBarry Smith tj->keepfiles = flg; 71564fc91eeSBarry Smith PetscFunctionReturn(0); 71664fc91eeSBarry Smith } 71764fc91eeSBarry Smith 718db901c5bSHong Zhang /*@C 71964e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 72064e38db7SHong Zhang 72164e38db7SHong Zhang Collective on TSTrajectory 72264e38db7SHong Zhang 7234165533cSJose E. Roman Input Parameters: 72464e38db7SHong Zhang + tj - the TSTrajectory context 72564e38db7SHong Zhang - dirname - the directory name 72664e38db7SHong Zhang 72764e38db7SHong Zhang Options Database Keys: 72864e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 72964e38db7SHong Zhang 73095452b02SPatrick Sanan Notes: 73195452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7321585b412SBarry Smith 73364e38db7SHong Zhang Level: developer 73464e38db7SHong Zhang 735c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73664e38db7SHong Zhang @*/ 73764e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 73864e38db7SHong Zhang { 739a17281aeSStefano Zampini PetscBool flg; 740a17281aeSStefano Zampini 74164e38db7SHong Zhang PetscFunctionBegin; 74264e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 7439566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname,dirname,&flg)); 744*049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup"); 7459566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7469566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname,&tj->dirname)); 74764e38db7SHong Zhang PetscFunctionReturn(0); 74864e38db7SHong Zhang } 74964e38db7SHong Zhang 750db901c5bSHong Zhang /*@C 75164e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 75264e38db7SHong Zhang 75364e38db7SHong Zhang Collective on TSTrajectory 75464e38db7SHong Zhang 7554165533cSJose E. Roman Input Parameters: 75664e38db7SHong Zhang + tj - the TSTrajectory context 7571585b412SBarry Smith - filetemplate - the template 75864e38db7SHong Zhang 75964e38db7SHong Zhang Options Database Keys: 7601585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7611585b412SBarry Smith 76295452b02SPatrick Sanan Notes: 76363a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7641585b412SBarry Smith 76563a3b9bcSJacob Faibussowitsch The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06" PetscInt_FMT " is replaced by the 7661585b412SBarry Smith timestep counter 76764e38db7SHong Zhang 76864e38db7SHong Zhang Level: developer 76964e38db7SHong Zhang 770c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 77164e38db7SHong Zhang @*/ 77264e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 77364e38db7SHong Zhang { 7749afe7f3eSBarry Smith const char *ptr,*ptr2; 7759afe7f3eSBarry Smith 77664e38db7SHong Zhang PetscFunctionBegin; 77764e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 77863a3b9bcSJacob Faibussowitsch PetscValidCharPointer(filetemplate,2); 7793c633725SBarry Smith PetscCheck(!tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 7809afe7f3eSBarry Smith 78163a3b9bcSJacob Faibussowitsch PetscCheck(filetemplate[0],PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin"); 7829afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7839566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate,"%",(char**)&ptr)); 78463a3b9bcSJacob Faibussowitsch PetscCheck(ptr,PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06" PetscInt_FMT ".bin"); 7859afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78663a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX",*ptr,(char**)&ptr2)); 78763a3b9bcSJacob Faibussowitsch PetscCheck(ptr2 || (*ptr >= '0' && *ptr <= '9'),PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06" PetscInt_FMT ".bin"); 7889afe7f3eSBarry Smith if (ptr2) break; 7899afe7f3eSBarry Smith } 7909566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7919566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate,&tj->filetemplate)); 79264e38db7SHong Zhang PetscFunctionReturn(0); 79364e38db7SHong Zhang } 79464e38db7SHong Zhang 79564e38db7SHong Zhang /*@ 796bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 797bc952696SBarry Smith 798bc952696SBarry Smith Collective on TSTrajectory 799bc952696SBarry Smith 800d8d19677SJose E. Roman Input Parameters: 8013c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 8023c0fce88SHong Zhang - ts - the TS context 803bc952696SBarry Smith 804bc952696SBarry Smith Options Database Keys: 8053c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 80664fc91eeSBarry Smith . -ts_trajectory_keep_files <true,false> - keep the files generated by the code after the program ends. This is true by default for TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 807063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 808bc952696SBarry Smith 809df5474d8SHong Zhang Level: developer 810bc952696SBarry Smith 81195452b02SPatrick Sanan Notes: 81295452b02SPatrick Sanan This is not normally called directly by users 813bc952696SBarry Smith 814db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 815bc952696SBarry Smith @*/ 816972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 817bc952696SBarry Smith { 818ed695a29SHong Zhang PetscBool set,flg; 81964e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 820bc952696SBarry Smith 821bc952696SBarry Smith PetscFunctionBegin; 822b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 823fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 824d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8259566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts)); 8269566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL)); 8279566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set)); 8289566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj,flg)); 8299566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL)); 8309566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL)); 8319566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL)); 8329566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL)); 8339566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set)); 8349566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj,flg)); 83564e38db7SHong Zhang 8369566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set)); 8371baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj,dirname)); 83864e38db7SHong Zhang 83963a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set)); 8401baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj,filetemplate)); 84164e38db7SHong Zhang 84264e38db7SHong Zhang /* Handle specific TSTrajectory options */ 8431baa6e33SBarry Smith if (tj->ops->setfromoptions) PetscCall((*tj->ops->setfromoptions)(PetscOptionsObject,tj)); 844d0609cedSBarry Smith PetscOptionsEnd(); 845bc952696SBarry Smith PetscFunctionReturn(0); 846bc952696SBarry Smith } 84768bece0bSHong Zhang 84868bece0bSHong Zhang /*@ 84968bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 85068bece0bSHong Zhang of a TS trajectory. 85168bece0bSHong Zhang 85268bece0bSHong Zhang Collective on TS 85368bece0bSHong Zhang 854d8d19677SJose E. Roman Input Parameters: 8553c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8563c0fce88SHong Zhang - tj - the TS trajectory context 85768bece0bSHong Zhang 858df5474d8SHong Zhang Level: developer 85968bece0bSHong Zhang 860db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 86168bece0bSHong Zhang @*/ 86268bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 86368bece0bSHong Zhang { 8649afe7f3eSBarry Smith size_t s1,s2; 86568bece0bSHong Zhang 86668bece0bSHong Zhang PetscFunctionBegin; 86768bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 86868bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 869fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 87068bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 87168bece0bSHong Zhang 8729566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0)); 87368bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 8749566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC)); 87568bece0bSHong Zhang } 8761baa6e33SBarry Smith if (tj->ops->setup) PetscCall((*tj->ops->setup)(tj,ts)); 87768bece0bSHong Zhang 87868bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 87953b27ddbSHong Zhang 88053b27ddbSHong Zhang /* Set the counters to zero */ 8811a5a771fSHong Zhang tj->recomps = 0; 88253b27ddbSHong Zhang tj->diskreads = 0; 88353b27ddbSHong Zhang tj->diskwrites = 0; 8849566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname,&s1)); 8859566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate,&s2)); 8869566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8879566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate)); 8889566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate)); 8899566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0)); 89068bece0bSHong Zhang PetscFunctionReturn(0); 89168bece0bSHong Zhang } 892fe8322adSStefano Zampini 893fe8322adSStefano Zampini /*@ 894fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 895fe8322adSStefano Zampini 896fe8322adSStefano Zampini Collective on TSTrajectory 897fe8322adSStefano Zampini 898d8d19677SJose E. Roman Input Parameters: 899fe8322adSStefano Zampini + tj - the TS trajectory context 900fe8322adSStefano Zampini - flg - the boolean flag 901fe8322adSStefano Zampini 902fe8322adSStefano Zampini Level: developer 903fe8322adSStefano Zampini 904db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 905fe8322adSStefano Zampini @*/ 906fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only) 907fe8322adSStefano Zampini { 908fe8322adSStefano Zampini PetscFunctionBegin; 909fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 910fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj,solution_only,2); 911fe8322adSStefano Zampini tj->solution_only = solution_only; 912fe8322adSStefano Zampini PetscFunctionReturn(0); 913fe8322adSStefano Zampini } 914fe8322adSStefano Zampini 915fe8322adSStefano Zampini /*@ 916fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 917fe8322adSStefano Zampini 918fe8322adSStefano Zampini Logically collective on TSTrajectory 919fe8322adSStefano Zampini 920fe8322adSStefano Zampini Input Parameter: 921fe8322adSStefano Zampini . tj - the TS trajectory context 922fe8322adSStefano Zampini 923fe8322adSStefano Zampini Output Parameter: 924d8d19677SJose E. Roman . flg - the boolean flag 925fe8322adSStefano Zampini 926fe8322adSStefano Zampini Level: developer 927fe8322adSStefano Zampini 928db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 929fe8322adSStefano Zampini @*/ 930fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only) 931fe8322adSStefano Zampini { 932fe8322adSStefano Zampini PetscFunctionBegin; 933fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 934dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only,2); 935fe8322adSStefano Zampini *solution_only = tj->solution_only; 936fe8322adSStefano Zampini PetscFunctionReturn(0); 937fe8322adSStefano Zampini } 938fe8322adSStefano Zampini 939fe8322adSStefano Zampini /*@ 940fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 941fe8322adSStefano Zampini 942fe8322adSStefano Zampini Collective on TSTrajectory 943fe8322adSStefano Zampini 944d8d19677SJose E. Roman Input Parameters: 945fe8322adSStefano Zampini + tj - the TS trajectory context 946fe8322adSStefano Zampini . ts - the TS solver context 947fe8322adSStefano Zampini - time - the requested time 948fe8322adSStefano Zampini 949d8d19677SJose E. Roman Output Parameters: 950fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 951fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 952fe8322adSStefano Zampini 953fe8322adSStefano Zampini Level: developer 954fe8322adSStefano Zampini 955fe8322adSStefano Zampini Notes: The vectors are interpolated if time does not match any time step stored in the TSTrajectory(). Pass NULL to not request a vector. 956fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 957fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 958fe8322adSStefano Zampini 959db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 960fe8322adSStefano Zampini @*/ 961fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 962fe8322adSStefano Zampini { 963fe8322adSStefano Zampini PetscFunctionBegin; 964fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 965fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 966fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,3); 967fe8322adSStefano Zampini if (U) PetscValidPointer(U,4); 968fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot,5); 969fe8322adSStefano Zampini if (U && !tj->U) { 970fe8322adSStefano Zampini DM dm; 971fe8322adSStefano Zampini 9729566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts,&dm)); 9739566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm,&tj->U)); 974fe8322adSStefano Zampini } 975fe8322adSStefano Zampini if (Udot && !tj->Udot) { 976fe8322adSStefano Zampini DM dm; 977fe8322adSStefano Zampini 9789566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts,&dm)); 9799566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm,&tj->Udot)); 980fe8322adSStefano Zampini } 9819566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL)); 982fe8322adSStefano Zampini if (U) { 9839566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 984fe8322adSStefano Zampini *U = tj->U; 985fe8322adSStefano Zampini } 986fe8322adSStefano Zampini if (Udot) { 9879566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 988fe8322adSStefano Zampini *Udot = tj->Udot; 989fe8322adSStefano Zampini } 990fe8322adSStefano Zampini PetscFunctionReturn(0); 991fe8322adSStefano Zampini } 992fe8322adSStefano Zampini 993fe8322adSStefano Zampini /*@ 994fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 995fe8322adSStefano Zampini 996fe8322adSStefano Zampini Collective on TSTrajectory 997fe8322adSStefano Zampini 998d8d19677SJose E. Roman Input Parameters: 999fe8322adSStefano Zampini + tj - the TS trajectory context 1000fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1001fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1002fe8322adSStefano Zampini 1003fe8322adSStefano Zampini Level: developer 1004fe8322adSStefano Zampini 1005db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()` 1006fe8322adSStefano Zampini @*/ 1007fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1008fe8322adSStefano Zampini { 1009fe8322adSStefano Zampini PetscFunctionBegin; 1010fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1011fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2); 1012fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3); 10133c633725SBarry Smith PetscCheck(!U || *U == tj->U,PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10143c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot,PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1015fe8322adSStefano Zampini if (U) { 10169566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1017fe8322adSStefano Zampini *U = NULL; 1018fe8322adSStefano Zampini } 1019fe8322adSStefano Zampini if (Udot) { 10209566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1021fe8322adSStefano Zampini *Udot = NULL; 1022fe8322adSStefano Zampini } 1023fe8322adSStefano Zampini PetscFunctionReturn(0); 1024fe8322adSStefano Zampini } 1025