xref: /petsc/src/sys/classes/viewer/interface/viewreg.c (revision cffb1e400d6c3ea2f6cb522ae2432dc42cf29e73)
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