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->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 61fe8322adSStefano Zampini if (tj->monitor) { 6263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %" PetscInt_FMT ", time %g (stages %" PetscInt_FMT ")\n",stepnum,(double)time,(PetscInt)!tj->solution_only)); 63fe8322adSStefano Zampini } 649566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0)); 65*dbbe0bcdSBarry Smith PetscUseTypeMethod(tj,set ,ts,stepnum,time,X); 669566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0)); 671baa6e33SBarry Smith if (tj->usehistory) PetscCall(TSHistoryUpdate(tj->tsh,stepnum,time)); 68fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 69bc952696SBarry Smith PetscFunctionReturn(0); 70bc952696SBarry Smith } 71bc952696SBarry Smith 72fe8322adSStefano Zampini /*@ 73fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 74fe8322adSStefano Zampini 75fe8322adSStefano Zampini Not collective. 76fe8322adSStefano Zampini 77fe8322adSStefano Zampini Input Parameters: 78fe8322adSStefano Zampini . tj - the trajectory object 79fe8322adSStefano Zampini 80fe8322adSStefano Zampini Output Parameter: 81fe8322adSStefano Zampini . steps - the number of steps 82fe8322adSStefano Zampini 83fe8322adSStefano Zampini Level: developer 84fe8322adSStefano Zampini 85db781477SPatrick Sanan .seealso: `TSTrajectorySet()` 86fe8322adSStefano Zampini @*/ 87fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 88fe8322adSStefano Zampini { 89fe8322adSStefano Zampini PetscFunctionBegin; 90fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 91fe8322adSStefano Zampini PetscValidIntPointer(steps,2); 929566063dSJacob Faibussowitsch PetscCall(TSHistoryGetNumSteps(tj->tsh,steps)); 93fe8322adSStefano Zampini PetscFunctionReturn(0); 94fe8322adSStefano Zampini } 95fe8322adSStefano Zampini 96fe8322adSStefano Zampini /*@ 97fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 98fe8322adSStefano Zampini 99fe8322adSStefano Zampini Collective on TS 100fe8322adSStefano Zampini 101fe8322adSStefano Zampini Input Parameters: 102fe8322adSStefano Zampini + tj - the trajectory object 103fe8322adSStefano Zampini . ts - the time stepper object 104fe8322adSStefano Zampini - stepnum - the step number 105fe8322adSStefano Zampini 106fe8322adSStefano Zampini Output Parameter: 107fe8322adSStefano Zampini . time - the time associated with the step number 108fe8322adSStefano Zampini 109fe8322adSStefano Zampini Level: developer 110fe8322adSStefano Zampini 111fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 112fe8322adSStefano Zampini 113db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGetVecs()`, `TSGetSolution()` 114fe8322adSStefano Zampini @*/ 115c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 116bc952696SBarry Smith { 117bc952696SBarry Smith PetscFunctionBegin; 1183c633725SBarry Smith PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 119fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 120fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 121fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 122dadcf809SJacob Faibussowitsch PetscValidRealPointer(time,4); 1233c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 1243c633725SBarry Smith PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 125fe8322adSStefano Zampini if (tj->monitor) { 12663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %" PetscInt_FMT ", stages %" PetscInt_FMT "\n",stepnum,(PetscInt)!tj->solution_only)); 1279566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 128fe8322adSStefano Zampini } 1299566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0)); 130*dbbe0bcdSBarry Smith PetscUseTypeMethod(tj,get ,ts,stepnum,time); 1319566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0)); 132bc952696SBarry Smith PetscFunctionReturn(0); 133bc952696SBarry Smith } 134bc952696SBarry Smith 135fe8322adSStefano Zampini /*@ 136fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 137fe8322adSStefano Zampini 138fe8322adSStefano Zampini Collective on TS 139fe8322adSStefano Zampini 140fe8322adSStefano Zampini Input Parameters: 141fe8322adSStefano Zampini + tj - the trajectory object 142fe8322adSStefano Zampini . ts - the time stepper object (optional) 143fe8322adSStefano Zampini - stepnum - the requested step number 144fe8322adSStefano Zampini 1456b867d5aSJose E. Roman Input/Output Parameter: 146fe8322adSStefano Zampini 147fe8322adSStefano Zampini Output Parameters: 148f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number 149f1a722f8SMatthew G. Knepley . U - state vector (can be NULL) 150fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 151fe8322adSStefano Zampini 152fe8322adSStefano Zampini Level: developer 153fe8322adSStefano Zampini 154fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 155fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 156fe8322adSStefano Zampini 157db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySet()`, `TSTrajectoryGet()` 158fe8322adSStefano Zampini @*/ 159fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot) 160fe8322adSStefano Zampini { 161fe8322adSStefano Zampini PetscFunctionBegin; 1623c633725SBarry Smith PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 163fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 164fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 165fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 166dadcf809SJacob Faibussowitsch PetscValidRealPointer(time,4); 167fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5); 168fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6); 169fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 1703c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 1719566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0)); 172fe8322adSStefano Zampini if (tj->monitor) { 173fe8322adSStefano Zampini PetscInt pU,pUdot; 174fe8322adSStefano Zampini pU = U ? 1 : 0; 175fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 17663a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %" PetscInt_FMT " %" PetscInt_FMT ": stepnum %" PetscInt_FMT ", time %g\n",pU,pUdot,stepnum,(double)*time)); 1779566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 178fe8322adSStefano Zampini } 179fe8322adSStefano Zampini if (U && tj->lag.caching) { 180fe8322adSStefano Zampini PetscObjectId id; 181fe8322adSStefano Zampini PetscObjectState state; 182fe8322adSStefano Zampini 1839566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U,&state)); 1849566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U,&id)); 185fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 186fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 187fe8322adSStefano Zampini } else { 188fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 189fe8322adSStefano Zampini } 190fe8322adSStefano Zampini if (tj->monitor && !U) { 1919566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 1929566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n")); 1939566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 1949566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 195fe8322adSStefano Zampini } 196fe8322adSStefano Zampini } 197fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 198fe8322adSStefano Zampini PetscObjectId id; 199fe8322adSStefano Zampini PetscObjectState state; 200fe8322adSStefano Zampini 2019566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)Udot,&state)); 2029566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)Udot,&id)); 203fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 204fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 205fe8322adSStefano Zampini } else { 206fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 207fe8322adSStefano Zampini } 208fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2099566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 2109566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n")); 2119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2129566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 213fe8322adSStefano Zampini } 214fe8322adSStefano Zampini } 215fe8322adSStefano Zampini if (!U && !Udot) { 2169566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0)); 217fe8322adSStefano Zampini PetscFunctionReturn(0); 218fe8322adSStefano Zampini } 219fe8322adSStefano Zampini 220fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 2211baa6e33SBarry Smith if (tj->monitor) PetscCall(PetscViewerASCIIPushTab(tj->monitor)); 222fe8322adSStefano Zampini /* cached states will be updated in the function */ 2239566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot)); 224fe8322adSStefano Zampini if (tj->monitor) { 2259566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(tj->monitor)); 2269566063dSJacob Faibussowitsch PetscCall(PetscViewerFlush(tj->monitor)); 227fe8322adSStefano Zampini } 228fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 229fe8322adSStefano Zampini TS fakets = ts; 230fe8322adSStefano Zampini Vec U2; 231fe8322adSStefano Zampini 232fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 233fe8322adSStefano Zampini if (!ts) { 2349566063dSJacob Faibussowitsch PetscCall(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets)); 235fe8322adSStefano Zampini if (!fakets) { 2369566063dSJacob Faibussowitsch PetscCall(TSCreate(PetscObjectComm((PetscObject)tj),&fakets)); 2379566063dSJacob Faibussowitsch PetscCall(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets)); 2389566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)fakets)); 2399566063dSJacob Faibussowitsch PetscCall(VecDuplicate(U,&U2)); 2409566063dSJacob Faibussowitsch PetscCall(TSSetSolution(fakets,U2)); 2419566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)U2)); 242fe8322adSStefano Zampini } 243fe8322adSStefano Zampini } 2449566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGet(tj,fakets,stepnum,time)); 2459566063dSJacob Faibussowitsch PetscCall(TSGetSolution(fakets,&U2)); 2469566063dSJacob Faibussowitsch PetscCall(VecCopy(U2,U)); 2479566063dSJacob Faibussowitsch PetscCall(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state)); 2489566063dSJacob Faibussowitsch PetscCall(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id)); 249fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 250fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 251fe8322adSStefano Zampini } 2529566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0)); 253fe8322adSStefano Zampini PetscFunctionReturn(0); 254fe8322adSStefano Zampini } 255fe8322adSStefano Zampini 256bc952696SBarry Smith /*@C 257fe2efc57SMark TSTrajectoryViewFromOptions - View from Options 258fe2efc57SMark 259fe2efc57SMark Collective on TSTrajectory 260fe2efc57SMark 261fe2efc57SMark Input Parameters: 262fe2efc57SMark + A - the TSTrajectory context 263736c3998SJose E. Roman . obj - Optional object 264736c3998SJose E. Roman - name - command line option 265fe2efc57SMark 266fe2efc57SMark Level: intermediate 267db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSTrajectoryView`, `PetscObjectViewFromOptions()`, `TSTrajectoryCreate()` 268fe2efc57SMark @*/ 269fe2efc57SMark PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[]) 270fe2efc57SMark { 271fe2efc57SMark PetscFunctionBegin; 272fe2efc57SMark PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1); 2739566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name)); 274fe2efc57SMark PetscFunctionReturn(0); 275fe2efc57SMark } 276fe2efc57SMark 277fe2efc57SMark /*@C 278bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 279bc952696SBarry Smith 280bc952696SBarry Smith Collective on TSTrajectory 281bc952696SBarry Smith 282bc952696SBarry Smith Input Parameters: 283b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 284bc952696SBarry Smith - viewer - visualization context 285bc952696SBarry Smith 286bc952696SBarry Smith Options Database Key: 287e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 288bc952696SBarry Smith 289bc952696SBarry Smith Notes: 290bc952696SBarry Smith The available visualization contexts include 291bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 292bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 293bc952696SBarry Smith output where only the first processor opens 294bc952696SBarry Smith the file. All other processors send their 295bc952696SBarry Smith data to the first processor to print. 296bc952696SBarry Smith 297bc952696SBarry Smith The user can open an alternative visualization context with 298bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 299bc952696SBarry Smith 300df5474d8SHong Zhang Level: developer 301bc952696SBarry Smith 302db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()` 303bc952696SBarry Smith @*/ 304b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 305bc952696SBarry Smith { 306bc952696SBarry Smith PetscBool iascii; 307bc952696SBarry Smith 308bc952696SBarry Smith PetscFunctionBegin; 3091a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 310bc952696SBarry Smith if (!viewer) { 3119566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer)); 312bc952696SBarry Smith } 313bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 314b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 315bc952696SBarry Smith 3169566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii)); 317bc952696SBarry Smith if (iascii) { 3189566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer)); 31963a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %" PetscInt_FMT "\n",tj->recomps)); 32063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %" PetscInt_FMT "\n",tj->diskreads)); 32163a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %" PetscInt_FMT "\n",tj->diskwrites)); 3229566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 323*dbbe0bcdSBarry Smith PetscTryTypeMethod(tj,view ,viewer); 3249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 325bc952696SBarry Smith } 326bc952696SBarry Smith PetscFunctionReturn(0); 327bc952696SBarry Smith } 328bc952696SBarry Smith 329bc952696SBarry Smith /*@C 33078fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 33178fbdcc8SBarry Smith 33278fbdcc8SBarry Smith Collective on TSTrajectory 33378fbdcc8SBarry Smith 33478fbdcc8SBarry Smith Input Parameters: 33578fbdcc8SBarry Smith + tr - the trajectory context 33678fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 33778fbdcc8SBarry Smith 33878fbdcc8SBarry Smith Level: intermediate 33978fbdcc8SBarry Smith 340db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 341db901c5bSHong Zhang 342db781477SPatrick Sanan .seealso: `TSTrajectory`, `TSGetTrajectory()` 34378fbdcc8SBarry Smith @*/ 34478fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 34578fbdcc8SBarry Smith { 34678fbdcc8SBarry Smith PetscFunctionBegin; 347fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1); 348fe8322adSStefano Zampini PetscValidPointer(names,2); 3499566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&ctx->names)); 3509566063dSJacob Faibussowitsch PetscCall(PetscStrArrayallocpy(names,&ctx->names)); 35178fbdcc8SBarry Smith PetscFunctionReturn(0); 35278fbdcc8SBarry Smith } 35378fbdcc8SBarry Smith 35478fbdcc8SBarry Smith /*@C 355fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 35608347785SBarry Smith 35708347785SBarry Smith Collective on TSLGCtx 35808347785SBarry Smith 35908347785SBarry Smith Input Parameters: 36008347785SBarry Smith + tj - the TSTrajectory context 36108347785SBarry Smith . transform - the transform function 36208347785SBarry Smith . destroy - function to destroy the optional context 36308347785SBarry Smith - ctx - optional context used by transform function 36408347785SBarry Smith 36508347785SBarry Smith Level: intermediate 36608347785SBarry Smith 367db781477SPatrick Sanan .seealso: `TSTrajectorySetVariableNames()`, `TSTrajectory`, `TSMonitorLGSetTransform()` 36808347785SBarry Smith @*/ 36908347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 37008347785SBarry Smith { 37108347785SBarry Smith PetscFunctionBegin; 372fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 37308347785SBarry Smith tj->transform = transform; 37408347785SBarry Smith tj->transformdestroy = destroy; 37508347785SBarry Smith tj->transformctx = tctx; 37608347785SBarry Smith PetscFunctionReturn(0); 37708347785SBarry Smith } 37808347785SBarry Smith 379db901c5bSHong Zhang /*@ 380bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 381bc952696SBarry Smith 382d083f849SBarry Smith Collective 383bc952696SBarry Smith 384bc952696SBarry Smith Input Parameter: 3853c0fce88SHong Zhang . comm - the communicator 386bc952696SBarry Smith 387bc952696SBarry Smith Output Parameter: 3883c0fce88SHong Zhang . tj - the trajectory object 389bc952696SBarry Smith 390df5474d8SHong Zhang Level: developer 391bc952696SBarry Smith 39295452b02SPatrick Sanan Notes: 39395452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 394bc952696SBarry Smith 395db781477SPatrick Sanan .seealso: `TSTrajectorySetUp()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()`, `TSTrajectorySetVariableNames()`, `TSGetTrajectory()`, `TSTrajectorySetKeepFiles()` 396bc952696SBarry Smith @*/ 397b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 398bc952696SBarry Smith { 399bc952696SBarry Smith TSTrajectory t; 400bc952696SBarry Smith 401bc952696SBarry Smith PetscFunctionBegin; 402b1d74d50SHong Zhang PetscValidPointer(tj,2); 403b1d74d50SHong Zhang *tj = NULL; 4049566063dSJacob Faibussowitsch PetscCall(TSInitializePackage()); 405bc952696SBarry Smith 4069566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView)); 40768bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4089566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(comm,&t->tsh)); 409fe8322adSStefano Zampini 410fe8322adSStefano Zampini t->lag.order = 1; 411fe8322adSStefano Zampini t->lag.L = NULL; 412fe8322adSStefano Zampini t->lag.T = NULL; 413fe8322adSStefano Zampini t->lag.W = NULL; 414fe8322adSStefano Zampini t->lag.WW = NULL; 415fe8322adSStefano Zampini t->lag.TW = NULL; 416fe8322adSStefano Zampini t->lag.TT = NULL; 417fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 418fe8322adSStefano Zampini t->lag.Ucached.id = 0; 419fe8322adSStefano Zampini t->lag.Ucached.state = -1; 420fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 421fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 422fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 423fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 424fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 425fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 426fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 427fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 428fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 429ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 430b1d74d50SHong Zhang *tj = t; 43163a3b9bcSJacob Faibussowitsch PetscCall(TSTrajectorySetFiletemplate(t,"TS-%06" PetscInt_FMT ".bin")); 432bc952696SBarry Smith PetscFunctionReturn(0); 433bc952696SBarry Smith } 434bc952696SBarry Smith 435bc952696SBarry Smith /*@C 436bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 437bc952696SBarry Smith 438bc952696SBarry Smith Collective on TS 439bc952696SBarry Smith 440bc952696SBarry Smith Input Parameters: 4413c0fce88SHong Zhang + tj - the TSTrajectory context 4423c0fce88SHong Zhang . ts - the TS context 4433c0fce88SHong Zhang - type - a known method 444bc952696SBarry Smith 445bc952696SBarry Smith Options Database Command: 446e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 447bc952696SBarry Smith 448df5474d8SHong Zhang Level: developer 449bc952696SBarry Smith 450db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetType()` 451bc952696SBarry Smith 452bc952696SBarry Smith @*/ 453fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 454bc952696SBarry Smith { 455972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 456bc952696SBarry Smith PetscBool match; 457bc952696SBarry Smith 458bc952696SBarry Smith PetscFunctionBegin; 459972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 4609566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tj,type,&match)); 461bc952696SBarry Smith if (match) PetscFunctionReturn(0); 462bc952696SBarry Smith 4639566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TSTrajectoryList,type,&r)); 4643c633725SBarry Smith PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 465972caf09SHong Zhang if (tj->ops->destroy) { 4669566063dSJacob Faibussowitsch PetscCall((*(tj)->ops->destroy)(tj)); 467bc952696SBarry Smith 468972caf09SHong Zhang tj->ops->destroy = NULL; 469bc952696SBarry Smith } 4709566063dSJacob Faibussowitsch PetscCall(PetscMemzero(tj->ops,sizeof(*tj->ops))); 471bc952696SBarry Smith 4729566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tj,type)); 4739566063dSJacob Faibussowitsch PetscCall((*r)(tj,ts)); 474bc952696SBarry Smith PetscFunctionReturn(0); 475bc952696SBarry Smith } 476bc952696SBarry Smith 477881c1a9bSHong Zhang /*@C 478881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 479881c1a9bSHong Zhang 480881c1a9bSHong Zhang Collective on TS 481881c1a9bSHong Zhang 482881c1a9bSHong Zhang Input Parameters: 483881c1a9bSHong Zhang + tj - the TSTrajectory context 484881c1a9bSHong Zhang - ts - the TS context 485881c1a9bSHong Zhang 486881c1a9bSHong Zhang Output Parameters: 487881c1a9bSHong Zhang . type - a known method 488881c1a9bSHong Zhang 489881c1a9bSHong Zhang Level: developer 490881c1a9bSHong Zhang 491db781477SPatrick Sanan .seealso: `TS`, `TSTrajectoryCreate()`, `TSTrajectorySetFromOptions()`, `TSTrajectoryDestroy()`, `TSTrajectorySetType()` 492881c1a9bSHong Zhang 493881c1a9bSHong Zhang @*/ 494881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type) 495881c1a9bSHong Zhang { 496881c1a9bSHong Zhang PetscFunctionBegin; 497881c1a9bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 498881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 499881c1a9bSHong Zhang PetscFunctionReturn(0); 500881c1a9bSHong Zhang } 501881c1a9bSHong Zhang 502972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 503972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 5049a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 5052b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 506bc952696SBarry Smith 507bc952696SBarry Smith /*@C 508bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 509bc952696SBarry Smith 510bc952696SBarry Smith Not Collective 511bc952696SBarry Smith 512df5474d8SHong Zhang Level: developer 513bc952696SBarry Smith 514db781477SPatrick Sanan .seealso: `TSTrajectoryRegister()` 515bc952696SBarry Smith @*/ 516bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 517bc952696SBarry Smith { 518bc952696SBarry Smith PetscFunctionBegin; 519560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 520bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 521bc952696SBarry Smith 5229566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic)); 5239566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile)); 5249566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory)); 5259566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization)); 526bc952696SBarry Smith PetscFunctionReturn(0); 527bc952696SBarry Smith } 528bc952696SBarry Smith 529bc952696SBarry Smith /*@ 5301550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5311550c9b9SHong Zhang 5321550c9b9SHong Zhang Collective on TSTrajectory 5331550c9b9SHong Zhang 5341550c9b9SHong Zhang Input Parameter: 5351550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5361550c9b9SHong Zhang 5371550c9b9SHong Zhang Level: developer 5381550c9b9SHong Zhang 539db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 5401550c9b9SHong Zhang @*/ 5419a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 5421550c9b9SHong Zhang { 5431550c9b9SHong Zhang PetscFunctionBegin; 5449a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5459a992471SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 546*dbbe0bcdSBarry Smith PetscTryTypeMethod(tj,reset); 5479566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 5489566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&tj->tsh)); 5499566063dSJacob Faibussowitsch PetscCall(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh)); 550fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5511550c9b9SHong Zhang PetscFunctionReturn(0); 5521550c9b9SHong Zhang } 5531550c9b9SHong Zhang 5541550c9b9SHong Zhang /*@ 555bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 556bc952696SBarry Smith 557bc952696SBarry Smith Collective on TSTrajectory 558bc952696SBarry Smith 559bc952696SBarry Smith Input Parameter: 5603c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 561bc952696SBarry Smith 562df5474d8SHong Zhang Level: developer 563bc952696SBarry Smith 564db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectorySetUp()` 565bc952696SBarry Smith @*/ 566972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 567bc952696SBarry Smith { 568bc952696SBarry Smith PetscFunctionBegin; 569972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 570972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 571c793f718SLisandro Dalcin if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);} 572bc952696SBarry Smith 5739566063dSJacob Faibussowitsch PetscCall(TSTrajectoryReset(*tj)); 5749566063dSJacob Faibussowitsch PetscCall(TSHistoryDestroy(&(*tj)->tsh)); 5759566063dSJacob Faibussowitsch PetscCall(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W)); 5769566063dSJacob Faibussowitsch PetscCall(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW)); 5779566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->U)); 5789566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tj)->Udot)); 5799a992471SHong Zhang 5809566063dSJacob Faibussowitsch if ((*tj)->transformdestroy) PetscCall((*(*tj)->transformdestroy)((*tj)->transformctx)); 581*dbbe0bcdSBarry Smith PetscTryTypeMethod((*tj),destroy); 582fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 583fe8322adSStefano Zampini PetscMPIInt rank; 584fe8322adSStefano Zampini MPI_Comm comm; 585fe8322adSStefano Zampini 5869566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)(*tj),&comm)); 5879566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm,&rank)); 588dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5899566063dSJacob Faibussowitsch PetscCall(PetscRMTree((*tj)->dirname)); 590fe8322adSStefano Zampini } 591fe8322adSStefano Zampini } 5929566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*tj)->names)); 5939566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->dirname)); 5949566063dSJacob Faibussowitsch PetscCall(PetscFree((*tj)->filetemplate)); 5959566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tj)); 596bc952696SBarry Smith PetscFunctionReturn(0); 597bc952696SBarry Smith } 598bc952696SBarry Smith 599bc952696SBarry Smith /* 600772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 601bc952696SBarry Smith 602bc952696SBarry Smith Collective on TSTrajectory 603bc952696SBarry Smith 604bc952696SBarry Smith Input Parameter: 6053c0fce88SHong Zhang + tj - the TSTrajectory context 6063c0fce88SHong Zhang - ts - the TS context 6073c0fce88SHong Zhang 6083c0fce88SHong Zhang Options Database Keys: 6093c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 610bc952696SBarry Smith 611df5474d8SHong Zhang Level: developer 612bc952696SBarry Smith 613db781477SPatrick Sanan .seealso: `TSTrajectorySetFromOptions()`, `TSTrajectorySetType()` 614bc952696SBarry Smith */ 6152bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 616bc952696SBarry Smith { 617bc952696SBarry Smith PetscBool opt; 618bc952696SBarry Smith const char *defaultType; 619bc952696SBarry Smith char typeName[256]; 620bc952696SBarry Smith 621bc952696SBarry Smith PetscFunctionBegin; 622b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 623bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 624bc952696SBarry Smith 6259566063dSJacob Faibussowitsch PetscCall(TSTrajectoryRegisterAll()); 6269566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt)); 627bc952696SBarry Smith if (opt) { 6289566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj,ts,typeName)); 629bc952696SBarry Smith } else { 6309566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj,ts,defaultType)); 631bc952696SBarry Smith } 632bc952696SBarry Smith PetscFunctionReturn(0); 633bc952696SBarry Smith } 634bc952696SBarry Smith 635ed695a29SHong Zhang /*@ 6369ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 6379ffb3502SHong Zhang 6389ffb3502SHong Zhang Collective on TSTrajectory 6399ffb3502SHong Zhang 6404165533cSJose E. Roman Input Parameters: 6419ffb3502SHong Zhang + tj - the TSTrajectory context 6429ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 6439ffb3502SHong Zhang 6449ffb3502SHong Zhang Options Database Keys: 6459ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 6469ffb3502SHong Zhang 6479ffb3502SHong Zhang Level: advanced 6489ffb3502SHong Zhang 649db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 6509ffb3502SHong Zhang @*/ 6519ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg) 6529ffb3502SHong Zhang { 6539ffb3502SHong Zhang PetscFunctionBegin; 6549ffb3502SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 6559ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 6569ffb3502SHong Zhang tj->usehistory = flg; 6579ffb3502SHong Zhang PetscFunctionReturn(0); 6589ffb3502SHong Zhang } 6599ffb3502SHong Zhang 6609ffb3502SHong Zhang /*@ 661ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 662ed695a29SHong Zhang 663ed695a29SHong Zhang Collective on TSTrajectory 664ed695a29SHong Zhang 6654165533cSJose E. Roman Input Parameters: 666ed695a29SHong Zhang + tj - the TSTrajectory context 667ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 668ed695a29SHong Zhang 6693c0fce88SHong Zhang Options Database Keys: 670063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 6713c0fce88SHong Zhang 672df5474d8SHong Zhang Level: developer 673ed695a29SHong Zhang 674db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()` 675ed695a29SHong Zhang @*/ 6762bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 677ed695a29SHong Zhang { 678ed695a29SHong Zhang PetscFunctionBegin; 679ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 680ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 681fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 682fe8322adSStefano Zampini else tj->monitor = NULL; 683ed695a29SHong Zhang PetscFunctionReturn(0); 684ed695a29SHong Zhang } 685ed695a29SHong Zhang 686bc952696SBarry Smith /*@ 68764fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 68864fc91eeSBarry Smith 68964fc91eeSBarry Smith Collective on TSTrajectory 69064fc91eeSBarry Smith 6914165533cSJose E. Roman Input Parameters: 69264fc91eeSBarry Smith + tj - the TSTrajectory context 69364fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 69464fc91eeSBarry Smith 69564fc91eeSBarry Smith Options Database Keys: 69664fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 69764fc91eeSBarry Smith 69895452b02SPatrick Sanan Notes: 69995452b02SPatrick 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. 70064fc91eeSBarry Smith 70164fc91eeSBarry Smith Level: advanced 70264fc91eeSBarry Smith 703db781477SPatrick Sanan .seealso: `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetUp()`, `TSTrajectorySetMonitor()` 70464fc91eeSBarry Smith @*/ 70564fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 70664fc91eeSBarry Smith { 70764fc91eeSBarry Smith PetscFunctionBegin; 70864fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 70964fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 71064fc91eeSBarry Smith tj->keepfiles = flg; 71164fc91eeSBarry Smith PetscFunctionReturn(0); 71264fc91eeSBarry Smith } 71364fc91eeSBarry Smith 714db901c5bSHong Zhang /*@C 71564e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 71664e38db7SHong Zhang 71764e38db7SHong Zhang Collective on TSTrajectory 71864e38db7SHong Zhang 7194165533cSJose E. Roman Input Parameters: 72064e38db7SHong Zhang + tj - the TSTrajectory context 72164e38db7SHong Zhang - dirname - the directory name 72264e38db7SHong Zhang 72364e38db7SHong Zhang Options Database Keys: 72464e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 72564e38db7SHong Zhang 72695452b02SPatrick Sanan Notes: 72795452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7281585b412SBarry Smith 72964e38db7SHong Zhang Level: developer 73064e38db7SHong Zhang 731c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetFiletemplate()`, `TSTrajectorySetUp()` 73264e38db7SHong Zhang @*/ 73364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 73464e38db7SHong Zhang { 735a17281aeSStefano Zampini PetscBool flg; 736a17281aeSStefano Zampini 73764e38db7SHong Zhang PetscFunctionBegin; 73864e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 7399566063dSJacob Faibussowitsch PetscCall(PetscStrcmp(tj->dirname,dirname,&flg)); 740049d1499SBarry Smith PetscCheck(flg || !tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup"); 7419566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirname)); 7429566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(dirname,&tj->dirname)); 74364e38db7SHong Zhang PetscFunctionReturn(0); 74464e38db7SHong Zhang } 74564e38db7SHong Zhang 746db901c5bSHong Zhang /*@C 74764e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 74864e38db7SHong Zhang 74964e38db7SHong Zhang Collective on TSTrajectory 75064e38db7SHong Zhang 7514165533cSJose E. Roman Input Parameters: 75264e38db7SHong Zhang + tj - the TSTrajectory context 7531585b412SBarry Smith - filetemplate - the template 75464e38db7SHong Zhang 75564e38db7SHong Zhang Options Database Keys: 7561585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7571585b412SBarry Smith 75895452b02SPatrick Sanan Notes: 75963a3b9bcSJacob Faibussowitsch The name template should be of the form, for example filename-%06" PetscInt_FMT ".bin It should not begin with a leading / 7601585b412SBarry Smith 76163a3b9bcSJacob 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 7621585b412SBarry Smith timestep counter 76364e38db7SHong Zhang 76464e38db7SHong Zhang Level: developer 76564e38db7SHong Zhang 766c2e3fba1SPatrick Sanan .seealso: `TSTrajectorySetDirname()`, `TSTrajectorySetUp()` 76764e38db7SHong Zhang @*/ 76864e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 76964e38db7SHong Zhang { 7709afe7f3eSBarry Smith const char *ptr,*ptr2; 7719afe7f3eSBarry Smith 77264e38db7SHong Zhang PetscFunctionBegin; 77364e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 77463a3b9bcSJacob Faibussowitsch PetscValidCharPointer(filetemplate,2); 7753c633725SBarry Smith PetscCheck(!tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 7769afe7f3eSBarry Smith 77763a3b9bcSJacob 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"); 7789afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7799566063dSJacob Faibussowitsch PetscCall(PetscStrstr(filetemplate,"%",(char**)&ptr)); 78063a3b9bcSJacob 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"); 7819afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 78263a3b9bcSJacob Faibussowitsch PetscCall(PetscStrchr(PetscInt_FMT "DiouxX",*ptr,(char**)&ptr2)); 78363a3b9bcSJacob 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"); 7849afe7f3eSBarry Smith if (ptr2) break; 7859afe7f3eSBarry Smith } 7869566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->filetemplate)); 7879566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(filetemplate,&tj->filetemplate)); 78864e38db7SHong Zhang PetscFunctionReturn(0); 78964e38db7SHong Zhang } 79064e38db7SHong Zhang 79164e38db7SHong Zhang /*@ 792bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 793bc952696SBarry Smith 794bc952696SBarry Smith Collective on TSTrajectory 795bc952696SBarry Smith 796d8d19677SJose E. Roman Input Parameters: 7973c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 7983c0fce88SHong Zhang - ts - the TS context 799bc952696SBarry Smith 800bc952696SBarry Smith Options Database Keys: 8013c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 80264fc91eeSBarry 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 803063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 804bc952696SBarry Smith 805df5474d8SHong Zhang Level: developer 806bc952696SBarry Smith 80795452b02SPatrick Sanan Notes: 80895452b02SPatrick Sanan This is not normally called directly by users 809bc952696SBarry Smith 810db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectorySetUp()` 811bc952696SBarry Smith @*/ 812972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 813bc952696SBarry Smith { 814ed695a29SHong Zhang PetscBool set,flg; 81564e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 816bc952696SBarry Smith 817bc952696SBarry Smith PetscFunctionBegin; 818b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 819fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 820d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tj); 8219566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts)); 8229566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL)); 8239566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set)); 8249566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetMonitor(tj,flg)); 8259566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL)); 8269566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL)); 8279566063dSJacob 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)); 8289566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL)); 8299566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set)); 8309566063dSJacob Faibussowitsch if (set) PetscCall(TSTrajectorySetKeepFiles(tj,flg)); 83164e38db7SHong Zhang 8329566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set)); 8331baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetDirname(tj,dirname)); 83464e38db7SHong Zhang 83563a3b9bcSJacob Faibussowitsch PetscCall(PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06" PetscInt_FMT ".bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set)); 8361baa6e33SBarry Smith if (set) PetscCall(TSTrajectorySetFiletemplate(tj,filetemplate)); 83764e38db7SHong Zhang 83864e38db7SHong Zhang /* Handle specific TSTrajectory options */ 839*dbbe0bcdSBarry Smith PetscTryTypeMethod(tj,setfromoptions,PetscOptionsObject); 840d0609cedSBarry Smith PetscOptionsEnd(); 841bc952696SBarry Smith PetscFunctionReturn(0); 842bc952696SBarry Smith } 84368bece0bSHong Zhang 84468bece0bSHong Zhang /*@ 84568bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 84668bece0bSHong Zhang of a TS trajectory. 84768bece0bSHong Zhang 84868bece0bSHong Zhang Collective on TS 84968bece0bSHong Zhang 850d8d19677SJose E. Roman Input Parameters: 8513c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8523c0fce88SHong Zhang - tj - the TS trajectory context 85368bece0bSHong Zhang 854df5474d8SHong Zhang Level: developer 85568bece0bSHong Zhang 856db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()` 85768bece0bSHong Zhang @*/ 85868bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 85968bece0bSHong Zhang { 8609afe7f3eSBarry Smith size_t s1,s2; 86168bece0bSHong Zhang 86268bece0bSHong Zhang PetscFunctionBegin; 86368bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 86468bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 865fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 86668bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 86768bece0bSHong Zhang 8689566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0)); 86968bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 8709566063dSJacob Faibussowitsch PetscCall(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC)); 87168bece0bSHong Zhang } 872*dbbe0bcdSBarry Smith PetscTryTypeMethod(tj,setup,ts); 87368bece0bSHong Zhang 87468bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 87553b27ddbSHong Zhang 87653b27ddbSHong Zhang /* Set the counters to zero */ 8771a5a771fSHong Zhang tj->recomps = 0; 87853b27ddbSHong Zhang tj->diskreads = 0; 87953b27ddbSHong Zhang tj->diskwrites = 0; 8809566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->dirname,&s1)); 8819566063dSJacob Faibussowitsch PetscCall(PetscStrlen(tj->filetemplate,&s2)); 8829566063dSJacob Faibussowitsch PetscCall(PetscFree(tj->dirfiletemplate)); 8839566063dSJacob Faibussowitsch PetscCall(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate)); 8849566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate)); 8859566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0)); 88668bece0bSHong Zhang PetscFunctionReturn(0); 88768bece0bSHong Zhang } 888fe8322adSStefano Zampini 889fe8322adSStefano Zampini /*@ 890fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 891fe8322adSStefano Zampini 892fe8322adSStefano Zampini Collective on TSTrajectory 893fe8322adSStefano Zampini 894d8d19677SJose E. Roman Input Parameters: 895fe8322adSStefano Zampini + tj - the TS trajectory context 896fe8322adSStefano Zampini - flg - the boolean flag 897fe8322adSStefano Zampini 898fe8322adSStefano Zampini Level: developer 899fe8322adSStefano Zampini 900db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryGetSolutionOnly()` 901fe8322adSStefano Zampini @*/ 902fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only) 903fe8322adSStefano Zampini { 904fe8322adSStefano Zampini PetscFunctionBegin; 905fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 906fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj,solution_only,2); 907fe8322adSStefano Zampini tj->solution_only = solution_only; 908fe8322adSStefano Zampini PetscFunctionReturn(0); 909fe8322adSStefano Zampini } 910fe8322adSStefano Zampini 911fe8322adSStefano Zampini /*@ 912fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 913fe8322adSStefano Zampini 914fe8322adSStefano Zampini Logically collective on TSTrajectory 915fe8322adSStefano Zampini 916fe8322adSStefano Zampini Input Parameter: 917fe8322adSStefano Zampini . tj - the TS trajectory context 918fe8322adSStefano Zampini 919fe8322adSStefano Zampini Output Parameter: 920d8d19677SJose E. Roman . flg - the boolean flag 921fe8322adSStefano Zampini 922fe8322adSStefano Zampini Level: developer 923fe8322adSStefano Zampini 924db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectorySetSolutionOnly()` 925fe8322adSStefano Zampini @*/ 926fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only) 927fe8322adSStefano Zampini { 928fe8322adSStefano Zampini PetscFunctionBegin; 929fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 930dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only,2); 931fe8322adSStefano Zampini *solution_only = tj->solution_only; 932fe8322adSStefano Zampini PetscFunctionReturn(0); 933fe8322adSStefano Zampini } 934fe8322adSStefano Zampini 935fe8322adSStefano Zampini /*@ 936fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 937fe8322adSStefano Zampini 938fe8322adSStefano Zampini Collective on TSTrajectory 939fe8322adSStefano Zampini 940d8d19677SJose E. Roman Input Parameters: 941fe8322adSStefano Zampini + tj - the TS trajectory context 942fe8322adSStefano Zampini . ts - the TS solver context 943fe8322adSStefano Zampini - time - the requested time 944fe8322adSStefano Zampini 945d8d19677SJose E. Roman Output Parameters: 946fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 947fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 948fe8322adSStefano Zampini 949fe8322adSStefano Zampini Level: developer 950fe8322adSStefano Zampini 951fe8322adSStefano 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. 952fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 953fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 954fe8322adSStefano Zampini 955db781477SPatrick Sanan .seealso: `TSSetSaveTrajectory()`, `TSTrajectoryCreate()`, `TSTrajectoryDestroy()`, `TSTrajectoryRestoreUpdatedHistoryVecs()`, `TSTrajectoryGetVecs()` 956fe8322adSStefano Zampini @*/ 957fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 958fe8322adSStefano Zampini { 959fe8322adSStefano Zampini PetscFunctionBegin; 960fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 961fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 962fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,3); 963fe8322adSStefano Zampini if (U) PetscValidPointer(U,4); 964fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot,5); 965fe8322adSStefano Zampini if (U && !tj->U) { 966fe8322adSStefano Zampini DM dm; 967fe8322adSStefano Zampini 9689566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts,&dm)); 9699566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm,&tj->U)); 970fe8322adSStefano Zampini } 971fe8322adSStefano Zampini if (Udot && !tj->Udot) { 972fe8322adSStefano Zampini DM dm; 973fe8322adSStefano Zampini 9749566063dSJacob Faibussowitsch PetscCall(TSGetDM(ts,&dm)); 9759566063dSJacob Faibussowitsch PetscCall(DMCreateGlobalVector(dm,&tj->Udot)); 976fe8322adSStefano Zampini } 9779566063dSJacob Faibussowitsch PetscCall(TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL)); 978fe8322adSStefano Zampini if (U) { 9799566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->U)); 980fe8322adSStefano Zampini *U = tj->U; 981fe8322adSStefano Zampini } 982fe8322adSStefano Zampini if (Udot) { 9839566063dSJacob Faibussowitsch PetscCall(VecLockReadPush(tj->Udot)); 984fe8322adSStefano Zampini *Udot = tj->Udot; 985fe8322adSStefano Zampini } 986fe8322adSStefano Zampini PetscFunctionReturn(0); 987fe8322adSStefano Zampini } 988fe8322adSStefano Zampini 989fe8322adSStefano Zampini /*@ 990fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 991fe8322adSStefano Zampini 992fe8322adSStefano Zampini Collective on TSTrajectory 993fe8322adSStefano Zampini 994d8d19677SJose E. Roman Input Parameters: 995fe8322adSStefano Zampini + tj - the TS trajectory context 996fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 997fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 998fe8322adSStefano Zampini 999fe8322adSStefano Zampini Level: developer 1000fe8322adSStefano Zampini 1001db781477SPatrick Sanan .seealso: `TSTrajectoryGetUpdatedHistoryVecs()` 1002fe8322adSStefano Zampini @*/ 1003fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1004fe8322adSStefano Zampini { 1005fe8322adSStefano Zampini PetscFunctionBegin; 1006fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1007fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2); 1008fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3); 10093c633725SBarry Smith PetscCheck(!U || *U == tj->U,PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10103c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot,PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1011fe8322adSStefano Zampini if (U) { 10129566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->U)); 1013fe8322adSStefano Zampini *U = NULL; 1014fe8322adSStefano Zampini } 1015fe8322adSStefano Zampini if (Udot) { 10169566063dSJacob Faibussowitsch PetscCall(VecLockReadPop(tj->Udot)); 1017fe8322adSStefano Zampini *Udot = NULL; 1018fe8322adSStefano Zampini } 1019fe8322adSStefano Zampini PetscFunctionReturn(0); 1020fe8322adSStefano Zampini } 1021