1 2 #include <petsc-private/viewerimpl.h> /*I "petscsys.h" I*/ 3 4 PetscFList PetscViewerList = 0; 5 6 PetscErrorCode PetscOptionsFindPair_Private(const char[],const char[],char *[],PetscBool*); 7 #undef __FUNCT__ 8 #define __FUNCT__ "PetscOptionsGetViewer" 9 /*@C 10 PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user 11 12 Collective on MPI_Comm 13 14 Input Parameters: 15 + comm - the communicator to own the viewer 16 . pre - the string to prepend to the name or PETSC_NULL 17 - name - the option one is seeking 18 19 Output Parameter: 20 + viewer - the viewer 21 - set - PETSC_TRUE if found, else PETSC_FALSE 22 23 Level: intermediate 24 25 Notes: If no value is provided ascii:stdout is used 26 $ ascii[:filename] defaults to stdout 27 $ binary[:filename] defaults to binaryoutput 28 $ draw 29 $ socket[:port] defaults to the standard output port 30 31 Use PetscOptionsRestoreViewer() after using the viewer, otherwise a memory leak may occur 32 33 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 34 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 35 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 36 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 37 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 38 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 39 PetscOptionsList(), PetscOptionsEList(), PetscOptionsRestoreViewer() 40 @*/ 41 PetscErrorCode PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscBool *set) 42 { 43 char *value; 44 PetscErrorCode ierr; 45 PetscBool flag; 46 47 PetscFunctionBegin; 48 PetscValidCharPointer(name,3); 49 50 if (set) *set = PETSC_FALSE; 51 ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 52 if (flag) { 53 if (set) *set = PETSC_TRUE; 54 if (!value) { 55 ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 56 } else { 57 PetscBool isbinary = PETSC_FALSE,isascii = PETSC_FALSE; 58 char *cvalue,*loc; 59 PetscInt cnt; 60 const char const *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,0}; 61 62 ierr = PetscStrallocpy(value,&cvalue);CHKERRQ(ierr); 63 ierr = PetscStrchr(cvalue,':',&loc);CHKERRQ(ierr); 64 if (loc) {*loc = 0; loc++;} 65 ierr = PetscStrendswithwhich(cvalue,viewers,&cnt);CHKERRQ(ierr); 66 if (cnt == 4) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",cvalue); 67 if (!loc) { 68 ierr = PetscStrcmp(cvalue,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 69 if (isbinary) { 70 *viewer = PETSC_VIEWER_BINARY_(comm);CHKERRQ(ierr); 71 ierr = PetscFree(cvalue);CHKERRQ(ierr); 72 PetscFunctionReturn(0); 73 } 74 ierr = PetscStrcmp(cvalue,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); 75 if (isascii) { 76 ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 77 ierr = PetscFree(cvalue);CHKERRQ(ierr); 78 PetscFunctionReturn(0); 79 } 80 } 81 ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); 82 ierr = PetscViewerSetType(*viewer,cvalue);CHKERRQ(ierr); 83 if (loc) { 84 ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 85 ierr = PetscViewerFileSetName(*viewer,loc);CHKERRQ(ierr); 86 } 87 ierr = PetscObjectComposeFunction((PetscObject)*viewer,"PetscOptionsDestroyViewer","PetscViewerDestroy",(void (*)(void))PetscViewerDestroy);CHKERRQ(ierr); 88 ierr = PetscFree(cvalue);CHKERRQ(ierr); 89 ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr); 90 } 91 } 92 PetscFunctionReturn(0); 93 } 94 95 #undef __FUNCT__ 96 #define __FUNCT__ "PetscOptionsRestoreViewer" 97 /*@C 98 PetscOptionsRestoresViewer - Restores a viewer obtained with PetscOptionsGetViewer() 99 100 Collective on PetscViewer 101 102 Input Parameters: 103 . viewer - the viewer 104 105 Level: intermediate 106 107 .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 108 PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 109 PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 110 PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 111 PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 112 PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 113 PetscOptionsList(), PetscOptionsEList(), PetscOptionsRestoreViewer() 114 @*/ 115 PetscErrorCode PetscOptionsRestoreViewer(PetscViewer viewer) 116 { 117 PetscErrorCode ierr,(*f)(PetscViewer*); 118 119 PetscFunctionBegin; 120 ierr = PetscObjectQueryFunction((PetscObject)viewer,"PetscOptionsDestroyViewer",(void (**)(void))&f);CHKERRQ(ierr); 121 if (f) { 122 ierr = (*f)(&viewer);CHKERRQ(ierr); 123 } 124 PetscFunctionReturn(0); 125 } 126 127 #undef __FUNCT__ 128 #define __FUNCT__ "PetscViewerCreate" 129 /*@ 130 PetscViewerCreate - Creates a viewing context 131 132 Collective on MPI_Comm 133 134 Input Parameter: 135 . comm - MPI communicator 136 137 Output Parameter: 138 . inviewer - location to put the PetscViewer context 139 140 Level: advanced 141 142 Concepts: graphics^creating PetscViewer 143 Concepts: file input/output^creating PetscViewer 144 Concepts: sockets^creating PetscViewer 145 146 .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType 147 148 @*/ 149 PetscErrorCode PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer) 150 { 151 PetscViewer viewer; 152 PetscErrorCode ierr; 153 154 PetscFunctionBegin; 155 *inviewer = 0; 156 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 157 ierr = PetscViewerInitializePackage(PETSC_NULL);CHKERRQ(ierr); 158 #endif 159 ierr = PetscHeaderCreate(viewer,_p_PetscViewer,struct _PetscViewerOps,PETSC_VIEWER_CLASSID,-1,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,0);CHKERRQ(ierr); 160 *inviewer = viewer; 161 viewer->data = 0; 162 PetscFunctionReturn(0); 163 } 164 165 #undef __FUNCT__ 166 #define __FUNCT__ "PetscViewerSetType" 167 /*@C 168 PetscViewerSetType - Builds PetscViewer for a particular implementation. 169 170 Collective on PetscViewer 171 172 Input Parameter: 173 + viewer - the PetscViewer context 174 - type - for example, "ASCII" 175 176 Options Database Command: 177 . -draw_type <type> - Sets the type; use -help for a list 178 of available methods (for instance, ascii) 179 180 Level: advanced 181 182 Notes: 183 See "include/petscviewer.h" for available methods (for instance, 184 PETSC_VIEWER_SOCKET) 185 186 .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType 187 @*/ 188 PetscErrorCode PetscViewerSetType(PetscViewer viewer,PetscViewerType type) 189 { 190 PetscErrorCode ierr,(*r)(PetscViewer); 191 PetscBool match; 192 193 PetscFunctionBegin; 194 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 195 PetscValidCharPointer(type,2); 196 CHKMEMQ; 197 ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr); 198 if (match) PetscFunctionReturn(0); 199 200 /* cleanup any old type that may be there */ 201 if (viewer->data) { 202 ierr = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr); 203 viewer->ops->destroy = PETSC_NULL; 204 viewer->data = 0; 205 } 206 ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr); 207 208 ierr = PetscFListFind(PetscViewerList,((PetscObject)viewer)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 209 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type); 210 211 ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr); 212 ierr = (*r)(viewer);CHKERRQ(ierr); 213 PetscFunctionReturn(0); 214 } 215 216 #undef __FUNCT__ 217 #define __FUNCT__ "PetscViewerRegisterDestroy" 218 /*@C 219 PetscViewerRegisterDestroy - Frees the list of PetscViewer methods that were 220 registered by PetscViewerRegisterDynamic(). 221 222 Not Collective 223 224 Level: developer 225 226 .seealso: PetscViewerRegisterDynamic(), PetscViewerRegisterAll() 227 @*/ 228 PetscErrorCode PetscViewerRegisterDestroy(void) 229 { 230 PetscErrorCode ierr; 231 232 PetscFunctionBegin; 233 ierr = PetscFListDestroy(&PetscViewerList);CHKERRQ(ierr); 234 PetscFunctionReturn(0); 235 } 236 237 #undef __FUNCT__ 238 #define __FUNCT__ "PetscViewerRegister" 239 PetscErrorCode PetscViewerRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(PetscViewer)) 240 { 241 PetscErrorCode ierr; 242 char fullname[PETSC_MAX_PATH_LEN]; 243 244 PetscFunctionBegin; 245 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 246 ierr = PetscFListAdd(&PetscViewerList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 247 PetscFunctionReturn(0); 248 } 249 250 #undef __FUNCT__ 251 #define __FUNCT__ "PetscViewerSetFromOptions" 252 /*@C 253 PetscViewerSetFromOptions - Sets the graphics type from the options database. 254 Defaults to a PETSc X windows graphics. 255 256 Collective on PetscViewer 257 258 Input Parameter: 259 . PetscViewer - the graphics context 260 261 Level: intermediate 262 263 Notes: 264 Must be called after PetscViewerCreate() before the PetscViewer is used. 265 266 Concepts: PetscViewer^setting options 267 268 .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 269 270 @*/ 271 PetscErrorCode PetscViewerSetFromOptions(PetscViewer viewer) 272 { 273 PetscErrorCode ierr; 274 char vtype[256]; 275 PetscBool flg; 276 277 PetscFunctionBegin; 278 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 279 280 if (!PetscViewerList) { 281 ierr = PetscViewerRegisterAll(PETSC_NULL);CHKERRQ(ierr); 282 } 283 ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr); 284 ierr = PetscOptionsList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char *)(((PetscObject)viewer)->type_name?((PetscObject)viewer)->type_name:PETSCVIEWERASCII),vtype,256,&flg);CHKERRQ(ierr); 285 if (flg) { 286 ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr); 287 } 288 /* type has not been set? */ 289 if (!((PetscObject)viewer)->type_name) { 290 ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 291 } 292 if (viewer->ops->setfromoptions) { 293 ierr = (*viewer->ops->setfromoptions)(viewer);CHKERRQ(ierr); 294 } 295 296 /* process any options handlers added with PetscObjectAddOptionsHandler() */ 297 ierr = PetscObjectProcessOptionsHandlers((PetscObject)viewer);CHKERRQ(ierr); 298 ierr = PetscOptionsEnd();CHKERRQ(ierr); 299 300 PetscFunctionReturn(0); 301 } 302