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