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 243c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll() 25bc952696SBarry Smith @*/ 26972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 27bc952696SBarry Smith { 28bc952696SBarry Smith PetscFunctionBegin; 295f80ce2aSJacob Faibussowitsch CHKERRQ(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 49fe8322adSStefano Zampini .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) { 635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only)); 64fe8322adSStefano Zampini } 655f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0)); 665f80ce2aSJacob Faibussowitsch CHKERRQ((*tj->ops->set)(tj,ts,stepnum,time,X)); 675f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0)); 68ac1a7491SHong Zhang if (tj->usehistory) { 695f80ce2aSJacob Faibussowitsch CHKERRQ(TSHistoryUpdate(tj->tsh,stepnum,time)); 70ac1a7491SHong Zhang } 71fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 72bc952696SBarry Smith PetscFunctionReturn(0); 73bc952696SBarry Smith } 74bc952696SBarry Smith 75fe8322adSStefano Zampini /*@ 76fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 77fe8322adSStefano Zampini 78fe8322adSStefano Zampini Not collective. 79fe8322adSStefano Zampini 80fe8322adSStefano Zampini Input Parameters: 81fe8322adSStefano Zampini . tj - the trajectory object 82fe8322adSStefano Zampini 83fe8322adSStefano Zampini Output Parameter: 84fe8322adSStefano Zampini . steps - the number of steps 85fe8322adSStefano Zampini 86fe8322adSStefano Zampini Level: developer 87fe8322adSStefano Zampini 88fe8322adSStefano Zampini .seealso: TSTrajectorySet() 89fe8322adSStefano Zampini @*/ 90fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 91fe8322adSStefano Zampini { 92fe8322adSStefano Zampini PetscFunctionBegin; 93fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 94fe8322adSStefano Zampini PetscValidIntPointer(steps,2); 955f80ce2aSJacob Faibussowitsch CHKERRQ(TSHistoryGetNumSteps(tj->tsh,steps)); 96fe8322adSStefano Zampini PetscFunctionReturn(0); 97fe8322adSStefano Zampini } 98fe8322adSStefano Zampini 99fe8322adSStefano Zampini /*@ 100fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 101fe8322adSStefano Zampini 102fe8322adSStefano Zampini Collective on TS 103fe8322adSStefano Zampini 104fe8322adSStefano Zampini Input Parameters: 105fe8322adSStefano Zampini + tj - the trajectory object 106fe8322adSStefano Zampini . ts - the time stepper object 107fe8322adSStefano Zampini - stepnum - the step number 108fe8322adSStefano Zampini 109fe8322adSStefano Zampini Output Parameter: 110fe8322adSStefano Zampini . time - the time associated with the step number 111fe8322adSStefano Zampini 112fe8322adSStefano Zampini Level: developer 113fe8322adSStefano Zampini 114fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 115fe8322adSStefano Zampini 116fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution() 117fe8322adSStefano Zampini @*/ 118c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 119bc952696SBarry Smith { 120bc952696SBarry Smith PetscFunctionBegin; 1213c633725SBarry Smith PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 122fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 123fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 124fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 125*dadcf809SJacob Faibussowitsch PetscValidRealPointer(time,4); 1263c633725SBarry Smith PetscCheck(tj->ops->get,PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 1273c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 1283c633725SBarry Smith PetscCheck(stepnum >= 0,PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 129fe8322adSStefano Zampini if (tj->monitor) { 1305f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only)); 1315f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(tj->monitor)); 132fe8322adSStefano Zampini } 1335f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0)); 1345f80ce2aSJacob Faibussowitsch CHKERRQ((*tj->ops->get)(tj,ts,stepnum,time)); 1355f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0)); 136bc952696SBarry Smith PetscFunctionReturn(0); 137bc952696SBarry Smith } 138bc952696SBarry Smith 139fe8322adSStefano Zampini /*@ 140fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 141fe8322adSStefano Zampini 142fe8322adSStefano Zampini Collective on TS 143fe8322adSStefano Zampini 144fe8322adSStefano Zampini Input Parameters: 145fe8322adSStefano Zampini + tj - the trajectory object 146fe8322adSStefano Zampini . ts - the time stepper object (optional) 147fe8322adSStefano Zampini - stepnum - the requested step number 148fe8322adSStefano Zampini 1496b867d5aSJose E. Roman Input/Output Parameter: 150fe8322adSStefano Zampini 151fe8322adSStefano Zampini Output Parameters: 152f1a722f8SMatthew G. Knepley + time - On input time for the step if step number is PETSC_DECIDE, on output the time associated with the step number 153f1a722f8SMatthew G. Knepley . U - state vector (can be NULL) 154fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 155fe8322adSStefano Zampini 156fe8322adSStefano Zampini Level: developer 157fe8322adSStefano Zampini 158fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 159fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 160fe8322adSStefano Zampini 161fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet() 162fe8322adSStefano Zampini @*/ 163fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot) 164fe8322adSStefano Zampini { 165fe8322adSStefano Zampini PetscFunctionBegin; 1663c633725SBarry Smith PetscCheck(tj,PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 167fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 168fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 169fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 170*dadcf809SJacob Faibussowitsch PetscValidRealPointer(time,4); 171fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5); 172fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6); 173fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 1743c633725SBarry Smith PetscCheck(tj->setupcalled,PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 1755f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0)); 176fe8322adSStefano Zampini if (tj->monitor) { 177fe8322adSStefano Zampini PetscInt pU,pUdot; 178fe8322adSStefano Zampini pU = U ? 1 : 0; 179fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 1805f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time)); 1815f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(tj->monitor)); 182fe8322adSStefano Zampini } 183fe8322adSStefano Zampini if (U && tj->lag.caching) { 184fe8322adSStefano Zampini PetscObjectId id; 185fe8322adSStefano Zampini PetscObjectState state; 186fe8322adSStefano Zampini 1875f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectStateGet((PetscObject)U,&state)); 1885f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetId((PetscObject)U,&id)); 189fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 190fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 191fe8322adSStefano Zampini } else { 192fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 193fe8322adSStefano Zampini } 194fe8322adSStefano Zampini if (tj->monitor && !U) { 1955f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(tj->monitor)); 1965f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n")); 1975f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(tj->monitor)); 1985f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(tj->monitor)); 199fe8322adSStefano Zampini } 200fe8322adSStefano Zampini } 201fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 202fe8322adSStefano Zampini PetscObjectId id; 203fe8322adSStefano Zampini PetscObjectState state; 204fe8322adSStefano Zampini 2055f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectStateGet((PetscObject)Udot,&state)); 2065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetId((PetscObject)Udot,&id)); 207fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 208fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 209fe8322adSStefano Zampini } else { 210fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 211fe8322adSStefano Zampini } 212fe8322adSStefano Zampini if (tj->monitor && !Udot) { 2135f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(tj->monitor)); 2145f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n")); 2155f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(tj->monitor)); 2165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(tj->monitor)); 217fe8322adSStefano Zampini } 218fe8322adSStefano Zampini } 219fe8322adSStefano Zampini if (!U && !Udot) { 2205f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0)); 221fe8322adSStefano Zampini PetscFunctionReturn(0); 222fe8322adSStefano Zampini } 223fe8322adSStefano Zampini 224fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 225fe8322adSStefano Zampini if (tj->monitor) { 2265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(tj->monitor)); 227fe8322adSStefano Zampini } 228fe8322adSStefano Zampini /* cached states will be updated in the function */ 2295f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot)); 230fe8322adSStefano Zampini if (tj->monitor) { 2315f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(tj->monitor)); 2325f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerFlush(tj->monitor)); 233fe8322adSStefano Zampini } 234fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 235fe8322adSStefano Zampini TS fakets = ts; 236fe8322adSStefano Zampini Vec U2; 237fe8322adSStefano Zampini 238fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 239fe8322adSStefano Zampini if (!ts) { 2405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets)); 241fe8322adSStefano Zampini if (!fakets) { 2425f80ce2aSJacob Faibussowitsch CHKERRQ(TSCreate(PetscObjectComm((PetscObject)tj),&fakets)); 2435f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets)); 2445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectDereference((PetscObject)fakets)); 2455f80ce2aSJacob Faibussowitsch CHKERRQ(VecDuplicate(U,&U2)); 2465f80ce2aSJacob Faibussowitsch CHKERRQ(TSSetSolution(fakets,U2)); 2475f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectDereference((PetscObject)U2)); 248fe8322adSStefano Zampini } 249fe8322adSStefano Zampini } 2505f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryGet(tj,fakets,stepnum,time)); 2515f80ce2aSJacob Faibussowitsch CHKERRQ(TSGetSolution(fakets,&U2)); 2525f80ce2aSJacob Faibussowitsch CHKERRQ(VecCopy(U2,U)); 2535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state)); 2545f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id)); 255fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 256fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 257fe8322adSStefano Zampini } 2585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0)); 259fe8322adSStefano Zampini PetscFunctionReturn(0); 260fe8322adSStefano Zampini } 261fe8322adSStefano Zampini 262bc952696SBarry Smith /*@C 263fe2efc57SMark TSTrajectoryViewFromOptions - View from Options 264fe2efc57SMark 265fe2efc57SMark Collective on TSTrajectory 266fe2efc57SMark 267fe2efc57SMark Input Parameters: 268fe2efc57SMark + A - the TSTrajectory context 269736c3998SJose E. Roman . obj - Optional object 270736c3998SJose E. Roman - name - command line option 271fe2efc57SMark 272fe2efc57SMark Level: intermediate 273fe2efc57SMark .seealso: TSTrajectory, TSTrajectoryView, PetscObjectViewFromOptions(), TSTrajectoryCreate() 274fe2efc57SMark @*/ 275fe2efc57SMark PetscErrorCode TSTrajectoryViewFromOptions(TSTrajectory A,PetscObject obj,const char name[]) 276fe2efc57SMark { 277fe2efc57SMark PetscFunctionBegin; 278fe2efc57SMark PetscValidHeaderSpecific(A,TSTRAJECTORY_CLASSID,1); 2795f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectViewFromOptions((PetscObject)A,obj,name)); 280fe2efc57SMark PetscFunctionReturn(0); 281fe2efc57SMark } 282fe2efc57SMark 283fe2efc57SMark /*@C 284bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 285bc952696SBarry Smith 286bc952696SBarry Smith Collective on TSTrajectory 287bc952696SBarry Smith 288bc952696SBarry Smith Input Parameters: 289b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 290bc952696SBarry Smith - viewer - visualization context 291bc952696SBarry Smith 292bc952696SBarry Smith Options Database Key: 293e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 294bc952696SBarry Smith 295bc952696SBarry Smith Notes: 296bc952696SBarry Smith The available visualization contexts include 297bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 298bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 299bc952696SBarry Smith output where only the first processor opens 300bc952696SBarry Smith the file. All other processors send their 301bc952696SBarry Smith data to the first processor to print. 302bc952696SBarry Smith 303bc952696SBarry Smith The user can open an alternative visualization context with 304bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 305bc952696SBarry Smith 306df5474d8SHong Zhang Level: developer 307bc952696SBarry Smith 308bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 309bc952696SBarry Smith @*/ 310b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 311bc952696SBarry Smith { 312bc952696SBarry Smith PetscBool iascii; 313bc952696SBarry Smith 314bc952696SBarry Smith PetscFunctionBegin; 3151a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 316bc952696SBarry Smith if (!viewer) { 3175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer)); 318bc952696SBarry Smith } 319bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 320b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 321bc952696SBarry Smith 3225f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii)); 323bc952696SBarry Smith if (iascii) { 3245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer)); 3255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps)); 3265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads)); 3275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites)); 328b1d74d50SHong Zhang if (tj->ops->view) { 3295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPushTab(viewer)); 3305f80ce2aSJacob Faibussowitsch CHKERRQ((*tj->ops->view)(tj,viewer)); 3315f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPopTab(viewer)); 332bc952696SBarry Smith } 333bc952696SBarry Smith } 334bc952696SBarry Smith PetscFunctionReturn(0); 335bc952696SBarry Smith } 336bc952696SBarry Smith 337bc952696SBarry Smith /*@C 33878fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 33978fbdcc8SBarry Smith 34078fbdcc8SBarry Smith Collective on TSTrajectory 34178fbdcc8SBarry Smith 34278fbdcc8SBarry Smith Input Parameters: 34378fbdcc8SBarry Smith + tr - the trajectory context 34478fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 34578fbdcc8SBarry Smith 34678fbdcc8SBarry Smith Level: intermediate 34778fbdcc8SBarry Smith 348db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 349db901c5bSHong Zhang 35078fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 35178fbdcc8SBarry Smith @*/ 35278fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 35378fbdcc8SBarry Smith { 35478fbdcc8SBarry Smith PetscFunctionBegin; 355fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1); 356fe8322adSStefano Zampini PetscValidPointer(names,2); 3575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrArrayDestroy(&ctx->names)); 3585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrArrayallocpy(names,&ctx->names)); 35978fbdcc8SBarry Smith PetscFunctionReturn(0); 36078fbdcc8SBarry Smith } 36178fbdcc8SBarry Smith 36278fbdcc8SBarry Smith /*@C 363fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 36408347785SBarry Smith 36508347785SBarry Smith Collective on TSLGCtx 36608347785SBarry Smith 36708347785SBarry Smith Input Parameters: 36808347785SBarry Smith + tj - the TSTrajectory context 36908347785SBarry Smith . transform - the transform function 37008347785SBarry Smith . destroy - function to destroy the optional context 37108347785SBarry Smith - ctx - optional context used by transform function 37208347785SBarry Smith 37308347785SBarry Smith Level: intermediate 37408347785SBarry Smith 37508347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 37608347785SBarry Smith @*/ 37708347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 37808347785SBarry Smith { 37908347785SBarry Smith PetscFunctionBegin; 380fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 38108347785SBarry Smith tj->transform = transform; 38208347785SBarry Smith tj->transformdestroy = destroy; 38308347785SBarry Smith tj->transformctx = tctx; 38408347785SBarry Smith PetscFunctionReturn(0); 38508347785SBarry Smith } 38608347785SBarry Smith 387db901c5bSHong Zhang /*@ 388bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 389bc952696SBarry Smith 390d083f849SBarry Smith Collective 391bc952696SBarry Smith 392bc952696SBarry Smith Input Parameter: 3933c0fce88SHong Zhang . comm - the communicator 394bc952696SBarry Smith 395bc952696SBarry Smith Output Parameter: 3963c0fce88SHong Zhang . tj - the trajectory object 397bc952696SBarry Smith 398df5474d8SHong Zhang Level: developer 399bc952696SBarry Smith 40095452b02SPatrick Sanan Notes: 40195452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 402bc952696SBarry Smith 40364fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 404bc952696SBarry Smith @*/ 405b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 406bc952696SBarry Smith { 407bc952696SBarry Smith TSTrajectory t; 408bc952696SBarry Smith 409bc952696SBarry Smith PetscFunctionBegin; 410b1d74d50SHong Zhang PetscValidPointer(tj,2); 411b1d74d50SHong Zhang *tj = NULL; 4125f80ce2aSJacob Faibussowitsch CHKERRQ(TSInitializePackage()); 413bc952696SBarry Smith 4145f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView)); 41568bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 4165f80ce2aSJacob Faibussowitsch CHKERRQ(TSHistoryCreate(comm,&t->tsh)); 417fe8322adSStefano Zampini 418fe8322adSStefano Zampini t->lag.order = 1; 419fe8322adSStefano Zampini t->lag.L = NULL; 420fe8322adSStefano Zampini t->lag.T = NULL; 421fe8322adSStefano Zampini t->lag.W = NULL; 422fe8322adSStefano Zampini t->lag.WW = NULL; 423fe8322adSStefano Zampini t->lag.TW = NULL; 424fe8322adSStefano Zampini t->lag.TT = NULL; 425fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 426fe8322adSStefano Zampini t->lag.Ucached.id = 0; 427fe8322adSStefano Zampini t->lag.Ucached.state = -1; 428fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 429fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 430fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 431fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 432fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 433fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 434fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 435fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 436fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 437ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 438b1d74d50SHong Zhang *tj = t; 4395f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetFiletemplate(t,"TS-%06D.bin")); 440bc952696SBarry Smith PetscFunctionReturn(0); 441bc952696SBarry Smith } 442bc952696SBarry Smith 443bc952696SBarry Smith /*@C 444bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 445bc952696SBarry Smith 446bc952696SBarry Smith Collective on TS 447bc952696SBarry Smith 448bc952696SBarry Smith Input Parameters: 4493c0fce88SHong Zhang + tj - the TSTrajectory context 4503c0fce88SHong Zhang . ts - the TS context 4513c0fce88SHong Zhang - type - a known method 452bc952696SBarry Smith 453bc952696SBarry Smith Options Database Command: 454e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 455bc952696SBarry Smith 456df5474d8SHong Zhang Level: developer 457bc952696SBarry Smith 458881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType() 459bc952696SBarry Smith 460bc952696SBarry Smith @*/ 461fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 462bc952696SBarry Smith { 463972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 464bc952696SBarry Smith PetscBool match; 465bc952696SBarry Smith 466bc952696SBarry Smith PetscFunctionBegin; 467972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 4685f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectTypeCompare((PetscObject)tj,type,&match)); 469bc952696SBarry Smith if (match) PetscFunctionReturn(0); 470bc952696SBarry Smith 4715f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFunctionListFind(TSTrajectoryList,type,&r)); 4723c633725SBarry Smith PetscCheck(r,PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 473972caf09SHong Zhang if (tj->ops->destroy) { 4745f80ce2aSJacob Faibussowitsch CHKERRQ((*(tj)->ops->destroy)(tj)); 475bc952696SBarry Smith 476972caf09SHong Zhang tj->ops->destroy = NULL; 477bc952696SBarry Smith } 4785f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMemzero(tj->ops,sizeof(*tj->ops))); 479bc952696SBarry Smith 4805f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectChangeTypeName((PetscObject)tj,type)); 4815f80ce2aSJacob Faibussowitsch CHKERRQ((*r)(tj,ts)); 482bc952696SBarry Smith PetscFunctionReturn(0); 483bc952696SBarry Smith } 484bc952696SBarry Smith 485881c1a9bSHong Zhang /*@C 486881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 487881c1a9bSHong Zhang 488881c1a9bSHong Zhang Collective on TS 489881c1a9bSHong Zhang 490881c1a9bSHong Zhang Input Parameters: 491881c1a9bSHong Zhang + tj - the TSTrajectory context 492881c1a9bSHong Zhang - ts - the TS context 493881c1a9bSHong Zhang 494881c1a9bSHong Zhang Output Parameters: 495881c1a9bSHong Zhang . type - a known method 496881c1a9bSHong Zhang 497881c1a9bSHong Zhang Level: developer 498881c1a9bSHong Zhang 499881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType() 500881c1a9bSHong Zhang 501881c1a9bSHong Zhang @*/ 502881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type) 503881c1a9bSHong Zhang { 504881c1a9bSHong Zhang PetscFunctionBegin; 505881c1a9bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 506881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 507881c1a9bSHong Zhang PetscFunctionReturn(0); 508881c1a9bSHong Zhang } 509881c1a9bSHong Zhang 510972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 511972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 5129a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 5132b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 514bc952696SBarry Smith 515bc952696SBarry Smith /*@C 516bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 517bc952696SBarry Smith 518bc952696SBarry Smith Not Collective 519bc952696SBarry Smith 520df5474d8SHong Zhang Level: developer 521bc952696SBarry Smith 5223c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 523bc952696SBarry Smith @*/ 524bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 525bc952696SBarry Smith { 526bc952696SBarry Smith PetscFunctionBegin; 527560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 528bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 529bc952696SBarry Smith 5305f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic)); 5315f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile)); 5325f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory)); 5335f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization)); 534bc952696SBarry Smith PetscFunctionReturn(0); 535bc952696SBarry Smith } 536bc952696SBarry Smith 537bc952696SBarry Smith /*@ 5381550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5391550c9b9SHong Zhang 5401550c9b9SHong Zhang Collective on TSTrajectory 5411550c9b9SHong Zhang 5421550c9b9SHong Zhang Input Parameter: 5431550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5441550c9b9SHong Zhang 5451550c9b9SHong Zhang Level: developer 5461550c9b9SHong Zhang 5471550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 5481550c9b9SHong Zhang @*/ 5499a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 5501550c9b9SHong Zhang { 5511550c9b9SHong Zhang PetscFunctionBegin; 5529a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5539a992471SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 5549a992471SHong Zhang if (tj->ops->reset) { 5555f80ce2aSJacob Faibussowitsch CHKERRQ((*tj->ops->reset)(tj)); 5569a992471SHong Zhang } 5575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(tj->dirfiletemplate)); 5585f80ce2aSJacob Faibussowitsch CHKERRQ(TSHistoryDestroy(&tj->tsh)); 5595f80ce2aSJacob Faibussowitsch CHKERRQ(TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh)); 560fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5611550c9b9SHong Zhang PetscFunctionReturn(0); 5621550c9b9SHong Zhang } 5631550c9b9SHong Zhang 5641550c9b9SHong Zhang /*@ 565bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 566bc952696SBarry Smith 567bc952696SBarry Smith Collective on TSTrajectory 568bc952696SBarry Smith 569bc952696SBarry Smith Input Parameter: 5703c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 571bc952696SBarry Smith 572df5474d8SHong Zhang Level: developer 573bc952696SBarry Smith 5743c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 575bc952696SBarry Smith @*/ 576972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 577bc952696SBarry Smith { 578bc952696SBarry Smith PetscFunctionBegin; 579972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 580972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 581c793f718SLisandro Dalcin if (--((PetscObject)(*tj))->refct > 0) {*tj = NULL; PetscFunctionReturn(0);} 582bc952696SBarry Smith 5835f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryReset(*tj)); 5845f80ce2aSJacob Faibussowitsch CHKERRQ(TSHistoryDestroy(&(*tj)->tsh)); 5855f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W)); 5865f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW)); 5875f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&(*tj)->U)); 5885f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&(*tj)->Udot)); 5899a992471SHong Zhang 5905f80ce2aSJacob Faibussowitsch if ((*tj)->transformdestroy) CHKERRQ((*(*tj)->transformdestroy)((*tj)->transformctx)); 5915f80ce2aSJacob Faibussowitsch if ((*tj)->ops->destroy) CHKERRQ((*(*tj)->ops->destroy)((*tj))); 592fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 593fe8322adSStefano Zampini PetscMPIInt rank; 594fe8322adSStefano Zampini MPI_Comm comm; 595fe8322adSStefano Zampini 5965f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetComm((PetscObject)(*tj),&comm)); 5975f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(comm,&rank)); 598dd400576SPatrick Sanan if (rank == 0 && (*tj)->dirname) { /* we own the directory, so we run PetscRMTree on it */ 5995f80ce2aSJacob Faibussowitsch CHKERRQ(PetscRMTree((*tj)->dirname)); 600fe8322adSStefano Zampini } 601fe8322adSStefano Zampini } 6025f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrArrayDestroy(&(*tj)->names)); 6035f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*tj)->dirname)); 6045f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*tj)->filetemplate)); 6055f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(tj)); 606bc952696SBarry Smith PetscFunctionReturn(0); 607bc952696SBarry Smith } 608bc952696SBarry Smith 609bc952696SBarry Smith /* 610772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 611bc952696SBarry Smith 612bc952696SBarry Smith Collective on TSTrajectory 613bc952696SBarry Smith 614bc952696SBarry Smith Input Parameter: 6153c0fce88SHong Zhang + tj - the TSTrajectory context 6163c0fce88SHong Zhang - ts - the TS context 6173c0fce88SHong Zhang 6183c0fce88SHong Zhang Options Database Keys: 6193c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 620bc952696SBarry Smith 621df5474d8SHong Zhang Level: developer 622bc952696SBarry Smith 6233c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 624bc952696SBarry Smith */ 6252bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 626bc952696SBarry Smith { 627bc952696SBarry Smith PetscBool opt; 628bc952696SBarry Smith const char *defaultType; 629bc952696SBarry Smith char typeName[256]; 630bc952696SBarry Smith 631bc952696SBarry Smith PetscFunctionBegin; 632b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 633bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 634bc952696SBarry Smith 6355f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryRegisterAll()); 6365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt)); 637bc952696SBarry Smith if (opt) { 6385f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetType(tj,ts,typeName)); 639bc952696SBarry Smith } else { 6405f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetType(tj,ts,defaultType)); 641bc952696SBarry Smith } 642bc952696SBarry Smith PetscFunctionReturn(0); 643bc952696SBarry Smith } 644bc952696SBarry Smith 645ed695a29SHong Zhang /*@ 6469ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 6479ffb3502SHong Zhang 6489ffb3502SHong Zhang Collective on TSTrajectory 6499ffb3502SHong Zhang 6504165533cSJose E. Roman Input Parameters: 6519ffb3502SHong Zhang + tj - the TSTrajectory context 6529ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 6539ffb3502SHong Zhang 6549ffb3502SHong Zhang Options Database Keys: 6559ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 6569ffb3502SHong Zhang 6579ffb3502SHong Zhang Level: advanced 6589ffb3502SHong Zhang 6599ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 6609ffb3502SHong Zhang @*/ 6619ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg) 6629ffb3502SHong Zhang { 6639ffb3502SHong Zhang PetscFunctionBegin; 6649ffb3502SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 6659ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 6669ffb3502SHong Zhang tj->usehistory = flg; 6679ffb3502SHong Zhang PetscFunctionReturn(0); 6689ffb3502SHong Zhang } 6699ffb3502SHong Zhang 6709ffb3502SHong Zhang /*@ 671ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 672ed695a29SHong Zhang 673ed695a29SHong Zhang Collective on TSTrajectory 674ed695a29SHong Zhang 6754165533cSJose E. Roman Input Parameters: 676ed695a29SHong Zhang + tj - the TSTrajectory context 677ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 678ed695a29SHong Zhang 6793c0fce88SHong Zhang Options Database Keys: 680063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 6813c0fce88SHong Zhang 682df5474d8SHong Zhang Level: developer 683ed695a29SHong Zhang 6843c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 685ed695a29SHong Zhang @*/ 6862bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 687ed695a29SHong Zhang { 688ed695a29SHong Zhang PetscFunctionBegin; 689ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 690ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 691fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 692fe8322adSStefano Zampini else tj->monitor = NULL; 693ed695a29SHong Zhang PetscFunctionReturn(0); 694ed695a29SHong Zhang } 695ed695a29SHong Zhang 696bc952696SBarry Smith /*@ 69764fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 69864fc91eeSBarry Smith 69964fc91eeSBarry Smith Collective on TSTrajectory 70064fc91eeSBarry Smith 7014165533cSJose E. Roman Input Parameters: 70264fc91eeSBarry Smith + tj - the TSTrajectory context 70364fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 70464fc91eeSBarry Smith 70564fc91eeSBarry Smith Options Database Keys: 70664fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 70764fc91eeSBarry Smith 70895452b02SPatrick Sanan Notes: 70995452b02SPatrick 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. 71064fc91eeSBarry Smith 71164fc91eeSBarry Smith Level: advanced 71264fc91eeSBarry Smith 71364fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 71464fc91eeSBarry Smith @*/ 71564fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 71664fc91eeSBarry Smith { 71764fc91eeSBarry Smith PetscFunctionBegin; 71864fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 71964fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 72064fc91eeSBarry Smith tj->keepfiles = flg; 72164fc91eeSBarry Smith PetscFunctionReturn(0); 72264fc91eeSBarry Smith } 72364fc91eeSBarry Smith 724db901c5bSHong Zhang /*@C 72564e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 72664e38db7SHong Zhang 72764e38db7SHong Zhang Collective on TSTrajectory 72864e38db7SHong Zhang 7294165533cSJose E. Roman Input Parameters: 73064e38db7SHong Zhang + tj - the TSTrajectory context 73164e38db7SHong Zhang - dirname - the directory name 73264e38db7SHong Zhang 73364e38db7SHong Zhang Options Database Keys: 73464e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 73564e38db7SHong Zhang 73695452b02SPatrick Sanan Notes: 73795452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7381585b412SBarry Smith 73964e38db7SHong Zhang Level: developer 74064e38db7SHong Zhang 74164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 74264e38db7SHong Zhang @*/ 74364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 74464e38db7SHong Zhang { 745a17281aeSStefano Zampini PetscBool flg; 746a17281aeSStefano Zampini 74764e38db7SHong Zhang PetscFunctionBegin; 74864e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 7495f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrcmp(tj->dirname,dirname,&flg)); 750a17281aeSStefano Zampini if (!flg && tj->dirfiletemplate) { 751a17281aeSStefano Zampini SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup"); 752a17281aeSStefano Zampini } 7535f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(tj->dirname)); 7545f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(dirname,&tj->dirname)); 75564e38db7SHong Zhang PetscFunctionReturn(0); 75664e38db7SHong Zhang } 75764e38db7SHong Zhang 758db901c5bSHong Zhang /*@C 75964e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 76064e38db7SHong Zhang 76164e38db7SHong Zhang Collective on TSTrajectory 76264e38db7SHong Zhang 7634165533cSJose E. Roman Input Parameters: 76464e38db7SHong Zhang + tj - the TSTrajectory context 7651585b412SBarry Smith - filetemplate - the template 76664e38db7SHong Zhang 76764e38db7SHong Zhang Options Database Keys: 7681585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 7691585b412SBarry Smith 77095452b02SPatrick Sanan Notes: 77195452b02SPatrick Sanan The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 7721585b412SBarry Smith 7731585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 7741585b412SBarry Smith timestep counter 77564e38db7SHong Zhang 77664e38db7SHong Zhang Level: developer 77764e38db7SHong Zhang 7781585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 77964e38db7SHong Zhang @*/ 78064e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 78164e38db7SHong Zhang { 7829afe7f3eSBarry Smith const char *ptr,*ptr2; 7839afe7f3eSBarry Smith 78464e38db7SHong Zhang PetscFunctionBegin; 78564e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 7863c633725SBarry Smith PetscCheck(!tj->dirfiletemplate,PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 7879afe7f3eSBarry Smith 7883c633725SBarry Smith PetscCheck(filetemplate[0],PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 7899afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 7905f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrstr(filetemplate,"%",(char**)&ptr)); 7913c633725SBarry Smith PetscCheck(ptr,PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 7929afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 7935f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrchr("DdiouxX",*ptr,(char**)&ptr2)); 7943c633725SBarry Smith 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-%%06D.bin"); 7959afe7f3eSBarry Smith if (ptr2) break; 7969afe7f3eSBarry Smith } 7975f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(tj->filetemplate)); 7985f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(filetemplate,&tj->filetemplate)); 79964e38db7SHong Zhang PetscFunctionReturn(0); 80064e38db7SHong Zhang } 80164e38db7SHong Zhang 80264e38db7SHong Zhang /*@ 803bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 804bc952696SBarry Smith 805bc952696SBarry Smith Collective on TSTrajectory 806bc952696SBarry Smith 807d8d19677SJose E. Roman Input Parameters: 8083c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 8093c0fce88SHong Zhang - ts - the TS context 810bc952696SBarry Smith 811bc952696SBarry Smith Options Database Keys: 8123c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 81364fc91eeSBarry 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 814063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 815bc952696SBarry Smith 816df5474d8SHong Zhang Level: developer 817bc952696SBarry Smith 81895452b02SPatrick Sanan Notes: 81995452b02SPatrick Sanan This is not normally called directly by users 820bc952696SBarry Smith 8213c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 822bc952696SBarry Smith @*/ 823972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 824bc952696SBarry Smith { 825ed695a29SHong Zhang PetscBool set,flg; 82664e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 82764e38db7SHong Zhang PetscErrorCode ierr; 828bc952696SBarry Smith 829bc952696SBarry Smith PetscFunctionBegin; 830b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 831fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 832b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 8335f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts)); 8345f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL)); 8355f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set)); 8365f80ce2aSJacob Faibussowitsch if (set) CHKERRQ(TSTrajectorySetMonitor(tj,flg)); 8375f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL)); 8385f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL)); 8395f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL)); 8405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL)); 8415f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set)); 8425f80ce2aSJacob Faibussowitsch if (set) CHKERRQ(TSTrajectorySetKeepFiles(tj,flg)); 84364e38db7SHong Zhang 8445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",NULL,dirname,sizeof(dirname)-14,&set)); 84584a45834SBarry Smith if (set) { 8465f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetDirname(tj,dirname)); 84784a45834SBarry Smith } 84864e38db7SHong Zhang 8495f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",NULL,filetemplate,sizeof(filetemplate),&set)); 85064e38db7SHong Zhang if (set) { 8515f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetFiletemplate(tj,filetemplate)); 85284a45834SBarry Smith } 85364e38db7SHong Zhang 85464e38db7SHong Zhang /* Handle specific TSTrajectory options */ 85562b521acSHong Zhang if (tj->ops->setfromoptions) { 8565f80ce2aSJacob Faibussowitsch CHKERRQ((*tj->ops->setfromoptions)(PetscOptionsObject,tj)); 85762b521acSHong Zhang } 858bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 859bc952696SBarry Smith PetscFunctionReturn(0); 860bc952696SBarry Smith } 86168bece0bSHong Zhang 86268bece0bSHong Zhang /*@ 86368bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 86468bece0bSHong Zhang of a TS trajectory. 86568bece0bSHong Zhang 86668bece0bSHong Zhang Collective on TS 86768bece0bSHong Zhang 868d8d19677SJose E. Roman Input Parameters: 8693c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 8703c0fce88SHong Zhang - tj - the TS trajectory context 87168bece0bSHong Zhang 872df5474d8SHong Zhang Level: developer 87368bece0bSHong Zhang 87468bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 87568bece0bSHong Zhang @*/ 87668bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 87768bece0bSHong Zhang { 8789afe7f3eSBarry Smith size_t s1,s2; 87968bece0bSHong Zhang 88068bece0bSHong Zhang PetscFunctionBegin; 88168bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 88268bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 883fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 88468bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 88568bece0bSHong Zhang 8865f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventBegin(TSTrajectory_SetUp,tj,ts,0,0)); 88768bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 8885f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC)); 88968bece0bSHong Zhang } 89068bece0bSHong Zhang if (tj->ops->setup) { 8915f80ce2aSJacob Faibussowitsch CHKERRQ((*tj->ops->setup)(tj,ts)); 89268bece0bSHong Zhang } 89368bece0bSHong Zhang 89468bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 89553b27ddbSHong Zhang 89653b27ddbSHong Zhang /* Set the counters to zero */ 8971a5a771fSHong Zhang tj->recomps = 0; 89853b27ddbSHong Zhang tj->diskreads = 0; 89953b27ddbSHong Zhang tj->diskwrites = 0; 9005f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlen(tj->dirname,&s1)); 9015f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlen(tj->filetemplate,&s2)); 9025f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(tj->dirfiletemplate)); 9035f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate)); 9045f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate)); 9055f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogEventEnd(TSTrajectory_SetUp,tj,ts,0,0)); 90668bece0bSHong Zhang PetscFunctionReturn(0); 90768bece0bSHong Zhang } 908fe8322adSStefano Zampini 909fe8322adSStefano Zampini /*@ 910fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 911fe8322adSStefano Zampini 912fe8322adSStefano Zampini Collective on TSTrajectory 913fe8322adSStefano Zampini 914d8d19677SJose E. Roman Input Parameters: 915fe8322adSStefano Zampini + tj - the TS trajectory context 916fe8322adSStefano Zampini - flg - the boolean flag 917fe8322adSStefano Zampini 918fe8322adSStefano Zampini Level: developer 919fe8322adSStefano Zampini 920fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly() 921fe8322adSStefano Zampini @*/ 922fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only) 923fe8322adSStefano Zampini { 924fe8322adSStefano Zampini PetscFunctionBegin; 925fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 926fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj,solution_only,2); 927fe8322adSStefano Zampini tj->solution_only = solution_only; 928fe8322adSStefano Zampini PetscFunctionReturn(0); 929fe8322adSStefano Zampini } 930fe8322adSStefano Zampini 931fe8322adSStefano Zampini /*@ 932fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 933fe8322adSStefano Zampini 934fe8322adSStefano Zampini Logically collective on TSTrajectory 935fe8322adSStefano Zampini 936fe8322adSStefano Zampini Input Parameter: 937fe8322adSStefano Zampini . tj - the TS trajectory context 938fe8322adSStefano Zampini 939fe8322adSStefano Zampini Output Parameter: 940d8d19677SJose E. Roman . flg - the boolean flag 941fe8322adSStefano Zampini 942fe8322adSStefano Zampini Level: developer 943fe8322adSStefano Zampini 944fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly() 945fe8322adSStefano Zampini @*/ 946fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only) 947fe8322adSStefano Zampini { 948fe8322adSStefano Zampini PetscFunctionBegin; 949fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 950*dadcf809SJacob Faibussowitsch PetscValidBoolPointer(solution_only,2); 951fe8322adSStefano Zampini *solution_only = tj->solution_only; 952fe8322adSStefano Zampini PetscFunctionReturn(0); 953fe8322adSStefano Zampini } 954fe8322adSStefano Zampini 955fe8322adSStefano Zampini /*@ 956fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 957fe8322adSStefano Zampini 958fe8322adSStefano Zampini Collective on TSTrajectory 959fe8322adSStefano Zampini 960d8d19677SJose E. Roman Input Parameters: 961fe8322adSStefano Zampini + tj - the TS trajectory context 962fe8322adSStefano Zampini . ts - the TS solver context 963fe8322adSStefano Zampini - time - the requested time 964fe8322adSStefano Zampini 965d8d19677SJose E. Roman Output Parameters: 966fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 967fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 968fe8322adSStefano Zampini 969fe8322adSStefano Zampini Level: developer 970fe8322adSStefano Zampini 971fe8322adSStefano 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. 972fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 973fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 974fe8322adSStefano Zampini 975fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs() 976fe8322adSStefano Zampini @*/ 977fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 978fe8322adSStefano Zampini { 979fe8322adSStefano Zampini PetscFunctionBegin; 980fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 981fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 982fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,3); 983fe8322adSStefano Zampini if (U) PetscValidPointer(U,4); 984fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot,5); 985fe8322adSStefano Zampini if (U && !tj->U) { 986fe8322adSStefano Zampini DM dm; 987fe8322adSStefano Zampini 9885f80ce2aSJacob Faibussowitsch CHKERRQ(TSGetDM(ts,&dm)); 9895f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(dm,&tj->U)); 990fe8322adSStefano Zampini } 991fe8322adSStefano Zampini if (Udot && !tj->Udot) { 992fe8322adSStefano Zampini DM dm; 993fe8322adSStefano Zampini 9945f80ce2aSJacob Faibussowitsch CHKERRQ(TSGetDM(ts,&dm)); 9955f80ce2aSJacob Faibussowitsch CHKERRQ(DMCreateGlobalVector(dm,&tj->Udot)); 996fe8322adSStefano Zampini } 9975f80ce2aSJacob Faibussowitsch CHKERRQ(TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL)); 998fe8322adSStefano Zampini if (U) { 9995f80ce2aSJacob Faibussowitsch CHKERRQ(VecLockReadPush(tj->U)); 1000fe8322adSStefano Zampini *U = tj->U; 1001fe8322adSStefano Zampini } 1002fe8322adSStefano Zampini if (Udot) { 10035f80ce2aSJacob Faibussowitsch CHKERRQ(VecLockReadPush(tj->Udot)); 1004fe8322adSStefano Zampini *Udot = tj->Udot; 1005fe8322adSStefano Zampini } 1006fe8322adSStefano Zampini PetscFunctionReturn(0); 1007fe8322adSStefano Zampini } 1008fe8322adSStefano Zampini 1009fe8322adSStefano Zampini /*@ 1010fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 1011fe8322adSStefano Zampini 1012fe8322adSStefano Zampini Collective on TSTrajectory 1013fe8322adSStefano Zampini 1014d8d19677SJose E. Roman Input Parameters: 1015fe8322adSStefano Zampini + tj - the TS trajectory context 1016fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1017fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1018fe8322adSStefano Zampini 1019fe8322adSStefano Zampini Level: developer 1020fe8322adSStefano Zampini 1021fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs() 1022fe8322adSStefano Zampini @*/ 1023fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1024fe8322adSStefano Zampini { 1025fe8322adSStefano Zampini PetscFunctionBegin; 1026fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1027fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2); 1028fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3); 10293c633725SBarry Smith PetscCheck(!U || *U == tj->U,PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 10303c633725SBarry Smith PetscCheck(!Udot || *Udot == tj->Udot,PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1031fe8322adSStefano Zampini if (U) { 10325f80ce2aSJacob Faibussowitsch CHKERRQ(VecLockReadPop(tj->U)); 1033fe8322adSStefano Zampini *U = NULL; 1034fe8322adSStefano Zampini } 1035fe8322adSStefano Zampini if (Udot) { 10365f80ce2aSJacob Faibussowitsch CHKERRQ(VecLockReadPop(tj->Udot)); 1037fe8322adSStefano Zampini *Udot = NULL; 1038fe8322adSStefano Zampini } 1039fe8322adSStefano Zampini PetscFunctionReturn(0); 1040fe8322adSStefano Zampini } 1041