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