1 2 #include <petsc/private/tsimpl.h> /*I "petscts.h" I*/ 3 4 PetscFunctionList TSTrajectoryList = NULL; 5 PetscBool TSTrajectoryRegisterAllCalled = PETSC_FALSE; 6 PetscClassId TSTRAJECTORY_CLASSID; 7 PetscLogEvent TSTrajectory_Set, TSTrajectory_Get; 8 9 /*@C 10 TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 11 12 Not Collective 13 14 Input Parameters: 15 + name - the name of a new user-defined creation routine 16 - create_func - the creation routine itself 17 18 Notes: 19 TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 20 21 Level: developer 22 23 .keywords: TS, trajectory, timestep, register 24 25 .seealso: TSTrajectoryRegisterAll() 26 @*/ 27 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 28 { 29 PetscErrorCode ierr; 30 31 PetscFunctionBegin; 32 ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 33 PetscFunctionReturn(0); 34 } 35 36 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 37 { 38 PetscErrorCode ierr; 39 40 PetscFunctionBegin; 41 if (!tj) PetscFunctionReturn(0); 42 ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 43 ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 44 ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 45 PetscFunctionReturn(0); 46 } 47 48 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 49 { 50 PetscErrorCode ierr; 51 52 PetscFunctionBegin; 53 if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 54 ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 55 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 56 ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 57 PetscFunctionReturn(0); 58 } 59 60 /*@C 61 TSTrajectoryView - Prints information about the trajectory object 62 63 Collective on TSTrajectory 64 65 Input Parameters: 66 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 67 - viewer - visualization context 68 69 Options Database Key: 70 . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 71 72 Notes: 73 The available visualization contexts include 74 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 75 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 76 output where only the first processor opens 77 the file. All other processors send their 78 data to the first processor to print. 79 80 The user can open an alternative visualization context with 81 PetscViewerASCIIOpen() - output to a specified file. 82 83 Level: developer 84 85 .keywords: TS, trajectory, timestep, view 86 87 .seealso: PetscViewerASCIIOpen() 88 @*/ 89 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 90 { 91 PetscErrorCode ierr; 92 PetscBool iascii; 93 94 PetscFunctionBegin; 95 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 96 if (!viewer) { 97 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 98 } 99 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 100 PetscCheckSameComm(tj,1,viewer,2); 101 102 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 103 if (iascii) { 104 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 105 ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 106 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 107 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 108 if (tj->ops->view) { 109 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 110 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 111 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 112 } 113 } 114 PetscFunctionReturn(0); 115 } 116 117 /*@C 118 TSTrajectorySetVariableNames - Sets the name of each component in the solution vector so that it may be saved with the trajectory 119 120 Collective on TSTrajectory 121 122 Input Parameters: 123 + tr - the trajectory context 124 - names - the names of the components, final string must be NULL 125 126 Level: intermediate 127 128 Note: Fortran interface is not possible because of the string array argument 129 130 .keywords: TS, TSTrajectory, vector, monitor, view 131 132 .seealso: TSTrajectory, TSGetTrajectory() 133 @*/ 134 PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 135 { 136 PetscErrorCode ierr; 137 138 PetscFunctionBegin; 139 ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 140 ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 141 PetscFunctionReturn(0); 142 } 143 144 /*@C 145 TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 146 147 Collective on TSLGCtx 148 149 Input Parameters: 150 + tj - the TSTrajectory context 151 . transform - the transform function 152 . destroy - function to destroy the optional context 153 - ctx - optional context used by transform function 154 155 Level: intermediate 156 157 .keywords: TSTrajectory, vector, monitor, view 158 159 .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 160 @*/ 161 PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 162 { 163 PetscFunctionBegin; 164 tj->transform = transform; 165 tj->transformdestroy = destroy; 166 tj->transformctx = tctx; 167 PetscFunctionReturn(0); 168 } 169 170 171 /*@ 172 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 173 174 Collective on MPI_Comm 175 176 Input Parameter: 177 . comm - the communicator 178 179 Output Parameter: 180 . tj - the trajectory object 181 182 Level: developer 183 184 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 185 186 .keywords: TS, trajectory, create 187 188 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 189 @*/ 190 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 191 { 192 TSTrajectory t; 193 PetscErrorCode ierr; 194 195 PetscFunctionBegin; 196 PetscValidPointer(tj,2); 197 *tj = NULL; 198 ierr = TSInitializePackage();CHKERRQ(ierr); 199 200 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 201 t->setupcalled = PETSC_FALSE; 202 t->keepfiles = PETSC_TRUE; 203 *tj = t; 204 PetscFunctionReturn(0); 205 } 206 207 /*@C 208 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 209 210 Collective on TS 211 212 Input Parameters: 213 + tj - the TSTrajectory context 214 . ts - the TS context 215 - type - a known method 216 217 Options Database Command: 218 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 219 220 Level: developer 221 222 .keywords: TS, trajectory, timestep, set, type 223 224 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 225 226 @*/ 227 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 228 { 229 PetscErrorCode (*r)(TSTrajectory,TS); 230 PetscBool match; 231 PetscErrorCode ierr; 232 233 PetscFunctionBegin; 234 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 235 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 236 if (match) PetscFunctionReturn(0); 237 238 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 239 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 240 if (tj->ops->destroy) { 241 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 242 243 tj->ops->destroy = NULL; 244 } 245 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 246 247 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 248 ierr = (*r)(tj,ts);CHKERRQ(ierr); 249 PetscFunctionReturn(0); 250 } 251 252 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 253 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 254 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 255 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 256 257 /*@C 258 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 259 260 Not Collective 261 262 Level: developer 263 264 .keywords: TS, trajectory, register, all 265 266 .seealso: TSTrajectoryRegister() 267 @*/ 268 PetscErrorCode TSTrajectoryRegisterAll(void) 269 { 270 PetscErrorCode ierr; 271 272 PetscFunctionBegin; 273 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 274 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 275 276 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 277 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 278 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 279 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 280 PetscFunctionReturn(0); 281 } 282 283 /*@ 284 TSTrajectoryDestroy - Destroys a trajectory context 285 286 Collective on TSTrajectory 287 288 Input Parameter: 289 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 290 291 Level: developer 292 293 .keywords: TS, trajectory, timestep, destroy 294 295 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 296 @*/ 297 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 298 { 299 PetscErrorCode ierr; 300 301 PetscFunctionBegin; 302 if (!*tj) PetscFunctionReturn(0); 303 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 304 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 305 306 if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 307 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 308 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 309 ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 310 ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 311 ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 312 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 313 PetscFunctionReturn(0); 314 } 315 316 /* 317 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 318 319 Collective on TSTrajectory 320 321 Input Parameter: 322 + tj - the TSTrajectory context 323 - ts - the TS context 324 325 Options Database Keys: 326 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 327 328 Level: developer 329 330 .keywords: TS, trajectory, set, options, type 331 332 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 333 */ 334 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 335 { 336 PetscBool opt; 337 const char *defaultType; 338 char typeName[256]; 339 PetscBool flg; 340 PetscErrorCode ierr; 341 342 PetscFunctionBegin; 343 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 344 else defaultType = TSTRAJECTORYBASIC; 345 346 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 347 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 348 if (opt) { 349 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 350 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 351 } else { 352 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 353 } 354 PetscFunctionReturn(0); 355 } 356 357 /*@ 358 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 359 360 Collective on TSTrajectory 361 362 Input Arguments: 363 + tj - the TSTrajectory context 364 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 365 366 Options Database Keys: 367 . -ts_trajectory_monitor - print TSTrajectory information 368 369 Level: developer 370 371 .keywords: TS, trajectory, set, monitor 372 373 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 374 @*/ 375 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 376 { 377 PetscErrorCode ierr; 378 379 PetscFunctionBegin; 380 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 381 PetscValidLogicalCollectiveBool(tj,flg,2); 382 if (flg) { 383 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 384 } else { 385 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 386 } 387 PetscFunctionReturn(0); 388 } 389 390 /*@ 391 TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 392 393 Collective on TSTrajectory 394 395 Input Arguments: 396 + tj - the TSTrajectory context 397 - flg - PETSC_TRUE to save, PETSC_FALSE to disable 398 399 Options Database Keys: 400 . -ts_trajectory_keep_files - have it keep the files 401 402 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. 403 404 Level: advanced 405 406 .keywords: TS, trajectory, set, monitor 407 408 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 409 @*/ 410 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 411 { 412 PetscFunctionBegin; 413 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 414 PetscValidLogicalCollectiveBool(tj,flg,2); 415 tj->keepfiles = flg; 416 PetscFunctionReturn(0); 417 } 418 419 /*@C 420 TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 421 422 Collective on TSTrajectory 423 424 Input Arguments: 425 + tj - the TSTrajectory context 426 - dirname - the directory name 427 428 Options Database Keys: 429 . -ts_trajectory_dirname - set the directory name 430 431 Level: developer 432 433 .keywords: TS, trajectory, set 434 435 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 436 @*/ 437 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 438 { 439 PetscErrorCode ierr; 440 PetscFunctionBegin; 441 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 442 ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 443 PetscFunctionReturn(0); 444 } 445 446 /*@C 447 TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 448 449 Collective on TSTrajectory 450 451 Input Arguments: 452 + tj - the TSTrajectory context 453 - filetemplate - the directory name 454 455 Options Database Keys: 456 . -ts_trajectory_file - set the file name template 457 458 Level: developer 459 460 .keywords: TS, trajectory, set 461 462 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 463 @*/ 464 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 465 { 466 PetscErrorCode ierr; 467 PetscFunctionBegin; 468 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 469 ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 470 PetscFunctionReturn(0); 471 } 472 473 /*@ 474 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 475 476 Collective on TSTrajectory 477 478 Input Parameter: 479 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 480 - ts - the TS context 481 482 Options Database Keys: 483 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 484 . -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 485 - -ts_trajectory_monitor - print TSTrajectory information 486 487 Level: developer 488 489 Notes: This is not normally called directly by users 490 491 .keywords: TS, trajectory, timestep, set, options, database 492 493 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 494 @*/ 495 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 496 { 497 PetscBool set,flg; 498 char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 499 PetscErrorCode ierr; 500 501 PetscFunctionBegin; 502 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 503 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 504 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 505 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 506 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 507 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 508 509 ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 510 if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 511 512 ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 513 if (!set) { 514 ierr = PetscStrcpy(dirname,"SA-data");CHKERRQ(ierr); 515 } 516 ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 517 518 ierr = PetscOptionsString("-ts_trajectory_file","Template for TSTrajectory file name, use filename-%06D.bin","TSTrajectorySetFiletemplate",0,filetemplate,PETSC_MAX_PATH_LEN,&set);CHKERRQ(ierr); 519 if (set) { 520 size_t len; 521 const char *ptr,*ptr2; 522 if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file requires a file name template, e.g. filename-%%06D.bin"); 523 /* Do some cursory validation of the input. */ 524 ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 525 if (!ptr) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_USER,"-ts_trajectory_file requires a file name template, e.g. filename-%%06D.bin"); 526 for (ptr++; ptr && *ptr; ptr++) { 527 ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 528 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"); 529 if (ptr2) break; 530 } 531 ierr = PetscStrcat(dirname,"/");CHKERRQ(ierr); 532 ierr = PetscStrlen(filetemplate,&len);CHKERRQ(ierr); 533 ierr = PetscStrncat(dirname,filetemplate,PETSC_MAX_PATH_LEN-len-1);CHKERRQ(ierr); 534 } else { 535 ierr = PetscStrcat(dirname,"/SA-%06D.bin");CHKERRQ(ierr); 536 } 537 ierr = TSTrajectorySetFiletemplate(tj,dirname);CHKERRQ(ierr); 538 539 /* Handle specific TSTrajectory options */ 540 if (tj->ops->setfromoptions) { 541 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 542 } 543 ierr = PetscOptionsEnd();CHKERRQ(ierr); 544 PetscFunctionReturn(0); 545 } 546 547 /*@ 548 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 549 of a TS trajectory. 550 551 Collective on TS 552 553 Input Parameter: 554 + ts - the TS context obtained from TSCreate() 555 - tj - the TS trajectory context 556 557 Level: developer 558 559 .keywords: TS, trajectory, setup 560 561 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 562 @*/ 563 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 564 { 565 PetscErrorCode ierr; 566 567 PetscFunctionBegin; 568 if (!tj) PetscFunctionReturn(0); 569 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 570 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 571 if (tj->setupcalled) PetscFunctionReturn(0); 572 573 if (!((PetscObject)tj)->type_name) { 574 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 575 } 576 if (tj->ops->setup) { 577 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 578 } 579 580 tj->setupcalled = PETSC_TRUE; 581 582 /* Set the counters to zero */ 583 tj->recomps = 0; 584 tj->diskreads = 0; 585 tj->diskwrites = 0; 586 PetscFunctionReturn(0); 587 } 588