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