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 #undef __FUNCT__ 10bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegister" 11bc952696SBarry Smith /*@C 12bc952696SBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 13bc952696SBarry Smith 14bc952696SBarry Smith Not Collective 15bc952696SBarry Smith 16bc952696SBarry Smith Input Parameters: 17bc952696SBarry Smith + name - The name of a new user-defined creation routine 18bc952696SBarry Smith - create_func - The creation routine itself 19bc952696SBarry Smith 20bc952696SBarry Smith Notes: 21bc952696SBarry Smith TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 22bc952696SBarry Smith 23bc952696SBarry Smith Level: advanced 24bc952696SBarry Smith 25bc952696SBarry Smith .keywords: TS, register 26bc952696SBarry Smith 27bc952696SBarry Smith .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy() 28bc952696SBarry Smith @*/ 29972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 30bc952696SBarry Smith { 31bc952696SBarry Smith PetscErrorCode ierr; 32bc952696SBarry Smith 33bc952696SBarry Smith PetscFunctionBegin; 34bc952696SBarry Smith ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 35bc952696SBarry Smith PetscFunctionReturn(0); 36bc952696SBarry Smith } 37bc952696SBarry Smith 38bc952696SBarry Smith #undef __FUNCT__ 39bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySet" 40bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 41bc952696SBarry Smith { 42bc952696SBarry Smith PetscErrorCode ierr; 43bc952696SBarry Smith 44bc952696SBarry Smith PetscFunctionBegin; 45bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 46d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 47bc952696SBarry Smith ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 48d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 49bc952696SBarry Smith PetscFunctionReturn(0); 50bc952696SBarry Smith } 51bc952696SBarry Smith 52bc952696SBarry Smith #undef __FUNCT__ 53bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryGet" 54c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 55bc952696SBarry Smith { 56bc952696SBarry Smith PetscErrorCode ierr; 57bc952696SBarry Smith 58bc952696SBarry Smith PetscFunctionBegin; 59bc952696SBarry Smith if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 60d0d044f3SHong Zhang ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 61bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 62d0d044f3SHong Zhang ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 63bc952696SBarry Smith PetscFunctionReturn(0); 64bc952696SBarry Smith } 65bc952696SBarry Smith 66bc952696SBarry Smith #undef __FUNCT__ 67bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryView" 68bc952696SBarry Smith /*@C 69bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 70bc952696SBarry Smith 71bc952696SBarry Smith Collective on TSTrajectory 72bc952696SBarry Smith 73bc952696SBarry Smith Input Parameters: 74b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 75bc952696SBarry Smith - viewer - visualization context 76bc952696SBarry Smith 77bc952696SBarry Smith Options Database Key: 78*e210cd0eSHong Zhang . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 79bc952696SBarry Smith 80bc952696SBarry Smith Notes: 81bc952696SBarry Smith The available visualization contexts include 82bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 83bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 84bc952696SBarry Smith output where only the first processor opens 85bc952696SBarry Smith the file. All other processors send their 86bc952696SBarry Smith data to the first processor to print. 87bc952696SBarry Smith 88bc952696SBarry Smith The user can open an alternative visualization context with 89bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 90bc952696SBarry Smith 91bc952696SBarry Smith Level: beginner 92bc952696SBarry Smith 93bc952696SBarry Smith .keywords: TS, timestep, view 94bc952696SBarry Smith 95bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 96bc952696SBarry Smith @*/ 97b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 98bc952696SBarry Smith { 99bc952696SBarry Smith PetscErrorCode ierr; 100bc952696SBarry Smith PetscBool iascii; 101bc952696SBarry Smith 102bc952696SBarry Smith PetscFunctionBegin; 1031a5a771fSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 104bc952696SBarry Smith if (!viewer) { 105b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 106bc952696SBarry Smith } 107bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 108b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 109bc952696SBarry Smith 110bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 111bc952696SBarry Smith if (iascii) { 112b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 1131a5a771fSHong Zhang ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation=%D\n",tj->recomps);CHKERRQ(ierr); 114b1d74d50SHong Zhang if (tj->ops->view) { 115b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 116bc952696SBarry Smith } 117bc952696SBarry Smith } 118bc952696SBarry Smith PetscFunctionReturn(0); 119bc952696SBarry Smith } 120bc952696SBarry Smith 121bc952696SBarry Smith #undef __FUNCT__ 122bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryCreate" 123bc952696SBarry Smith /*@C 124bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 125bc952696SBarry Smith 126bc952696SBarry Smith Collective on MPI_Comm 127bc952696SBarry Smith 128bc952696SBarry Smith Input Parameter: 129bc952696SBarry Smith . comm - The communicator 130bc952696SBarry Smith 131bc952696SBarry Smith Output Parameter: 132b1d74d50SHong Zhang . tj - The trajectory object 133bc952696SBarry Smith 134bc952696SBarry Smith Level: advanced 135bc952696SBarry Smith 136bc952696SBarry Smith Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call 137bc952696SBarry Smith TSGetTrajectory() to access the created trajectory. 138bc952696SBarry Smith 139bc952696SBarry Smith .keywords: TS, create 140bc952696SBarry Smith .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory() 141bc952696SBarry Smith @*/ 142b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 143bc952696SBarry Smith { 144bc952696SBarry Smith TSTrajectory t; 145bc952696SBarry Smith PetscErrorCode ierr; 146bc952696SBarry Smith 147bc952696SBarry Smith PetscFunctionBegin; 148b1d74d50SHong Zhang PetscValidPointer(tj,2); 149b1d74d50SHong Zhang *tj = NULL; 150bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 151bc952696SBarry Smith 15273107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 15368bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 154b1d74d50SHong Zhang *tj = t; 155bc952696SBarry Smith PetscFunctionReturn(0); 156bc952696SBarry Smith } 157bc952696SBarry Smith 158bc952696SBarry Smith #undef __FUNCT__ 159bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetType" 160bc952696SBarry Smith /*@C 161bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 162bc952696SBarry Smith 163bc952696SBarry Smith Collective on TS 164bc952696SBarry Smith 165bc952696SBarry Smith Input Parameters: 166bc952696SBarry Smith + ts - The TS context 167bc952696SBarry Smith - type - A known method 168bc952696SBarry Smith 169bc952696SBarry Smith Options Database Command: 170*e210cd0eSHong Zhang . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 171bc952696SBarry Smith 172bc952696SBarry Smith Level: intermediate 173bc952696SBarry Smith 174bc952696SBarry Smith .keywords: TS, set, type 175bc952696SBarry Smith 176bc952696SBarry Smith .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType 177bc952696SBarry Smith 178bc952696SBarry Smith @*/ 179972caf09SHong Zhang PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 180bc952696SBarry Smith { 181972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 182bc952696SBarry Smith PetscBool match; 183bc952696SBarry Smith PetscErrorCode ierr; 184bc952696SBarry Smith 185bc952696SBarry Smith PetscFunctionBegin; 186972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 187972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 188bc952696SBarry Smith if (match) PetscFunctionReturn(0); 189bc952696SBarry Smith 190bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 191bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 192972caf09SHong Zhang if (tj->ops->destroy) { 193972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 194bc952696SBarry Smith 195972caf09SHong Zhang tj->ops->destroy = NULL; 196bc952696SBarry Smith } 197972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 198bc952696SBarry Smith 199972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 200972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 201bc952696SBarry Smith PetscFunctionReturn(0); 202bc952696SBarry Smith } 203bc952696SBarry Smith 204972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 205972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 2069a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 2072b043167SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 208bc952696SBarry Smith 209bc952696SBarry Smith #undef __FUNCT__ 210bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegisterAll" 211bc952696SBarry Smith /*@C 212bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 213bc952696SBarry Smith 214bc952696SBarry Smith Not Collective 215bc952696SBarry Smith 216bc952696SBarry Smith Level: advanced 217bc952696SBarry Smith 218bc952696SBarry Smith .keywords: TS, timestepper, register, all 219bc952696SBarry Smith .seealso: TSCreate(), TSRegister(), TSRegisterDestroy() 220bc952696SBarry Smith @*/ 221bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 222bc952696SBarry Smith { 223bc952696SBarry Smith PetscErrorCode ierr; 224bc952696SBarry Smith 225bc952696SBarry Smith PetscFunctionBegin; 226bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 227bc952696SBarry Smith 228bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 2291c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 2309a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 2312b043167SHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 232bc952696SBarry Smith PetscFunctionReturn(0); 233bc952696SBarry Smith } 234bc952696SBarry Smith 235bc952696SBarry Smith #undef __FUNCT__ 236bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryDestroy" 237bc952696SBarry Smith /*@ 238bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 239bc952696SBarry Smith 240bc952696SBarry Smith Collective on TSTrajectory 241bc952696SBarry Smith 242bc952696SBarry Smith Input Parameter: 243bc952696SBarry Smith . ts - the TSTrajectory context obtained from TSTrajectoryCreate() 244bc952696SBarry Smith 245bc952696SBarry Smith Level: advanced 246bc952696SBarry Smith 247bc952696SBarry Smith .keywords: TS, timestepper, destroy 248bc952696SBarry Smith 249bc952696SBarry Smith .seealso: TSCreate(), TSSetUp(), TSSolve() 250bc952696SBarry Smith @*/ 251972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 252bc952696SBarry Smith { 253bc952696SBarry Smith PetscErrorCode ierr; 254bc952696SBarry Smith 255bc952696SBarry Smith PetscFunctionBegin; 256972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 257972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 258972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 259bc952696SBarry Smith 260972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 261972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 262bc952696SBarry Smith PetscFunctionReturn(0); 263bc952696SBarry Smith } 264bc952696SBarry Smith 265bc952696SBarry Smith #undef __FUNCT__ 266772b2523SBarry Smith #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private" 267bc952696SBarry Smith /* 268772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 269bc952696SBarry Smith 270bc952696SBarry Smith Collective on TSTrajectory 271bc952696SBarry Smith 272bc952696SBarry Smith Input Parameter: 273972caf09SHong Zhang . tj - TSTrajectory 274bc952696SBarry Smith 275bc952696SBarry Smith Level: intermediate 276bc952696SBarry Smith 277bc952696SBarry Smith .keywords: TS, set, options, database, type 278bc952696SBarry Smith .seealso: TSSetFromOptions(), TSSetType() 279bc952696SBarry Smith */ 2802bfe6b3fSBarry Smith static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 281bc952696SBarry Smith { 282bc952696SBarry Smith PetscBool opt; 283bc952696SBarry Smith const char *defaultType; 284bc952696SBarry Smith char typeName[256]; 2859a53571cSHong Zhang PetscBool flg; 286bc952696SBarry Smith PetscErrorCode ierr; 287bc952696SBarry Smith 288bc952696SBarry Smith PetscFunctionBegin; 289b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 290bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 291bc952696SBarry Smith 292bc952696SBarry Smith if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);} 293*e210cd0eSHong Zhang ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 294bc952696SBarry Smith if (opt) { 2959a53571cSHong Zhang ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg); 296972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 297bc952696SBarry Smith } else { 298972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 299bc952696SBarry Smith } 300bc952696SBarry Smith PetscFunctionReturn(0); 301bc952696SBarry Smith } 302bc952696SBarry Smith 303bc952696SBarry Smith #undef __FUNCT__ 304bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetFromOptions" 305bc952696SBarry Smith /*@ 306bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 307bc952696SBarry Smith 308bc952696SBarry Smith Collective on TSTrajectory 309bc952696SBarry Smith 310bc952696SBarry Smith Input Parameter: 311b1d74d50SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 312bc952696SBarry Smith 313bc952696SBarry Smith Options Database Keys: 314*e210cd0eSHong Zhang . -ts_trajectory_type <type> - TSTRAJECTORYBASIC 315*e210cd0eSHong Zhang . -ts_trajectory_max_cps <int> 316bc952696SBarry Smith 317bc952696SBarry Smith Level: advanced 318bc952696SBarry Smith 31962b521acSHong Zhang Notes: This is not normally called directly by users 320bc952696SBarry Smith 32162b521acSHong Zhang .keywords: TS, timestep, set, options, database, trajectory 322bc952696SBarry Smith 323bc952696SBarry Smith .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory() 324bc952696SBarry Smith @*/ 325972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 326bc952696SBarry Smith { 327bc952696SBarry Smith PetscErrorCode ierr; 328bc952696SBarry Smith 329bc952696SBarry Smith PetscFunctionBegin; 330b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 331972caf09SHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 332b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 333972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 33462b521acSHong Zhang /* Handle specific TS options */ 33562b521acSHong Zhang if (tj->ops->setfromoptions) { 33662b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 33762b521acSHong Zhang } 338bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 339bc952696SBarry Smith PetscFunctionReturn(0); 340bc952696SBarry Smith } 34168bece0bSHong Zhang 34268bece0bSHong Zhang #undef __FUNCT__ 34368bece0bSHong Zhang #define __FUNCT__ "TSTrajectorySetUp" 34468bece0bSHong Zhang /*@ 34568bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 34668bece0bSHong Zhang of a TS trajectory. 34768bece0bSHong Zhang 34868bece0bSHong Zhang Collective on TS 34968bece0bSHong Zhang 35068bece0bSHong Zhang Input Parameter: 35168bece0bSHong Zhang . ts - the TS context obtained from TSCreate() 35268bece0bSHong Zhang . tj - the TS trajectory context 35368bece0bSHong Zhang 35468bece0bSHong Zhang Level: advanced 35568bece0bSHong Zhang 35668bece0bSHong Zhang .keywords: TS, setup, checkpoint 35768bece0bSHong Zhang 35868bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 35968bece0bSHong Zhang @*/ 36068bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 36168bece0bSHong Zhang { 36268bece0bSHong Zhang PetscErrorCode ierr; 36368bece0bSHong Zhang 36468bece0bSHong Zhang PetscFunctionBegin; 36568bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 36668bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 36768bece0bSHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 36868bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 36968bece0bSHong Zhang 37068bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 37168bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 37268bece0bSHong Zhang } 37368bece0bSHong Zhang if (tj->ops->setup) { 37468bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 37568bece0bSHong Zhang } 37668bece0bSHong Zhang 37768bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 3781a5a771fSHong Zhang tj->recomps = 0; 37968bece0bSHong Zhang PetscFunctionReturn(0); 38068bece0bSHong Zhang } 381