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 #undef __FUNCT__ 10 #define __FUNCT__ "TSTrajectoryRegister" 11 /*@C 12 TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 13 14 Not Collective 15 16 Input Parameters: 17 + name - the name of a new user-defined creation routine 18 - create_func - the creation routine itself 19 20 Notes: 21 TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 22 23 Level: advanced 24 25 .keywords: TS, trajectory, timestep, register 26 27 .seealso: TSTrajectoryRegisterAll() 28 @*/ 29 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 30 { 31 PetscErrorCode ierr; 32 33 PetscFunctionBegin; 34 ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 35 PetscFunctionReturn(0); 36 } 37 38 #undef __FUNCT__ 39 #define __FUNCT__ "TSTrajectorySet" 40 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 41 { 42 PetscErrorCode ierr; 43 44 PetscFunctionBegin; 45 if (!tj) PetscFunctionReturn(0); 46 ierr = PetscLogEventBegin(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 47 ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 48 ierr = PetscLogEventEnd(TSTrajectory_Set,tj,ts,0,0);CHKERRQ(ierr); 49 PetscFunctionReturn(0); 50 } 51 52 #undef __FUNCT__ 53 #define __FUNCT__ "TSTrajectoryGet" 54 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 55 { 56 PetscErrorCode ierr; 57 58 PetscFunctionBegin; 59 if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 60 ierr = PetscLogEventBegin(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 61 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 62 ierr = PetscLogEventEnd(TSTrajectory_Get,tj,ts,0,0);CHKERRQ(ierr); 63 PetscFunctionReturn(0); 64 } 65 66 #undef __FUNCT__ 67 #define __FUNCT__ "TSTrajectoryView" 68 /*@C 69 TSTrajectoryView - Prints information about the trajectory object 70 71 Collective on TSTrajectory 72 73 Input Parameters: 74 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 75 - viewer - visualization context 76 77 Options Database Key: 78 . -ts_trajectory_view - calls TSTrajectoryView() at end of TSAdjointStep() 79 80 Notes: 81 The available visualization contexts include 82 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 83 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 84 output where only the first processor opens 85 the file. All other processors send their 86 data to the first processor to print. 87 88 The user can open an alternative visualization context with 89 PetscViewerASCIIOpen() - output to a specified file. 90 91 Level: beginner 92 93 .keywords: TS, trajectory, timestep, view 94 95 .seealso: PetscViewerASCIIOpen() 96 @*/ 97 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 98 { 99 PetscErrorCode ierr; 100 PetscBool iascii; 101 102 PetscFunctionBegin; 103 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 104 if (!viewer) { 105 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 106 } 107 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 108 PetscCheckSameComm(tj,1,viewer,2); 109 110 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 111 if (iascii) { 112 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 113 ierr = PetscViewerASCIIPrintf(viewer," total number of recomputations for adjoint calculation = %D\n",tj->recomps);CHKERRQ(ierr); 114 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint reads = %D\n",tj->diskreads);CHKERRQ(ierr); 115 ierr = PetscViewerASCIIPrintf(viewer," disk checkpoint writes = %D\n",tj->diskwrites);CHKERRQ(ierr); 116 if (tj->ops->view) { 117 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 118 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 119 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 120 } 121 } 122 PetscFunctionReturn(0); 123 } 124 125 #undef __FUNCT__ 126 #define __FUNCT__ "TSTrajectoryCreate" 127 /*@C 128 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 129 130 Collective on MPI_Comm 131 132 Input Parameter: 133 . comm - the communicator 134 135 Output Parameter: 136 . tj - the trajectory object 137 138 Level: advanced 139 140 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). 141 142 .keywords: TS, trajectory, create 143 144 .seealso: TSTrajectorySetUp(), TSTrajectoryDestroy(), TSTrajectorySetType() 145 @*/ 146 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 147 { 148 TSTrajectory t; 149 PetscErrorCode ierr; 150 151 PetscFunctionBegin; 152 PetscValidPointer(tj,2); 153 *tj = NULL; 154 ierr = TSInitializePackage();CHKERRQ(ierr); 155 156 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 157 t->setupcalled = PETSC_FALSE; 158 *tj = t; 159 PetscFunctionReturn(0); 160 } 161 162 #undef __FUNCT__ 163 #define __FUNCT__ "TSTrajectorySetType" 164 /*@C 165 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 166 167 Collective on TS 168 169 Input Parameters: 170 + tj - the TSTrajectory context 171 . ts - the TS context 172 - type - a known method 173 174 Options Database Command: 175 . -ts_trajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 176 177 Level: intermediate 178 179 .keywords: TS, trajectory, timestep, set, type 180 181 .seealso: TS, TSTrajectoryCreate(), TSTrajectorySetFromOptions(), TSTrajectoryDestroy() 182 183 @*/ 184 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 185 { 186 PetscErrorCode (*r)(TSTrajectory,TS); 187 PetscBool match; 188 PetscErrorCode ierr; 189 190 PetscFunctionBegin; 191 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 192 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 193 if (match) PetscFunctionReturn(0); 194 195 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 196 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 197 if (tj->ops->destroy) { 198 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 199 200 tj->ops->destroy = NULL; 201 } 202 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 203 204 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 205 ierr = (*r)(tj,ts);CHKERRQ(ierr); 206 PetscFunctionReturn(0); 207 } 208 209 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 210 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 211 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 212 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Visualization(TSTrajectory,TS); 213 214 #undef __FUNCT__ 215 #define __FUNCT__ "TSTrajectoryRegisterAll" 216 /*@C 217 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 218 219 Not Collective 220 221 Level: advanced 222 223 .keywords: TS, trajectory, register, all 224 225 .seealso: TSTrajectoryRegister() 226 @*/ 227 PetscErrorCode TSTrajectoryRegisterAll(void) 228 { 229 PetscErrorCode ierr; 230 231 PetscFunctionBegin; 232 if (TSTrajectoryRegisterAllCalled) PetscFunctionReturn(0); 233 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 234 235 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 236 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 237 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 238 ierr = TSTrajectoryRegister(TSTRAJECTORYVISUALIZATION,TSTrajectoryCreate_Visualization);CHKERRQ(ierr); 239 PetscFunctionReturn(0); 240 } 241 242 #undef __FUNCT__ 243 #define __FUNCT__ "TSTrajectoryDestroy" 244 /*@ 245 TSTrajectoryDestroy - Destroys a trajectory context 246 247 Collective on TSTrajectory 248 249 Input Parameter: 250 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 251 252 Level: advanced 253 254 .keywords: TS, trajectory, timestep, destroy 255 256 .seealso: TSTrajectoryCreate(), TSTrajectorySetUp() 257 @*/ 258 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 259 { 260 PetscErrorCode ierr; 261 262 PetscFunctionBegin; 263 if (!*tj) PetscFunctionReturn(0); 264 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 265 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 266 267 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 268 ierr = PetscViewerDestroy(&(*tj)->monitor);CHKERRQ(ierr); 269 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 270 PetscFunctionReturn(0); 271 } 272 273 #undef __FUNCT__ 274 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private" 275 /* 276 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 277 278 Collective on TSTrajectory 279 280 Input Parameter: 281 + tj - the TSTrajectory context 282 - ts - the TS context 283 284 Options Database Keys: 285 . -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 286 287 Level: intermediate 288 289 .keywords: TS, trajectory, set, options, type 290 291 .seealso: TSTrajectorySetFromOptions(), TSTrajectorySetType() 292 */ 293 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptionItems *PetscOptionsObject,TSTrajectory tj,TS ts) 294 { 295 PetscBool opt; 296 const char *defaultType; 297 char typeName[256]; 298 PetscBool flg; 299 PetscErrorCode ierr; 300 301 PetscFunctionBegin; 302 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 303 else defaultType = TSTRAJECTORYBASIC; 304 305 ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr); 306 ierr = PetscOptionsFList("-ts_trajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 307 if (opt) { 308 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg);CHKERRQ(ierr); 309 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 310 } else { 311 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 312 } 313 PetscFunctionReturn(0); 314 } 315 316 #undef __FUNCT__ 317 #define __FUNCT__ "TSTrajectorySetMonitor" 318 /*@ 319 TSTrajectorySetMonitor - Monitor the schedules generated by the checkpointing controller 320 321 Collective on TSTrajectory 322 323 Input Arguments: 324 + tj - the TSTrajectory context 325 - flg - PETSC_TRUE to active a monitor, PETSC_FALSE to disable 326 327 Options Database Keys: 328 . -ts_trajectory_monitor - print TSTrajectory information 329 330 Level: intermediate 331 332 .keywords: TS, trajectory, set, monitor 333 334 .seealso: TSTrajectoryCreate(), TSTrajectoryDestroy(), TSTrajectorySetUp() 335 @*/ 336 PetscErrorCode TSTrajectorySetMonitor(TSTrajectory tj,PetscBool flg) 337 { 338 PetscErrorCode ierr; 339 340 PetscFunctionBegin; 341 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 342 PetscValidLogicalCollectiveBool(tj,flg,2); 343 if (flg) { 344 if (!tj->monitor) {ierr = PetscViewerASCIIOpen(PetscObjectComm((PetscObject)tj),"stdout",&tj->monitor);CHKERRQ(ierr);} 345 } else { 346 ierr = PetscViewerDestroy(&tj->monitor);CHKERRQ(ierr); 347 } 348 PetscFunctionReturn(0); 349 } 350 351 #undef __FUNCT__ 352 #define __FUNCT__ "TSTrajectorySetFromOptions" 353 /*@ 354 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 355 356 Collective on TSTrajectory 357 358 Input Parameter: 359 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 360 - ts - the TS context 361 362 Options Database Keys: 363 + -ts_trajectory_type <type> - TSTRAJECTORYBASIC, TSTRAJECTORYMEMORY, TSTRAJECTORYSINGLEFILE, TSTRAJECTORYVISUALIZATION 364 - -ts_trajectory_monitor - print TSTrajectory information 365 366 Level: advanced 367 368 Notes: This is not normally called directly by users 369 370 .keywords: TS, trajectory, timestep, set, options, database 371 372 .seealso: TSSetSaveTrajectory(), TSTrajectorySetUp() 373 @*/ 374 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 375 { 376 PetscErrorCode ierr; 377 PetscBool set,flg; 378 379 PetscFunctionBegin; 380 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 381 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 382 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 383 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 384 ierr = PetscOptionsBool("-ts_trajectory_monitor","Print checkpointing schedules","TSTrajectorySetMonitor",tj->monitor ? PETSC_TRUE:PETSC_FALSE,&flg,&set);CHKERRQ(ierr); 385 if (set) {ierr = TSTrajectorySetMonitor(tj,flg);CHKERRQ(ierr);} 386 /* Handle specific TS options */ 387 if (tj->ops->setfromoptions) { 388 ierr = (*tj->ops->setfromoptions)(PetscOptionsObject,tj);CHKERRQ(ierr); 389 } 390 ierr = PetscOptionsEnd();CHKERRQ(ierr); 391 PetscFunctionReturn(0); 392 } 393 394 #undef __FUNCT__ 395 #define __FUNCT__ "TSTrajectorySetUp" 396 /*@ 397 TSTrajectorySetUp - Sets up the internal data structures, e.g. stacks, for the later use 398 of a TS trajectory. 399 400 Collective on TS 401 402 Input Parameter: 403 + ts - the TS context obtained from TSCreate() 404 - tj - the TS trajectory context 405 406 Level: advanced 407 408 .keywords: TS, trajectory, setup 409 410 .seealso: TSSetSaveTrajectory(), TSTrajectoryCreate(), TSTrajectoryDestroy() 411 @*/ 412 PetscErrorCode TSTrajectorySetUp(TSTrajectory tj,TS ts) 413 { 414 PetscErrorCode ierr; 415 416 PetscFunctionBegin; 417 if (!tj) PetscFunctionReturn(0); 418 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 419 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 420 if (tj->setupcalled) PetscFunctionReturn(0); 421 422 if (!((PetscObject)tj)->type_name) { 423 ierr = TSTrajectorySetType(tj,ts,TSTRAJECTORYBASIC);CHKERRQ(ierr); 424 } 425 if (tj->ops->setup) { 426 ierr = (*tj->ops->setup)(tj,ts);CHKERRQ(ierr); 427 } 428 429 tj->setupcalled = PETSC_TRUE; 430 431 /* Set the counters to zero */ 432 tj->recomps = 0; 433 tj->diskreads = 0; 434 tj->diskwrites = 0; 435 PetscFunctionReturn(0); 436 } 437