1 2 #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/ 3 4 PetscClassId PETSC_VIEWER_CLASSID; 5 6 static PetscBool PetscViewerPackageInitialized = PETSC_FALSE; 7 #undef __FUNCT__ 8 #define __FUNCT__ "PetscViewerFinalizePackage" 9 /*@C 10 PetscViewerFinalizePackage - This function destroys everything in the Petsc interface to Mathematica. It is 11 called from PetscFinalize(). 12 13 Level: developer 14 15 .keywords: Petsc, destroy, package, mathematica 16 .seealso: PetscFinalize() 17 @*/ 18 PetscErrorCode PetscViewerFinalizePackage(void) 19 { 20 PetscErrorCode ierr; 21 22 PetscFunctionBegin; 23 ierr = PetscFunctionListDestroy(&PetscViewerList);CHKERRQ(ierr); 24 PetscViewerPackageInitialized = PETSC_FALSE; 25 PetscViewerRegisterAllCalled = PETSC_FALSE; 26 PetscFunctionReturn(0); 27 } 28 29 #undef __FUNCT__ 30 #define __FUNCT__ "PetscViewerInitializePackage" 31 /*@C 32 PetscViewerInitializePackage - This function initializes everything in the main PetscViewer package. 33 34 Level: developer 35 36 .keywords: Petsc, initialize, package 37 .seealso: PetscInitialize() 38 @*/ 39 PetscErrorCode PetscViewerInitializePackage(void) 40 { 41 char logList[256]; 42 char *className; 43 PetscBool opt; 44 PetscErrorCode ierr; 45 46 PetscFunctionBegin; 47 if (PetscViewerPackageInitialized) PetscFunctionReturn(0); 48 PetscViewerPackageInitialized = PETSC_TRUE; 49 /* Register Classes */ 50 ierr = PetscClassIdRegister("Viewer",&PETSC_VIEWER_CLASSID);CHKERRQ(ierr); 51 52 /* Register Constructors */ 53 ierr = PetscViewerRegisterAll();CHKERRQ(ierr); 54 55 /* Process info exclusions */ 56 ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr); 57 if (opt) { 58 ierr = PetscStrstr(logList, "viewer", &className);CHKERRQ(ierr); 59 if (className) { 60 ierr = PetscInfoDeactivateClass(0);CHKERRQ(ierr); 61 } 62 } 63 /* Process summary exclusions */ 64 ierr = PetscOptionsGetString(NULL,NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr); 65 if (opt) { 66 ierr = PetscStrstr(logList, "viewer", &className);CHKERRQ(ierr); 67 if (className) { 68 ierr = PetscLogEventDeactivateClass(0);CHKERRQ(ierr); 69 } 70 } 71 #if defined(PETSC_HAVE_MATHEMATICA) 72 ierr = PetscViewerMathematicaInitializePackage();CHKERRQ(ierr); 73 #endif 74 ierr = PetscRegisterFinalize(PetscViewerFinalizePackage);CHKERRQ(ierr); 75 PetscFunctionReturn(0); 76 } 77 78 #undef __FUNCT__ 79 #define __FUNCT__ "PetscViewerDestroy" 80 /*@ 81 PetscViewerDestroy - Destroys a PetscViewer. 82 83 Collective on PetscViewer 84 85 Input Parameters: 86 . viewer - the PetscViewer to be destroyed. 87 88 Level: beginner 89 90 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen() 91 92 @*/ 93 PetscErrorCode PetscViewerDestroy(PetscViewer *viewer) 94 { 95 PetscErrorCode ierr; 96 97 PetscFunctionBegin; 98 if (!*viewer) PetscFunctionReturn(0); 99 PetscValidHeaderSpecific(*viewer,PETSC_VIEWER_CLASSID,1); 100 101 ierr = PetscViewerFlush(*viewer);CHKERRQ(ierr); 102 if (--((PetscObject)(*viewer))->refct > 0) {*viewer = 0; PetscFunctionReturn(0);} 103 104 ierr = PetscObjectSAWsViewOff((PetscObject)*viewer);CHKERRQ(ierr); 105 if ((*viewer)->ops->destroy) { 106 ierr = (*(*viewer)->ops->destroy)(*viewer);CHKERRQ(ierr); 107 } 108 ierr = PetscHeaderDestroy(viewer);CHKERRQ(ierr); 109 PetscFunctionReturn(0); 110 } 111 112 #undef __FUNCT__ 113 #define __FUNCT__ "PetscViewerAndFormatDestroy" 114 /*@C 115 PetscViewerAndFormatDestroy - Destroys a PetscViewerAndFormat struct. 116 117 Collective on PetscViewer 118 119 Input Parameters: 120 . viewer - the PetscViewerAndFormat to be destroyed. 121 122 Level: beginner 123 124 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerCreate(), PetscViewerDrawOpen() 125 126 @*/ 127 PetscErrorCode PetscViewerAndFormatDestroy(PetscViewerAndFormat **vf) 128 { 129 PetscErrorCode ierr; 130 131 PetscFunctionBegin; 132 ierr = PetscViewerDestroy(&(*vf)->viewer);CHKERRQ(ierr); 133 ierr = PetscFree(*vf);CHKERRQ(ierr); 134 PetscFunctionReturn(0); 135 } 136 137 #undef __FUNCT__ 138 #define __FUNCT__ "PetscViewerGetType" 139 /*@C 140 PetscViewerGetType - Returns the type of a PetscViewer. 141 142 Not Collective 143 144 Input Parameter: 145 . viewer - the PetscViewer 146 147 Output Parameter: 148 . type - PetscViewer type (see below) 149 150 Available Types Include: 151 . PETSCVIEWERSOCKET - Socket PetscViewer 152 . PETSCVIEWERASCII - ASCII PetscViewer 153 . PETSCVIEWERBINARY - binary file PetscViewer 154 . PETSCVIEWERSTRING - string PetscViewer 155 . PETSCVIEWERDRAW - drawing PetscViewer 156 157 Level: intermediate 158 159 Note: 160 See include/petscviewer.h for a complete list of PetscViewers. 161 162 PetscViewerType is actually a string 163 164 .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 165 166 @*/ 167 PetscErrorCode PetscViewerGetType(PetscViewer viewer,PetscViewerType *type) 168 { 169 PetscFunctionBegin; 170 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 171 PetscValidPointer(type,2); 172 *type = ((PetscObject)viewer)->type_name; 173 PetscFunctionReturn(0); 174 } 175 176 #undef __FUNCT__ 177 #define __FUNCT__ "PetscViewerSetOptionsPrefix" 178 /*@C 179 PetscViewerSetOptionsPrefix - Sets the prefix used for searching for all 180 PetscViewer options in the database. 181 182 Logically Collective on PetscViewer 183 184 Input Parameter: 185 + viewer - the PetscViewer context 186 - prefix - the prefix to prepend to all option names 187 188 Notes: 189 A hyphen (-) must NOT be given at the beginning of the prefix name. 190 The first character of all runtime options is AUTOMATICALLY the hyphen. 191 192 Level: advanced 193 194 .keywords: PetscViewer, set, options, prefix, database 195 196 .seealso: PetscViewerSetFromOptions() 197 @*/ 198 PetscErrorCode PetscViewerSetOptionsPrefix(PetscViewer viewer,const char prefix[]) 199 { 200 PetscErrorCode ierr; 201 202 PetscFunctionBegin; 203 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 204 ierr = PetscObjectSetOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr); 205 PetscFunctionReturn(0); 206 } 207 208 #undef __FUNCT__ 209 #define __FUNCT__ "PetscViewerAppendOptionsPrefix" 210 /*@C 211 PetscViewerAppendOptionsPrefix - Appends to the prefix used for searching for all 212 PetscViewer options in the database. 213 214 Logically Collective on PetscViewer 215 216 Input Parameters: 217 + viewer - the PetscViewer context 218 - prefix - the prefix to prepend to all option names 219 220 Notes: 221 A hyphen (-) must NOT be given at the beginning of the prefix name. 222 The first character of all runtime options is AUTOMATICALLY the hyphen. 223 224 Level: advanced 225 226 .keywords: PetscViewer, append, options, prefix, database 227 228 .seealso: PetscViewerGetOptionsPrefix() 229 @*/ 230 PetscErrorCode PetscViewerAppendOptionsPrefix(PetscViewer viewer,const char prefix[]) 231 { 232 PetscErrorCode ierr; 233 234 PetscFunctionBegin; 235 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 236 ierr = PetscObjectAppendOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr); 237 PetscFunctionReturn(0); 238 } 239 240 #undef __FUNCT__ 241 #define __FUNCT__ "PetscViewerGetOptionsPrefix" 242 /*@C 243 PetscViewerGetOptionsPrefix - Sets the prefix used for searching for all 244 PetscViewer options in the database. 245 246 Not Collective 247 248 Input Parameter: 249 . viewer - the PetscViewer context 250 251 Output Parameter: 252 . prefix - pointer to the prefix string used 253 254 Notes: On the fortran side, the user should pass in a string 'prefix' of 255 sufficient length to hold the prefix. 256 257 Level: advanced 258 259 .keywords: PetscViewer, get, options, prefix, database 260 261 .seealso: PetscViewerAppendOptionsPrefix() 262 @*/ 263 PetscErrorCode PetscViewerGetOptionsPrefix(PetscViewer viewer,const char *prefix[]) 264 { 265 PetscErrorCode ierr; 266 267 PetscFunctionBegin; 268 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 269 ierr = PetscObjectGetOptionsPrefix((PetscObject)viewer,prefix);CHKERRQ(ierr); 270 PetscFunctionReturn(0); 271 } 272 273 #undef __FUNCT__ 274 #define __FUNCT__ "PetscViewerSetUp" 275 /*@ 276 PetscViewerSetUp - Sets up the internal viewer data structures for the later use. 277 278 Collective on PetscViewer 279 280 Input Parameters: 281 . viewer - the PetscViewer context 282 283 Notes: 284 For basic use of the PetscViewer classes the user need not explicitly call 285 PetscViewerSetUp(), since these actions will happen automatically. 286 287 Level: advanced 288 289 .keywords: PetscViewer, setup 290 291 .seealso: PetscViewerCreate(), PetscViewerDestroy() 292 @*/ 293 PetscErrorCode PetscViewerSetUp(PetscViewer viewer) 294 { 295 PetscErrorCode ierr; 296 297 PetscFunctionBegin; 298 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 299 if (viewer->setupcalled) PetscFunctionReturn(0); 300 if (viewer->ops->setup) { 301 ierr = (*viewer->ops->setup)(viewer);CHKERRQ(ierr); 302 } 303 viewer->setupcalled = PETSC_TRUE; 304 PetscFunctionReturn(0); 305 } 306 307 #undef __FUNCT__ 308 #define __FUNCT__ "PetscViewerView" 309 /*@C 310 PetscViewerView - Visualizes a viewer object. 311 312 Collective on PetscViewer 313 314 Input Parameters: 315 + v - the viewer 316 - viewer - visualization context 317 318 Notes: 319 The available visualization contexts include 320 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 321 . PETSC_VIEWER_STDOUT_WORLD - synchronized standard 322 output where only the first processor opens 323 the file. All other processors send their 324 data to the first processor to print. 325 - PETSC_VIEWER_DRAW_WORLD - graphical display of nonzero structure 326 327 Level: beginner 328 329 .seealso: PetscViewerPushFormat(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), 330 PetscViewerSocketOpen(), PetscViewerBinaryOpen(), PetscViewerLoad() 331 @*/ 332 PetscErrorCode PetscViewerView(PetscViewer v,PetscViewer viewer) 333 { 334 PetscErrorCode ierr; 335 PetscBool iascii; 336 PetscViewerFormat format; 337 #if defined(PETSC_HAVE_SAWS) 338 PetscBool issaws; 339 #endif 340 341 PetscFunctionBegin; 342 PetscValidHeaderSpecific(v,PETSC_VIEWER_CLASSID,1); 343 PetscValidType(v,1); 344 if (!viewer) { 345 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)v),&viewer);CHKERRQ(ierr); 346 } 347 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 348 PetscCheckSameComm(v,1,viewer,2); 349 350 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 351 #if defined(PETSC_HAVE_SAWS) 352 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr); 353 #endif 354 if (iascii) { 355 ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 356 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)v,viewer);CHKERRQ(ierr); 357 if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 358 if (v->format) { 359 ierr = PetscViewerASCIIPrintf(viewer," Viewer format = %s\n",PetscViewerFormats[v->format]);CHKERRQ(ierr); 360 } 361 ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 362 if (v->ops->view) { 363 ierr = (*v->ops->view)(v,viewer);CHKERRQ(ierr); 364 } 365 ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 366 } 367 #if defined(PETSC_HAVE_SAWS) 368 } else if (issaws) { 369 if (!((PetscObject)v)->amsmem) { 370 ierr = PetscObjectViewSAWs((PetscObject)v,viewer);CHKERRQ(ierr); 371 if (v->ops->view) { 372 ierr = (*v->ops->view)(v,viewer);CHKERRQ(ierr); 373 } 374 } 375 #endif 376 } 377 PetscFunctionReturn(0); 378 } 379 380 #undef __FUNCT__ 381 #define __FUNCT__ "PetscViewerRead" 382 /*@C 383 PetscViewerRead - Reads data from a PetscViewer 384 385 Collective on MPI_Comm 386 387 Input Parameters: 388 + viewer - The viewer 389 . data - Location to write the data 390 . num - Number of items of data to read 391 - datatype - Type of data to read 392 393 Output Parameters: 394 . count - number of items of data actually read, or NULL 395 396 Level: beginner 397 398 Concepts: binary files, ascii files 399 400 .seealso: PetscViewerASCIIOpen(), PetscViewerPushFormat(), PetscViewerDestroy(), 401 VecView(), MatView(), VecLoad(), MatLoad(), PetscViewerBinaryGetDescriptor(), 402 PetscViewerBinaryGetInfoPointer(), PetscFileMode, PetscViewer 403 @*/ 404 PetscErrorCode PetscViewerRead(PetscViewer viewer, void *data, PetscInt num, PetscInt *count, PetscDataType dtype) 405 { 406 PetscErrorCode ierr; 407 408 PetscFunctionBegin; 409 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 410 if (dtype == PETSC_STRING) { 411 PetscInt c, i = 0, cnt; 412 char *s = (char *)data; 413 for (c = 0; c < num; c++) { 414 /* Skip leading whitespaces */ 415 do {ierr = (*viewer->ops->read)(viewer, &(s[i]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (count && !cnt) break;} 416 while (s[i]=='\n' || s[i]=='\t' || s[i]==' ' || s[i]=='\0' || s[i]=='\v' || s[i]=='\f' || s[i]=='\r'); 417 i++; 418 /* Read strings one char at a time */ 419 do {ierr = (*viewer->ops->read)(viewer, &(s[i++]), 1, &cnt, PETSC_CHAR);CHKERRQ(ierr); if (count && !cnt) break;} 420 while (s[i-1]!='\n' && s[i-1]!='\t' && s[i-1]!=' ' && s[i-1]!='\0' && s[i-1]!='\v' && s[i-1]!='\f' && s[i-1]!='\r'); 421 /* Terminate final string */ 422 if (c == num-1) s[i-1] = '\0'; 423 } 424 if (count) *count = c; 425 else if (c < num) SETERRQ2(PetscObjectComm((PetscObject) viewer), PETSC_ERR_FILE_READ, "Insufficient data, only read %D < %D strings", c, num); 426 } else { 427 ierr = (*viewer->ops->read)(viewer, data, num, count, dtype);CHKERRQ(ierr); 428 } 429 PetscFunctionReturn(0); 430 } 431