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 ierr = TSTrajectorySetDirname(t,"SA-data");CHKERRQ(ierr); 205 ierr = TSTrajectorySetFiletemplate(t,"SA-%06D.bin");CHKERRQ(ierr); 206 PetscFunctionReturn(0); 207 } 208 209 /*@C 210 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 211 212 Collective on TS 213 214 Input Parameters: 215 + tj - the TSTrajectory context 216 . ts - the TS context 217 - type - a known method 218 219 Options Database Command: 220 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 221 222 Level: developer 223 224 .keywords: TS, trajectory, timestep, set, type 225 226 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 227 228 @*/ 229 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 230 { 231 PetscErrorCode (*r)(TSTrajectory,TS); 232 PetscBool match; 233 PetscErrorCode ierr; 234 235 PetscFunctionBegin; 236 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 237 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 238 if (match) PetscFunctionReturn(0); 239 240 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 241 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 242 if (tj->ops->destroy) { 243 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 244 245 tj->ops->destroy = NULL; 246 } 247 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 248 249 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 250 ierr = (*r)(tj,ts);CHKERRQ(ierr); 251 PetscFunctionReturn(0); 252 } 253 254 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 255 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 256 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 257 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 258 259 /*@C 260 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 261 262 Not Collective 263 264 Level: developer 265 266 .keywords: TS, trajectory, register, all 267 268 .seealso: TSTrajectoryRegister() 269 @*/ 270 PetscErrorCode TSTrajectoryRegisterAll(void) 271 { 272 PetscErrorCode ierr; 273 274 PetscFunctionBegin; 275 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 276 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 277 278 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 279 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 280 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 281 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 282 PetscFunctionReturn(0); 283 } 284 285 /*@ 286 TSTrajectoryDestroy - Destroys a trajectory context 287 288 Collective on TSTrajectory 289 290 Input Parameter: 291 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 292 293 Level: developer 294 295 .keywords: TS, trajectory, timestep, destroy 296 297 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 298 @*/ 299 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 300 { 301 PetscErrorCode ierr; 302 303 PetscFunctionBegin; 304 if (!*tj) PetscFunctionReturn(0); 305 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 306 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 307 308 if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 309 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 310 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 311 ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 312 ierr = PetscFree((*tj)->dirname);CHKERRQ(ierr); 313 ierr = PetscFree((*tj)->filetemplate);CHKERRQ(ierr); 314 ierr = PetscFree((*tj)->dirfiletemplate);CHKERRQ(ierr); 315 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 316 PetscFunctionReturn(0); 317 } 318 319 /* 320 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 321 322 Collective on TSTrajectory 323 324 Input Parameter: 325 + tj - the TSTrajectory context 326 - ts - the TS context 327 328 Options Database Keys: 329 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 330 331 Level: developer 332 333 .keywords: TS, trajectory, set, options, type 334 335 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 336 */ 337 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 338 { 339 PetscBool opt; 340 const char *defaultType; 341 char typeName[256]; 342 PetscBool flg; 343 PetscErrorCode ierr; 344 345 PetscFunctionBegin; 346 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 347 else defaultType = TSTRAJECTORYBASIC; 348 349 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 350 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method","TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 351 if (opt) { 352 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 353 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 354 } else { 355 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 356 } 357 PetscFunctionReturn(0); 358 } 359 360 /*@ 361 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 362 363 Collective on TSTrajectory 364 365 Input Arguments: 366 + tj - the TSTrajectory context 367 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 368 369 Options Database Keys: 370 . -ts_trajectory_monitor - print TSTrajectory information 371 372 Level: developer 373 374 .keywords: TS, trajectory, set, monitor 375 376 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 377 @*/ 378 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 379 { 380 PetscErrorCode ierr; 381 382 PetscFunctionBegin; 383 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 384 PetscValidLogicalCollectiveBool(tj,flg,2); 385 if (flg) { 386 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 387 } else { 388 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 389 } 390 PetscFunctionReturn(0); 391 } 392 393 /*@ 394 TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 395 396 Collective on TSTrajectory 397 398 Input Arguments: 399 + tj - the TSTrajectory context 400 - flg - PETSC_TRUE to save, PETSC_FALSE to disable 401 402 Options Database Keys: 403 . -ts_trajectory_keep_files - have it keep the files 404 405 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. 406 407 Level: advanced 408 409 .keywords: TS, trajectory, set, monitor 410 411 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 412 @*/ 413 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 414 { 415 PetscFunctionBegin; 416 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 417 PetscValidLogicalCollectiveBool(tj,flg,2); 418 tj->keepfiles = flg; 419 PetscFunctionReturn(0); 420 } 421 422 /*@C 423 TSTrajectorySetDirname - Specify the name of the directory where disk checkpoints are stored. 424 425 Collective on TSTrajectory 426 427 Input Arguments: 428 + tj - the TSTrajectory context 429 - dirname - the directory name 430 431 Options Database Keys: 432 . -ts_trajectory_dirname - set the directory name 433 434 Notes: The final location of the files is determined by dirname/filetemplate where filetemplate was provided by TSTrajectorySetFiletemplate() 435 436 Level: developer 437 438 .keywords: TS, trajectory, set 439 440 .seealso: TSTrajectorySetFiletemplate(),TSTrajectorySetUp() 441 @*/ 442 PetscErrorCode TSTrajectorySetDirname(TSTrajectory tj,const char dirname[]) 443 { 444 PetscErrorCode ierr; 445 PetscFunctionBegin; 446 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 447 if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set directoryname after it TSTrajectory has been setup"); 448 ierr = PetscFree(tj->dirname);CHKERRQ(ierr); 449 ierr = PetscStrallocpy(dirname,&tj->dirname);CHKERRQ(ierr); 450 PetscFunctionReturn(0); 451 } 452 453 /*@C 454 TSTrajectorySetFiletemplate - Specify the name template for the files storing checkpoints. 455 456 Collective on TSTrajectory 457 458 Input Arguments: 459 + tj - the TSTrajectory context 460 - filetemplate - the template 461 462 Options Database Keys: 463 . -ts_trajectory_file_template - set the file name template 464 465 Notes: The name template should be of the form, for example filename-%06D.bin It should not begin with a leading / 466 467 The final location of the files is determined by dirname/filetemplate where dirname was provided by TSTrajectorySetDirname(). The %06D is replaced by the 468 timestep counter 469 470 Level: developer 471 472 .keywords: TS, trajectory, set 473 474 .seealso: TSTrajectorySetDirname(),TSTrajectorySetUp() 475 @*/ 476 PetscErrorCode TSTrajectorySetFiletemplate(TSTrajectory tj,const char filetemplate[]) 477 { 478 PetscErrorCode ierr; 479 const char *ptr,*ptr2; 480 481 PetscFunctionBegin; 482 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 483 if (tj->dirfiletemplate) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_ARG_WRONGSTATE,"Cannot set filetemplate after TSTrajectory has been setup"); 484 485 if (!filetemplate[0]) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 486 /* Do some cursory validation of the input. */ 487 ierr = PetscStrstr(filetemplate,"%",(char**)&ptr);CHKERRQ(ierr); 488 if (!ptr) SETERRQ(PetscObjectComm((PetscObject)tj),PETSC_ERR_USER,"-ts_trajectory_file_template requires a file name template, e.g. filename-%%06D.bin"); 489 for (ptr++; ptr && *ptr; ptr++) { 490 ierr = PetscStrchr("DdiouxX",*ptr,(char**)&ptr2);CHKERRQ(ierr); 491 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"); 492 if (ptr2) break; 493 } 494 ierr = PetscFree(tj->filetemplate);CHKERRQ(ierr); 495 ierr = PetscStrallocpy(filetemplate,&tj->filetemplate);CHKERRQ(ierr); 496 PetscFunctionReturn(0); 497 } 498 499 /*@ 500 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 501 502 Collective on TSTrajectory 503 504 Input Parameter: 505 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 506 - ts - the TS context 507 508 Options Database Keys: 509 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 510 . -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 511 - -ts_trajectory_monitor - print TSTrajectory information 512 513 Level: developer 514 515 Notes: This is not normally called directly by users 516 517 .keywords: TS, trajectory, timestep, set, options, database 518 519 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 520 @*/ 521 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 522 { 523 PetscBool set,flg; 524 char dirname[PETSC_MAX_PATH_LEN],filetemplate[PETSC_MAX_PATH_LEN]; 525 PetscErrorCode ierr; 526 527 PetscFunctionBegin; 528 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 529 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 530 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 531 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 532 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 533 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 534 535 ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 536 if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 537 538 ierr = PetscOptionsString("-ts_trajectory_dirname","Directory name for TSTrajectory file","TSTrajectorySetDirname",0,dirname,PETSC_MAX_PATH_LEN-14,&set);CHKERRQ(ierr); 539 if (set) { 540 ierr = TSTrajectorySetDirname(tj,dirname);CHKERRQ(ierr); 541 } 542 543 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); 544 if (set) { 545 ierr = TSTrajectorySetFiletemplate(tj,filetemplate);CHKERRQ(ierr); 546 } 547 548 /* Handle specific TSTrajectory options */ 549 if (tj->ops->setfromoptions) { 550 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 551 } 552 ierr = PetscOptionsEnd();CHKERRQ(ierr); 553 PetscFunctionReturn(0); 554 } 555 556 /*@ 557 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 558 of a TS trajectory. 559 560 Collective on TS 561 562 Input Parameter: 563 + ts - the TS context obtained from TSCreate() 564 - tj - the TS trajectory context 565 566 Level: developer 567 568 .keywords: TS, trajectory, setup 569 570 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 571 @*/ 572 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 573 { 574 PetscErrorCode ierr; 575 size_t s1,s2; 576 577 PetscFunctionBegin; 578 if (!tj) PetscFunctionReturn(0); 579 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 580 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 581 if (tj->setupcalled) PetscFunctionReturn(0); 582 583 if (!((PetscObject)tj)->type_name) { 584 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 585 } 586 if (tj->ops->setup) { 587 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 588 } 589 590 tj->setupcalled = PETSC_TRUE; 591 592 /* Set the counters to zero */ 593 tj->recomps = 0; 594 tj->diskreads = 0; 595 tj->diskwrites = 0; 596 ierr = PetscStrlen(tj->dirname,&s1);CHKERRQ(ierr); 597 ierr = PetscStrlen(tj->filetemplate,&s2);CHKERRQ(ierr); 598 ierr = PetscMalloc((s1 + s2 + 2)*sizeof(char),&tj->dirfiletemplate);CHKERRQ(ierr); 599 ierr = PetscSNPrintf(tj->dirfiletemplate,s1+s2+1,"%s/%s",tj->dirname,tj->filetemplate);CHKERRQ(ierr); 600 PetscFunctionReturn(0); 601 } 602