15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h> /*I "petscsys.h" I*/ 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith PetscFList PetscViewerList = 0; 55c6c1daeSBarry Smith 62bf49c77SBarry Smith PetscErrorCode PetscOptionsFindPair_Private(const char[],const char[],char *[],PetscBool*); 72bf49c77SBarry Smith #undef __FUNCT__ 82bf49c77SBarry Smith #define __FUNCT__ "PetscOptionsGetViewer" 92bf49c77SBarry Smith /*@C 102bf49c77SBarry Smith PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user 112bf49c77SBarry Smith 122bf49c77SBarry Smith Collective on MPI_Comm 132bf49c77SBarry Smith 142bf49c77SBarry Smith Input Parameters: 152bf49c77SBarry Smith + comm - the communicator to own the viewer 162bf49c77SBarry Smith . pre - the string to prepend to the name or PETSC_NULL 172bf49c77SBarry Smith - name - the option one is seeking 182bf49c77SBarry Smith 192bf49c77SBarry Smith Output Parameter: 202bf49c77SBarry Smith + viewer - the viewer 21*cffb1e40SBarry Smith . format - the PetscViewerFormat requested by the user 222bf49c77SBarry Smith - set - PETSC_TRUE if found, else PETSC_FALSE 232bf49c77SBarry Smith 242bf49c77SBarry Smith Level: intermediate 252bf49c77SBarry Smith 262bf49c77SBarry Smith Notes: If no value is provided ascii:stdout is used 278cc676e6SMatthew G Knepley $ ascii[:[filename][:format]] defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab, for example ascii::ascii_info prints just the info 287f677774SBarry Smith $ about the object to standard out 292bf49c77SBarry Smith $ binary[:filename] defaults to binaryoutput 302bf49c77SBarry Smith $ draw 312bf49c77SBarry Smith $ socket[:port] defaults to the standard output port 322bf49c77SBarry Smith 33*cffb1e40SBarry Smith Use PetscViewerDestroy() after using the viewer, otherwise a memory leak will occur 342bf49c77SBarry Smith 352bf49c77SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(), 362bf49c77SBarry Smith PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool() 372bf49c77SBarry Smith PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(), 382bf49c77SBarry Smith PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(), 392bf49c77SBarry Smith PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(), 402bf49c77SBarry Smith PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(), 41*cffb1e40SBarry Smith PetscOptionsList(), PetscOptionsEList() 422bf49c77SBarry Smith @*/ 43*cffb1e40SBarry Smith PetscErrorCode PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool *set) 442bf49c77SBarry Smith { 452bf49c77SBarry Smith char *value; 462bf49c77SBarry Smith PetscErrorCode ierr; 472bf49c77SBarry Smith PetscBool flag; 482bf49c77SBarry Smith 492bf49c77SBarry Smith PetscFunctionBegin; 502bf49c77SBarry Smith PetscValidCharPointer(name,3); 512bf49c77SBarry Smith 52*cffb1e40SBarry Smith *format = PETSC_VIEWER_DEFAULT; 532bf49c77SBarry Smith if (set) *set = PETSC_FALSE; 542bf49c77SBarry Smith ierr = PetscOptionsFindPair_Private(pre,name,&value,&flag);CHKERRQ(ierr); 552bf49c77SBarry Smith if (flag) { 562bf49c77SBarry Smith if (set) *set = PETSC_TRUE; 572bf49c77SBarry Smith if (!value) { 582bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 59706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 602bf49c77SBarry Smith } else { 617f677774SBarry Smith char *cvalue,*loc,*loc2 = PETSC_NULL; 622bf49c77SBarry Smith PetscInt cnt; 63b58ca069SBarry Smith const char *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,PETSCVIEWERMATLAB,PETSCVIEWERVTK,0}; 642bf49c77SBarry Smith 652bf49c77SBarry Smith ierr = PetscStrallocpy(value,&cvalue);CHKERRQ(ierr); 662bf49c77SBarry Smith ierr = PetscStrchr(cvalue,':',&loc);CHKERRQ(ierr); 672bf49c77SBarry Smith if (loc) {*loc = 0; loc++;} 687f677774SBarry Smith ierr = PetscStrendswithwhich(*cvalue ? cvalue : "ascii",viewers,&cnt);CHKERRQ(ierr); 6943b63833SBarry Smith if (cnt > sizeof(viewers)-1) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",cvalue); 702bf49c77SBarry Smith if (!loc) { 7143b63833SBarry Smith switch (cnt) { 7243b63833SBarry Smith case 0: 732bf49c77SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 7443b63833SBarry Smith break; 7543b63833SBarry Smith case 1: 767f677774SBarry Smith *viewer = PETSC_VIEWER_BINARY_(comm);CHKERRQ(ierr); 7743b63833SBarry Smith break; 7843b63833SBarry Smith case 2: 797f677774SBarry Smith *viewer = PETSC_VIEWER_DRAW_(comm);CHKERRQ(ierr); 8043b63833SBarry Smith break; 81b58ca069SBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER) 8243b63833SBarry Smith case 3: 837f677774SBarry Smith *viewer = PETSC_VIEWER_SOCKET_(comm);CHKERRQ(ierr); 8443b63833SBarry Smith break; 85b58ca069SBarry Smith #endif 8643b63833SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE) 8743b63833SBarry Smith case 4: 8843b63833SBarry Smith *viewer = PETSC_VIEWER_MATLAB_(comm);CHKERRQ(ierr); 8943b63833SBarry Smith break; 9043b63833SBarry Smith #endif 9143b63833SBarry Smith default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported viewer %s",cvalue);CHKERRQ(ierr); 92706a11cbSBarry Smith break; 937f677774SBarry Smith } 94706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 957f677774SBarry Smith } else { 967f677774SBarry Smith ierr = PetscStrchr(loc,':',&loc2);CHKERRQ(ierr); 977f677774SBarry Smith if (loc2) {*loc2 = 0; loc2++;} 98ccad63c3SBarry Smith if (loc2 && !*loc && (cnt == 0)) { /* ASCII format without file name */ 997f677774SBarry Smith ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr); 100706a11cbSBarry Smith ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr); 1017f677774SBarry Smith } else { 1022bf49c77SBarry Smith ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr); 1037f677774SBarry Smith ierr = PetscViewerSetType(*viewer,*cvalue ? cvalue : "ascii");CHKERRQ(ierr); 1042bf49c77SBarry Smith ierr = PetscViewerFileSetMode(*viewer,FILE_MODE_WRITE);CHKERRQ(ierr); 1052bf49c77SBarry Smith ierr = PetscViewerFileSetName(*viewer,loc);CHKERRQ(ierr); 1067f677774SBarry Smith } 1077f677774SBarry Smith } 1082bf49c77SBarry Smith ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr); 1092f234a98SBarry Smith if (loc2 && *loc2) { 1102f234a98SBarry Smith ierr = PetscStrtoupper(loc2);CHKERRQ(ierr); 1112f234a98SBarry Smith ierr = PetscStrendswithwhich(loc2,PetscViewerFormats,&cnt);CHKERRQ(ierr); 1122f234a98SBarry Smith if (!PetscViewerFormats[cnt]) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unknown viewer format %s",loc2);CHKERRQ(ierr); 113*cffb1e40SBarry Smith *format = (PetscViewerFormat)cnt; 1142f234a98SBarry Smith } 1152f234a98SBarry Smith ierr = PetscFree(cvalue);CHKERRQ(ierr); 1162bf49c77SBarry Smith } 1172bf49c77SBarry Smith } 1182bf49c77SBarry Smith PetscFunctionReturn(0); 1192bf49c77SBarry Smith } 1202bf49c77SBarry Smith 1212bf49c77SBarry Smith #undef __FUNCT__ 1225c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate" 1235c6c1daeSBarry Smith /*@ 1245c6c1daeSBarry Smith PetscViewerCreate - Creates a viewing context 1255c6c1daeSBarry Smith 1265c6c1daeSBarry Smith Collective on MPI_Comm 1275c6c1daeSBarry Smith 1285c6c1daeSBarry Smith Input Parameter: 1295c6c1daeSBarry Smith . comm - MPI communicator 1305c6c1daeSBarry Smith 1315c6c1daeSBarry Smith Output Parameter: 1325c6c1daeSBarry Smith . inviewer - location to put the PetscViewer context 1335c6c1daeSBarry Smith 1345c6c1daeSBarry Smith Level: advanced 1355c6c1daeSBarry Smith 1365c6c1daeSBarry Smith Concepts: graphics^creating PetscViewer 1375c6c1daeSBarry Smith Concepts: file input/output^creating PetscViewer 1385c6c1daeSBarry Smith Concepts: sockets^creating PetscViewer 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType 1415c6c1daeSBarry Smith 1425c6c1daeSBarry Smith @*/ 1435c6c1daeSBarry Smith PetscErrorCode PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer) 1445c6c1daeSBarry Smith { 1455c6c1daeSBarry Smith PetscViewer viewer; 1465c6c1daeSBarry Smith PetscErrorCode ierr; 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith PetscFunctionBegin; 1495c6c1daeSBarry Smith *inviewer = 0; 1505c6c1daeSBarry Smith #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 1515c6c1daeSBarry Smith ierr = PetscViewerInitializePackage(PETSC_NULL);CHKERRQ(ierr); 1525c6c1daeSBarry Smith #endif 1535c6c1daeSBarry Smith ierr = PetscHeaderCreate(viewer,_p_PetscViewer,struct _PetscViewerOps,PETSC_VIEWER_CLASSID,-1,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,0);CHKERRQ(ierr); 1545c6c1daeSBarry Smith *inviewer = viewer; 1555c6c1daeSBarry Smith viewer->data = 0; 1565c6c1daeSBarry Smith PetscFunctionReturn(0); 1575c6c1daeSBarry Smith } 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith #undef __FUNCT__ 1605c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetType" 1615c6c1daeSBarry Smith /*@C 1625c6c1daeSBarry Smith PetscViewerSetType - Builds PetscViewer for a particular implementation. 1635c6c1daeSBarry Smith 1645c6c1daeSBarry Smith Collective on PetscViewer 1655c6c1daeSBarry Smith 1665c6c1daeSBarry Smith Input Parameter: 1675c6c1daeSBarry Smith + viewer - the PetscViewer context 1685c6c1daeSBarry Smith - type - for example, "ASCII" 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith Options Database Command: 1715c6c1daeSBarry Smith . -draw_type <type> - Sets the type; use -help for a list 1725c6c1daeSBarry Smith of available methods (for instance, ascii) 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith Level: advanced 1755c6c1daeSBarry Smith 1765c6c1daeSBarry Smith Notes: 1775c6c1daeSBarry Smith See "include/petscviewer.h" for available methods (for instance, 1785c6c1daeSBarry Smith PETSC_VIEWER_SOCKET) 1795c6c1daeSBarry Smith 1805c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType 1815c6c1daeSBarry Smith @*/ 1825c6c1daeSBarry Smith PetscErrorCode PetscViewerSetType(PetscViewer viewer,PetscViewerType type) 1835c6c1daeSBarry Smith { 1845c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscViewer); 1855c6c1daeSBarry Smith PetscBool match; 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith PetscFunctionBegin; 1885c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 1895c6c1daeSBarry Smith PetscValidCharPointer(type,2); 1905c6c1daeSBarry Smith CHKMEMQ; 1915c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr); 1925c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith /* cleanup any old type that may be there */ 1955c6c1daeSBarry Smith if (viewer->data) { 1965c6c1daeSBarry Smith ierr = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr); 1975c6c1daeSBarry Smith viewer->ops->destroy = PETSC_NULL; 1985c6c1daeSBarry Smith viewer->data = 0; 1995c6c1daeSBarry Smith } 2005c6c1daeSBarry Smith ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr); 2015c6c1daeSBarry Smith 2025c6c1daeSBarry Smith ierr = PetscFListFind(PetscViewerList,((PetscObject)viewer)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 2035c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type); 2045c6c1daeSBarry Smith 2055c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr); 2065c6c1daeSBarry Smith ierr = (*r)(viewer);CHKERRQ(ierr); 2075c6c1daeSBarry Smith PetscFunctionReturn(0); 2085c6c1daeSBarry Smith } 2095c6c1daeSBarry Smith 2105c6c1daeSBarry Smith #undef __FUNCT__ 2115c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRegisterDestroy" 2125c6c1daeSBarry Smith /*@C 2135c6c1daeSBarry Smith PetscViewerRegisterDestroy - Frees the list of PetscViewer methods that were 2145c6c1daeSBarry Smith registered by PetscViewerRegisterDynamic(). 2155c6c1daeSBarry Smith 2165c6c1daeSBarry Smith Not Collective 2175c6c1daeSBarry Smith 2185c6c1daeSBarry Smith Level: developer 2195c6c1daeSBarry Smith 2205c6c1daeSBarry Smith .seealso: PetscViewerRegisterDynamic(), PetscViewerRegisterAll() 2215c6c1daeSBarry Smith @*/ 2225c6c1daeSBarry Smith PetscErrorCode PetscViewerRegisterDestroy(void) 2235c6c1daeSBarry Smith { 2245c6c1daeSBarry Smith PetscErrorCode ierr; 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith PetscFunctionBegin; 2275c6c1daeSBarry Smith ierr = PetscFListDestroy(&PetscViewerList);CHKERRQ(ierr); 2285c6c1daeSBarry Smith PetscFunctionReturn(0); 2295c6c1daeSBarry Smith } 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith #undef __FUNCT__ 2325c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRegister" 2335c6c1daeSBarry Smith PetscErrorCode PetscViewerRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(PetscViewer)) 2345c6c1daeSBarry Smith { 2355c6c1daeSBarry Smith PetscErrorCode ierr; 2365c6c1daeSBarry Smith char fullname[PETSC_MAX_PATH_LEN]; 2375c6c1daeSBarry Smith 2385c6c1daeSBarry Smith PetscFunctionBegin; 2395c6c1daeSBarry Smith ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 2405c6c1daeSBarry Smith ierr = PetscFListAdd(&PetscViewerList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 2415c6c1daeSBarry Smith PetscFunctionReturn(0); 2425c6c1daeSBarry Smith } 2435c6c1daeSBarry Smith 2445c6c1daeSBarry Smith #undef __FUNCT__ 2455c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetFromOptions" 2465c6c1daeSBarry Smith /*@C 2475c6c1daeSBarry Smith PetscViewerSetFromOptions - Sets the graphics type from the options database. 2485c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 2495c6c1daeSBarry Smith 2505c6c1daeSBarry Smith Collective on PetscViewer 2515c6c1daeSBarry Smith 2525c6c1daeSBarry Smith Input Parameter: 2535c6c1daeSBarry Smith . PetscViewer - the graphics context 2545c6c1daeSBarry Smith 2555c6c1daeSBarry Smith Level: intermediate 2565c6c1daeSBarry Smith 2575c6c1daeSBarry Smith Notes: 2585c6c1daeSBarry Smith Must be called after PetscViewerCreate() before the PetscViewer is used. 2595c6c1daeSBarry Smith 2605c6c1daeSBarry Smith Concepts: PetscViewer^setting options 2615c6c1daeSBarry Smith 2625c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith @*/ 2655c6c1daeSBarry Smith PetscErrorCode PetscViewerSetFromOptions(PetscViewer viewer) 2665c6c1daeSBarry Smith { 2675c6c1daeSBarry Smith PetscErrorCode ierr; 2685c6c1daeSBarry Smith char vtype[256]; 2695c6c1daeSBarry Smith PetscBool flg; 2705c6c1daeSBarry Smith 2715c6c1daeSBarry Smith PetscFunctionBegin; 2725c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 2735c6c1daeSBarry Smith 2745c6c1daeSBarry Smith if (!PetscViewerList) { 2755c6c1daeSBarry Smith ierr = PetscViewerRegisterAll(PETSC_NULL);CHKERRQ(ierr); 2765c6c1daeSBarry Smith } 2775c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr); 2785c6c1daeSBarry Smith ierr = PetscOptionsList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char *)(((PetscObject)viewer)->type_name?((PetscObject)viewer)->type_name:PETSCVIEWERASCII),vtype,256,&flg);CHKERRQ(ierr); 2795c6c1daeSBarry Smith if (flg) { 2805c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr); 2815c6c1daeSBarry Smith } 2825c6c1daeSBarry Smith /* type has not been set? */ 2835c6c1daeSBarry Smith if (!((PetscObject)viewer)->type_name) { 2845c6c1daeSBarry Smith ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr); 2855c6c1daeSBarry Smith } 2865c6c1daeSBarry Smith if (viewer->ops->setfromoptions) { 2875c6c1daeSBarry Smith ierr = (*viewer->ops->setfromoptions)(viewer);CHKERRQ(ierr); 2885c6c1daeSBarry Smith } 2895c6c1daeSBarry Smith 2905c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 2915c6c1daeSBarry Smith ierr = PetscObjectProcessOptionsHandlers((PetscObject)viewer);CHKERRQ(ierr); 2925c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 2935c6c1daeSBarry Smith 2945c6c1daeSBarry Smith PetscFunctionReturn(0); 2955c6c1daeSBarry Smith } 296