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 12878fbdcc8SBarry Smith .keywords: TS, TSTrajectory, vector, monitor, view 12978fbdcc8SBarry Smith 13078fbdcc8SBarry Smith .seealso: TSTrajectory, TSGetTrajectory() 13178fbdcc8SBarry Smith @*/ 13278fbdcc8SBarry Smith PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 13378fbdcc8SBarry Smith { 13478fbdcc8SBarry Smith PetscErrorCode ierr; 13578fbdcc8SBarry Smith 13678fbdcc8SBarry Smith PetscFunctionBegin; 13778fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 13878fbdcc8SBarry Smith ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 13978fbdcc8SBarry Smith PetscFunctionReturn(0); 14078fbdcc8SBarry Smith } 14178fbdcc8SBarry Smith 14278fbdcc8SBarry Smith /*@C 14308347785SBarry Smith TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 14408347785SBarry Smith 14508347785SBarry Smith Collective on TSLGCtx 14608347785SBarry Smith 14708347785SBarry Smith Input Parameters: 14808347785SBarry Smith + tj - the TSTrajectory context 14908347785SBarry Smith . transform - the transform function 15008347785SBarry Smith . destroy - function to destroy the optional context 15108347785SBarry Smith - ctx - optional context used by transform function 15208347785SBarry Smith 15308347785SBarry Smith Level: intermediate 15408347785SBarry Smith 15508347785SBarry Smith .keywords: TSTrajectory, vector, monitor, view 15608347785SBarry Smith 15708347785SBarry Smith .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 15808347785SBarry Smith @*/ 15908347785SBarry Smith PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 16008347785SBarry Smith { 16108347785SBarry Smith PetscFunctionBegin; 16208347785SBarry Smith tj->transform = transform; 16308347785SBarry Smith tj->transformdestroy = destroy; 16408347785SBarry Smith tj->transformctx = tctx; 16508347785SBarry Smith PetscFunctionReturn(0); 16608347785SBarry Smith } 16708347785SBarry Smith 16808347785SBarry Smith 16908347785SBarry Smith /*@C 170bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 171bc952696SBarry Smith 172bc952696SBarry Smith Collective on MPI_Comm 173bc952696SBarry Smith 174bc952696SBarry Smith Input Parameter: 1753c0fce88SHong Zhang . comm - the communicator 176bc952696SBarry Smith 177bc952696SBarry Smith Output Parameter: 1783c0fce88SHong Zhang . tj - the trajectory object 179bc952696SBarry Smith 180df5474d8SHong Zhang Level: developer 181bc952696SBarry Smith 1823c0fce88SHong Zhang Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 183bc952696SBarry Smith 1843c0fce88SHong Zhang .keywords: TS, trajectory, create 1853c0fce88SHong Zhang 18664fc91eeSBarry Smith .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 187bc952696SBarry Smith @*/ 188b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 189bc952696SBarry Smith { 190bc952696SBarry Smith TSTrajectory t; 191bc952696SBarry Smith PetscErrorCode ierr; 192bc952696SBarry Smith 193bc952696SBarry Smith PetscFunctionBegin; 194b1d74d50SHong Zhang PetscValidPointer(tj,2); 195b1d74d50SHong Zhang *tj = NULL; 196bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 197bc952696SBarry Smith 19873107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 19968bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 20064fc91eeSBarry Smith t->keepfiles = PETSC_TRUE; 201b1d74d50SHong Zhang *tj = t; 202bc952696SBarry Smith PetscFunctionReturn(0); 203bc952696SBarry Smith } 204bc952696SBarry Smith 205bc952696SBarry Smith /*@C 206bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 207bc952696SBarry Smith 208bc952696SBarry Smith Collective on TS 209bc952696SBarry Smith 210bc952696SBarry Smith Input Parameters: 2113c0fce88SHong Zhang + tj - the TSTrajectory context 2123c0fce88SHong Zhang . ts - the TS context 2133c0fce88SHong Zhang - type - a known method 214bc952696SBarry Smith 215bc952696SBarry Smith Options Database Command: 216e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 217bc952696SBarry Smith 218df5474d8SHong Zhang Level: developer 219bc952696SBarry Smith 2203c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, type 221bc952696SBarry Smith 2223c0fce88SHong Zhang .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 223bc952696SBarry Smith 224bc952696SBarry Smith @*/ 225972caf09SHong Zhang PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 226bc952696SBarry Smith { 227972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 228bc952696SBarry Smith PetscBool match; 229bc952696SBarry Smith PetscErrorCode ierr; 230bc952696SBarry Smith 231bc952696SBarry Smith PetscFunctionBegin; 232972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 233972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 234bc952696SBarry Smith if (match) PetscFunctionReturn(0); 235bc952696SBarry Smith 236bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 237bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 238972caf09SHong Zhang if (tj->ops->destroy) { 239972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 240bc952696SBarry Smith 241972caf09SHong Zhang tj->ops->destroy = NULL; 242bc952696SBarry Smith } 243972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 244bc952696SBarry Smith 245972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 246972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 247bc952696SBarry Smith PetscFunctionReturn(0); 248bc952696SBarry Smith } 249bc952696SBarry Smith 250972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 251972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 2529a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 2532b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 254bc952696SBarry Smith 255bc952696SBarry Smith /*@C 256bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 257bc952696SBarry Smith 258bc952696SBarry Smith Not Collective 259bc952696SBarry Smith 260df5474d8SHong Zhang Level: developer 261bc952696SBarry Smith 2623c0fce88SHong Zhang .keywords: TS, trajectory, register, all 2633c0fce88SHong Zhang 2643c0fce88SHong Zhang .seealso: TSTrajectoryRegister() 265bc952696SBarry Smith @*/ 266bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 267bc952696SBarry Smith { 268bc952696SBarry Smith PetscErrorCode ierr; 269bc952696SBarry Smith 270bc952696SBarry Smith PetscFunctionBegin; 271560360afSLisandro Dalcin if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 272bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 273bc952696SBarry Smith 274bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 2751c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 2769a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 2772b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 278bc952696SBarry Smith PetscFunctionReturn(0); 279bc952696SBarry Smith } 280bc952696SBarry Smith 281bc952696SBarry Smith /*@ 282bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 283bc952696SBarry Smith 284bc952696SBarry Smith Collective on TSTrajectory 285bc952696SBarry Smith 286bc952696SBarry Smith Input Parameter: 2873c0fce88SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 288bc952696SBarry Smith 289df5474d8SHong Zhang Level: developer 290bc952696SBarry Smith 2913c0fce88SHong Zhang .keywords: TS, trajectory, timestep, destroy 292bc952696SBarry Smith 2933c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 294bc952696SBarry Smith @*/ 295972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 296bc952696SBarry Smith { 297bc952696SBarry Smith PetscErrorCode ierr; 298bc952696SBarry Smith 299bc952696SBarry Smith PetscFunctionBegin; 300972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 301972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 302972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 303bc952696SBarry Smith 3047f79407eSBarry Smith if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 305972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 306aced365eSHong Zhang ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 30778fbdcc8SBarry Smith ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 308*64e38db7SHong Zhang ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 309*64e38db7SHong Zhang ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 310972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 311bc952696SBarry Smith PetscFunctionReturn(0); 312bc952696SBarry Smith } 313bc952696SBarry Smith 314bc952696SBarry Smith /* 315772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 316bc952696SBarry Smith 317bc952696SBarry Smith Collective on TSTrajectory 318bc952696SBarry Smith 319bc952696SBarry Smith Input Parameter: 3203c0fce88SHong Zhang + tj - the TSTrajectory context 3213c0fce88SHong Zhang - ts - the TS context 3223c0fce88SHong Zhang 3233c0fce88SHong Zhang Options Database Keys: 3243c0fce88SHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 325bc952696SBarry Smith 326df5474d8SHong Zhang Level: developer 327bc952696SBarry Smith 3283c0fce88SHong Zhang .keywords: TS, trajectory, set, options, type 3293c0fce88SHong Zhang 3303c0fce88SHong Zhang .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 331bc952696SBarry Smith */ 3322bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 333bc952696SBarry Smith { 334bc952696SBarry Smith PetscBool opt; 335bc952696SBarry Smith const char *defaultType; 336bc952696SBarry Smith char typeName[256]; 3379a53571cSHong Zhang PetscBool flg; 338bc952696SBarry Smith PetscErrorCode ierr; 339bc952696SBarry Smith 340bc952696SBarry Smith PetscFunctionBegin; 341b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 342bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 343bc952696SBarry Smith 344560360afSLisandro Dalcin ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 345e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 346bc952696SBarry Smith if (opt) { 347f416af30SBarry Smith ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 348972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 349bc952696SBarry Smith } else { 350972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 351bc952696SBarry Smith } 352bc952696SBarry Smith PetscFunctionReturn(0); 353bc952696SBarry Smith } 354bc952696SBarry Smith 355ed695a29SHong Zhang /*@ 356ed695a29SHong Zhang TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 357ed695a29SHong Zhang 358ed695a29SHong Zhang Collective on TSTrajectory 359ed695a29SHong Zhang 360ed695a29SHong Zhang Input Arguments: 361ed695a29SHong Zhang + tj - the TSTrajectory context 362ed695a29SHong Zhang - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 363ed695a29SHong Zhang 3643c0fce88SHong Zhang Options Database Keys: 365063c0c7aSHong Zhang . -ts_trajectory_monitor - print TSTrajectory information 3663c0fce88SHong Zhang 367df5474d8SHong Zhang Level: developer 368ed695a29SHong Zhang 3693c0fce88SHong Zhang .keywords: TS, trajectory, set, monitor 3703c0fce88SHong Zhang 3713c0fce88SHong Zhang .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 372ed695a29SHong Zhang @*/ 3732bee684fSHong Zhang PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 374ed695a29SHong Zhang { 375ed695a29SHong Zhang PetscErrorCode ierr; 376ed695a29SHong Zhang 377ed695a29SHong Zhang PetscFunctionBegin; 378ed695a29SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 379ed695a29SHong Zhang PetscValidLogicalCollectiveBool(tj,flg,2); 380ed695a29SHong Zhang if (flg) { 381ed695a29SHong Zhang if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 382ed695a29SHong Zhang } else { 383ed695a29SHong Zhang ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 384ed695a29SHong Zhang } 385ed695a29SHong Zhang PetscFunctionReturn(0); 386ed695a29SHong Zhang } 387ed695a29SHong Zhang 388bc952696SBarry Smith /*@ 38964fc91eeSBarry Smith TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 39064fc91eeSBarry Smith 39164fc91eeSBarry Smith Collective on TSTrajectory 39264fc91eeSBarry Smith 39364fc91eeSBarry Smith Input Arguments: 39464fc91eeSBarry Smith + tj - the TSTrajectory context 39564fc91eeSBarry Smith - flg - PETSC_TRUE to save, PETSC_FALSE to disable 39664fc91eeSBarry Smith 39764fc91eeSBarry Smith Options Database Keys: 39864fc91eeSBarry Smith . -ts_trajectory_keep_files - have it keep the files 39964fc91eeSBarry Smith 40064fc91eeSBarry 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. 40164fc91eeSBarry Smith 40264fc91eeSBarry Smith Level: advanced 40364fc91eeSBarry Smith 40464fc91eeSBarry Smith .keywords: TS, trajectory, set, monitor 40564fc91eeSBarry Smith 40664fc91eeSBarry Smith .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 40764fc91eeSBarry Smith @*/ 40864fc91eeSBarry Smith PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 40964fc91eeSBarry Smith { 41064fc91eeSBarry Smith PetscFunctionBegin; 41164fc91eeSBarry Smith PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 41264fc91eeSBarry Smith PetscValidLogicalCollectiveBool(tj,flg,2); 41364fc91eeSBarry Smith tj->keepfiles = flg; 41464fc91eeSBarry Smith PetscFunctionReturn(0); 41564fc91eeSBarry Smith } 41664fc91eeSBarry Smith 41764fc91eeSBarry Smith /*@ 418*64e38db7SHong Zhang TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 419*64e38db7SHong Zhang 420*64e38db7SHong Zhang Collective on TSTrajectory 421*64e38db7SHong Zhang 422*64e38db7SHong Zhang Input Arguments: 423*64e38db7SHong Zhang + tj - the TSTrajectory context 424*64e38db7SHong Zhang - dirname - the directory name 425*64e38db7SHong Zhang 426*64e38db7SHong Zhang Options Database Keys: 427*64e38db7SHong Zhang . -ts_trajectory_dirname - set the directory name 428*64e38db7SHong Zhang 429*64e38db7SHong Zhang Level: developer 430*64e38db7SHong Zhang 431*64e38db7SHong Zhang .keywords: TS, trajectory, set 432*64e38db7SHong Zhang 433*64e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 434*64e38db7SHong Zhang @*/ 435*64e38db7SHong Zhang PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 436*64e38db7SHong Zhang { 437*64e38db7SHong Zhang PetscErrorCode ierr; 438*64e38db7SHong Zhang PetscFunctionBegin; 439*64e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 440*64e38db7SHong Zhang ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 441*64e38db7SHong Zhang PetscFunctionReturn(0); 442*64e38db7SHong Zhang } 443*64e38db7SHong Zhang 444*64e38db7SHong Zhang /*@ 445*64e38db7SHong Zhang TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 446*64e38db7SHong Zhang 447*64e38db7SHong Zhang Collective on TSTrajectory 448*64e38db7SHong Zhang 449*64e38db7SHong Zhang Input Arguments: 450*64e38db7SHong Zhang + tj - the TSTrajectory context 451*64e38db7SHong Zhang - filetemplate - the directory name 452*64e38db7SHong Zhang 453*64e38db7SHong Zhang Options Database Keys: 454*64e38db7SHong Zhang . -ts_trajectory_file - set the file name template 455*64e38db7SHong Zhang 456*64e38db7SHong Zhang Level: developer 457*64e38db7SHong Zhang 458*64e38db7SHong Zhang .keywords: TS, trajectory, set 459*64e38db7SHong Zhang 460*64e38db7SHong Zhang .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 461*64e38db7SHong Zhang @*/ 462*64e38db7SHong Zhang PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 463*64e38db7SHong Zhang { 464*64e38db7SHong Zhang PetscErrorCode ierr; 465*64e38db7SHong Zhang PetscFunctionBegin; 466*64e38db7SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 467*64e38db7SHong Zhang ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 468*64e38db7SHong Zhang PetscFunctionReturn(0); 469*64e38db7SHong Zhang } 470*64e38db7SHong Zhang 471*64e38db7SHong Zhang /*@ 472bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 473bc952696SBarry Smith 474bc952696SBarry Smith Collective on TSTrajectory 475bc952696SBarry Smith 476bc952696SBarry Smith Input Parameter: 4773c0fce88SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 4783c0fce88SHong Zhang - ts - the TS context 479bc952696SBarry Smith 480bc952696SBarry Smith Options Database Keys: 4813c0fce88SHong Zhang + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 48264fc91eeSBarry 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 483063c0c7aSHong Zhang - -ts_trajectory_monitor - print TSTrajectory information 484bc952696SBarry Smith 485df5474d8SHong Zhang Level: developer 486bc952696SBarry Smith 48762b521acSHong Zhang Notes: This is not normally called directly by users 488bc952696SBarry Smith 4893c0fce88SHong Zhang .keywords: TS, trajectory, timestep, set, options, database 490bc952696SBarry Smith 4913c0fce88SHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 492bc952696SBarry Smith @*/ 493972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 494bc952696SBarry Smith { 495ed695a29SHong Zhang PetscBool set,flg; 496*64e38db7SHong Zhang char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 497*64e38db7SHong Zhang PetscErrorCode ierr; 498bc952696SBarry Smith 499bc952696SBarry Smith PetscFunctionBegin; 500b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 501972caf09SHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 502b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 503972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 504ed695a29SHong Zhang ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 505aced365eSHong Zhang if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 506*64e38db7SHong Zhang 50764fc91eeSBarry Smith ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 50864fc91eeSBarry Smith if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 509*64e38db7SHong Zhang 510*64e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 511*64e38db7SHong Zhang if (!set) { 512*64e38db7SHong Zhang ierr = PetscStrcpy(dirname,"SA-data");CHKERRQ(ierr); 513*64e38db7SHong Zhang } 514*64e38db7SHong Zhang ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 515*64e38db7SHong Zhang 516*64e38db7SHong Zhang ierr = PetscOptionsString("-ts_trajectory_file","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr); 517*64e38db7SHong Zhang if (set) { 518*64e38db7SHong Zhang size_t len; 519*64e38db7SHong Zhang const char *ptr,*ptr2; 520*64e38db7SHong Zhang if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file requires a file name template, e.g. filename-%%06D.bin"); 521*64e38db7SHong Zhang /* Do some cursory validation of the input. */ 522*64e38db7SHong Zhang ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 523*64e38db7SHong Zhang if (!ptr) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file requires a file name template, e.g. filename-%%06D.bin"); 524*64e38db7SHong Zhang for (ptr++; ptr && *ptr; ptr++) { 525*64e38db7SHong Zhang ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 526*64e38db7SHong Zhang if (!ptr2 && (*ptr < '0' || '9' < *ptr)) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"Invalid file template argument to -ts_trajectory_file, should look like filename-%%06D.bin"); 527*64e38db7SHong Zhang if (ptr2) break; 528*64e38db7SHong Zhang } 529*64e38db7SHong Zhang ierr = PetscStrcat(dirname,"/");CHKERRQ(ierr); 530*64e38db7SHong Zhang ierr = PetscStrlen(filetemplate,&len);CHKERRQ(ierr); 531*64e38db7SHong Zhang ierr = PetscStrncat(dirname,filetemplate,PETSC_MAX_PATH_LEN-len-1);CHKERRQ(ierr); 532*64e38db7SHong Zhang } else { 533*64e38db7SHong Zhang ierr = PetscStrcat(dirname,"/SA-%06D.bin");CHKERRQ(ierr); 534*64e38db7SHong Zhang } 535*64e38db7SHong Zhang ierr = TSTrajectorySetFiletemplate(tj,dirname);CHKERRQ(ierr); 536*64e38db7SHong Zhang 537*64e38db7SHong Zhang /* Handle specific TSTrajectory options */ 53862b521acSHong Zhang if (tj->ops->setfromoptions) { 53962b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 54062b521acSHong Zhang } 541bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 542bc952696SBarry Smith PetscFunctionReturn(0); 543bc952696SBarry Smith } 54468bece0bSHong Zhang 54568bece0bSHong Zhang /*@ 54668bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 54768bece0bSHong Zhang of a TS trajectory. 54868bece0bSHong Zhang 54968bece0bSHong Zhang Collective on TS 55068bece0bSHong Zhang 55168bece0bSHong Zhang Input Parameter: 5523c0fce88SHong Zhang + ts - the TS context obtained from TSCreate() 5533c0fce88SHong Zhang - tj - the TS trajectory context 55468bece0bSHong Zhang 555df5474d8SHong Zhang Level: developer 55668bece0bSHong Zhang 5573c0fce88SHong Zhang .keywords: TS, trajectory, setup 55868bece0bSHong Zhang 55968bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 56068bece0bSHong Zhang @*/ 56168bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 56268bece0bSHong Zhang { 56368bece0bSHong Zhang PetscErrorCode ierr; 56468bece0bSHong Zhang 56568bece0bSHong Zhang PetscFunctionBegin; 56668bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 56768bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 56868bece0bSHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 56968bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 57068bece0bSHong Zhang 57168bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 57268bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 57368bece0bSHong Zhang } 57468bece0bSHong Zhang if (tj->ops->setup) { 57568bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 57668bece0bSHong Zhang } 57768bece0bSHong Zhang 57868bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 57953b27ddbSHong Zhang 58053b27ddbSHong Zhang /* Set the counters to zero */ 5811a5a771fSHong Zhang tj->recomps = 0; 58253b27ddbSHong Zhang tj->diskreads = 0; 58353b27ddbSHong Zhang tj->diskwrites = 0; 58468bece0bSHong Zhang PetscFunctionReturn(0); 58568bece0bSHong Zhang } 586