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 18595452b02SPatrick Sanan Notes: 18695452b02SPatrick Sanan Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 187bc952696SBarry Smith 1883c0fce88SHong Zhang .keywords: TS, trajectory, create 1893c0fce88SHong Zhang 19064fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 191bc952696SBarry Smith @*/ 192b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 193bc952696SBarry Smith { 194bc952696SBarry Smith TSTrajectory t; 195bc952696SBarry Smith PetscErrorCode ierr; 196bc952696SBarry Smith 197bc952696SBarry Smith PetscFunctionBegin; 198b1d74d50SHong Zhang PetscValidPointer(tj,2); 199b1d74d50SHong Zhang *tj = NULL; 200bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 201bc952696SBarry Smith 20273107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 20368bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 20464fc91eeSBarry Smith t->keepfiles = PETSC_TRUE; 205b1d74d50SHong Zhang *tj = t; 20684a45834SBarry Smith ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 207e94726ebSBarry Smith ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr); 208bc952696SBarry Smith PetscFunctionReturn(0); 209bc952696SBarry Smith } 210bc952696SBarry Smith 211bc952696SBarry Smith /*@C 212bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 213bc952696SBarry Smith 214bc952696SBarry Smith Collective on TS 215bc952696SBarry Smith 216bc952696SBarry Smith Input Parameters: 2173c0fce88SHong Zhang + tj - the TSTrajectory context 2183c0fce88SHong Zhang . ts - the TS context 2193c0fce88SHong Zhang - type - a known method 220bc952696SBarry Smith 221bc952696SBarry Smith Options Database Command: 222e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 223bc952696SBarry Smith 224df5474d8SHong Zhang Level: developer 225bc952696SBarry Smith 2263c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type 227bc952696SBarry Smith 2283c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 229bc952696SBarry Smith 230bc952696SBarry Smith @*/ 231fd9d3c67SJed Brown PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,TSTrajectoryType type) 232bc952696SBarry Smith { 233972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 234bc952696SBarry Smith PetscBool match; 235bc952696SBarry Smith PetscErrorCode ierr; 236bc952696SBarry Smith 237bc952696SBarry Smith PetscFunctionBegin; 238972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 239972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 240bc952696SBarry Smith if (match) PetscFunctionReturn(0); 241bc952696SBarry Smith 242bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 243bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 244972caf09SHong Zhang if (tj->ops->destroy) { 245972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 246bc952696SBarry Smith 247972caf09SHong Zhang tj->ops->destroy = NULL; 248bc952696SBarry Smith } 249972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 250bc952696SBarry Smith 251972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 252972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 253bc952696SBarry Smith PetscFunctionReturn(0); 254bc952696SBarry Smith } 255bc952696SBarry Smith 256972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 257972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 2589a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 2592b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 260bc952696SBarry Smith 261bc952696SBarry Smith /*@C 262bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 263bc952696SBarry Smith 264bc952696SBarry Smith Not Collective 265bc952696SBarry Smith 266df5474d8SHong Zhang Level: developer 267bc952696SBarry Smith 2683c0fce88SHong Zhang .keywords: TS, trajectory, register, all 2693c0fce88SHong Zhang 2703c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 271bc952696SBarry Smith @*/ 272bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 273bc952696SBarry Smith { 274bc952696SBarry Smith PetscErrorCode ierr; 275bc952696SBarry Smith 276bc952696SBarry Smith PetscFunctionBegin; 277560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 278bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 279bc952696SBarry Smith 280bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 2811c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 2829a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 2832b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 284bc952696SBarry Smith PetscFunctionReturn(0); 285bc952696SBarry Smith } 286bc952696SBarry Smith 287bc952696SBarry Smith /*@ 288*1550c9b9SHong Zhang TSTrajectoryReset - Resets a trajectory context 289*1550c9b9SHong Zhang 290*1550c9b9SHong Zhang Collective on TSTrajectory 291*1550c9b9SHong Zhang 292*1550c9b9SHong Zhang Input Parameter: 293*1550c9b9SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 294*1550c9b9SHong Zhang 295*1550c9b9SHong Zhang Level: developer 296*1550c9b9SHong Zhang 297*1550c9b9SHong Zhang .keywords: TS, trajectory, timestep, reset 298*1550c9b9SHong Zhang 299*1550c9b9SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 300*1550c9b9SHong Zhang @*/ 301*1550c9b9SHong Zhang PetscErrorCode TSTrajectoryReset(TSTrajectory *tj) 302*1550c9b9SHong Zhang { 303*1550c9b9SHong Zhang PetscErrorCode ierr; 304*1550c9b9SHong Zhang 305*1550c9b9SHong Zhang PetscFunctionBegin; 306*1550c9b9SHong Zhang if (!*tj) PetscFunctionReturn(0); 307*1550c9b9SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 308*1550c9b9SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 309*1550c9b9SHong Zhang if ((*tj)->ops->reset) {ierr = (*(*tj)->ops->reset)((*tj));CHKERRQ(ierr);} 310*1550c9b9SHong Zhang (*tj)->setupcalled = PETSC_FALSE; 311*1550c9b9SHong Zhang PetscFunctionReturn(0); 312*1550c9b9SHong Zhang } 313*1550c9b9SHong Zhang 314*1550c9b9SHong Zhang /*@ 315bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 316bc952696SBarry Smith 317bc952696SBarry Smith Collective on TSTrajectory 318bc952696SBarry Smith 319bc952696SBarry Smith Input Parameter: 3203c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 321bc952696SBarry Smith 322df5474d8SHong Zhang Level: developer 323bc952696SBarry Smith 3243c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy 325bc952696SBarry Smith 3263c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 327bc952696SBarry Smith @*/ 328972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 329bc952696SBarry Smith { 330bc952696SBarry Smith PetscErrorCode ierr; 331bc952696SBarry Smith 332bc952696SBarry Smith PetscFunctionBegin; 333972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 334972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 335972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 336bc952696SBarry Smith 3377f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 338972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 339aced365eSHong Zhang ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 34078fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 34164e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 34264e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 3439afe7f3eSBarry Smith ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr); 344972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 345bc952696SBarry Smith PetscFunctionReturn(0); 346bc952696SBarry Smith } 347bc952696SBarry Smith 348bc952696SBarry Smith /* 349772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 350bc952696SBarry Smith 351bc952696SBarry Smith Collective on TSTrajectory 352bc952696SBarry Smith 353bc952696SBarry Smith Input Parameter: 3543c0fce88SHong Zhang + tj - the TSTrajectory context 3553c0fce88SHong Zhang - ts - the TS context 3563c0fce88SHong Zhang 3573c0fce88SHong Zhang Options Database Keys: 3583c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 359bc952696SBarry Smith 360df5474d8SHong Zhang Level: developer 361bc952696SBarry Smith 3623c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type 3633c0fce88SHong Zhang 3643c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 365bc952696SBarry Smith */ 3662bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 367bc952696SBarry Smith { 368bc952696SBarry Smith PetscBool opt; 369bc952696SBarry Smith const char *defaultType; 370bc952696SBarry Smith char typeName[256]; 3719a53571cSHong Zhang PetscBool flg; 372bc952696SBarry Smith PetscErrorCode ierr; 373bc952696SBarry Smith 374bc952696SBarry Smith PetscFunctionBegin; 375b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 376bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 377bc952696SBarry Smith 378560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 379e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 380bc952696SBarry Smith if (opt) { 381f416af30SBarry Smith ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 382972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 383bc952696SBarry Smith } else { 384972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 385bc952696SBarry Smith } 386bc952696SBarry Smith PetscFunctionReturn(0); 387bc952696SBarry Smith } 388bc952696SBarry Smith 389ed695a29SHong Zhang /*@ 390ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 391ed695a29SHong Zhang 392ed695a29SHong Zhang Collective on TSTrajectory 393ed695a29SHong Zhang 394ed695a29SHong Zhang Input Arguments: 395ed695a29SHong Zhang + tj - the TSTrajectory context 396ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 397ed695a29SHong Zhang 3983c0fce88SHong Zhang Options Database Keys: 399063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 4003c0fce88SHong Zhang 401df5474d8SHong Zhang Level: developer 402ed695a29SHong Zhang 4033c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor 4043c0fce88SHong Zhang 4053c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 406ed695a29SHong Zhang @*/ 4072bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 408ed695a29SHong Zhang { 409ed695a29SHong Zhang PetscErrorCode ierr; 410ed695a29SHong Zhang 411ed695a29SHong Zhang PetscFunctionBegin; 412ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 413ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 414ed695a29SHong Zhang if (flg) { 415ed695a29SHong Zhang if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 416ed695a29SHong Zhang } else { 417ed695a29SHong Zhang ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 418ed695a29SHong Zhang } 419ed695a29SHong Zhang PetscFunctionReturn(0); 420ed695a29SHong Zhang } 421ed695a29SHong Zhang 422bc952696SBarry Smith /*@ 42364fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 42464fc91eeSBarry Smith 42564fc91eeSBarry Smith Collective on TSTrajectory 42664fc91eeSBarry Smith 42764fc91eeSBarry Smith Input Arguments: 42864fc91eeSBarry Smith + tj - the TSTrajectory context 42964fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 43064fc91eeSBarry Smith 43164fc91eeSBarry Smith Options Database Keys: 43264fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 43364fc91eeSBarry Smith 43495452b02SPatrick Sanan Notes: 43595452b02SPatrick 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. 43664fc91eeSBarry Smith 43764fc91eeSBarry Smith Level: advanced 43864fc91eeSBarry Smith 43964fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor 44064fc91eeSBarry Smith 44164fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 44264fc91eeSBarry Smith @*/ 44364fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 44464fc91eeSBarry Smith { 44564fc91eeSBarry Smith PetscFunctionBegin; 44664fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 44764fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 44864fc91eeSBarry Smith tj->keepfiles = flg; 44964fc91eeSBarry Smith PetscFunctionReturn(0); 45064fc91eeSBarry Smith } 45164fc91eeSBarry Smith 452db901c5bSHong Zhang /*@C 45364e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 45464e38db7SHong Zhang 45564e38db7SHong Zhang Collective on TSTrajectory 45664e38db7SHong Zhang 45764e38db7SHong Zhang Input Arguments: 45864e38db7SHong Zhang + tj - the TSTrajectory context 45964e38db7SHong Zhang - dirname - the directory name 46064e38db7SHong Zhang 46164e38db7SHong Zhang Options Database Keys: 46264e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 46364e38db7SHong Zhang 46495452b02SPatrick Sanan Notes: 46595452b02SPatrick Sanan The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 4661585b412SBarry Smith 46764e38db7SHong Zhang Level: developer 46864e38db7SHong Zhang 46964e38db7SHong Zhang .keywords: TS, trajectory, set 47064e38db7SHong Zhang 47164e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 47264e38db7SHong Zhang @*/ 47364e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 47464e38db7SHong Zhang { 47564e38db7SHong Zhang PetscErrorCode ierr; 47664e38db7SHong Zhang PetscFunctionBegin; 47764e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 4789afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup"); 47984a45834SBarry Smith ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 48064e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 48164e38db7SHong Zhang PetscFunctionReturn(0); 48264e38db7SHong Zhang } 48364e38db7SHong Zhang 484db901c5bSHong Zhang /*@C 48564e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 48664e38db7SHong Zhang 48764e38db7SHong Zhang Collective on TSTrajectory 48864e38db7SHong Zhang 48964e38db7SHong Zhang Input Arguments: 49064e38db7SHong Zhang + tj - the TSTrajectory context 4911585b412SBarry Smith - filetemplate - the template 49264e38db7SHong Zhang 49364e38db7SHong Zhang Options Database Keys: 4941585b412SBarry Smith . -ts_trajectory_file_template - set the file name template 4951585b412SBarry Smith 49695452b02SPatrick Sanan Notes: 49795452b02SPatrick Sanan The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 4981585b412SBarry Smith 4991585b412SBarry Smith The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 5001585b412SBarry Smith timestep counter 50164e38db7SHong Zhang 50264e38db7SHong Zhang Level: developer 50364e38db7SHong Zhang 50464e38db7SHong Zhang .keywords: TS, trajectory, set 50564e38db7SHong Zhang 5061585b412SBarry Smith .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 50764e38db7SHong Zhang @*/ 50864e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 50964e38db7SHong Zhang { 51064e38db7SHong Zhang PetscErrorCode ierr; 5119afe7f3eSBarry Smith const char *ptr,*ptr2; 5129afe7f3eSBarry Smith 51364e38db7SHong Zhang PetscFunctionBegin; 51464e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 5159afe7f3eSBarry Smith if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 5169afe7f3eSBarry Smith 5179afe7f3eSBarry 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"); 5189afe7f3eSBarry Smith /* Do some cursory validation of the input. */ 5199afe7f3eSBarry Smith ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 5209afe7f3eSBarry Smith if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 5219afe7f3eSBarry Smith for (ptr++; ptr && *ptr; ptr++) { 5229afe7f3eSBarry Smith ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 5239afe7f3eSBarry 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"); 5249afe7f3eSBarry Smith if (ptr2) break; 5259afe7f3eSBarry Smith } 52684a45834SBarry Smith ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 52764e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 52864e38db7SHong Zhang PetscFunctionReturn(0); 52964e38db7SHong Zhang } 53064e38db7SHong Zhang 53164e38db7SHong Zhang /*@ 532bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 533bc952696SBarry Smith 534bc952696SBarry Smith Collective on TSTrajectory 535bc952696SBarry Smith 536bc952696SBarry Smith Input Parameter: 5373c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 5383c0fce88SHong Zhang - ts - the TS context 539bc952696SBarry Smith 540bc952696SBarry Smith Options Database Keys: 5413c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 54264fc91eeSBarry 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 543063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 544bc952696SBarry Smith 545df5474d8SHong Zhang Level: developer 546bc952696SBarry Smith 54795452b02SPatrick Sanan Notes: 54895452b02SPatrick Sanan This is not normally called directly by users 549bc952696SBarry Smith 5503c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database 551bc952696SBarry Smith 5523c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 553bc952696SBarry Smith @*/ 554972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 555bc952696SBarry Smith { 556ed695a29SHong Zhang PetscBool set,flg; 55764e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 55864e38db7SHong Zhang PetscErrorCode ierr; 559bc952696SBarry Smith 560bc952696SBarry Smith PetscFunctionBegin; 561b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 562972caf09SHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 563b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 564972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 565ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 566aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 56764e38db7SHong Zhang 56864fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 56964fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 57064e38db7SHong Zhang 57164e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 57284a45834SBarry Smith if (set) { 57364e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 57484a45834SBarry Smith } 57564e38db7SHong Zhang 5761585b412SBarry 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); 57764e38db7SHong Zhang if (set) { 5781585b412SBarry Smith ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 57984a45834SBarry Smith } 58064e38db7SHong Zhang 58164e38db7SHong Zhang /* Handle specific TSTrajectory options */ 58262b521acSHong Zhang if (tj->ops->setfromoptions) { 58362b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 58462b521acSHong Zhang } 585bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 586bc952696SBarry Smith PetscFunctionReturn(0); 587bc952696SBarry Smith } 58868bece0bSHong Zhang 58968bece0bSHong Zhang /*@ 59068bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 59168bece0bSHong Zhang of a TS trajectory. 59268bece0bSHong Zhang 59368bece0bSHong Zhang Collective on TS 59468bece0bSHong Zhang 59568bece0bSHong Zhang Input Parameter: 5963c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 5973c0fce88SHong Zhang - tj - the TS trajectory context 59868bece0bSHong Zhang 599df5474d8SHong Zhang Level: developer 60068bece0bSHong Zhang 6013c0fce88SHong Zhang .keywords: TS, trajectory, setup 60268bece0bSHong Zhang 60368bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 60468bece0bSHong Zhang @*/ 60568bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 60668bece0bSHong Zhang { 60768bece0bSHong Zhang PetscErrorCode ierr; 6089afe7f3eSBarry Smith size_t s1,s2; 60968bece0bSHong Zhang 61068bece0bSHong Zhang PetscFunctionBegin; 61168bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 61268bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 61368bece0bSHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 61468bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 61568bece0bSHong Zhang 61668bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 61768bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 61868bece0bSHong Zhang } 61968bece0bSHong Zhang if (tj->ops->setup) { 62068bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 62168bece0bSHong Zhang } 62268bece0bSHong Zhang 62368bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 62453b27ddbSHong Zhang 62553b27ddbSHong Zhang /* Set the counters to zero */ 6261a5a771fSHong Zhang tj->recomps = 0; 62753b27ddbSHong Zhang tj->diskreads = 0; 62853b27ddbSHong Zhang tj->diskwrites = 0; 6299afe7f3eSBarry Smith ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 6309afe7f3eSBarry Smith ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 63111e1d5c3SBarry Smith ierr = PetscMalloc((s1 + s2 + 10)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 63211e1d5c3SBarry Smith ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+10,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 63368bece0bSHong Zhang PetscFunctionReturn(0); 63468bece0bSHong Zhang } 635