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