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"); 5411e1d5c3SBarry Smith if (stepnum < 0) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_PLIB,"Requesting negative step number"); 55d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 56bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 57d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 58bc952696SBarry Smith PetscFunctionReturn(0); 59bc952696SBarry Smith } 60bc952696SBarry Smith 61bc952696SBarry Smith /*@C 62bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 63bc952696SBarry Smith 64bc952696SBarry Smith Collective on TSTrajectory 65bc952696SBarry Smith 66bc952696SBarry Smith Input Parameters: 67b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 68bc952696SBarry Smith - viewer - visualization context 69bc952696SBarry Smith 70bc952696SBarry Smith Options Database Key: 71e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 72bc952696SBarry Smith 73bc952696SBarry Smith Notes: 74bc952696SBarry Smith The available visualization contexts include 75bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 76bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 77bc952696SBarry Smith output where only the first processor opens 78bc952696SBarry Smith the file. All other processors send their 79bc952696SBarry Smith data to the first processor to print. 80bc952696SBarry Smith 81bc952696SBarry Smith The user can open an alternative visualization context with 82bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 83bc952696SBarry Smith 84df5474d8SHong Zhang Level: developer 85bc952696SBarry Smith 863c0fce88SHong Zhang .keywords: TS, trajectory, timestep, view 87bc952696SBarry Smith 88bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 89bc952696SBarry Smith @*/ 90b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 91bc952696SBarry Smith { 92bc952696SBarry Smith PetscErrorCode ierr; 93bc952696SBarry Smith PetscBool iascii; 94bc952696SBarry Smith 95bc952696SBarry Smith PetscFunctionBegin; 961a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 97bc952696SBarry Smith if (!viewer) { 98b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 99bc952696SBarry Smith } 100bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 101b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 102bc952696SBarry Smith 103bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 104bc952696SBarry Smith if (iascii) { 105b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 1061a5a771fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 10753b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 10853b27ddbSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 109b1d74d50SHong Zhang if (tj->ops->view) { 110285336bfSHong Zhang ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 111b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 112285336bfSHong Zhang ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 113bc952696SBarry Smith } 114bc952696SBarry Smith } 115bc952696SBarry Smith PetscFunctionReturn(0); 116bc952696SBarry Smith } 117bc952696SBarry Smith 118bc952696SBarry Smith /*@C 11978fbdcc8SBarry Smith TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 12078fbdcc8SBarry Smith 12178fbdcc8SBarry Smith Collective on TSTrajectory 12278fbdcc8SBarry Smith 12378fbdcc8SBarry Smith Input Parameters: 12478fbdcc8SBarry Smith + tr - the trajectory context 12578fbdcc8SBarry Smith - names - the names of the components, final string must be NULL 12678fbdcc8SBarry Smith 12778fbdcc8SBarry Smith Level: intermediate 12878fbdcc8SBarry Smith 129db901c5bSHong Zhang Note: Fortran interface is not possible because of the string array argument 130db901c5bSHong Zhang 13178fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view 13278fbdcc8SBarry Smith 13378fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 13478fbdcc8SBarry Smith @*/ 13578fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 13678fbdcc8SBarry Smith { 13778fbdcc8SBarry Smith PetscErrorCode ierr; 13878fbdcc8SBarry Smith 13978fbdcc8SBarry Smith PetscFunctionBegin; 14078fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 14178fbdcc8SBarry Smith ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 14278fbdcc8SBarry Smith PetscFunctionReturn(0); 14378fbdcc8SBarry Smith } 14478fbdcc8SBarry Smith 14578fbdcc8SBarry Smith /*@C 14608347785SBarry Smith TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 14708347785SBarry Smith 14808347785SBarry Smith Collective on TSLGCtx 14908347785SBarry Smith 15008347785SBarry Smith Input Parameters: 15108347785SBarry Smith + tj - the TSTrajectory context 15208347785SBarry Smith . transform - the transform function 15308347785SBarry Smith . destroy - function to destroy the optional context 15408347785SBarry Smith - ctx - optional context used by transform function 15508347785SBarry Smith 15608347785SBarry Smith Level: intermediate 15708347785SBarry Smith 15808347785SBarry Smith .keywords: TSTrajectory, vector, monitor, view 15908347785SBarry Smith 16008347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 16108347785SBarry Smith @*/ 16208347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 16308347785SBarry Smith { 16408347785SBarry Smith PetscFunctionBegin; 16508347785SBarry Smith tj->transform = transform; 16608347785SBarry Smith tj->transformdestroy = destroy; 16708347785SBarry Smith tj->transformctx = tctx; 16808347785SBarry Smith PetscFunctionReturn(0); 16908347785SBarry Smith } 17008347785SBarry Smith 17108347785SBarry Smith 172db901c5bSHong Zhang /*@ 173bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 174bc952696SBarry Smith 175bc952696SBarry Smith Collective on MPI_Comm 176bc952696SBarry Smith 177bc952696SBarry Smith Input Parameter: 1783c0fce88SHong Zhang . comm - the communicator 179bc952696SBarry Smith 180bc952696SBarry Smith Output Parameter: 1813c0fce88SHong Zhang . tj - the trajectory object 182bc952696SBarry Smith 183df5474d8SHong Zhang Level: developer 184bc952696SBarry Smith 1853c0fce88SHong Zhang Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 186bc952696SBarry Smith 1873c0fce88SHong Zhang .keywords: TS, trajectory, create 1883c0fce88SHong Zhang 18964fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 190bc952696SBarry Smith @*/ 191b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 192bc952696SBarry Smith { 193bc952696SBarry Smith TSTrajectory t; 194bc952696SBarry Smith PetscErrorCode ierr; 195bc952696SBarry Smith 196bc952696SBarry Smith PetscFunctionBegin; 197b1d74d50SHong Zhang PetscValidPointer(tj,2); 198b1d74d50SHong Zhang *tj = NULL; 199bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 200bc952696SBarry Smith 20173107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 20268bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 20364fc91eeSBarry Smith t->keepfiles = PETSC_TRUE; 204b1d74d50SHong Zhang *tj = t; 20584a45834SBarry Smith ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 206e94726ebSBarry Smith ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr); 207bc952696SBarry Smith PetscFunctionReturn(0); 208bc952696SBarry Smith } 209bc952696SBarry Smith 210bc952696SBarry Smith /*@C 211bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 212bc952696SBarry Smith 213bc952696SBarry Smith Collective on TS 214bc952696SBarry Smith 215bc952696SBarry Smith Input Parameters: 2163c0fce88SHong Zhang + tj - the TSTrajectory context 2173c0fce88SHong Zhang . ts - the TS context 2183c0fce88SHong Zhang - type - a known method 219bc952696SBarry Smith 220bc952696SBarry Smith Options Database Command: 221e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 222bc952696SBarry Smith 223df5474d8SHong Zhang Level: developer 224bc952696SBarry Smith 2253c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type 226bc952696SBarry Smith 2273c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 228bc952696SBarry Smith 229bc952696SBarry Smith @*/ 230*fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 231bc952696SBarry Smith { 232972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 233bc952696SBarry Smith PetscBool match; 234bc952696SBarry Smith PetscErrorCode ierr; 235bc952696SBarry Smith 236bc952696SBarry Smith PetscFunctionBegin; 237972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 238972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 239bc952696SBarry Smith if (match) PetscFunctionReturn(0); 240bc952696SBarry Smith 241bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 242bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 243972caf09SHong Zhang if (tj->ops->destroy) { 244972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 245bc952696SBarry Smith 246972caf09SHong Zhang tj->ops->destroy = NULL; 247bc952696SBarry Smith } 248972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 249bc952696SBarry Smith 250972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 251972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 252bc952696SBarry Smith PetscFunctionReturn(0); 253bc952696SBarry Smith } 254bc952696SBarry Smith 255972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 256972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 2579a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 2582b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 259bc952696SBarry Smith 260bc952696SBarry Smith /*@C 261bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 262bc952696SBarry Smith 263bc952696SBarry Smith Not Collective 264bc952696SBarry Smith 265df5474d8SHong Zhang Level: developer 266bc952696SBarry Smith 2673c0fce88SHong Zhang .keywords: TS, trajectory, register, all 2683c0fce88SHong Zhang 2693c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 270bc952696SBarry Smith @*/ 271bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 272bc952696SBarry Smith { 273bc952696SBarry Smith PetscErrorCode ierr; 274bc952696SBarry Smith 275bc952696SBarry Smith PetscFunctionBegin; 276560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 277bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 278bc952696SBarry Smith 279bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 2801c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 2819a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 2822b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 283bc952696SBarry Smith PetscFunctionReturn(0); 284bc952696SBarry Smith } 285bc952696SBarry Smith 286bc952696SBarry Smith /*@ 287bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 288bc952696SBarry Smith 289bc952696SBarry Smith Collective on TSTrajectory 290bc952696SBarry Smith 291bc952696SBarry Smith Input Parameter: 2923c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 293bc952696SBarry Smith 294df5474d8SHong Zhang Level: developer 295bc952696SBarry Smith 2963c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy 297bc952696SBarry Smith 2983c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 299bc952696SBarry Smith @*/ 300972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 301bc952696SBarry Smith { 302bc952696SBarry Smith PetscErrorCode ierr; 303bc952696SBarry Smith 304bc952696SBarry Smith PetscFunctionBegin; 305972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 306972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 307972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 308bc952696SBarry Smith 3097f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 310972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 311aced365eSHong Zhang ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 31278fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 31364e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 31464e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 3159afe7f3eSBarry Smith ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr); 316972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 317bc952696SBarry Smith PetscFunctionReturn(0); 318bc952696SBarry Smith } 319bc952696SBarry Smith 320bc952696SBarry Smith /* 321772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 322bc952696SBarry Smith 323bc952696SBarry Smith Collective on TSTrajectory 324bc952696SBarry Smith 325bc952696SBarry Smith Input Parameter: 3263c0fce88SHong Zhang + tj - the TSTrajectory context 3273c0fce88SHong Zhang - ts - the TS context 3283c0fce88SHong Zhang 3293c0fce88SHong Zhang Options Database Keys: 3303c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 331bc952696SBarry Smith 332df5474d8SHong Zhang Level: developer 333bc952696SBarry Smith 3343c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type 3353c0fce88SHong Zhang 3363c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 337bc952696SBarry Smith */ 3382bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 339bc952696SBarry Smith { 340bc952696SBarry Smith PetscBool opt; 341bc952696SBarry Smith const char *defaultType; 342bc952696SBarry Smith char typeName[256]; 3439a53571cSHong Zhang PetscBool flg; 344bc952696SBarry Smith PetscErrorCode ierr; 345bc952696SBarry Smith 346bc952696SBarry Smith PetscFunctionBegin; 347b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 348bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 349bc952696SBarry Smith 350560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 351e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 352bc952696SBarry Smith if (opt) { 353f416af30SBarry Smith ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 354972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 355bc952696SBarry Smith } else { 356972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 357bc952696SBarry Smith } 358bc952696SBarry Smith PetscFunctionReturn(0); 359bc952696SBarry Smith } 360bc952696SBarry Smith 361ed695a29SHong Zhang /*@ 362ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 363ed695a29SHong Zhang 364ed695a29SHong Zhang Collective on TSTrajectory 365ed695a29SHong Zhang 366ed695a29SHong Zhang Input Arguments: 367ed695a29SHong Zhang + tj - the TSTrajectory context 368ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 369ed695a29SHong Zhang 3703c0fce88SHong Zhang Options Database Keys: 371063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 3723c0fce88SHong Zhang 373df5474d8SHong Zhang Level: developer 374ed695a29SHong Zhang 3753c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor 3763c0fce88SHong Zhang 3773c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 378ed695a29SHong Zhang @*/ 3792bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 380ed695a29SHong Zhang { 381ed695a29SHong Zhang PetscErrorCode ierr; 382ed695a29SHong Zhang 383ed695a29SHong Zhang PetscFunctionBegin; 384ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 385ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 386ed695a29SHong Zhang if (flg) { 387ed695a29SHong Zhang if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 388ed695a29SHong Zhang } else { 389ed695a29SHong Zhang ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 390ed695a29SHong Zhang } 391ed695a29SHong Zhang PetscFunctionReturn(0); 392ed695a29SHong Zhang } 393ed695a29SHong Zhang 394bc952696SBarry Smith /*@ 39564fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 39664fc91eeSBarry Smith 39764fc91eeSBarry Smith Collective on TSTrajectory 39864fc91eeSBarry Smith 39964fc91eeSBarry Smith Input Arguments: 40064fc91eeSBarry Smith + tj - the TSTrajectory context 40164fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 40264fc91eeSBarry Smith 40364fc91eeSBarry Smith Options Database Keys: 40464fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 40564fc91eeSBarry Smith 40664fc91eeSBarry 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. 40764fc91eeSBarry Smith 40864fc91eeSBarry Smith Level: advanced 40964fc91eeSBarry Smith 41064fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor 41164fc91eeSBarry Smith 41264fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 41364fc91eeSBarry Smith @*/ 41464fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 41564fc91eeSBarry Smith { 41664fc91eeSBarry Smith PetscFunctionBegin; 41764fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 41864fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 41964fc91eeSBarry Smith tj->keepfiles = flg; 42064fc91eeSBarry Smith PetscFunctionReturn(0); 42164fc91eeSBarry Smith } 42264fc91eeSBarry Smith 423db901c5bSHong Zhang /*@C 42464e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 42564e38db7SHong Zhang 42664e38db7SHong Zhang Collective on TSTrajectory 42764e38db7SHong Zhang 42864e38db7SHong Zhang Input Arguments: 42964e38db7SHong Zhang + tj - the TSTrajectory context 43064e38db7SHong Zhang - dirname - the directory name 43164e38db7SHong Zhang 43264e38db7SHong Zhang Options Database Keys: 43364e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 43464e38db7SHong Zhang 4351585b412SBarry Smith Notes: The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 4361585b412SBarry Smith 43764e38db7SHong Zhang Level: developer 43864e38db7SHong Zhang 43964e38db7SHong Zhang .keywords: TS, trajectory, set 44064e38db7SHong Zhang 44164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 44264e38db7SHong Zhang @*/ 44364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 44464e38db7SHong Zhang { 44564e38db7SHong Zhang PetscErrorCode ierr; 44664e38db7SHong Zhang PetscFunctionBegin; 44764e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 4489afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup"); 44984a45834SBarry Smith ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 45064e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 45164e38db7SHong Zhang PetscFunctionReturn(0); 45264e38db7SHong Zhang } 45364e38db7SHong Zhang 454db901c5bSHong Zhang /*@C 45564e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 45664e38db7SHong Zhang 45764e38db7SHong Zhang Collective on TSTrajectory 45864e38db7SHong Zhang 45964e38db7SHong Zhang Input Arguments: 46064e38db7SHong Zhang + tj - the TSTrajectory context 4611585b412SBarry Smith - filetemplate - the template 46264e38db7SHong Zhang 46364e38db7SHong Zhang Options Database Keys: 4641585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 4651585b412SBarry Smith 466e94726ebSBarry Smith Notes: The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 4671585b412SBarry Smith 4681585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 4691585b412SBarry Smith timestep counter 47064e38db7SHong Zhang 47164e38db7SHong Zhang Level: developer 47264e38db7SHong Zhang 47364e38db7SHong Zhang .keywords: TS, trajectory, set 47464e38db7SHong Zhang 4751585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 47664e38db7SHong Zhang @*/ 47764e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 47864e38db7SHong Zhang { 47964e38db7SHong Zhang PetscErrorCode ierr; 4809afe7f3eSBarry Smith const char *ptr,*ptr2; 4819afe7f3eSBarry Smith 48264e38db7SHong Zhang PetscFunctionBegin; 48364e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 4849afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 4859afe7f3eSBarry Smith 4869afe7f3eSBarry 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"); 4879afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 4889afe7f3eSBarry Smith ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 4899afe7f3eSBarry Smith if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 4909afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 4919afe7f3eSBarry Smith ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 4929afe7f3eSBarry 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"); 4939afe7f3eSBarry Smith if (ptr2) break; 4949afe7f3eSBarry Smith } 49584a45834SBarry Smith ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 49664e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 49764e38db7SHong Zhang PetscFunctionReturn(0); 49864e38db7SHong Zhang } 49964e38db7SHong Zhang 50064e38db7SHong Zhang /*@ 501bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 502bc952696SBarry Smith 503bc952696SBarry Smith Collective on TSTrajectory 504bc952696SBarry Smith 505bc952696SBarry Smith Input Parameter: 5063c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5073c0fce88SHong Zhang - ts - the TS context 508bc952696SBarry Smith 509bc952696SBarry Smith Options Database Keys: 5103c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 51164fc91eeSBarry 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 512063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 513bc952696SBarry Smith 514df5474d8SHong Zhang Level: developer 515bc952696SBarry Smith 51662b521acSHong Zhang Notes: This is not normally called directly by users 517bc952696SBarry Smith 5183c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database 519bc952696SBarry Smith 5203c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 521bc952696SBarry Smith @*/ 522972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 523bc952696SBarry Smith { 524ed695a29SHong Zhang PetscBool set,flg; 52564e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 52664e38db7SHong Zhang PetscErrorCode ierr; 527bc952696SBarry Smith 528bc952696SBarry Smith PetscFunctionBegin; 529b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 530972caf09SHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 531b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 532972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 533ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 534aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 53564e38db7SHong Zhang 53664fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 53764fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 53864e38db7SHong Zhang 53964e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 54084a45834SBarry Smith if (set) { 54164e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 54284a45834SBarry Smith } 54364e38db7SHong Zhang 5441585b412SBarry 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); 54564e38db7SHong Zhang if (set) { 5461585b412SBarry Smith ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 54784a45834SBarry Smith } 54864e38db7SHong Zhang 54964e38db7SHong Zhang /* Handle specific TSTrajectory options */ 55062b521acSHong Zhang if (tj->ops->setfromoptions) { 55162b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 55262b521acSHong Zhang } 553bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 554bc952696SBarry Smith PetscFunctionReturn(0); 555bc952696SBarry Smith } 55668bece0bSHong Zhang 55768bece0bSHong Zhang /*@ 55868bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 55968bece0bSHong Zhang of a TS trajectory. 56068bece0bSHong Zhang 56168bece0bSHong Zhang Collective on TS 56268bece0bSHong Zhang 56368bece0bSHong Zhang Input Parameter: 5643c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 5653c0fce88SHong Zhang - tj - the TS trajectory context 56668bece0bSHong Zhang 567df5474d8SHong Zhang Level: developer 56868bece0bSHong Zhang 5693c0fce88SHong Zhang .keywords: TS, trajectory, setup 57068bece0bSHong Zhang 57168bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 57268bece0bSHong Zhang @*/ 57368bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 57468bece0bSHong Zhang { 57568bece0bSHong Zhang PetscErrorCode ierr; 5769afe7f3eSBarry Smith size_t s1,s2; 57768bece0bSHong Zhang 57868bece0bSHong Zhang PetscFunctionBegin; 57968bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 58068bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 58168bece0bSHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 58268bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 58368bece0bSHong Zhang 58468bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 58568bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 58668bece0bSHong Zhang } 58768bece0bSHong Zhang if (tj->ops->setup) { 58868bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 58968bece0bSHong Zhang } 59068bece0bSHong Zhang 59168bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 59253b27ddbSHong Zhang 59353b27ddbSHong Zhang /* Set the counters to zero */ 5941a5a771fSHong Zhang tj->recomps = 0; 59553b27ddbSHong Zhang tj->diskreads = 0; 59653b27ddbSHong Zhang tj->diskwrites = 0; 5979afe7f3eSBarry Smith ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 5989afe7f3eSBarry Smith ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 59911e1d5c3SBarry Smith ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 60011e1d5c3SBarry Smith ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 60168bece0bSHong Zhang PetscFunctionReturn(0); 60268bece0bSHong Zhang } 603