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 .keywords: TS, TSTrajectory, vector, monitor, view 129 130 .seealso: TSTrajectory, TSGetTrajectory() 131 @*/ 132 PetscErrorCode TSTrajectorySetVariableNames(TSTrajectory ctx,const char * const *names) 133 { 134 PetscErrorCode ierr; 135 136 PetscFunctionBegin; 137 ierr = PetscStrArrayDestroy(&ctx->names);CHKERRQ(ierr); 138 ierr = PetscStrArrayallocpy(names,&ctx->names);CHKERRQ(ierr); 139 PetscFunctionReturn(0); 140 } 141 142 /*@C 143 TSTrjactorySetTransform - Solution vector will be transformed by provided function before being saved to disk 144 145 Collective on TSLGCtx 146 147 Input Parameters: 148 + tj - the TSTrajectory context 149 . transform - the transform function 150 . destroy - function to destroy the optional context 151 - ctx - optional context used by transform function 152 153 Level: intermediate 154 155 .keywords: TSTrajectory, vector, monitor, view 156 157 .seealso: TSTrajectorySetVariableNames(), TSTrajectory, TSMonitorLGSetTransform() 158 @*/ 159 PetscErrorCode TSTrajectorySetTransform(TSTrajectory tj,PetscErrorCode (*transform)(void*,Vec,Vec*),PetscErrorCode (*destroy)(void*),void *tctx) 160 { 161 PetscFunctionBegin; 162 tj->transform = transform; 163 tj->transformdestroy = destroy; 164 tj->transformctx = tctx; 165 PetscFunctionReturn(0); 166 } 167 168 169 /*@C 170 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 171 172 Collective on MPI_Comm 173 174 Input Parameter: 175 . comm - the communicator 176 177 Output Parameter: 178 . tj - the trajectory object 179 180 Level: developer 181 182 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 183 184 .keywords: TS, trajectory, create 185 186 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType(), TSTrajectorySetVariableNames(), TSGetTrajectory(), TSTrajectorySetKeepFiles() 187 @*/ 188 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 189 { 190 TSTrajectory t; 191 PetscErrorCode ierr; 192 193 PetscFunctionBegin; 194 PetscValidPointer(tj,2); 195 *tj = NULL; 196 ierr = TSInitializePackage();CHKERRQ(ierr); 197 198 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 199 t->setupcalled = PETSC_FALSE; 200 t->keepfiles = PETSC_TRUE; 201 *tj = t; 202 PetscFunctionReturn(0); 203 } 204 205 /*@C 206 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 207 208 Collective on TS 209 210 Input Parameters: 211 + tj - the TSTrajectory context 212 . ts - the TS context 213 - type - a known method 214 215 Options Database Command: 216 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 217 218 Level: developer 219 220 .keywords: TS, trajectory, timestep, set, type 221 222 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 223 224 @*/ 225 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 226 { 227 PetscErrorCode (*r)(TSTrajectory,TS); 228 PetscBool match; 229 PetscErrorCode ierr; 230 231 PetscFunctionBegin; 232 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 233 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 234 if (match) PetscFunctionReturn(0); 235 236 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 237 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 238 if (tj->ops->destroy) { 239 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 240 241 tj->ops->destroy = NULL; 242 } 243 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 244 245 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 246 ierr = (*r)(tj,ts);CHKERRQ(ierr); 247 PetscFunctionReturn(0); 248 } 249 250 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 251 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 252 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 253 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 254 255 /*@C 256 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 257 258 Not Collective 259 260 Level: developer 261 262 .keywords: TS, trajectory, register, all 263 264 .seealso: TSTrajectoryRegister() 265 @*/ 266 PetscErrorCode TSTrajectoryRegisterAll(void) 267 { 268 PetscErrorCode ierr; 269 270 PetscFunctionBegin; 271 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 272 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 273 274 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 275 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 276 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 277 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 278 PetscFunctionReturn(0); 279 } 280 281 /*@ 282 TSTrajectoryDestroy - Destroys a trajectory context 283 284 Collective on TSTrajectory 285 286 Input Parameter: 287 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 288 289 Level: developer 290 291 .keywords: TS, trajectory, timestep, destroy 292 293 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 294 @*/ 295 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 296 { 297 PetscErrorCode ierr; 298 299 PetscFunctionBegin; 300 if (!*tj) PetscFunctionReturn(0); 301 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 302 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 303 304 if ((*tj)->transformdestroy) {ierr = (*(*tj)->transformdestroy)((*tj)->transformctx);CHKERRQ(ierr);} 305 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 306 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 307 ierr = PetscStrArrayDestroy(&(*tj)->names);CHKERRQ(ierr); 308 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 309 PetscFunctionReturn(0); 310 } 311 312 /* 313 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 314 315 Collective on TSTrajectory 316 317 Input Parameter: 318 + tj - the TSTrajectory context 319 - ts - the TS context 320 321 Options Database Keys: 322 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 323 324 Level: developer 325 326 .keywords: TS, trajectory, set, options, type 327 328 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 329 */ 330 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 331 { 332 PetscBool opt; 333 const char *defaultType; 334 char typeName[256]; 335 PetscBool flg; 336 PetscErrorCode ierr; 337 338 PetscFunctionBegin; 339 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 340 else defaultType = TSTRAJECTORYBASIC; 341 342 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 343 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 344 if (opt) { 345 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 346 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 347 } else { 348 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 349 } 350 PetscFunctionReturn(0); 351 } 352 353 /*@ 354 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 355 356 Collective on TSTrajectory 357 358 Input Arguments: 359 + tj - the TSTrajectory context 360 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 361 362 Options Database Keys: 363 . -ts_trajectory_monitor - print TSTrajectory information 364 365 Level: developer 366 367 .keywords: TS, trajectory, set, monitor 368 369 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 370 @*/ 371 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 372 { 373 PetscErrorCode ierr; 374 375 PetscFunctionBegin; 376 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 377 PetscValidLogicalCollectiveBool(tj,flg,2); 378 if (flg) { 379 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 380 } else { 381 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 382 } 383 PetscFunctionReturn(0); 384 } 385 386 /*@ 387 TSTrajectorySetKeepFiles - Keep the files generated by the TSTrajectory 388 389 Collective on TSTrajectory 390 391 Input Arguments: 392 + tj - the TSTrajectory context 393 - flg - PETSC_TRUE to save, PETSC_FALSE to disable 394 395 Options Database Keys: 396 . -ts_trajectory_keep_files - have it keep the files 397 398 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. 399 400 Level: advanced 401 402 .keywords: TS, trajectory, set, monitor 403 404 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp(), TSTrajectorySetMonitor() 405 @*/ 406 PetscErrorCode TSTrajectorySetKeepFiles(TSTrajectory tj,PetscBool flg) 407 { 408 PetscFunctionBegin; 409 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 410 PetscValidLogicalCollectiveBool(tj,flg,2); 411 tj->keepfiles = flg; 412 PetscFunctionReturn(0); 413 } 414 415 /*@ 416 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 417 418 Collective on TSTrajectory 419 420 Input Parameter: 421 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 422 - ts - the TS context 423 424 Options Database Keys: 425 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 426 . -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 427 - -ts_trajectory_monitor - print TSTrajectory information 428 429 Level: developer 430 431 Notes: This is not normally called directly by users 432 433 .keywords: TS, trajectory, timestep, set, options, database 434 435 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 436 @*/ 437 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 438 { 439 PetscErrorCode ierr; 440 PetscBool set,flg; 441 442 PetscFunctionBegin; 443 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 444 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 445 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 446 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 447 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 448 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 449 ierr = PetscOptionsBool("-ts_trajectory_keep_files","Keep any trajectory files generated during the run","TSTrajectorySetKeepFiles",tj->keepfiles,&flg,&set);CHKERRQ(ierr); 450 if (set) {ierr = TSTrajectorySetKeepFiles(tj,flg);CHKERRQ(ierr);} 451 /* Handle specific TS options */ 452 if (tj->ops->setfromoptions) { 453 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 454 } 455 ierr = PetscOptionsEnd();CHKERRQ(ierr); 456 PetscFunctionReturn(0); 457 } 458 459 /*@ 460 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 461 of a TS trajectory. 462 463 Collective on TS 464 465 Input Parameter: 466 + ts - the TS context obtained from TSCreate() 467 - tj - the TS trajectory context 468 469 Level: developer 470 471 .keywords: TS, trajectory, setup 472 473 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 474 @*/ 475 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 476 { 477 PetscErrorCode ierr; 478 479 PetscFunctionBegin; 480 if (!tj) PetscFunctionReturn(0); 481 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 482 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 483 if (tj->setupcalled) PetscFunctionReturn(0); 484 485 if (!((PetscObject)tj)->type_name) { 486 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 487 } 488 if (tj->ops->setup) { 489 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 490 } 491 492 tj->setupcalled = PETSC_TRUE; 493 494 /* Set the counters to zero */ 495 tj->recomps = 0; 496 tj->diskreads = 0; 497 tj->diskwrites = 0; 498 PetscFunctionReturn(0); 499 } 500