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; 8fe8322adSStefano Zampini PetscLogEvent TSTrajectory_Set, TSTrajectory_Get, TSTrajectory_GetVecs; 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 .keywords: TS, trajectory, timestep, register 25bc952696SBarry Smith 263c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll() 27bc952696SBarry Smith @*/ 28972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 29bc952696SBarry Smith { 30bc952696SBarry Smith PetscErrorCode ierr; 31bc952696SBarry Smith 32bc952696SBarry Smith PetscFunctionBegin; 33bc952696SBarry Smith ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 34bc952696SBarry Smith PetscFunctionReturn(0); 35bc952696SBarry Smith } 36bc952696SBarry Smith 37fe8322adSStefano Zampini /*@ 38fe8322adSStefano Zampini TSTrajectorySet - Sets a vector of state in the trajectory object 39fe8322adSStefano Zampini 40fe8322adSStefano Zampini Collective on TSTrajectory 41fe8322adSStefano Zampini 42fe8322adSStefano Zampini Input Parameters: 43fe8322adSStefano Zampini + tj - the trajectory object 44fe8322adSStefano Zampini . ts - the time stepper object (optional) 45fe8322adSStefano Zampini . stepnum - the step number 46fe8322adSStefano Zampini . time - the current time 47fe8322adSStefano Zampini - X - the current solution 48fe8322adSStefano Zampini 49fe8322adSStefano Zampini Level: developer 50fe8322adSStefano Zampini 51fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 52fe8322adSStefano Zampini 53fe8322adSStefano Zampini .keywords: TS, trajectory, create 54fe8322adSStefano Zampini 55fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectoryGet(), TSTrajectoryGetVecs() 56fe8322adSStefano Zampini @*/ 57bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 58bc952696SBarry Smith { 59bc952696SBarry Smith PetscErrorCode ierr; 60bc952696SBarry Smith 61bc952696SBarry Smith PetscFunctionBegin; 62bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 63fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 64fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 65fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 66fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,4); 67fe8322adSStefano Zampini PetscValidHeaderSpecific(X,VEC_CLASSID,5); 68fe8322adSStefano Zampini if (!tj->ops->set) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 69fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 70fe8322adSStefano Zampini if (tj->monitor) { 71fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectorySet: stepnum %D, time %g (stages %D)\n",stepnum,(double)time,(PetscInt)!tj->solution_only);CHKERRQ(ierr); 72fe8322adSStefano Zampini } 73d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 74bc952696SBarry Smith ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 75d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 76ac1a7491SHong Zhang if (tj->usehistory) { 77fe8322adSStefano Zampini ierr = TSHistoryUpdate(tj->tsh,stepnum,time);CHKERRQ(ierr); 78ac1a7491SHong Zhang } 79fe8322adSStefano Zampini if (tj->lag.caching) tj->lag.Udotcached.time = PETSC_MIN_REAL; 80bc952696SBarry Smith PetscFunctionReturn(0); 81bc952696SBarry Smith } 82bc952696SBarry Smith 83fe8322adSStefano Zampini /*@ 84fe8322adSStefano Zampini TSTrajectoryGetNumSteps - Return the number of steps registered in the TSTrajectory via TSTrajectorySet(). 85fe8322adSStefano Zampini 86fe8322adSStefano Zampini Not collective. 87fe8322adSStefano Zampini 88fe8322adSStefano Zampini Input Parameters: 89fe8322adSStefano Zampini . tj - the trajectory object 90fe8322adSStefano Zampini 91fe8322adSStefano Zampini Output Parameter: 92fe8322adSStefano Zampini . steps - the number of steps 93fe8322adSStefano Zampini 94fe8322adSStefano Zampini Level: developer 95fe8322adSStefano Zampini 96fe8322adSStefano Zampini .keywords: TS, trajectory, create 97fe8322adSStefano Zampini 98fe8322adSStefano Zampini .seealso: TSTrajectorySet() 99fe8322adSStefano Zampini @*/ 100fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetNumSteps(TSTrajectory tj, PetscInt *steps) 101fe8322adSStefano Zampini { 102fe8322adSStefano Zampini PetscErrorCode ierr; 103fe8322adSStefano Zampini 104fe8322adSStefano Zampini PetscFunctionBegin; 105fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 106fe8322adSStefano Zampini PetscValidIntPointer(steps,2); 107fe8322adSStefano Zampini ierr = TSHistoryGetNumSteps(tj->tsh,steps);CHKERRQ(ierr); 108fe8322adSStefano Zampini PetscFunctionReturn(0); 109fe8322adSStefano Zampini } 110fe8322adSStefano Zampini 111fe8322adSStefano Zampini /*@ 112fe8322adSStefano Zampini TSTrajectoryGet - Updates the solution vector of a time stepper object by inquiring the TSTrajectory 113fe8322adSStefano Zampini 114fe8322adSStefano Zampini Collective on TS 115fe8322adSStefano Zampini 116fe8322adSStefano Zampini Input Parameters: 117fe8322adSStefano Zampini + tj - the trajectory object 118fe8322adSStefano Zampini . ts - the time stepper object 119fe8322adSStefano Zampini - stepnum - the step number 120fe8322adSStefano Zampini 121fe8322adSStefano Zampini Output Parameter: 122fe8322adSStefano Zampini . time - the time associated with the step number 123fe8322adSStefano Zampini 124fe8322adSStefano Zampini Level: developer 125fe8322adSStefano Zampini 126fe8322adSStefano Zampini Notes: Usually one does not call this routine, it is called automatically during TSSolve() 127fe8322adSStefano Zampini 128fe8322adSStefano Zampini .keywords: TS, trajectory, create 129fe8322adSStefano Zampini 130fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGetVecs(), TSGetSolution() 131fe8322adSStefano Zampini @*/ 132c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 133bc952696SBarry Smith { 134bc952696SBarry Smith PetscErrorCode ierr; 135bc952696SBarry Smith 136bc952696SBarry Smith PetscFunctionBegin; 137bc952696SBarry Smith if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 138fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 139fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 140fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 141fe8322adSStefano Zampini PetscValidPointer(time,4); 142fe8322adSStefano Zampini if (!tj->ops->get) SETERRQ1(PetscObjectComm((PetscObject)tj),PETSC_ERR_SUP,"TSTrajectory type %s",((PetscObject)tj)->type_name); 143fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 14411e1d5c3SBarry Smith if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 145fe8322adSStefano Zampini if (tj->monitor) { 146fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"TSTrajectoryGet: stepnum %D, stages %D\n",stepnum,(PetscInt)!tj->solution_only);CHKERRQ(ierr); 147fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 148fe8322adSStefano Zampini } 149d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 150bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 151d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 152bc952696SBarry Smith PetscFunctionReturn(0); 153bc952696SBarry Smith } 154bc952696SBarry Smith 155fe8322adSStefano Zampini /*@ 156fe8322adSStefano Zampini TSTrajectoryGetVecs - Reconstructs the vector of state and its time derivative using information from the TSTrajectory and, possibly, from the TS 157fe8322adSStefano Zampini 158fe8322adSStefano Zampini Collective on TS 159fe8322adSStefano Zampini 160fe8322adSStefano Zampini Input Parameters: 161fe8322adSStefano Zampini + tj - the trajectory object 162fe8322adSStefano Zampini . ts - the time stepper object (optional) 163fe8322adSStefano Zampini - stepnum - the requested step number 164fe8322adSStefano Zampini 165fe8322adSStefano Zampini Input/Output Parameters: 166fe8322adSStefano Zampini . time - the time associated with the step number 167fe8322adSStefano Zampini 168fe8322adSStefano Zampini Output Parameters: 169fe8322adSStefano Zampini + U - state vector (can be NULL) 170fe8322adSStefano Zampini - Udot - time derivative of state vector (can be NULL) 171fe8322adSStefano Zampini 172fe8322adSStefano Zampini Level: developer 173fe8322adSStefano Zampini 174fe8322adSStefano Zampini Notes: If the step number is PETSC_DECIDE, the time argument is used to inquire the trajectory. 175fe8322adSStefano Zampini If the requested time does not match any in the trajectory, Lagrangian interpolations are returned. 176fe8322adSStefano Zampini 177fe8322adSStefano Zampini .keywords: TS, trajectory, create 178fe8322adSStefano Zampini 179fe8322adSStefano Zampini .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySet(), TSTrajectoryGet() 180fe8322adSStefano Zampini @*/ 181fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetVecs(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time,Vec U,Vec Udot) 182fe8322adSStefano Zampini { 183fe8322adSStefano Zampini PetscErrorCode ierr; 184fe8322adSStefano Zampini 185fe8322adSStefano Zampini PetscFunctionBegin; 186fe8322adSStefano Zampini if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 187fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 188fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 189fe8322adSStefano Zampini PetscValidLogicalCollectiveInt(tj,stepnum,3); 190fe8322adSStefano Zampini PetscValidPointer(time,4); 191fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(U,VEC_CLASSID,5); 192fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(Udot,VEC_CLASSID,6); 193fe8322adSStefano Zampini if (!U && !Udot) PetscFunctionReturn(0); 194fe8322adSStefano Zampini if (!tj->setupcalled) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ORDER,"TSTrajectorySetUp should be called first"); 195fe8322adSStefano Zampini ierr = PetscLogEventBegin(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 196fe8322adSStefano Zampini if (tj->monitor) { 197fe8322adSStefano Zampini PetscInt pU,pUdot; 198fe8322adSStefano Zampini pU = U ? 1 : 0; 199fe8322adSStefano Zampini pUdot = Udot ? 1 : 0; 200fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"Requested by GetVecs %D %D: stepnum %D, time %g\n",pU,pUdot,stepnum,(double)*time);CHKERRQ(ierr); 201fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 202fe8322adSStefano Zampini } 203fe8322adSStefano Zampini if (U && tj->lag.caching) { 204fe8322adSStefano Zampini PetscObjectId id; 205fe8322adSStefano Zampini PetscObjectState state; 206fe8322adSStefano Zampini 207fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)U,&state);CHKERRQ(ierr); 208fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)U,&id);CHKERRQ(ierr); 209fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 210fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && *time == tj->lag.Ucached.time && state == tj->lag.Ucached.state) U = NULL; 211fe8322adSStefano Zampini } else { 212fe8322adSStefano Zampini if (id == tj->lag.Ucached.id && stepnum == tj->lag.Ucached.step && state == tj->lag.Ucached.state) U = NULL; 213fe8322adSStefano Zampini } 214fe8322adSStefano Zampini if (tj->monitor && !U) { 215fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 216fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"State vector cached\n");CHKERRQ(ierr); 217fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 218fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 219fe8322adSStefano Zampini } 220fe8322adSStefano Zampini } 221fe8322adSStefano Zampini if (Udot && tj->lag.caching) { 222fe8322adSStefano Zampini PetscObjectId id; 223fe8322adSStefano Zampini PetscObjectState state; 224fe8322adSStefano Zampini 225fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)Udot,&state);CHKERRQ(ierr); 226fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)Udot,&id);CHKERRQ(ierr); 227fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE) { 228fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && *time == tj->lag.Udotcached.time && state == tj->lag.Udotcached.state) Udot = NULL; 229fe8322adSStefano Zampini } else { 230fe8322adSStefano Zampini if (id == tj->lag.Udotcached.id && stepnum == tj->lag.Udotcached.step && state == tj->lag.Udotcached.state) Udot = NULL; 231fe8322adSStefano Zampini } 232fe8322adSStefano Zampini if (tj->monitor && !Udot) { 233fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 234fe8322adSStefano Zampini ierr = PetscViewerASCIIPrintf(tj->monitor,"Derivative vector cached\n");CHKERRQ(ierr); 235fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 236fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 237fe8322adSStefano Zampini } 238fe8322adSStefano Zampini } 239fe8322adSStefano Zampini if (!U && !Udot) { 240fe8322adSStefano Zampini ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 241fe8322adSStefano Zampini PetscFunctionReturn(0); 242fe8322adSStefano Zampini } 243fe8322adSStefano Zampini 244fe8322adSStefano Zampini if (stepnum == PETSC_DECIDE || Udot) { /* reverse search for requested time in TSHistory */ 245fe8322adSStefano Zampini if (tj->monitor) { 246fe8322adSStefano Zampini ierr = PetscViewerASCIIPushTab(tj->monitor);CHKERRQ(ierr); 247fe8322adSStefano Zampini } 248fe8322adSStefano Zampini /* cached states will be updated in the function */ 249fe8322adSStefano Zampini ierr = TSTrajectoryReconstruct_Private(tj,ts,*time,U,Udot);CHKERRQ(ierr); 250fe8322adSStefano Zampini if (tj->monitor) { 251fe8322adSStefano Zampini ierr = PetscViewerASCIIPopTab(tj->monitor);CHKERRQ(ierr); 252fe8322adSStefano Zampini ierr = PetscViewerFlush(tj->monitor);CHKERRQ(ierr); 253fe8322adSStefano Zampini } 254fe8322adSStefano Zampini } else if (U) { /* we were asked to load from stepnum, use TSTrajectoryGet */ 255fe8322adSStefano Zampini TS fakets = ts; 256fe8322adSStefano Zampini Vec U2; 257fe8322adSStefano Zampini 258fe8322adSStefano Zampini /* use a fake TS if ts is missing */ 259fe8322adSStefano Zampini if (!ts) { 260fe8322adSStefano Zampini ierr = PetscObjectQuery((PetscObject)tj,"__fake_ts",(PetscObject*)&fakets);CHKERRQ(ierr); 261fe8322adSStefano Zampini if (!fakets) { 262fe8322adSStefano Zampini ierr = TSCreate(PetscObjectComm((PetscObject)tj),&fakets);CHKERRQ(ierr); 263fe8322adSStefano Zampini ierr = PetscObjectCompose((PetscObject)tj,"__fake_ts",(PetscObject)fakets);CHKERRQ(ierr); 264fe8322adSStefano Zampini ierr = PetscObjectDereference((PetscObject)fakets);CHKERRQ(ierr); 265fe8322adSStefano Zampini ierr = VecDuplicate(U,&U2);CHKERRQ(ierr); 266fe8322adSStefano Zampini ierr = TSSetSolution(fakets,U2);CHKERRQ(ierr); 267fe8322adSStefano Zampini ierr = PetscObjectDereference((PetscObject)U2);CHKERRQ(ierr); 268fe8322adSStefano Zampini } 269fe8322adSStefano Zampini } 270fe8322adSStefano Zampini ierr = TSTrajectoryGet(tj,fakets,stepnum,time);CHKERRQ(ierr); 271fe8322adSStefano Zampini ierr = TSGetSolution(fakets,&U2);CHKERRQ(ierr); 272fe8322adSStefano Zampini ierr = VecCopy(U2,U);CHKERRQ(ierr); 273fe8322adSStefano Zampini ierr = PetscObjectStateGet((PetscObject)U,&tj->lag.Ucached.state);CHKERRQ(ierr); 274fe8322adSStefano Zampini ierr = PetscObjectGetId((PetscObject)U,&tj->lag.Ucached.id);CHKERRQ(ierr); 275fe8322adSStefano Zampini tj->lag.Ucached.time = *time; 276fe8322adSStefano Zampini tj->lag.Ucached.step = stepnum; 277fe8322adSStefano Zampini } 278fe8322adSStefano Zampini ierr = PetscLogEventEnd(TSTrajectory_GetVecs,tj,ts,0,0);CHKERRQ(ierr); 279fe8322adSStefano Zampini PetscFunctionReturn(0); 280fe8322adSStefano Zampini } 281fe8322adSStefano Zampini 282bc952696SBarry Smith /*@C 283bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 284bc952696SBarry Smith 285bc952696SBarry Smith Collective on TSTrajectory 286bc952696SBarry Smith 287bc952696SBarry Smith Input Parameters: 288b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 289bc952696SBarry Smith - viewer - visualization context 290bc952696SBarry Smith 291bc952696SBarry Smith Options Database Key: 292e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 293bc952696SBarry Smith 294bc952696SBarry Smith Notes: 295bc952696SBarry Smith The available visualization contexts include 296bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 297bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 298bc952696SBarry Smith output where only the first processor opens 299bc952696SBarry Smith the file. All other processors send their 300bc952696SBarry Smith data to the first processor to print. 301bc952696SBarry Smith 302bc952696SBarry Smith The user can open an alternative visualization context with 303bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 304bc952696SBarry Smith 305df5474d8SHong Zhang Level: developer 306bc952696SBarry Smith 3073c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view 308bc952696SBarry Smith 309bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 310bc952696SBarry Smith @*/ 311b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 312bc952696SBarry Smith { 313bc952696SBarry Smith PetscErrorCode ierr; 314bc952696SBarry Smith PetscBool iascii; 315bc952696SBarry Smith 316bc952696SBarry Smith PetscFunctionBegin; 3171a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 318bc952696SBarry Smith if (!viewer) { 319b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 320bc952696SBarry Smith } 321bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 322b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 323bc952696SBarry Smith 324bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 325bc952696SBarry Smith if (iascii) { 326b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 3271a5a771fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 32853b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 32953b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 330b1d74d50SHong Zhang if (tj->ops->view) { 331285336bfSHong Zhang ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 332b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 333285336bfSHong Zhang ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 334bc952696SBarry Smith } 335bc952696SBarry Smith } 336bc952696SBarry Smith PetscFunctionReturn(0); 337bc952696SBarry Smith } 338bc952696SBarry Smith 339bc952696SBarry Smith /*@C 34078fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 34178fbdcc8SBarry Smith 34278fbdcc8SBarry Smith Collective on TSTrajectory 34378fbdcc8SBarry Smith 34478fbdcc8SBarry Smith Input Parameters: 34578fbdcc8SBarry Smith + tr - the trajectory context 34678fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 34778fbdcc8SBarry Smith 34878fbdcc8SBarry Smith Level: intermediate 34978fbdcc8SBarry Smith 350db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 351db901c5bSHong Zhang 35278fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view 35378fbdcc8SBarry Smith 35478fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 35578fbdcc8SBarry Smith @*/ 35678fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 35778fbdcc8SBarry Smith { 35878fbdcc8SBarry Smith PetscErrorCode ierr; 35978fbdcc8SBarry Smith 36078fbdcc8SBarry Smith PetscFunctionBegin; 361fe8322adSStefano Zampini PetscValidHeaderSpecific(ctx,TSTRAJECTORY_CLASSID,1); 362fe8322adSStefano Zampini PetscValidPointer(names,2); 36378fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 36478fbdcc8SBarry Smith ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 36578fbdcc8SBarry Smith PetscFunctionReturn(0); 36678fbdcc8SBarry Smith } 36778fbdcc8SBarry Smith 36878fbdcc8SBarry Smith /*@C 369fe8322adSStefano Zampini TSTrajectorySetTransform - Solution vector will be transformed by provided function before being saved to disk 37008347785SBarry Smith 37108347785SBarry Smith Collective on TSLGCtx 37208347785SBarry Smith 37308347785SBarry Smith Input Parameters: 37408347785SBarry Smith + tj - the TSTrajectory context 37508347785SBarry Smith . transform - the transform function 37608347785SBarry Smith . destroy - function to destroy the optional context 37708347785SBarry Smith - ctx - optional context used by transform function 37808347785SBarry Smith 37908347785SBarry Smith Level: intermediate 38008347785SBarry Smith 38108347785SBarry Smith .keywords: TSTrajectory, vector, monitor, view 38208347785SBarry Smith 38308347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 38408347785SBarry Smith @*/ 38508347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 38608347785SBarry Smith { 38708347785SBarry Smith PetscFunctionBegin; 388fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 38908347785SBarry Smith tj->transform = transform; 39008347785SBarry Smith tj->transformdestroy = destroy; 39108347785SBarry Smith tj->transformctx = tctx; 39208347785SBarry Smith PetscFunctionReturn(0); 39308347785SBarry Smith } 39408347785SBarry Smith 395db901c5bSHong Zhang /*@ 396bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 397bc952696SBarry Smith 398bc952696SBarry Smith Collective on MPI_Comm 399bc952696SBarry Smith 400bc952696SBarry Smith Input Parameter: 4013c0fce88SHong Zhang . comm - the communicator 402bc952696SBarry Smith 403bc952696SBarry Smith Output Parameter: 4043c0fce88SHong Zhang . tj - the trajectory object 405bc952696SBarry Smith 406df5474d8SHong Zhang Level: developer 407bc952696SBarry Smith 40895452b02SPatrick Sanan Notes: 40995452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 410bc952696SBarry Smith 4113c0fce88SHong Zhang .keywords: TS, trajectory, create 4123c0fce88SHong Zhang 41364fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 414bc952696SBarry Smith @*/ 415b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 416bc952696SBarry Smith { 417bc952696SBarry Smith TSTrajectory t; 418bc952696SBarry Smith PetscErrorCode ierr; 419bc952696SBarry Smith 420bc952696SBarry Smith PetscFunctionBegin; 421b1d74d50SHong Zhang PetscValidPointer(tj,2); 422b1d74d50SHong Zhang *tj = NULL; 423bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 424bc952696SBarry Smith 42573107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 42668bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 427fe8322adSStefano Zampini ierr = TSHistoryCreate(comm,&t->tsh);CHKERRQ(ierr); 428fe8322adSStefano Zampini 429fe8322adSStefano Zampini t->lag.order = 1; 430fe8322adSStefano Zampini t->lag.L = NULL; 431fe8322adSStefano Zampini t->lag.T = NULL; 432fe8322adSStefano Zampini t->lag.W = NULL; 433fe8322adSStefano Zampini t->lag.WW = NULL; 434fe8322adSStefano Zampini t->lag.TW = NULL; 435fe8322adSStefano Zampini t->lag.TT = NULL; 436fe8322adSStefano Zampini t->lag.caching = PETSC_TRUE; 437fe8322adSStefano Zampini t->lag.Ucached.id = 0; 438fe8322adSStefano Zampini t->lag.Ucached.state = -1; 439fe8322adSStefano Zampini t->lag.Ucached.time = PETSC_MIN_REAL; 440fe8322adSStefano Zampini t->lag.Ucached.step = PETSC_MAX_INT; 441fe8322adSStefano Zampini t->lag.Udotcached.id = 0; 442fe8322adSStefano Zampini t->lag.Udotcached.state = -1; 443fe8322adSStefano Zampini t->lag.Udotcached.time = PETSC_MIN_REAL; 444fe8322adSStefano Zampini t->lag.Udotcached.step = PETSC_MAX_INT; 445fe8322adSStefano Zampini t->adjoint_solve_mode = PETSC_TRUE; 446fe8322adSStefano Zampini t->solution_only = PETSC_FALSE; 447fe8322adSStefano Zampini t->keepfiles = PETSC_FALSE; 448ac1a7491SHong Zhang t->usehistory = PETSC_TRUE; 449b1d74d50SHong Zhang *tj = t; 45084a45834SBarry Smith ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 451e94726ebSBarry Smith ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr); 452bc952696SBarry Smith PetscFunctionReturn(0); 453bc952696SBarry Smith } 454bc952696SBarry Smith 455bc952696SBarry Smith /*@C 456bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 457bc952696SBarry Smith 458bc952696SBarry Smith Collective on TS 459bc952696SBarry Smith 460bc952696SBarry Smith Input Parameters: 4613c0fce88SHong Zhang + tj - the TSTrajectory context 4623c0fce88SHong Zhang . ts - the TS context 4633c0fce88SHong Zhang - type - a known method 464bc952696SBarry Smith 465bc952696SBarry Smith Options Database Command: 466e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 467bc952696SBarry Smith 468df5474d8SHong Zhang Level: developer 469bc952696SBarry Smith 4703c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type 471bc952696SBarry Smith 472881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectoryGetType() 473bc952696SBarry Smith 474bc952696SBarry Smith @*/ 475fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 476bc952696SBarry Smith { 477972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 478bc952696SBarry Smith PetscBool match; 479bc952696SBarry Smith PetscErrorCode ierr; 480bc952696SBarry Smith 481bc952696SBarry Smith PetscFunctionBegin; 482972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 483972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 484bc952696SBarry Smith if (match) PetscFunctionReturn(0); 485bc952696SBarry Smith 486bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 487bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 488972caf09SHong Zhang if (tj->ops->destroy) { 489972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 490bc952696SBarry Smith 491972caf09SHong Zhang tj->ops->destroy = NULL; 492bc952696SBarry Smith } 493972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 494bc952696SBarry Smith 495972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 496972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 497bc952696SBarry Smith PetscFunctionReturn(0); 498bc952696SBarry Smith } 499bc952696SBarry Smith 500881c1a9bSHong Zhang /*@C 501881c1a9bSHong Zhang TSTrajectoryGetType - Gets the trajectory type 502881c1a9bSHong Zhang 503881c1a9bSHong Zhang Collective on TS 504881c1a9bSHong Zhang 505881c1a9bSHong Zhang Input Parameters: 506881c1a9bSHong Zhang + tj - the TSTrajectory context 507881c1a9bSHong Zhang - ts - the TS context 508881c1a9bSHong Zhang 509881c1a9bSHong Zhang Output Parameters: 510881c1a9bSHong Zhang . type - a known method 511881c1a9bSHong Zhang 512881c1a9bSHong Zhang Level: developer 513881c1a9bSHong Zhang 514881c1a9bSHong Zhang .keywords: TS, trajectory, timestep, get, type 515881c1a9bSHong Zhang 516881c1a9bSHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy(), TSTrajectorySetType() 517881c1a9bSHong Zhang 518881c1a9bSHong Zhang @*/ 519881c1a9bSHong Zhang PetscErrorCode TSTrajectoryGetType(TSTrajectory tj,TS ts,TSTrajectoryType *type) 520881c1a9bSHong Zhang { 521881c1a9bSHong Zhang PetscFunctionBegin; 522881c1a9bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 523881c1a9bSHong Zhang if (type) *type = ((PetscObject)tj)->type_name; 524881c1a9bSHong Zhang PetscFunctionReturn(0); 525881c1a9bSHong Zhang } 526881c1a9bSHong Zhang 527972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 528972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 5299a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 5302b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 531bc952696SBarry Smith 532bc952696SBarry Smith /*@C 533bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 534bc952696SBarry Smith 535bc952696SBarry Smith Not Collective 536bc952696SBarry Smith 537df5474d8SHong Zhang Level: developer 538bc952696SBarry Smith 5393c0fce88SHong Zhang .keywords: TS, trajectory, register, all 5403c0fce88SHong Zhang 5413c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 542bc952696SBarry Smith @*/ 543bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 544bc952696SBarry Smith { 545bc952696SBarry Smith PetscErrorCode ierr; 546bc952696SBarry Smith 547bc952696SBarry Smith PetscFunctionBegin; 548560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 549bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 550bc952696SBarry Smith 551bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 5521c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 5539a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 5542b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 555bc952696SBarry Smith PetscFunctionReturn(0); 556bc952696SBarry Smith } 557bc952696SBarry Smith 558bc952696SBarry Smith /*@ 5591550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 5601550c9b9SHong Zhang 5611550c9b9SHong Zhang Collective on TSTrajectory 5621550c9b9SHong Zhang 5631550c9b9SHong Zhang Input Parameter: 5641550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5651550c9b9SHong Zhang 5661550c9b9SHong Zhang Level: developer 5671550c9b9SHong Zhang 5681550c9b9SHong Zhang .keywords: TS, trajectory, timestep, reset 5691550c9b9SHong Zhang 5701550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 5711550c9b9SHong Zhang @*/ 5729a992471SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory tj) 5731550c9b9SHong Zhang { 5741550c9b9SHong Zhang PetscErrorCode ierr; 5751550c9b9SHong Zhang 5761550c9b9SHong Zhang PetscFunctionBegin; 5779a992471SHong Zhang if (!tj) PetscFunctionReturn(0); 5789a992471SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 5799a992471SHong Zhang if (tj->ops->reset) { 5809a992471SHong Zhang ierr = (*tj->ops->reset)(tj);CHKERRQ(ierr); 5819a992471SHong Zhang } 5829a992471SHong Zhang ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 583fe8322adSStefano Zampini ierr = TSHistoryDestroy(&tj->tsh);CHKERRQ(ierr); 584fe8322adSStefano Zampini ierr = TSHistoryCreate(PetscObjectComm((PetscObject)tj),&tj->tsh);CHKERRQ(ierr); 585fe8322adSStefano Zampini tj->setupcalled = PETSC_FALSE; 5861550c9b9SHong Zhang PetscFunctionReturn(0); 5871550c9b9SHong Zhang } 5881550c9b9SHong Zhang 5891550c9b9SHong Zhang /*@ 590bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 591bc952696SBarry Smith 592bc952696SBarry Smith Collective on TSTrajectory 593bc952696SBarry Smith 594bc952696SBarry Smith Input Parameter: 5953c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 596bc952696SBarry Smith 597df5474d8SHong Zhang Level: developer 598bc952696SBarry Smith 5993c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy 600bc952696SBarry Smith 6013c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 602bc952696SBarry Smith @*/ 603972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 604bc952696SBarry Smith { 605bc952696SBarry Smith PetscErrorCode ierr; 606bc952696SBarry Smith 607bc952696SBarry Smith PetscFunctionBegin; 608972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 609972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 610972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 611bc952696SBarry Smith 612fe8322adSStefano Zampini ierr = TSTrajectoryReset(*tj);CHKERRQ(ierr); 613fe8322adSStefano Zampini ierr = TSHistoryDestroy(&(*tj)->tsh);CHKERRQ(ierr); 614fe8322adSStefano Zampini ierr = VecDestroyVecs((*tj)->lag.order+1,&(*tj)->lag.W);CHKERRQ(ierr); 615fe8322adSStefano Zampini ierr = PetscFree5((*tj)->lag.L,(*tj)->lag.T,(*tj)->lag.WW,(*tj)->lag.TT,(*tj)->lag.TW);CHKERRQ(ierr); 616fe8322adSStefano Zampini ierr = VecDestroy(&(*tj)->U);CHKERRQ(ierr); 617fe8322adSStefano Zampini ierr = VecDestroy(&(*tj)->Udot);CHKERRQ(ierr); 6189a992471SHong Zhang 6197f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 620972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 621fe8322adSStefano Zampini if (!((*tj)->keepfiles)) { 622fe8322adSStefano Zampini PetscMPIInt rank; 623fe8322adSStefano Zampini MPI_Comm comm; 624fe8322adSStefano Zampini 625fe8322adSStefano Zampini ierr = PetscObjectGetComm((PetscObject)(*tj),&comm);CHKERRQ(ierr); 626fe8322adSStefano Zampini ierr = MPI_Comm_rank(comm,&rank);CHKERRQ(ierr); 627fe8322adSStefano Zampini if (!rank) { /* we own the directory, so we run PetscRMTree on it */ 628fe8322adSStefano Zampini ierr = PetscRMTree((*tj)->dirname);CHKERRQ(ierr); 629fe8322adSStefano Zampini } 630fe8322adSStefano Zampini } 63178fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 63264e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 63364e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 634972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 635bc952696SBarry Smith PetscFunctionReturn(0); 636bc952696SBarry Smith } 637bc952696SBarry Smith 638bc952696SBarry Smith /* 639772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 640bc952696SBarry Smith 641bc952696SBarry Smith Collective on TSTrajectory 642bc952696SBarry Smith 643bc952696SBarry Smith Input Parameter: 6443c0fce88SHong Zhang + tj - the TSTrajectory context 6453c0fce88SHong Zhang - ts - the TS context 6463c0fce88SHong Zhang 6473c0fce88SHong Zhang Options Database Keys: 6483c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 649bc952696SBarry Smith 650df5474d8SHong Zhang Level: developer 651bc952696SBarry Smith 6523c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type 6533c0fce88SHong Zhang 6543c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 655bc952696SBarry Smith */ 6562bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 657bc952696SBarry Smith { 658bc952696SBarry Smith PetscBool opt; 659bc952696SBarry Smith const char *defaultType; 660bc952696SBarry Smith char typeName[256]; 661bc952696SBarry Smith PetscErrorCode ierr; 662bc952696SBarry Smith 663bc952696SBarry Smith PetscFunctionBegin; 664b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 665bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 666bc952696SBarry Smith 667560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 668e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 669bc952696SBarry Smith if (opt) { 670972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 671bc952696SBarry Smith } else { 672972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 673bc952696SBarry Smith } 674bc952696SBarry Smith PetscFunctionReturn(0); 675bc952696SBarry Smith } 676bc952696SBarry Smith 677ed695a29SHong Zhang /*@ 678*9ffb3502SHong Zhang TSTrajectorySetUseHistory - Use TSHistory in TSTrajectory 679*9ffb3502SHong Zhang 680*9ffb3502SHong Zhang Collective on TSTrajectory 681*9ffb3502SHong Zhang 682*9ffb3502SHong Zhang Input Arguments: 683*9ffb3502SHong Zhang + tj - the TSTrajectory context 684*9ffb3502SHong Zhang - flg - PETSC_TRUE to save, PETSC_FALSE to disable 685*9ffb3502SHong Zhang 686*9ffb3502SHong Zhang Options Database Keys: 687*9ffb3502SHong Zhang . -ts_trajectory_use_history - have it use TSHistory 688*9ffb3502SHong Zhang 689*9ffb3502SHong Zhang Level: advanced 690*9ffb3502SHong Zhang 691*9ffb3502SHong Zhang .keywords: TS, trajectory, set, TSHistory 692*9ffb3502SHong Zhang 693*9ffb3502SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 694*9ffb3502SHong Zhang @*/ 695*9ffb3502SHong Zhang PetscErrorCode TSTrajectorySetUseHistory(TSTrajectory tj,PetscBool flg) 696*9ffb3502SHong Zhang { 697*9ffb3502SHong Zhang PetscFunctionBegin; 698*9ffb3502SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 699*9ffb3502SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 700*9ffb3502SHong Zhang tj->usehistory = flg; 701*9ffb3502SHong Zhang PetscFunctionReturn(0); 702*9ffb3502SHong Zhang } 703*9ffb3502SHong Zhang 704*9ffb3502SHong Zhang /*@ 705ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 706ed695a29SHong Zhang 707ed695a29SHong Zhang Collective on TSTrajectory 708ed695a29SHong Zhang 709ed695a29SHong Zhang Input Arguments: 710ed695a29SHong Zhang + tj - the TSTrajectory context 711ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 712ed695a29SHong Zhang 7133c0fce88SHong Zhang Options Database Keys: 714063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 7153c0fce88SHong Zhang 716df5474d8SHong Zhang Level: developer 717ed695a29SHong Zhang 7183c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor 7193c0fce88SHong Zhang 7203c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 721ed695a29SHong Zhang @*/ 7222bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 723ed695a29SHong Zhang { 724ed695a29SHong Zhang PetscFunctionBegin; 725ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 726ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 727fe8322adSStefano Zampini if (flg) tj->monitor = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)tj)); 728fe8322adSStefano Zampini else tj->monitor = NULL; 729ed695a29SHong Zhang PetscFunctionReturn(0); 730ed695a29SHong Zhang } 731ed695a29SHong Zhang 732bc952696SBarry Smith /*@ 73364fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 73464fc91eeSBarry Smith 73564fc91eeSBarry Smith Collective on TSTrajectory 73664fc91eeSBarry Smith 73764fc91eeSBarry Smith Input Arguments: 73864fc91eeSBarry Smith + tj - the TSTrajectory context 73964fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 74064fc91eeSBarry Smith 74164fc91eeSBarry Smith Options Database Keys: 74264fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 74364fc91eeSBarry Smith 74495452b02SPatrick Sanan Notes: 74595452b02SPatrick 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. 74664fc91eeSBarry Smith 74764fc91eeSBarry Smith Level: advanced 74864fc91eeSBarry Smith 74964fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor 75064fc91eeSBarry Smith 75164fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 75264fc91eeSBarry Smith @*/ 75364fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 75464fc91eeSBarry Smith { 75564fc91eeSBarry Smith PetscFunctionBegin; 75664fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 75764fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 75864fc91eeSBarry Smith tj->keepfiles = flg; 75964fc91eeSBarry Smith PetscFunctionReturn(0); 76064fc91eeSBarry Smith } 76164fc91eeSBarry Smith 762db901c5bSHong Zhang /*@C 76364e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 76464e38db7SHong Zhang 76564e38db7SHong Zhang Collective on TSTrajectory 76664e38db7SHong Zhang 76764e38db7SHong Zhang Input Arguments: 76864e38db7SHong Zhang + tj - the TSTrajectory context 76964e38db7SHong Zhang - dirname - the directory name 77064e38db7SHong Zhang 77164e38db7SHong Zhang Options Database Keys: 77264e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 77364e38db7SHong Zhang 77495452b02SPatrick Sanan Notes: 77595452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 7761585b412SBarry Smith 77764e38db7SHong Zhang Level: developer 77864e38db7SHong Zhang 77964e38db7SHong Zhang .keywords: TS, trajectory, set 78064e38db7SHong Zhang 78164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 78264e38db7SHong Zhang @*/ 78364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 78464e38db7SHong Zhang { 78564e38db7SHong Zhang PetscErrorCode ierr; 786a17281aeSStefano Zampini PetscBool flg; 787a17281aeSStefano Zampini 78864e38db7SHong Zhang PetscFunctionBegin; 78964e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 790a17281aeSStefano Zampini ierr = PetscStrcmp(tj->dirname,dirname,&flg);CHKERRQ(ierr); 791a17281aeSStefano Zampini if (!flg && tj->dirfiletemplate) { 792a17281aeSStefano Zampini SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after TSTrajectory has been setup"); 793a17281aeSStefano Zampini } 79484a45834SBarry Smith ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 79564e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 79664e38db7SHong Zhang PetscFunctionReturn(0); 79764e38db7SHong Zhang } 79864e38db7SHong Zhang 799db901c5bSHong Zhang /*@C 80064e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 80164e38db7SHong Zhang 80264e38db7SHong Zhang Collective on TSTrajectory 80364e38db7SHong Zhang 80464e38db7SHong Zhang Input Arguments: 80564e38db7SHong Zhang + tj - the TSTrajectory context 8061585b412SBarry Smith - filetemplate - the template 80764e38db7SHong Zhang 80864e38db7SHong Zhang Options Database Keys: 8091585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 8101585b412SBarry Smith 81195452b02SPatrick Sanan Notes: 81295452b02SPatrick Sanan The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 8131585b412SBarry Smith 8141585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 8151585b412SBarry Smith timestep counter 81664e38db7SHong Zhang 81764e38db7SHong Zhang Level: developer 81864e38db7SHong Zhang 81964e38db7SHong Zhang .keywords: TS, trajectory, set 82064e38db7SHong Zhang 8211585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 82264e38db7SHong Zhang @*/ 82364e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 82464e38db7SHong Zhang { 82564e38db7SHong Zhang PetscErrorCode ierr; 8269afe7f3eSBarry Smith const char *ptr,*ptr2; 8279afe7f3eSBarry Smith 82864e38db7SHong Zhang PetscFunctionBegin; 82964e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 8309afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 8319afe7f3eSBarry Smith 8329afe7f3eSBarry Smith if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 8339afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 8349afe7f3eSBarry Smith ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 8359afe7f3eSBarry Smith if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 8369afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 8379afe7f3eSBarry Smith ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 8389afe7f3eSBarry Smith if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06D.bin"); 8399afe7f3eSBarry Smith if (ptr2) break; 8409afe7f3eSBarry Smith } 84184a45834SBarry Smith ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 84264e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 84364e38db7SHong Zhang PetscFunctionReturn(0); 84464e38db7SHong Zhang } 84564e38db7SHong Zhang 84664e38db7SHong Zhang /*@ 847bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 848bc952696SBarry Smith 849bc952696SBarry Smith Collective on TSTrajectory 850bc952696SBarry Smith 851bc952696SBarry Smith Input Parameter: 8523c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 8533c0fce88SHong Zhang - ts - the TS context 854bc952696SBarry Smith 855bc952696SBarry Smith Options Database Keys: 8563c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 85764fc91eeSBarry 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 858063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 859bc952696SBarry Smith 860df5474d8SHong Zhang Level: developer 861bc952696SBarry Smith 86295452b02SPatrick Sanan Notes: 86395452b02SPatrick Sanan This is not normally called directly by users 864bc952696SBarry Smith 8653c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database 866bc952696SBarry Smith 8673c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 868bc952696SBarry Smith @*/ 869972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 870bc952696SBarry Smith { 871ed695a29SHong Zhang PetscBool set,flg; 87264e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 87364e38db7SHong Zhang PetscErrorCode ierr; 874bc952696SBarry Smith 875bc952696SBarry Smith PetscFunctionBegin; 876b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 877fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 878b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 879972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 880ac1a7491SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_use_history","Turn on/off usage of TSHistory",NULL,tj->usehistory,&tj->usehistory,NULL);CHKERRQ(ierr); 881ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 882aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 883fe8322adSStefano Zampini ierr = PetscOptionsInt("-ts_trajectory_reconstruction_order","Interpolation order for reconstruction",NULL,tj->lag.order,&tj->lag.order,NULL);CHKERRQ(ierr); 884fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_reconstruction_caching","Turn on/off caching of TSTrajectoryGetVecs input",NULL,tj->lag.caching,&tj->lag.caching,NULL);CHKERRQ(ierr); 885fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_adjointmode","Instruct the trajectory that will be used in a TSAdjointSolve()",NULL,tj->adjoint_solve_mode,&tj->adjoint_solve_mode,NULL);CHKERRQ(ierr); 886fe8322adSStefano Zampini ierr = PetscOptionsBool("-ts_trajectory_solution_only","Checkpoint solution only","TSTrajectorySetSolutionOnly",tj->solution_only,&tj->solution_only,NULL);CHKERRQ(ierr); 88764fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 88864fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 88964e38db7SHong Zhang 89064e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 89184a45834SBarry Smith if (set) { 89264e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 89384a45834SBarry Smith } 89464e38db7SHong Zhang 8951585b412SBarry Smith ierr = PetscOptionsString("-ts_trajectory_file_template","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr); 89664e38db7SHong Zhang if (set) { 8971585b412SBarry Smith ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 89884a45834SBarry Smith } 89964e38db7SHong Zhang 90064e38db7SHong Zhang /* Handle specific TSTrajectory options */ 90162b521acSHong Zhang if (tj->ops->setfromoptions) { 90262b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 90362b521acSHong Zhang } 904bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 905bc952696SBarry Smith PetscFunctionReturn(0); 906bc952696SBarry Smith } 90768bece0bSHong Zhang 90868bece0bSHong Zhang /*@ 90968bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 91068bece0bSHong Zhang of a TS trajectory. 91168bece0bSHong Zhang 91268bece0bSHong Zhang Collective on TS 91368bece0bSHong Zhang 91468bece0bSHong Zhang Input Parameter: 9153c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 9163c0fce88SHong Zhang - tj - the TS trajectory context 91768bece0bSHong Zhang 918df5474d8SHong Zhang Level: developer 91968bece0bSHong Zhang 9203c0fce88SHong Zhang .keywords: TS, trajectory, setup 92168bece0bSHong Zhang 92268bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 92368bece0bSHong Zhang @*/ 92468bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 92568bece0bSHong Zhang { 92668bece0bSHong Zhang PetscErrorCode ierr; 9279afe7f3eSBarry Smith size_t s1,s2; 92868bece0bSHong Zhang 92968bece0bSHong Zhang PetscFunctionBegin; 93068bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 93168bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 932fe8322adSStefano Zampini if (ts) PetscValidHeaderSpecific(ts,TS_CLASSID,2); 93368bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 93468bece0bSHong Zhang 93568bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 93668bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 93768bece0bSHong Zhang } 93868bece0bSHong Zhang if (tj->ops->setup) { 93968bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 94068bece0bSHong Zhang } 94168bece0bSHong Zhang 94268bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 94353b27ddbSHong Zhang 94453b27ddbSHong Zhang /* Set the counters to zero */ 9451a5a771fSHong Zhang tj->recomps = 0; 94653b27ddbSHong Zhang tj->diskreads = 0; 94753b27ddbSHong Zhang tj->diskwrites = 0; 9489afe7f3eSBarry Smith ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 9499afe7f3eSBarry Smith ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 950fe8322adSStefano Zampini ierr = PetscFree(tj->dirfiletemplate);CHKERRQ(ierr); 95111e1d5c3SBarry Smith ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 95211e1d5c3SBarry Smith ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 95368bece0bSHong Zhang PetscFunctionReturn(0); 95468bece0bSHong Zhang } 955fe8322adSStefano Zampini 956fe8322adSStefano Zampini /*@ 957fe8322adSStefano Zampini TSTrajectorySetSolutionOnly - Tells the trajectory to store just the solution, and not any intermediate stage also. 958fe8322adSStefano Zampini 959fe8322adSStefano Zampini Collective on TSTrajectory 960fe8322adSStefano Zampini 961fe8322adSStefano Zampini Input Parameter: 962fe8322adSStefano Zampini + tj - the TS trajectory context 963fe8322adSStefano Zampini - flg - the boolean flag 964fe8322adSStefano Zampini 965fe8322adSStefano Zampini Level: developer 966fe8322adSStefano Zampini 967fe8322adSStefano Zampini .keywords: trajectory 968fe8322adSStefano Zampini 969fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryGetSolutionOnly() 970fe8322adSStefano Zampini @*/ 971fe8322adSStefano Zampini PetscErrorCode TSTrajectorySetSolutionOnly(TSTrajectory tj,PetscBool solution_only) 972fe8322adSStefano Zampini { 973fe8322adSStefano Zampini PetscFunctionBegin; 974fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 975fe8322adSStefano Zampini PetscValidLogicalCollectiveBool(tj,solution_only,2); 976fe8322adSStefano Zampini tj->solution_only = solution_only; 977fe8322adSStefano Zampini PetscFunctionReturn(0); 978fe8322adSStefano Zampini } 979fe8322adSStefano Zampini 980fe8322adSStefano Zampini /*@ 981fe8322adSStefano Zampini TSTrajectoryGetSolutionOnly - Gets the value set with TSTrajectorySetSolutionOnly. 982fe8322adSStefano Zampini 983fe8322adSStefano Zampini Logically collective on TSTrajectory 984fe8322adSStefano Zampini 985fe8322adSStefano Zampini Input Parameter: 986fe8322adSStefano Zampini . tj - the TS trajectory context 987fe8322adSStefano Zampini 988fe8322adSStefano Zampini Output Parameter: 989fe8322adSStefano Zampini - flg - the boolean flag 990fe8322adSStefano Zampini 991fe8322adSStefano Zampini Level: developer 992fe8322adSStefano Zampini 993fe8322adSStefano Zampini .keywords: trajectory 994fe8322adSStefano Zampini 995fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetSolutionOnly() 996fe8322adSStefano Zampini @*/ 997fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetSolutionOnly(TSTrajectory tj,PetscBool *solution_only) 998fe8322adSStefano Zampini { 999fe8322adSStefano Zampini PetscFunctionBegin; 1000fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1001fe8322adSStefano Zampini PetscValidPointer(solution_only,2); 1002fe8322adSStefano Zampini *solution_only = tj->solution_only; 1003fe8322adSStefano Zampini PetscFunctionReturn(0); 1004fe8322adSStefano Zampini } 1005fe8322adSStefano Zampini 1006fe8322adSStefano Zampini /*@ 1007fe8322adSStefano Zampini TSTrajectoryGetUpdatedHistoryVecs - Get updated state and time-derivative history vectors. 1008fe8322adSStefano Zampini 1009fe8322adSStefano Zampini Collective on TSTrajectory 1010fe8322adSStefano Zampini 1011fe8322adSStefano Zampini Input Parameter: 1012fe8322adSStefano Zampini + tj - the TS trajectory context 1013fe8322adSStefano Zampini . ts - the TS solver context 1014fe8322adSStefano Zampini - time - the requested time 1015fe8322adSStefano Zampini 1016fe8322adSStefano Zampini Output Parameter: 1017fe8322adSStefano Zampini + U - state vector at given time (can be interpolated) 1018fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1019fe8322adSStefano Zampini 1020fe8322adSStefano Zampini Level: developer 1021fe8322adSStefano Zampini 1022fe8322adSStefano 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. 1023fe8322adSStefano Zampini This function differs from TSTrajectoryGetVecs since the vectors obtained cannot be modified, and they need to be returned by 1024fe8322adSStefano Zampini calling TSTrajectoryRestoreUpdatedHistoryVecs(). 1025fe8322adSStefano Zampini 1026fe8322adSStefano Zampini .keywords: trajectory 1027fe8322adSStefano Zampini 1028fe8322adSStefano Zampini .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectoryRestoreUpdatedHistoryVecs(), TSTrajectoryGetVecs() 1029fe8322adSStefano Zampini @*/ 1030fe8322adSStefano Zampini PetscErrorCode TSTrajectoryGetUpdatedHistoryVecs(TSTrajectory tj, TS ts, PetscReal time, Vec *U, Vec *Udot) 1031fe8322adSStefano Zampini { 1032fe8322adSStefano Zampini PetscErrorCode ierr; 1033fe8322adSStefano Zampini 1034fe8322adSStefano Zampini PetscFunctionBegin; 1035fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1036fe8322adSStefano Zampini PetscValidHeaderSpecific(ts,TS_CLASSID,2); 1037fe8322adSStefano Zampini PetscValidLogicalCollectiveReal(tj,time,3); 1038fe8322adSStefano Zampini if (U) PetscValidPointer(U,4); 1039fe8322adSStefano Zampini if (Udot) PetscValidPointer(Udot,5); 1040fe8322adSStefano Zampini if (U && !tj->U) { 1041fe8322adSStefano Zampini DM dm; 1042fe8322adSStefano Zampini 1043fe8322adSStefano Zampini ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 1044fe8322adSStefano Zampini ierr = DMCreateGlobalVector(dm,&tj->U);CHKERRQ(ierr); 1045fe8322adSStefano Zampini } 1046fe8322adSStefano Zampini if (Udot && !tj->Udot) { 1047fe8322adSStefano Zampini DM dm; 1048fe8322adSStefano Zampini 1049fe8322adSStefano Zampini ierr = TSGetDM(ts,&dm);CHKERRQ(ierr); 1050fe8322adSStefano Zampini ierr = DMCreateGlobalVector(dm,&tj->Udot);CHKERRQ(ierr); 1051fe8322adSStefano Zampini } 1052fe8322adSStefano Zampini ierr = TSTrajectoryGetVecs(tj,ts,PETSC_DECIDE,&time,U ? tj->U : NULL,Udot ? tj->Udot : NULL);CHKERRQ(ierr); 1053fe8322adSStefano Zampini if (U) { 10548860a134SJunchao Zhang ierr = VecLockReadPush(tj->U);CHKERRQ(ierr); 1055fe8322adSStefano Zampini *U = tj->U; 1056fe8322adSStefano Zampini } 1057fe8322adSStefano Zampini if (Udot) { 10588860a134SJunchao Zhang ierr = VecLockReadPush(tj->Udot);CHKERRQ(ierr); 1059fe8322adSStefano Zampini *Udot = tj->Udot; 1060fe8322adSStefano Zampini } 1061fe8322adSStefano Zampini PetscFunctionReturn(0); 1062fe8322adSStefano Zampini } 1063fe8322adSStefano Zampini 1064fe8322adSStefano Zampini /*@ 1065fe8322adSStefano Zampini TSTrajectoryRestoreUpdatedHistoryVecs - Restores updated state and time-derivative history vectors obtained with TSTrajectoryGetUpdatedHistoryVecs(). 1066fe8322adSStefano Zampini 1067fe8322adSStefano Zampini Collective on TSTrajectory 1068fe8322adSStefano Zampini 1069fe8322adSStefano Zampini Input Parameter: 1070fe8322adSStefano Zampini + tj - the TS trajectory context 1071fe8322adSStefano Zampini . U - state vector at given time (can be interpolated) 1072fe8322adSStefano Zampini - Udot - time-derivative vector at given time (can be interpolated) 1073fe8322adSStefano Zampini 1074fe8322adSStefano Zampini Level: developer 1075fe8322adSStefano Zampini 1076fe8322adSStefano Zampini .keywords: trajectory 1077fe8322adSStefano Zampini 1078fe8322adSStefano Zampini .seealso: TSTrajectoryGetUpdatedHistoryVecs() 1079fe8322adSStefano Zampini @*/ 1080fe8322adSStefano Zampini PetscErrorCode TSTrajectoryRestoreUpdatedHistoryVecs(TSTrajectory tj, Vec *U, Vec *Udot) 1081fe8322adSStefano Zampini { 1082fe8322adSStefano Zampini PetscErrorCode ierr; 1083fe8322adSStefano Zampini 1084fe8322adSStefano Zampini PetscFunctionBegin; 1085fe8322adSStefano Zampini PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 1086fe8322adSStefano Zampini if (U) PetscValidHeaderSpecific(*U,VEC_CLASSID,2); 1087fe8322adSStefano Zampini if (Udot) PetscValidHeaderSpecific(*Udot,VEC_CLASSID,3); 1088fe8322adSStefano Zampini if (U && *U != tj->U) SETERRQ(PetscObjectComm((PetscObject)*U),PETSC_ERR_USER,"U was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1089fe8322adSStefano Zampini if (Udot && *Udot != tj->Udot) SETERRQ(PetscObjectComm((PetscObject)*Udot),PETSC_ERR_USER,"Udot was not obtained from TSTrajectoryGetUpdatedHistoryVecs()"); 1090fe8322adSStefano Zampini if (U) { 10918860a134SJunchao Zhang ierr = VecLockReadPop(tj->U);CHKERRQ(ierr); 1092fe8322adSStefano Zampini *U = NULL; 1093fe8322adSStefano Zampini } 1094fe8322adSStefano Zampini if (Udot) { 10958860a134SJunchao Zhang ierr = VecLockReadPop(tj->Udot);CHKERRQ(ierr); 1096fe8322adSStefano Zampini *Udot = NULL; 1097fe8322adSStefano Zampini } 1098fe8322adSStefano Zampini PetscFunctionReturn(0); 1099fe8322adSStefano Zampini } 1100