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; 7bc952696SBarry Smith 8bc952696SBarry Smith #undef __FUNCT__ 9bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegister" 10bc952696SBarry Smith /*@C 11bc952696SBarry Smith TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 12bc952696SBarry Smith 13bc952696SBarry Smith Not Collective 14bc952696SBarry Smith 15bc952696SBarry Smith Input Parameters: 16bc952696SBarry Smith + name - The name of a new user-defined creation routine 17bc952696SBarry Smith - create_func - The creation routine itself 18bc952696SBarry Smith 19bc952696SBarry Smith Notes: 20bc952696SBarry Smith TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 21bc952696SBarry Smith 22bc952696SBarry Smith Level: advanced 23bc952696SBarry Smith 24bc952696SBarry Smith .keywords: TS, register 25bc952696SBarry Smith 26bc952696SBarry Smith .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy() 27bc952696SBarry Smith @*/ 28972caf09SHong Zhang PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 29bc952696SBarry Smith { 30bc952696SBarry Smith PetscErrorCode ierr; 31bc952696SBarry Smith 32bc952696SBarry Smith PetscFunctionBegin; 33bc952696SBarry Smith ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 34bc952696SBarry Smith PetscFunctionReturn(0); 35bc952696SBarry Smith } 36bc952696SBarry Smith 37bc952696SBarry Smith #undef __FUNCT__ 38bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySet" 39bc952696SBarry Smith PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 40bc952696SBarry Smith { 41bc952696SBarry Smith PetscErrorCode ierr; 42bc952696SBarry Smith 43bc952696SBarry Smith PetscFunctionBegin; 44bc952696SBarry Smith if (!tj) PetscFunctionReturn(0); 45bc952696SBarry Smith ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 46bc952696SBarry Smith PetscFunctionReturn(0); 47bc952696SBarry Smith } 48bc952696SBarry Smith 49bc952696SBarry Smith #undef __FUNCT__ 50bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryGet" 51c679fc15SHong Zhang PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 52bc952696SBarry Smith { 53bc952696SBarry Smith PetscErrorCode ierr; 54bc952696SBarry Smith 55bc952696SBarry Smith PetscFunctionBegin; 56bc952696SBarry Smith if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 57bc952696SBarry Smith ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 58bc952696SBarry Smith PetscFunctionReturn(0); 59bc952696SBarry Smith } 60bc952696SBarry Smith 61bc952696SBarry Smith #undef __FUNCT__ 62bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryView" 63bc952696SBarry Smith /*@C 64bc952696SBarry Smith TSTrajectoryView - Prints information about the trajectory object 65bc952696SBarry Smith 66bc952696SBarry Smith Collective on TSTrajectory 67bc952696SBarry Smith 68bc952696SBarry Smith Input Parameters: 69b1d74d50SHong Zhang + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 70bc952696SBarry Smith - viewer - visualization context 71bc952696SBarry Smith 72bc952696SBarry Smith Options Database Key: 73bc952696SBarry Smith . -ts_view - calls TSView() at end of TSStep() 74bc952696SBarry Smith 75bc952696SBarry Smith Notes: 76bc952696SBarry Smith The available visualization contexts include 77bc952696SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 78bc952696SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 79bc952696SBarry Smith output where only the first processor opens 80bc952696SBarry Smith the file. All other processors send their 81bc952696SBarry Smith data to the first processor to print. 82bc952696SBarry Smith 83bc952696SBarry Smith The user can open an alternative visualization context with 84bc952696SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 85bc952696SBarry Smith 86bc952696SBarry Smith Level: beginner 87bc952696SBarry Smith 88bc952696SBarry Smith .keywords: TS, timestep, view 89bc952696SBarry Smith 90bc952696SBarry Smith .seealso: PetscViewerASCIIOpen() 91bc952696SBarry Smith @*/ 92b1d74d50SHong Zhang PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 93bc952696SBarry Smith { 94bc952696SBarry Smith PetscErrorCode ierr; 95bc952696SBarry Smith PetscBool iascii; 96bc952696SBarry Smith 97bc952696SBarry Smith PetscFunctionBegin; 98b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TS_CLASSID,1); 99bc952696SBarry Smith if (!viewer) { 100b1d74d50SHong Zhang ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 101bc952696SBarry Smith } 102bc952696SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 103b1d74d50SHong Zhang PetscCheckSameComm(tj,1,viewer,2); 104bc952696SBarry Smith 105bc952696SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 106bc952696SBarry Smith if (iascii) { 107b1d74d50SHong Zhang ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 108b1d74d50SHong Zhang if (tj->ops->view) { 109b1d74d50SHong Zhang ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 110bc952696SBarry Smith } 111bc952696SBarry Smith } 112bc952696SBarry Smith PetscFunctionReturn(0); 113bc952696SBarry Smith } 114bc952696SBarry Smith 115bc952696SBarry Smith #undef __FUNCT__ 116bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryCreate" 117bc952696SBarry Smith /*@C 118bc952696SBarry Smith TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 119bc952696SBarry Smith 120bc952696SBarry Smith Collective on MPI_Comm 121bc952696SBarry Smith 122bc952696SBarry Smith Input Parameter: 123bc952696SBarry Smith . comm - The communicator 124bc952696SBarry Smith 125bc952696SBarry Smith Output Parameter: 126b1d74d50SHong Zhang . tj - The trajectory object 127bc952696SBarry Smith 128bc952696SBarry Smith Level: advanced 129bc952696SBarry Smith 130bc952696SBarry Smith Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call 131bc952696SBarry Smith TSGetTrajectory() to access the created trajectory. 132bc952696SBarry Smith 133bc952696SBarry Smith .keywords: TS, create 134bc952696SBarry Smith .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory() 135bc952696SBarry Smith @*/ 136b1d74d50SHong Zhang PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 137bc952696SBarry Smith { 138bc952696SBarry Smith TSTrajectory t; 139bc952696SBarry Smith PetscErrorCode ierr; 140bc952696SBarry Smith 141bc952696SBarry Smith PetscFunctionBegin; 142b1d74d50SHong Zhang PetscValidPointer(tj,2); 143b1d74d50SHong Zhang *tj = NULL; 144bc952696SBarry Smith ierr = TSInitializePackage();CHKERRQ(ierr); 145bc952696SBarry Smith 14673107ff1SLisandro Dalcin ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 147*68bece0bSHong Zhang t->setupcalled = PETSC_FALSE; 148b1d74d50SHong Zhang *tj = t; 149bc952696SBarry Smith PetscFunctionReturn(0); 150bc952696SBarry Smith } 151bc952696SBarry Smith 152bc952696SBarry Smith #undef __FUNCT__ 153bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetType" 154bc952696SBarry Smith /*@C 155bc952696SBarry Smith TSTrajectorySetType - Sets the storage method to be used as in a trajectory 156bc952696SBarry Smith 157bc952696SBarry Smith Collective on TS 158bc952696SBarry Smith 159bc952696SBarry Smith Input Parameters: 160bc952696SBarry Smith + ts - The TS context 161bc952696SBarry Smith - type - A known method 162bc952696SBarry Smith 163bc952696SBarry Smith Options Database Command: 164bc952696SBarry Smith . -tstrajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 165bc952696SBarry Smith 166bc952696SBarry Smith Level: intermediate 167bc952696SBarry Smith 168bc952696SBarry Smith .keywords: TS, set, type 169bc952696SBarry Smith 170bc952696SBarry Smith .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType 171bc952696SBarry Smith 172bc952696SBarry Smith @*/ 173972caf09SHong Zhang PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 174bc952696SBarry Smith { 175972caf09SHong Zhang PetscErrorCode (*r)(TSTrajectory,TS); 176bc952696SBarry Smith PetscBool match; 177bc952696SBarry Smith PetscErrorCode ierr; 178bc952696SBarry Smith 179bc952696SBarry Smith PetscFunctionBegin; 180972caf09SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 181972caf09SHong Zhang ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 182bc952696SBarry Smith if (match) PetscFunctionReturn(0); 183bc952696SBarry Smith 184bc952696SBarry Smith ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 185bc952696SBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 186972caf09SHong Zhang if (tj->ops->destroy) { 187972caf09SHong Zhang ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 188bc952696SBarry Smith 189972caf09SHong Zhang tj->ops->destroy = NULL; 190bc952696SBarry Smith } 191972caf09SHong Zhang ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 192bc952696SBarry Smith 193972caf09SHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 194972caf09SHong Zhang ierr = (*r)(tj,ts);CHKERRQ(ierr); 195bc952696SBarry Smith PetscFunctionReturn(0); 196bc952696SBarry Smith } 197bc952696SBarry Smith 198972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 199972caf09SHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 2009a53571cSHong Zhang PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 201bc952696SBarry Smith 202bc952696SBarry Smith #undef __FUNCT__ 203bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryRegisterAll" 204bc952696SBarry Smith /*@C 205bc952696SBarry Smith TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 206bc952696SBarry Smith 207bc952696SBarry Smith Not Collective 208bc952696SBarry Smith 209bc952696SBarry Smith Level: advanced 210bc952696SBarry Smith 211bc952696SBarry Smith .keywords: TS, timestepper, register, all 212bc952696SBarry Smith .seealso: TSCreate(), TSRegister(), TSRegisterDestroy() 213bc952696SBarry Smith @*/ 214bc952696SBarry Smith PetscErrorCode TSTrajectoryRegisterAll(void) 215bc952696SBarry Smith { 216bc952696SBarry Smith PetscErrorCode ierr; 217bc952696SBarry Smith 218bc952696SBarry Smith PetscFunctionBegin; 219bc952696SBarry Smith TSTrajectoryRegisterAllCalled = PETSC_TRUE; 220bc952696SBarry Smith 221bc952696SBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 2221c8c567eSBarry Smith ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 2239a53571cSHong Zhang ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 224bc952696SBarry Smith PetscFunctionReturn(0); 225bc952696SBarry Smith } 226bc952696SBarry Smith 227bc952696SBarry Smith #undef __FUNCT__ 228bc952696SBarry Smith #define __FUNCT__ "TSTrajectoryDestroy" 229bc952696SBarry Smith /*@ 230bc952696SBarry Smith TSTrajectoryDestroy - Destroys a trajectory context 231bc952696SBarry Smith 232bc952696SBarry Smith Collective on TSTrajectory 233bc952696SBarry Smith 234bc952696SBarry Smith Input Parameter: 235bc952696SBarry Smith . ts - the TSTrajectory context obtained from TSTrajectoryCreate() 236bc952696SBarry Smith 237bc952696SBarry Smith Level: advanced 238bc952696SBarry Smith 239bc952696SBarry Smith .keywords: TS, timestepper, destroy 240bc952696SBarry Smith 241bc952696SBarry Smith .seealso: TSCreate(), TSSetUp(), TSSolve() 242bc952696SBarry Smith @*/ 243972caf09SHong Zhang PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 244bc952696SBarry Smith { 245bc952696SBarry Smith PetscErrorCode ierr; 246bc952696SBarry Smith 247bc952696SBarry Smith PetscFunctionBegin; 248972caf09SHong Zhang if (!*tj) PetscFunctionReturn(0); 249972caf09SHong Zhang PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 250972caf09SHong Zhang if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 251bc952696SBarry Smith 252972caf09SHong Zhang if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 253972caf09SHong Zhang ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 254bc952696SBarry Smith PetscFunctionReturn(0); 255bc952696SBarry Smith } 256bc952696SBarry Smith 257bc952696SBarry Smith #undef __FUNCT__ 258772b2523SBarry Smith #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private" 259bc952696SBarry Smith /* 260772b2523SBarry Smith TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 261bc952696SBarry Smith 262bc952696SBarry Smith Collective on TSTrajectory 263bc952696SBarry Smith 264bc952696SBarry Smith Input Parameter: 265972caf09SHong Zhang . tj - TSTrajectory 266bc952696SBarry Smith 267bc952696SBarry Smith Level: intermediate 268bc952696SBarry Smith 269bc952696SBarry Smith .keywords: TS, set, options, database, type 270bc952696SBarry Smith .seealso: TSSetFromOptions(), TSSetType() 271bc952696SBarry Smith */ 272972caf09SHong Zhang static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,TSTrajectory tj,TS ts) 273bc952696SBarry Smith { 274bc952696SBarry Smith PetscBool opt; 275bc952696SBarry Smith const char *defaultType; 276bc952696SBarry Smith char typeName[256]; 2779a53571cSHong Zhang PetscBool flg; 278bc952696SBarry Smith PetscErrorCode ierr; 279bc952696SBarry Smith 280bc952696SBarry Smith PetscFunctionBegin; 281b1d74d50SHong Zhang if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 282bc952696SBarry Smith else defaultType = TSTRAJECTORYBASIC; 283bc952696SBarry Smith 284bc952696SBarry Smith if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);} 285bc952696SBarry Smith ierr = PetscOptionsFList("-tstrajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 286bc952696SBarry Smith if (opt) { 2879a53571cSHong Zhang ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg); 288*68bece0bSHong Zhang //if (flg) { /* ts_max_steps determines memory allocated */ 289*68bece0bSHong Zhang // ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,NULL);CHKERRQ(ierr); 290*68bece0bSHong Zhang //} 291972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 292bc952696SBarry Smith } else { 293972caf09SHong Zhang ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 294bc952696SBarry Smith } 295bc952696SBarry Smith PetscFunctionReturn(0); 296bc952696SBarry Smith } 297bc952696SBarry Smith 298bc952696SBarry Smith #undef __FUNCT__ 299bc952696SBarry Smith #define __FUNCT__ "TSTrajectorySetFromOptions" 300bc952696SBarry Smith /*@ 301bc952696SBarry Smith TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 302bc952696SBarry Smith 303bc952696SBarry Smith Collective on TSTrajectory 304bc952696SBarry Smith 305bc952696SBarry Smith Input Parameter: 306b1d74d50SHong Zhang . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 307bc952696SBarry Smith 308bc952696SBarry Smith Options Database Keys: 309bc952696SBarry Smith . -tstrajectory_type <type> - TSTRAJECTORYBASIC 310*68bece0bSHong Zhang . -tstrajectory_max_cps <int> 311bc952696SBarry Smith 312bc952696SBarry Smith Level: advanced 313bc952696SBarry Smith 31462b521acSHong Zhang Notes: This is not normally called directly by users 315bc952696SBarry Smith 31662b521acSHong Zhang .keywords: TS, timestep, set, options, database, trajectory 317bc952696SBarry Smith 318bc952696SBarry Smith .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory() 319bc952696SBarry Smith @*/ 320972caf09SHong Zhang PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 321bc952696SBarry Smith { 322bc952696SBarry Smith PetscErrorCode ierr; 323bc952696SBarry Smith 324bc952696SBarry Smith PetscFunctionBegin; 325b1d74d50SHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 326972caf09SHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 327b1d74d50SHong Zhang ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 328972caf09SHong Zhang ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 32962b521acSHong Zhang /* Handle specific TS options */ 33062b521acSHong Zhang if (tj->ops->setfromoptions) { 33162b521acSHong Zhang ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 33262b521acSHong Zhang } 333bc952696SBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 334bc952696SBarry Smith PetscFunctionReturn(0); 335bc952696SBarry Smith } 336*68bece0bSHong Zhang 337*68bece0bSHong Zhang #undef __FUNCT__ 338*68bece0bSHong Zhang #define __FUNCT__ "TSTrajectorySetUp" 339*68bece0bSHong Zhang /*@ 340*68bece0bSHong Zhang TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 341*68bece0bSHong Zhang of a TS trajectory. 342*68bece0bSHong Zhang 343*68bece0bSHong Zhang Collective on TS 344*68bece0bSHong Zhang 345*68bece0bSHong Zhang Input Parameter: 346*68bece0bSHong Zhang . ts - the TS context obtained from TSCreate() 347*68bece0bSHong Zhang . tj - the TS trajectory context 348*68bece0bSHong Zhang 349*68bece0bSHong Zhang Level: advanced 350*68bece0bSHong Zhang 351*68bece0bSHong Zhang .keywords: TS, setup, checkpoint 352*68bece0bSHong Zhang 353*68bece0bSHong Zhang .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 354*68bece0bSHong Zhang @*/ 355*68bece0bSHong Zhang PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 356*68bece0bSHong Zhang { 357*68bece0bSHong Zhang PetscErrorCode ierr; 358*68bece0bSHong Zhang 359*68bece0bSHong Zhang PetscFunctionBegin; 360*68bece0bSHong Zhang if (!tj) PetscFunctionReturn(0); 361*68bece0bSHong Zhang PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 362*68bece0bSHong Zhang PetscValidHeaderSpecific(ts,TS_CLASSID,2); 363*68bece0bSHong Zhang if (tj->setupcalled) PetscFunctionReturn(0); 364*68bece0bSHong Zhang 365*68bece0bSHong Zhang if (!((PetscObject)tj)->type_name) { 366*68bece0bSHong Zhang ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 367*68bece0bSHong Zhang } 368*68bece0bSHong Zhang if (tj->ops->setup) { 369*68bece0bSHong Zhang ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 370*68bece0bSHong Zhang } 371*68bece0bSHong Zhang 372*68bece0bSHong Zhang tj->setupcalled = PETSC_TRUE; 373*68bece0bSHong Zhang PetscFunctionReturn(0); 374*68bece0bSHong Zhang } 375