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 8 #undef __FUNCT__ 9 #define __FUNCT__ "TSTrajectoryRegister" 10 /*@C 11 TSTrajectoryRegister - Adds a way of storing trajectories to the TS package 12 13 Not Collective 14 15 Input Parameters: 16 + name - The name of a new user-defined creation routine 17 - create_func - The creation routine itself 18 19 Notes: 20 TSTrajectoryRegister() may be called multiple times to add several user-defined tses. 21 22 Level: advanced 23 24 .keywords: TS, register 25 26 .seealso: TSTrajectoryRegisterAll(), TSTrajectoryRegisterDestroy() 27 @*/ 28 PetscErrorCode TSTrajectoryRegister(const char sname[],PetscErrorCode (*function)(TSTrajectory,TS)) 29 { 30 PetscErrorCode ierr; 31 32 PetscFunctionBegin; 33 ierr = PetscFunctionListAdd(&TSTrajectoryList,sname,function);CHKERRQ(ierr); 34 PetscFunctionReturn(0); 35 } 36 37 #undef __FUNCT__ 38 #define __FUNCT__ "TSTrajectorySet" 39 PetscErrorCode TSTrajectorySet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal time,Vec X) 40 { 41 PetscErrorCode ierr; 42 43 PetscFunctionBegin; 44 if (!tj) PetscFunctionReturn(0); 45 ierr = (*tj->ops->set)(tj,ts,stepnum,time,X);CHKERRQ(ierr); 46 PetscFunctionReturn(0); 47 } 48 49 #undef __FUNCT__ 50 #define __FUNCT__ "TSTrajectoryGet" 51 PetscErrorCode TSTrajectoryGet(TSTrajectory tj,TS ts,PetscInt stepnum,PetscReal *time) 52 { 53 PetscErrorCode ierr; 54 55 PetscFunctionBegin; 56 if (!tj) SETERRQ(PetscObjectComm((PetscObject)ts),PETSC_ERR_ARG_WRONGSTATE,"TS solver did not save trajectory"); 57 ierr = (*tj->ops->get)(tj,ts,stepnum,time);CHKERRQ(ierr); 58 PetscFunctionReturn(0); 59 } 60 61 #undef __FUNCT__ 62 #define __FUNCT__ "TSTrajectoryView" 63 /*@C 64 TSTrajectoryView - Prints information about the trajectory object 65 66 Collective on TSTrajectory 67 68 Input Parameters: 69 + tj - the TSTrajectory context obtained from TSTrajectoryCreate() 70 - viewer - visualization context 71 72 Options Database Key: 73 . -ts_view - calls TSView() at end of TSStep() 74 75 Notes: 76 The available visualization contexts include 77 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 78 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 79 output where only the first processor opens 80 the file. All other processors send their 81 data to the first processor to print. 82 83 The user can open an alternative visualization context with 84 PetscViewerASCIIOpen() - output to a specified file. 85 86 Level: beginner 87 88 .keywords: TS, timestep, view 89 90 .seealso: PetscViewerASCIIOpen() 91 @*/ 92 PetscErrorCode TSTrajectoryView(TSTrajectory tj,PetscViewer viewer) 93 { 94 PetscErrorCode ierr; 95 PetscBool iascii; 96 97 PetscFunctionBegin; 98 PetscValidHeaderSpecific(tj,TS_CLASSID,1); 99 if (!viewer) { 100 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)tj),&viewer);CHKERRQ(ierr); 101 } 102 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 103 PetscCheckSameComm(tj,1,viewer,2); 104 105 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 106 if (iascii) { 107 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)tj,viewer);CHKERRQ(ierr); 108 if (tj->ops->view) { 109 ierr = (*tj->ops->view)(tj,viewer);CHKERRQ(ierr); 110 } 111 } 112 PetscFunctionReturn(0); 113 } 114 115 #undef __FUNCT__ 116 #define __FUNCT__ "TSTrajectoryCreate" 117 /*@C 118 TSTrajectoryCreate - This function creates an empty trajectory object used to store the time dependent solution of an ODE/DAE 119 120 Collective on MPI_Comm 121 122 Input Parameter: 123 . comm - The communicator 124 125 Output Parameter: 126 . tj - The trajectory object 127 128 Level: advanced 129 130 Notes: Usually one does not call this routine, it is called automatically when one calls TSSetSaveTrajectory(). One can call 131 TSGetTrajectory() to access the created trajectory. 132 133 .keywords: TS, create 134 .seealso: TSSetType(), TSSetUp(), TSDestroy(), TSSetProblemType(), TSGetTrajectory() 135 @*/ 136 PetscErrorCode TSTrajectoryCreate(MPI_Comm comm,TSTrajectory *tj) 137 { 138 TSTrajectory t; 139 PetscErrorCode ierr; 140 141 PetscFunctionBegin; 142 PetscValidPointer(tj,2); 143 *tj = NULL; 144 ierr = TSInitializePackage();CHKERRQ(ierr); 145 146 ierr = PetscHeaderCreate(t,TSTRAJECTORY_CLASSID,"TSTrajectory","Time stepping","TS",comm,TSTrajectoryDestroy,TSTrajectoryView);CHKERRQ(ierr); 147 *tj = t; 148 PetscFunctionReturn(0); 149 } 150 151 #undef __FUNCT__ 152 #define __FUNCT__ "TSTrajectorySetType" 153 /*@C 154 TSTrajectorySetType - Sets the storage method to be used as in a trajectory 155 156 Collective on TS 157 158 Input Parameters: 159 + ts - The TS context 160 - type - A known method 161 162 Options Database Command: 163 . -tstrajectory_type <type> - Sets the method; use -help for a list of available methods (for instance, basic) 164 165 Level: intermediate 166 167 .keywords: TS, set, type 168 169 .seealso: TS, TSSolve(), TSCreate(), TSSetFromOptions(), TSDestroy(), TSType 170 171 @*/ 172 PetscErrorCode TSTrajectorySetType(TSTrajectory tj,TS ts,const TSTrajectoryType type) 173 { 174 PetscErrorCode (*r)(TSTrajectory,TS); 175 PetscBool match; 176 PetscErrorCode ierr; 177 178 PetscFunctionBegin; 179 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 180 ierr = PetscObjectTypeCompare((PetscObject)tj,type,&match);CHKERRQ(ierr); 181 if (match) PetscFunctionReturn(0); 182 183 ierr = PetscFunctionListFind(TSTrajectoryList,type,&r);CHKERRQ(ierr); 184 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown TSTrajectory type: %s",type); 185 if (tj->ops->destroy) { 186 ierr = (*(tj)->ops->destroy)(tj);CHKERRQ(ierr); 187 188 tj->ops->destroy = NULL; 189 } 190 ierr = PetscMemzero(tj->ops,sizeof(*tj->ops));CHKERRQ(ierr); 191 192 ierr = PetscObjectChangeTypeName((PetscObject)tj,type);CHKERRQ(ierr); 193 ierr = (*r)(tj,ts);CHKERRQ(ierr); 194 PetscFunctionReturn(0); 195 } 196 197 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Basic(TSTrajectory,TS); 198 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Singlefile(TSTrajectory,TS); 199 PETSC_EXTERN PetscErrorCode TSTrajectoryCreate_Memory(TSTrajectory,TS); 200 201 #undef __FUNCT__ 202 #define __FUNCT__ "TSTrajectoryRegisterAll" 203 /*@C 204 TSTrajectoryRegisterAll - Registers all of the trajectory storage schecmes in the TS package. 205 206 Not Collective 207 208 Level: advanced 209 210 .keywords: TS, timestepper, register, all 211 .seealso: TSCreate(), TSRegister(), TSRegisterDestroy() 212 @*/ 213 PetscErrorCode TSTrajectoryRegisterAll(void) 214 { 215 PetscErrorCode ierr; 216 217 PetscFunctionBegin; 218 TSTrajectoryRegisterAllCalled = PETSC_TRUE; 219 220 ierr = TSTrajectoryRegister(TSTRAJECTORYBASIC,TSTrajectoryCreate_Basic);CHKERRQ(ierr); 221 ierr = TSTrajectoryRegister(TSTRAJECTORYSINGLEFILE,TSTrajectoryCreate_Singlefile);CHKERRQ(ierr); 222 ierr = TSTrajectoryRegister(TSTRAJECTORYMEMORY,TSTrajectoryCreate_Memory);CHKERRQ(ierr); 223 PetscFunctionReturn(0); 224 } 225 226 #undef __FUNCT__ 227 #define __FUNCT__ "TSTrajectoryDestroy" 228 /*@ 229 TSTrajectoryDestroy - Destroys a trajectory context 230 231 Collective on TSTrajectory 232 233 Input Parameter: 234 . ts - the TSTrajectory context obtained from TSTrajectoryCreate() 235 236 Level: advanced 237 238 .keywords: TS, timestepper, destroy 239 240 .seealso: TSCreate(), TSSetUp(), TSSolve() 241 @*/ 242 PetscErrorCode TSTrajectoryDestroy(TSTrajectory *tj) 243 { 244 PetscErrorCode ierr; 245 246 PetscFunctionBegin; 247 if (!*tj) PetscFunctionReturn(0); 248 PetscValidHeaderSpecific((*tj),TSTRAJECTORY_CLASSID,1); 249 if (--((PetscObject)(*tj))->refct > 0) {*tj = 0; PetscFunctionReturn(0);} 250 251 if ((*tj)->ops->destroy) {ierr = (*(*tj)->ops->destroy)((*tj));CHKERRQ(ierr);} 252 ierr = PetscHeaderDestroy(tj);CHKERRQ(ierr); 253 PetscFunctionReturn(0); 254 } 255 256 #undef __FUNCT__ 257 #define __FUNCT__ "TSTrajectorySetTypeFromOptions_Private" 258 /* 259 TSTrajectorySetTypeFromOptions_Private - Sets the type of ts from user options. 260 261 Collective on TSTrajectory 262 263 Input Parameter: 264 . tj - TSTrajectory 265 266 Level: intermediate 267 268 .keywords: TS, set, options, database, type 269 .seealso: TSSetFromOptions(), TSSetType() 270 */ 271 static PetscErrorCode TSTrajectorySetTypeFromOptions_Private(PetscOptions *PetscOptionsObject,TSTrajectory tj,TS ts) 272 { 273 PetscBool opt; 274 const char *defaultType; 275 char typeName[256]; 276 PetscBool flg; 277 PetscErrorCode ierr; 278 279 PetscFunctionBegin; 280 if (((PetscObject)tj)->type_name) defaultType = ((PetscObject)tj)->type_name; 281 else defaultType = TSTRAJECTORYBASIC; 282 283 if (!TSRegisterAllCalled) {ierr = TSTrajectoryRegisterAll();CHKERRQ(ierr);} 284 ierr = PetscOptionsFList("-tstrajectory_type","TSTrajectory method"," TSTrajectorySetType",TSTrajectoryList,defaultType,typeName,256,&opt);CHKERRQ(ierr); 285 if (opt) { 286 ierr = PetscStrcmp(typeName,TSTRAJECTORYMEMORY,&flg); 287 if (flg) { /* ts_max_steps determines memory allocated */ 288 ierr = PetscOptionsInt("-ts_max_steps","Maximum number of time steps","TSSetDuration",ts->max_steps,&ts->max_steps,NULL);CHKERRQ(ierr); 289 } 290 ierr = TSTrajectorySetType(tj,ts,typeName);CHKERRQ(ierr); 291 } else { 292 ierr = TSTrajectorySetType(tj,ts,defaultType);CHKERRQ(ierr); 293 } 294 PetscFunctionReturn(0); 295 } 296 297 #undef __FUNCT__ 298 #define __FUNCT__ "TSTrajectorySetFromOptions" 299 /*@ 300 TSTrajectorySetFromOptions - Sets various TSTrajectory parameters from user options. 301 302 Collective on TSTrajectory 303 304 Input Parameter: 305 . tj - the TSTrajectory context obtained from TSTrajectoryCreate() 306 307 Options Database Keys: 308 . -tstrajectory_type <type> - TSTRAJECTORYBASIC 309 310 Level: advanced 311 312 Notes: This is not normally called directly by users, instead it is called by TSSetFromOptions() after a call to 313 TSSetSaveTrajectory() 314 315 .keywords: TS, timestep, set, options, database 316 317 .seealso: TSGetType(), TSSetSaveTrajectory(), TSGetTrajectory() 318 @*/ 319 PetscErrorCode TSTrajectorySetFromOptions(TSTrajectory tj,TS ts) 320 { 321 PetscErrorCode ierr; 322 323 PetscFunctionBegin; 324 PetscValidHeaderSpecific(tj,TSTRAJECTORY_CLASSID,1); 325 PetscValidHeaderSpecific(ts,TS_CLASSID,2); 326 ierr = PetscObjectOptionsBegin((PetscObject)tj);CHKERRQ(ierr); 327 ierr = TSTrajectorySetTypeFromOptions_Private(PetscOptionsObject,tj,ts);CHKERRQ(ierr); 328 ierr = PetscOptionsEnd();CHKERRQ(ierr); 329 PetscFunctionReturn(0); 330 } 331