1bc952696SBarry Smith 2af0996ceSBarry Smith #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 3bc952696SBarry Smith 4bc952696SBarry Smith PetscFunctionList TSTrajectoryList = NULL; 5bc952696SBarry Smith PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 6bc952696SBarry Smith PetscClassId TSTRAJECTORY_CLASSID; 7d0d044f3SHong Zhang PetscLogEvent TSTrajectory_Set, TSTrajectory_Get; 8bc952696SBarry Smith 9bc952696SBarry Smith /*@C 10bc952696SBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 11bc952696SBarry Smith 12bc952696SBarry Smith Not Collective 13bc952696SBarry Smith 14bc952696SBarry Smith Input Parameters: 153c0fce88SHong Zhang + name - the name of a new user-defined creation routine 163c0fce88SHong Zhang - create_func - the creation routine itself 17bc952696SBarry Smith 18bc952696SBarry Smith Notes: 19bc952696SBarry Smith TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 20bc952696SBarry Smith 21df5474d8SHong Zhang Level: developer 22bc952696SBarry Smith 233c0fce88SHong Zhang .keywords: TS, trajectory, timestep, register 24bc952696SBarry Smith 253c0fce88SHong Zhang .seealso: TSTrajectoryRegisterAll() 26bc952696SBarry Smith @*/ 27972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 28bc952696SBarry Smith { 29bc952696SBarry Smith PetscErrorCode ierr; 30bc952696SBarry Smith 31bc952696SBarry Smith PetscFunctionBegin; 32bc952696SBarry Smith ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 33bc952696SBarry Smith PetscFunctionReturn(0); 34bc952696SBarry Smith } 35bc952696SBarry Smith 36bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 37bc952696SBarry Smith { 38bc952696SBarry Smith PetscErrorCode ierr; 39bc952696SBarry Smith 40bc952696SBarry Smith PetscFunctionBegin; 41bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 42d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 43bc952696SBarry Smith ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 44d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 45bc952696SBarry Smith PetscFunctionReturn(0); 46bc952696SBarry Smith } 47bc952696SBarry Smith 48c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 49bc952696SBarry Smith { 50bc952696SBarry Smith PetscErrorCode ierr; 51bc952696SBarry Smith 52bc952696SBarry Smith PetscFunctionBegin; 53bc952696SBarry Smith if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 54d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 55bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 56d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 57bc952696SBarry Smith PetscFunctionReturn(0); 58bc952696SBarry Smith } 59bc952696SBarry Smith 60bc952696SBarry Smith /*@C 61bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 62bc952696SBarry Smith 63bc952696SBarry Smith Collective on TSTrajectory 64bc952696SBarry Smith 65bc952696SBarry Smith Input Parameters: 66b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 67bc952696SBarry Smith - viewer - visualization context 68bc952696SBarry Smith 69bc952696SBarry Smith Options Database Key: 70e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 71bc952696SBarry Smith 72bc952696SBarry Smith Notes: 73bc952696SBarry Smith The available visualization contexts include 74bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 75bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 76bc952696SBarry Smith output where only the first processor opens 77bc952696SBarry Smith the file. All other processors send their 78bc952696SBarry Smith data to the first processor to print. 79bc952696SBarry Smith 80bc952696SBarry Smith The user can open an alternative visualization context with 81bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 82bc952696SBarry Smith 83df5474d8SHong Zhang Level: developer 84bc952696SBarry Smith 853c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view 86bc952696SBarry Smith 87bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 88bc952696SBarry Smith @*/ 89b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 90bc952696SBarry Smith { 91bc952696SBarry Smith PetscErrorCode ierr; 92bc952696SBarry Smith PetscBool iascii; 93bc952696SBarry Smith 94bc952696SBarry Smith PetscFunctionBegin; 951a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 96bc952696SBarry Smith if (!viewer) { 97b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 98bc952696SBarry Smith } 99bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 100b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 101bc952696SBarry Smith 102bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 103bc952696SBarry Smith if (iascii) { 104b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 1051a5a771fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 10653b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 10753b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 108b1d74d50SHong Zhang if (tj->ops->view) { 109285336bfSHong Zhang ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 110b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 111285336bfSHong Zhang ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 112bc952696SBarry Smith } 113bc952696SBarry Smith } 114bc952696SBarry Smith PetscFunctionReturn(0); 115bc952696SBarry Smith } 116bc952696SBarry Smith 117bc952696SBarry Smith /*@C 11878fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 11978fbdcc8SBarry Smith 12078fbdcc8SBarry Smith Collective on TSTrajectory 12178fbdcc8SBarry Smith 12278fbdcc8SBarry Smith Input Parameters: 12378fbdcc8SBarry Smith + tr - the trajectory context 12478fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 12578fbdcc8SBarry Smith 12678fbdcc8SBarry Smith Level: intermediate 12778fbdcc8SBarry Smith 128db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 129db901c5bSHong Zhang 13078fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view 13178fbdcc8SBarry Smith 13278fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 13378fbdcc8SBarry Smith @*/ 13478fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 13578fbdcc8SBarry Smith { 13678fbdcc8SBarry Smith PetscErrorCode ierr; 13778fbdcc8SBarry Smith 13878fbdcc8SBarry Smith PetscFunctionBegin; 13978fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 14078fbdcc8SBarry Smith ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 14178fbdcc8SBarry Smith PetscFunctionReturn(0); 14278fbdcc8SBarry Smith } 14378fbdcc8SBarry Smith 14478fbdcc8SBarry Smith /*@C 14508347785SBarry Smith TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 14608347785SBarry Smith 14708347785SBarry Smith Collective on TSLGCtx 14808347785SBarry Smith 14908347785SBarry Smith Input Parameters: 15008347785SBarry Smith + tj - the TSTrajectory context 15108347785SBarry Smith . transform - the transform function 15208347785SBarry Smith . destroy - function to destroy the optional context 15308347785SBarry Smith - ctx - optional context used by transform function 15408347785SBarry Smith 15508347785SBarry Smith Level: intermediate 15608347785SBarry Smith 15708347785SBarry Smith .keywords: TSTrajectory, vector, monitor, view 15808347785SBarry Smith 15908347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 16008347785SBarry Smith @*/ 16108347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 16208347785SBarry Smith { 16308347785SBarry Smith PetscFunctionBegin; 16408347785SBarry Smith tj->transform = transform; 16508347785SBarry Smith tj->transformdestroy = destroy; 16608347785SBarry Smith tj->transformctx = tctx; 16708347785SBarry Smith PetscFunctionReturn(0); 16808347785SBarry Smith } 16908347785SBarry Smith 17008347785SBarry Smith 171db901c5bSHong Zhang /*@ 172bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 173bc952696SBarry Smith 174bc952696SBarry Smith Collective on MPI_Comm 175bc952696SBarry Smith 176bc952696SBarry Smith Input Parameter: 1773c0fce88SHong Zhang . comm - the communicator 178bc952696SBarry Smith 179bc952696SBarry Smith Output Parameter: 1803c0fce88SHong Zhang . tj - the trajectory object 181bc952696SBarry Smith 182df5474d8SHong Zhang Level: developer 183bc952696SBarry Smith 1843c0fce88SHong Zhang Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 185bc952696SBarry Smith 1863c0fce88SHong Zhang .keywords: TS, trajectory, create 1873c0fce88SHong Zhang 18864fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 189bc952696SBarry Smith @*/ 190b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 191bc952696SBarry Smith { 192bc952696SBarry Smith TSTrajectory t; 193bc952696SBarry Smith PetscErrorCode ierr; 194bc952696SBarry Smith 195bc952696SBarry Smith PetscFunctionBegin; 196b1d74d50SHong Zhang PetscValidPointer(tj,2); 197b1d74d50SHong Zhang *tj = NULL; 198bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 199bc952696SBarry Smith 20073107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 20168bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 20264fc91eeSBarry Smith t->keepfiles = PETSC_TRUE; 203b1d74d50SHong Zhang *tj = t; 20484a45834SBarry Smith ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 20584a45834SBarry Smith ierr = TSTrajectorySetFiletemplate(t,"/SA-%06D.bin");CHKERRQ(ierr); 206bc952696SBarry Smith PetscFunctionReturn(0); 207bc952696SBarry Smith } 208bc952696SBarry Smith 209bc952696SBarry Smith /*@C 210bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 211bc952696SBarry Smith 212bc952696SBarry Smith Collective on TS 213bc952696SBarry Smith 214bc952696SBarry Smith Input Parameters: 2153c0fce88SHong Zhang + tj - the TSTrajectory context 2163c0fce88SHong Zhang . ts - the TS context 2173c0fce88SHong Zhang - type - a known method 218bc952696SBarry Smith 219bc952696SBarry Smith Options Database Command: 220e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 221bc952696SBarry Smith 222df5474d8SHong Zhang Level: developer 223bc952696SBarry Smith 2243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type 225bc952696SBarry Smith 2263c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 227bc952696SBarry Smith 228bc952696SBarry Smith @*/ 229972caf09SHong Zhang PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 230bc952696SBarry Smith { 231972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 232bc952696SBarry Smith PetscBool match; 233bc952696SBarry Smith PetscErrorCode ierr; 234bc952696SBarry Smith 235bc952696SBarry Smith PetscFunctionBegin; 236972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 237972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 238bc952696SBarry Smith if (match) PetscFunctionReturn(0); 239bc952696SBarry Smith 240bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 241bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 242972caf09SHong Zhang if (tj->ops->destroy) { 243972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 244bc952696SBarry Smith 245972caf09SHong Zhang tj->ops->destroy = NULL; 246bc952696SBarry Smith } 247972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 248bc952696SBarry Smith 249972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 250972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 251bc952696SBarry Smith PetscFunctionReturn(0); 252bc952696SBarry Smith } 253bc952696SBarry Smith 254972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 255972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 2569a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 2572b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 258bc952696SBarry Smith 259bc952696SBarry Smith /*@C 260bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 261bc952696SBarry Smith 262bc952696SBarry Smith Not Collective 263bc952696SBarry Smith 264df5474d8SHong Zhang Level: developer 265bc952696SBarry Smith 2663c0fce88SHong Zhang .keywords: TS, trajectory, register, all 2673c0fce88SHong Zhang 2683c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 269bc952696SBarry Smith @*/ 270bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 271bc952696SBarry Smith { 272bc952696SBarry Smith PetscErrorCode ierr; 273bc952696SBarry Smith 274bc952696SBarry Smith PetscFunctionBegin; 275560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 276bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 277bc952696SBarry Smith 278bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 2791c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 2809a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 2812b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 282bc952696SBarry Smith PetscFunctionReturn(0); 283bc952696SBarry Smith } 284bc952696SBarry Smith 285bc952696SBarry Smith /*@ 286bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 287bc952696SBarry Smith 288bc952696SBarry Smith Collective on TSTrajectory 289bc952696SBarry Smith 290bc952696SBarry Smith Input Parameter: 2913c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 292bc952696SBarry Smith 293df5474d8SHong Zhang Level: developer 294bc952696SBarry Smith 2953c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy 296bc952696SBarry Smith 2973c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 298bc952696SBarry Smith @*/ 299972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 300bc952696SBarry Smith { 301bc952696SBarry Smith PetscErrorCode ierr; 302bc952696SBarry Smith 303bc952696SBarry Smith PetscFunctionBegin; 304972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 305972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 306972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 307bc952696SBarry Smith 3087f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 309972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 310aced365eSHong Zhang ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 31178fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 31264e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 31364e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 314972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 315bc952696SBarry Smith PetscFunctionReturn(0); 316bc952696SBarry Smith } 317bc952696SBarry Smith 318bc952696SBarry Smith /* 319772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 320bc952696SBarry Smith 321bc952696SBarry Smith Collective on TSTrajectory 322bc952696SBarry Smith 323bc952696SBarry Smith Input Parameter: 3243c0fce88SHong Zhang + tj - the TSTrajectory context 3253c0fce88SHong Zhang - ts - the TS context 3263c0fce88SHong Zhang 3273c0fce88SHong Zhang Options Database Keys: 3283c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 329bc952696SBarry Smith 330df5474d8SHong Zhang Level: developer 331bc952696SBarry Smith 3323c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type 3333c0fce88SHong Zhang 3343c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 335bc952696SBarry Smith */ 3362bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 337bc952696SBarry Smith { 338bc952696SBarry Smith PetscBool opt; 339bc952696SBarry Smith const char *defaultType; 340bc952696SBarry Smith char typeName[256]; 3419a53571cSHong Zhang PetscBool flg; 342bc952696SBarry Smith PetscErrorCode ierr; 343bc952696SBarry Smith 344bc952696SBarry Smith PetscFunctionBegin; 345b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 346bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 347bc952696SBarry Smith 348560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 349e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 350bc952696SBarry Smith if (opt) { 351f416af30SBarry Smith ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 352972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 353bc952696SBarry Smith } else { 354972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 355bc952696SBarry Smith } 356bc952696SBarry Smith PetscFunctionReturn(0); 357bc952696SBarry Smith } 358bc952696SBarry Smith 359ed695a29SHong Zhang /*@ 360ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 361ed695a29SHong Zhang 362ed695a29SHong Zhang Collective on TSTrajectory 363ed695a29SHong Zhang 364ed695a29SHong Zhang Input Arguments: 365ed695a29SHong Zhang + tj - the TSTrajectory context 366ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 367ed695a29SHong Zhang 3683c0fce88SHong Zhang Options Database Keys: 369063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 3703c0fce88SHong Zhang 371df5474d8SHong Zhang Level: developer 372ed695a29SHong Zhang 3733c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor 3743c0fce88SHong Zhang 3753c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 376ed695a29SHong Zhang @*/ 3772bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 378ed695a29SHong Zhang { 379ed695a29SHong Zhang PetscErrorCode ierr; 380ed695a29SHong Zhang 381ed695a29SHong Zhang PetscFunctionBegin; 382ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 383ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 384ed695a29SHong Zhang if (flg) { 385ed695a29SHong Zhang if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 386ed695a29SHong Zhang } else { 387ed695a29SHong Zhang ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 388ed695a29SHong Zhang } 389ed695a29SHong Zhang PetscFunctionReturn(0); 390ed695a29SHong Zhang } 391ed695a29SHong Zhang 392bc952696SBarry Smith /*@ 39364fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 39464fc91eeSBarry Smith 39564fc91eeSBarry Smith Collective on TSTrajectory 39664fc91eeSBarry Smith 39764fc91eeSBarry Smith Input Arguments: 39864fc91eeSBarry Smith + tj - the TSTrajectory context 39964fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 40064fc91eeSBarry Smith 40164fc91eeSBarry Smith Options Database Keys: 40264fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 40364fc91eeSBarry Smith 40464fc91eeSBarry Smith Notes: 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. 40564fc91eeSBarry Smith 40664fc91eeSBarry Smith Level: advanced 40764fc91eeSBarry Smith 40864fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor 40964fc91eeSBarry Smith 41064fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 41164fc91eeSBarry Smith @*/ 41264fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 41364fc91eeSBarry Smith { 41464fc91eeSBarry Smith PetscFunctionBegin; 41564fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 41664fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 41764fc91eeSBarry Smith tj->keepfiles = flg; 41864fc91eeSBarry Smith PetscFunctionReturn(0); 41964fc91eeSBarry Smith } 42064fc91eeSBarry Smith 421db901c5bSHong Zhang /*@C 42264e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 42364e38db7SHong Zhang 42464e38db7SHong Zhang Collective on TSTrajectory 42564e38db7SHong Zhang 42664e38db7SHong Zhang Input Arguments: 42764e38db7SHong Zhang + tj - the TSTrajectory context 42864e38db7SHong Zhang - dirname - the directory name 42964e38db7SHong Zhang 43064e38db7SHong Zhang Options Database Keys: 43164e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 43264e38db7SHong Zhang 433*1585b412SBarry Smith Notes: The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 434*1585b412SBarry Smith 43564e38db7SHong Zhang Level: developer 43664e38db7SHong Zhang 43764e38db7SHong Zhang .keywords: TS, trajectory, set 43864e38db7SHong Zhang 43964e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 44064e38db7SHong Zhang @*/ 44164e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 44264e38db7SHong Zhang { 44364e38db7SHong Zhang PetscErrorCode ierr; 44464e38db7SHong Zhang PetscFunctionBegin; 44564e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 44684a45834SBarry Smith ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 44764e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 44864e38db7SHong Zhang PetscFunctionReturn(0); 44964e38db7SHong Zhang } 45064e38db7SHong Zhang 451db901c5bSHong Zhang /*@C 45264e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 45364e38db7SHong Zhang 45464e38db7SHong Zhang Collective on TSTrajectory 45564e38db7SHong Zhang 45664e38db7SHong Zhang Input Arguments: 45764e38db7SHong Zhang + tj - the TSTrajectory context 458*1585b412SBarry Smith - filetemplate - the template 45964e38db7SHong Zhang 46064e38db7SHong Zhang Options Database Keys: 461*1585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 462*1585b412SBarry Smith 463*1585b412SBarry Smith Notes: The name template should be of the form, for example filename-%06D.bin 464*1585b412SBarry Smith 465*1585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 466*1585b412SBarry Smith timestep counter 46764e38db7SHong Zhang 46864e38db7SHong Zhang Level: developer 46964e38db7SHong Zhang 47064e38db7SHong Zhang .keywords: TS, trajectory, set 47164e38db7SHong Zhang 472*1585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 47364e38db7SHong Zhang @*/ 47464e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 47564e38db7SHong Zhang { 47664e38db7SHong Zhang PetscErrorCode ierr; 47764e38db7SHong Zhang PetscFunctionBegin; 47864e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 47984a45834SBarry Smith ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 48064e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 48164e38db7SHong Zhang PetscFunctionReturn(0); 48264e38db7SHong Zhang } 48364e38db7SHong Zhang 48464e38db7SHong Zhang /*@ 485bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 486bc952696SBarry Smith 487bc952696SBarry Smith Collective on TSTrajectory 488bc952696SBarry Smith 489bc952696SBarry Smith Input Parameter: 4903c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 4913c0fce88SHong Zhang - ts - the TS context 492bc952696SBarry Smith 493bc952696SBarry Smith Options Database Keys: 4943c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 49564fc91eeSBarry 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 496063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 497bc952696SBarry Smith 498df5474d8SHong Zhang Level: developer 499bc952696SBarry Smith 50062b521acSHong Zhang Notes: This is not normally called directly by users 501bc952696SBarry Smith 5023c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database 503bc952696SBarry Smith 5043c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 505bc952696SBarry Smith @*/ 506972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 507bc952696SBarry Smith { 508ed695a29SHong Zhang PetscBool set,flg; 50964e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 51064e38db7SHong Zhang PetscErrorCode ierr; 511bc952696SBarry Smith 512bc952696SBarry Smith PetscFunctionBegin; 513b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 514972caf09SHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 515b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 516972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 517ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 518aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 51964e38db7SHong Zhang 52064fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 52164fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 52264e38db7SHong Zhang 52364e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 52484a45834SBarry Smith if (set) { 52564e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 52684a45834SBarry Smith } 52764e38db7SHong Zhang 528*1585b412SBarry 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); 52964e38db7SHong Zhang if (set) { 53064e38db7SHong Zhang const char *ptr,*ptr2; 531*1585b412SBarry Smith size_t len; 53284a45834SBarry Smith 533*1585b412SBarry Smith if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 53464e38db7SHong Zhang /* Do some cursory validation of the input. */ 53564e38db7SHong Zhang ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 536*1585b412SBarry Smith if (!ptr) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 53764e38db7SHong Zhang for (ptr++; ptr && *ptr; ptr++) { 53864e38db7SHong Zhang ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 539*1585b412SBarry Smith if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file_template, should look like filename-%%06D.bin"); 54064e38db7SHong Zhang if (ptr2) break; 54164e38db7SHong Zhang } 54264e38db7SHong Zhang ierr = PetscStrcat(dirname,"/");CHKERRQ(ierr); 54364e38db7SHong Zhang ierr = PetscStrlen(filetemplate,&len);CHKERRQ(ierr); 54464e38db7SHong Zhang ierr = PetscStrncat(dirname,filetemplate,PETSC_MAX_PATH_LEN-len-1);CHKERRQ(ierr); 545*1585b412SBarry Smith ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 54684a45834SBarry Smith } 54764e38db7SHong Zhang 54864e38db7SHong Zhang /* Handle specific TSTrajectory options */ 54962b521acSHong Zhang if (tj->ops->setfromoptions) { 55062b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 55162b521acSHong Zhang } 552bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 553bc952696SBarry Smith PetscFunctionReturn(0); 554bc952696SBarry Smith } 55568bece0bSHong Zhang 55668bece0bSHong Zhang /*@ 55768bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 55868bece0bSHong Zhang of a TS trajectory. 55968bece0bSHong Zhang 56068bece0bSHong Zhang Collective on TS 56168bece0bSHong Zhang 56268bece0bSHong Zhang Input Parameter: 5633c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 5643c0fce88SHong Zhang - tj - the TS trajectory context 56568bece0bSHong Zhang 566df5474d8SHong Zhang Level: developer 56768bece0bSHong Zhang 5683c0fce88SHong Zhang .keywords: TS, trajectory, setup 56968bece0bSHong Zhang 57068bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 57168bece0bSHong Zhang @*/ 57268bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 57368bece0bSHong Zhang { 57468bece0bSHong Zhang PetscErrorCode ierr; 57568bece0bSHong Zhang 57668bece0bSHong Zhang PetscFunctionBegin; 57768bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 57868bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 57968bece0bSHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 58068bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 58168bece0bSHong Zhang 58268bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 58368bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 58468bece0bSHong Zhang } 58568bece0bSHong Zhang if (tj->ops->setup) { 58668bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 58768bece0bSHong Zhang } 58868bece0bSHong Zhang 58968bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 59053b27ddbSHong Zhang 59153b27ddbSHong Zhang /* Set the counters to zero */ 5921a5a771fSHong Zhang tj->recomps = 0; 59353b27ddbSHong Zhang tj->diskreads = 0; 59453b27ddbSHong Zhang tj->diskwrites = 0; 59568bece0bSHong Zhang PetscFunctionReturn(0); 59668bece0bSHong Zhang } 597