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