xref: /petsc/src/sys/classes/viewer/interface/viewreg.c (revision 94d6a4312157890dfee99620aa7c220c7b8c1f9b)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>  /*I "petscviewer.h" I*/
3e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
4e04113cfSBarry Smith #include <petscviewersaws.h>
5bfb97211SBarry Smith #endif
65c6c1daeSBarry Smith 
7140e18c1SBarry Smith PetscFunctionList PetscViewerList = 0;
85c6c1daeSBarry Smith 
9*94d6a431SBarry Smith /*
10*94d6a431SBarry Smith   A standard run of an implicit TS generated 60 help message hashes,
11*94d6a431SBarry Smith   thus we reserve room for 5 combinations of prefixes. If that is not
12*94d6a431SBarry Smith   enough then any additional help messages will be printed multiple times.
13*94d6a431SBarry Smith */
14*94d6a431SBarry Smith #define PETSCSTRINGHASHSIZE 300
15*94d6a431SBarry Smith typedef struct {
16*94d6a431SBarry Smith   int           cnt;
17*94d6a431SBarry Smith   unsigned long hashes[PETSCSTRINGHASHSIZE];
18*94d6a431SBarry Smith } PetscStrHash;
19*94d6a431SBarry Smith 
20*94d6a431SBarry Smith /*
21*94d6a431SBarry Smith     This is the djb2 due to Dan Bernstein http://www.cse.yorku.ca/~oz/hash.html
22*94d6a431SBarry Smith */
23*94d6a431SBarry Smith PETSC_STATIC_INLINE unsigned long PetscStrHashHash(const char *pre,const char *str)
24*94d6a431SBarry Smith {
25*94d6a431SBarry Smith   unsigned long hash = 5381;
26*94d6a431SBarry Smith   int           c;
27*94d6a431SBarry Smith 
28*94d6a431SBarry Smith   if (pre) {
29*94d6a431SBarry Smith     while ((c = *pre++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
30*94d6a431SBarry Smith   }
31*94d6a431SBarry Smith   while ((c = *str++)) hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
32*94d6a431SBarry Smith   return hash;
33*94d6a431SBarry Smith }
34*94d6a431SBarry Smith 
35*94d6a431SBarry Smith PETSC_STATIC_INLINE PetscBool PetscStrHashCheck(PetscStrHash *ht,const char *pre,const char *str)
36*94d6a431SBarry Smith {
37*94d6a431SBarry Smith   unsigned long h = PetscStrHashHash(pre,str);
38*94d6a431SBarry Smith   int           i;
39*94d6a431SBarry Smith   for (i=0; i<ht->cnt; i++) {
40*94d6a431SBarry Smith     if (ht->hashes[i] == h) return PETSC_TRUE;
41*94d6a431SBarry Smith   }
42*94d6a431SBarry Smith   if (ht->cnt >= PETSCSTRINGHASHSIZE) return PETSC_FALSE;
43*94d6a431SBarry Smith   ht->hashes[ht->cnt++] = h;
44*94d6a431SBarry Smith   return PETSC_FALSE;
45*94d6a431SBarry Smith }
46*94d6a431SBarry Smith 
47*94d6a431SBarry Smith 
482bf49c77SBarry Smith #undef __FUNCT__
492bf49c77SBarry Smith #define __FUNCT__ "PetscOptionsGetViewer"
502bf49c77SBarry Smith /*@C
512bf49c77SBarry Smith    PetscOptionsGetViewer - Gets a viewer appropriate for the type indicated by the user
522bf49c77SBarry Smith 
532bf49c77SBarry Smith    Collective on MPI_Comm
542bf49c77SBarry Smith 
552bf49c77SBarry Smith    Input Parameters:
562bf49c77SBarry Smith +  comm - the communicator to own the viewer
570298fd71SBarry Smith .  pre - the string to prepend to the name or NULL
582bf49c77SBarry Smith -  name - the option one is seeking
592bf49c77SBarry Smith 
602bf49c77SBarry Smith    Output Parameter:
61bb1d7374SBarry Smith +  viewer - the viewer, pass NULL if not needed
62bb1d7374SBarry Smith .  format - the PetscViewerFormat requested by the user, pass NULL if not needed
632bf49c77SBarry Smith -  set - PETSC_TRUE if found, else PETSC_FALSE
642bf49c77SBarry Smith 
652bf49c77SBarry Smith    Level: intermediate
662bf49c77SBarry Smith 
672bf49c77SBarry Smith    Notes: If no value is provided ascii:stdout is used
68d1da0b69SBarry Smith $       ascii[:[filename][:[format][:append]]]    defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab,
69d1da0b69SBarry Smith                                                   for example ascii::ascii_info prints just the information about the object not all details
70d1da0b69SBarry Smith                                                   unless :append is given filename opens in write mode, overwriting what was already there
71d1da0b69SBarry Smith $       binary[:[filename][:[format][:append]]]   defaults to the file binaryoutput
7220610d12SBarry Smith $       draw[:drawtype]                           for example, draw:tikz  or draw:x
732bf49c77SBarry Smith $       socket[:port]                             defaults to the standard output port
742a359c20SBarry Smith $       saws[:communicatorname]                    publishes object to the Scientific Application Webserver (SAWs)
752bf49c77SBarry Smith 
76cffb1e40SBarry Smith    Use PetscViewerDestroy() after using the viewer, otherwise a memory leak will occur
772bf49c77SBarry Smith 
7827b0f280SBarry Smith    If PETSc is configured with --with-viewfromoptions=0 this function always returns with *set of PETSC_FALSE
7927b0f280SBarry Smith 
802bf49c77SBarry Smith .seealso: PetscOptionsGetReal(), PetscOptionsHasName(), PetscOptionsGetString(),
812bf49c77SBarry Smith           PetscOptionsGetIntArray(), PetscOptionsGetRealArray(), PetscOptionsBool()
822bf49c77SBarry Smith           PetscOptionsInt(), PetscOptionsString(), PetscOptionsReal(), PetscOptionsBool(),
832bf49c77SBarry Smith           PetscOptionsName(), PetscOptionsBegin(), PetscOptionsEnd(), PetscOptionsHead(),
842bf49c77SBarry Smith           PetscOptionsStringArray(),PetscOptionsRealArray(), PetscOptionsScalar(),
852bf49c77SBarry Smith           PetscOptionsBoolGroupBegin(), PetscOptionsBoolGroup(), PetscOptionsBoolGroupEnd(),
86a264d7a6SBarry Smith           PetscOptionsFList(), PetscOptionsEList()
872bf49c77SBarry Smith @*/
88cffb1e40SBarry Smith PetscErrorCode  PetscOptionsGetViewer(MPI_Comm comm,const char pre[],const char name[],PetscViewer *viewer,PetscViewerFormat *format,PetscBool  *set)
892bf49c77SBarry Smith {
902bf49c77SBarry Smith   char                 *value;
912bf49c77SBarry Smith   PetscErrorCode       ierr;
9220610d12SBarry Smith   PetscBool            flag,hashelp;
93*94d6a431SBarry Smith   static  PetscStrHash ht;
942bf49c77SBarry Smith 
952bf49c77SBarry Smith   PetscFunctionBegin;
962bf49c77SBarry Smith   PetscValidCharPointer(name,3);
972bf49c77SBarry Smith 
9827b0f280SBarry Smith   if (set) *set = PETSC_FALSE;
9927b0f280SBarry Smith #if defined(PETSC_SKIP_VIEWFROMOPTIONS)
10027b0f280SBarry Smith   PetscFunctionReturn(0);
10127b0f280SBarry Smith #endif
10227b0f280SBarry Smith 
103c5929fdfSBarry Smith   ierr = PetscOptionsHasName(NULL,NULL,"-help",&hashelp);CHKERRQ(ierr);
10420610d12SBarry Smith   if (hashelp) {
105*94d6a431SBarry Smith     if (!PetscStrHashCheck(&ht,pre,name)) {
106*94d6a431SBarry Smith       if (viewer) {
107*94d6a431SBarry Smith         ierr = (*PetscHelpPrintf)(comm,"\n  -%s%s ascii[:[filename][:[format][:append]]]: %s (%s)\n",pre ? pre : "",name+1,"Prints object to stdout or ASCII file","PetscOptionsGetViewer");CHKERRQ(ierr);
108*94d6a431SBarry Smith         ierr = (*PetscHelpPrintf)(comm,"    -%s%s binary[:[filename][:[format][:append]]]: %s (%s)\n",pre ? pre : "",name+1,"Saves object to a binary file","PetscOptionsGetViewer");CHKERRQ(ierr);
109*94d6a431SBarry Smith         ierr = (*PetscHelpPrintf)(comm,"    -%s%s draw[:drawtype]: %s (%s)\n",pre ? pre : "",name+1,"Draws object","PetscOptionsGetViewer");CHKERRQ(ierr);
110*94d6a431SBarry Smith         ierr = (*PetscHelpPrintf)(comm,"    -%s%s socket[:port]: %s (%s)\n",pre ? pre : "",name+1,"Pushes object to a Unix socket","PetscOptionsGetViewer");CHKERRQ(ierr);
111*94d6a431SBarry Smith         ierr = (*PetscHelpPrintf)(comm,"    -%s%s saws[:communicatorname]: %s (%s)\n\n",pre ? pre : "",name+1,"Publishes object to SAWs","PetscOptionsGetViewer");CHKERRQ(ierr);
112*94d6a431SBarry Smith       } else {
113*94d6a431SBarry Smith         ierr = (*PetscHelpPrintf)(comm,"    -%s%s\n",pre ? pre : "",name+1);CHKERRQ(ierr);
114*94d6a431SBarry Smith       }
115*94d6a431SBarry Smith     }
11620610d12SBarry Smith   }
117685405a1SBarry Smith 
118e3f3e4b6SBarry Smith   if (format) *format = PETSC_VIEWER_DEFAULT;
119c5929fdfSBarry Smith   ierr = PetscOptionsFindPair_Private(NULL,pre,name,&value,&flag);CHKERRQ(ierr);
1202bf49c77SBarry Smith   if (flag) {
1212bf49c77SBarry Smith     if (set) *set = PETSC_TRUE;
1222bf49c77SBarry Smith     if (!value) {
123bb1d7374SBarry Smith       if (viewer) {
1242bf49c77SBarry Smith         ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr);
125706a11cbSBarry Smith         ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr);
126bb1d7374SBarry Smith       }
1272bf49c77SBarry Smith     } else {
12835d27ee3SJed Brown       char       *loc0_vtype,*loc1_fname,*loc2_fmt = NULL,*loc3_fmode = NULL;
1292bf49c77SBarry Smith       PetscInt   cnt;
130a75e6a4aSMatthew G. Knepley       const char *viewers[] = {PETSCVIEWERASCII,PETSCVIEWERBINARY,PETSCVIEWERDRAW,PETSCVIEWERSOCKET,PETSCVIEWERMATLAB,PETSCVIEWERSAWS,PETSCVIEWERVTK,PETSCVIEWERHDF5,0};
1312bf49c77SBarry Smith 
13235d27ee3SJed Brown       ierr = PetscStrallocpy(value,&loc0_vtype);CHKERRQ(ierr);
13335d27ee3SJed Brown       ierr = PetscStrchr(loc0_vtype,':',&loc1_fname);CHKERRQ(ierr);
13435d27ee3SJed Brown       if (loc1_fname) {
13535d27ee3SJed Brown         *loc1_fname++ = 0;
13635d27ee3SJed Brown         ierr = PetscStrchr(loc1_fname,':',&loc2_fmt);CHKERRQ(ierr);
13735d27ee3SJed Brown       }
13835d27ee3SJed Brown       if (loc2_fmt) {
13935d27ee3SJed Brown         *loc2_fmt++ = 0;
14035d27ee3SJed Brown         ierr = PetscStrchr(loc2_fmt,':',&loc3_fmode);CHKERRQ(ierr);
14135d27ee3SJed Brown       }
14235d27ee3SJed Brown       if (loc3_fmode) *loc3_fmode++ = 0;
14335d27ee3SJed Brown       ierr = PetscStrendswithwhich(*loc0_vtype ? loc0_vtype : "ascii",viewers,&cnt);CHKERRQ(ierr);
14435d27ee3SJed Brown       if (cnt > (PetscInt) sizeof(viewers)-1) SETERRQ1(comm,PETSC_ERR_ARG_OUTOFRANGE,"Unknown viewer type: %s",loc0_vtype);
145bb1d7374SBarry Smith       if (viewer) {
14635d27ee3SJed Brown         if (!loc1_fname) {
14743b63833SBarry Smith           switch (cnt) {
14843b63833SBarry Smith           case 0:
1492bf49c77SBarry Smith             ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr);
15043b63833SBarry Smith             break;
15143b63833SBarry Smith           case 1:
152aa1c909bSJed Brown             if (!(*viewer = PETSC_VIEWER_BINARY_(comm))) CHKERRQ(PETSC_ERR_PLIB);
15343b63833SBarry Smith             break;
15443b63833SBarry Smith           case 2:
155aa1c909bSJed Brown             if (!(*viewer = PETSC_VIEWER_DRAW_(comm))) CHKERRQ(PETSC_ERR_PLIB);
15643b63833SBarry Smith             break;
157b58ca069SBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER)
15843b63833SBarry Smith           case 3:
159aa1c909bSJed Brown             if (!(*viewer = PETSC_VIEWER_SOCKET_(comm))) CHKERRQ(PETSC_ERR_PLIB);
16043b63833SBarry Smith             break;
161b58ca069SBarry Smith #endif
16243b63833SBarry Smith #if defined(PETSC_HAVE_MATLAB_ENGINE)
16343b63833SBarry Smith           case 4:
164aa1c909bSJed Brown             if (!(*viewer = PETSC_VIEWER_MATLAB_(comm))) CHKERRQ(PETSC_ERR_PLIB);
16543b63833SBarry Smith             break;
16643b63833SBarry Smith #endif
167e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
168bfb97211SBarry Smith           case 5:
169e04113cfSBarry Smith             if (!(*viewer = PETSC_VIEWER_SAWS_(comm))) CHKERRQ(PETSC_ERR_PLIB);
170bfb97211SBarry Smith             break;
171bfb97211SBarry Smith #endif
172a75e6a4aSMatthew G. Knepley #if defined(PETSC_HAVE_HDF5)
173a75e6a4aSMatthew G. Knepley           case 7:
174a75e6a4aSMatthew G. Knepley             if (!(*viewer = PETSC_VIEWER_HDF5_(comm))) CHKERRQ(PETSC_ERR_PLIB);
175a75e6a4aSMatthew G. Knepley             break;
176a75e6a4aSMatthew G. Knepley #endif
177aa1c909bSJed Brown           default: SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unsupported viewer %s",loc0_vtype);
1787f677774SBarry Smith           }
179706a11cbSBarry Smith           ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr);
1807f677774SBarry Smith         } else {
18135d27ee3SJed Brown           if (loc2_fmt && !*loc1_fname && (cnt == 0)) { /* ASCII format without file name */
1827f677774SBarry Smith             ierr = PetscViewerASCIIGetStdout(comm,viewer);CHKERRQ(ierr);
183706a11cbSBarry Smith             ierr = PetscObjectReference((PetscObject)*viewer);CHKERRQ(ierr);
1847f677774SBarry Smith           } else {
1853550efbcSJed Brown             PetscFileMode fmode;
1862bf49c77SBarry Smith             ierr = PetscViewerCreate(comm,viewer);CHKERRQ(ierr);
18735d27ee3SJed Brown             ierr = PetscViewerSetType(*viewer,*loc0_vtype ? loc0_vtype : "ascii");CHKERRQ(ierr);
1883550efbcSJed Brown             fmode = FILE_MODE_WRITE;
1893550efbcSJed Brown             if (loc3_fmode && *loc3_fmode) { /* Has non-empty file mode ("write" or "append") */
19035d27ee3SJed Brown               ierr = PetscEnumFind(PetscFileModes,loc3_fmode,(PetscEnum*)&fmode,&flag);CHKERRQ(ierr);
1913550efbcSJed Brown               if (!flag) SETERRQ1(comm,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown file mode: %s",loc3_fmode);
1927f677774SBarry Smith             }
1933550efbcSJed Brown             ierr = PetscViewerFileSetMode(*viewer,flag?fmode:FILE_MODE_WRITE);CHKERRQ(ierr);
19435d27ee3SJed Brown             ierr = PetscViewerFileSetName(*viewer,loc1_fname);CHKERRQ(ierr);
195d1da0b69SBarry Smith             ierr = PetscViewerDrawSetDrawType(*viewer,loc1_fname);CHKERRQ(ierr);
19605315717SToby Isaac           }
19705315717SToby Isaac         }
198bb1d7374SBarry Smith       }
199bb1d7374SBarry Smith       if (viewer) {
200bb1d7374SBarry Smith         ierr = PetscViewerSetUp(*viewer);CHKERRQ(ierr);
201bb1d7374SBarry Smith       }
20235d27ee3SJed Brown       if (loc2_fmt && *loc2_fmt) {
20335d27ee3SJed Brown         ierr = PetscEnumFind(PetscViewerFormats,loc2_fmt,(PetscEnum*)format,&flag);CHKERRQ(ierr);
20435d27ee3SJed Brown         if (!flag) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Unknown viewer format %s",loc2_fmt);CHKERRQ(ierr);
2057f677774SBarry Smith       }
20635d27ee3SJed Brown       ierr = PetscFree(loc0_vtype);CHKERRQ(ierr);
2072bf49c77SBarry Smith     }
2082bf49c77SBarry Smith   }
2092bf49c77SBarry Smith   PetscFunctionReturn(0);
2102bf49c77SBarry Smith }
2112bf49c77SBarry Smith 
2122bf49c77SBarry Smith #undef __FUNCT__
2135c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerCreate"
2145c6c1daeSBarry Smith /*@
2155c6c1daeSBarry Smith    PetscViewerCreate - Creates a viewing context
2165c6c1daeSBarry Smith 
2175c6c1daeSBarry Smith    Collective on MPI_Comm
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith    Input Parameter:
2205c6c1daeSBarry Smith .  comm - MPI communicator
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith    Output Parameter:
2235c6c1daeSBarry Smith .  inviewer - location to put the PetscViewer context
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith    Level: advanced
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith    Concepts: graphics^creating PetscViewer
2285c6c1daeSBarry Smith    Concepts: file input/output^creating PetscViewer
2295c6c1daeSBarry Smith    Concepts: sockets^creating PetscViewer
2305c6c1daeSBarry Smith 
2315c6c1daeSBarry Smith .seealso: PetscViewerDestroy(), PetscViewerSetType(), PetscViewerType
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith @*/
2345c6c1daeSBarry Smith PetscErrorCode  PetscViewerCreate(MPI_Comm comm,PetscViewer *inviewer)
2355c6c1daeSBarry Smith {
2365c6c1daeSBarry Smith   PetscViewer    viewer;
2375c6c1daeSBarry Smith   PetscErrorCode ierr;
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith   PetscFunctionBegin;
2405c6c1daeSBarry Smith   *inviewer = 0;
241607a6623SBarry Smith   ierr = PetscViewerInitializePackage();CHKERRQ(ierr);
24273107ff1SLisandro Dalcin   ierr         = PetscHeaderCreate(viewer,PETSC_VIEWER_CLASSID,"PetscViewer","PetscViewer","Viewer",comm,PetscViewerDestroy,NULL);CHKERRQ(ierr);
2435c6c1daeSBarry Smith   *inviewer    = viewer;
2445c6c1daeSBarry Smith   viewer->data = 0;
2455c6c1daeSBarry Smith   PetscFunctionReturn(0);
2465c6c1daeSBarry Smith }
2475c6c1daeSBarry Smith 
2485c6c1daeSBarry Smith #undef __FUNCT__
2495c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetType"
2505c6c1daeSBarry Smith /*@C
2515c6c1daeSBarry Smith    PetscViewerSetType - Builds PetscViewer for a particular implementation.
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith    Collective on PetscViewer
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith    Input Parameter:
2565c6c1daeSBarry Smith +  viewer      - the PetscViewer context
2578f6c3df8SBarry Smith -  type        - for example, PETSCVIEWERASCII
2585c6c1daeSBarry Smith 
2595c6c1daeSBarry Smith    Options Database Command:
2605c6c1daeSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list
2615c6c1daeSBarry Smith     of available methods (for instance, ascii)
2625c6c1daeSBarry Smith 
2635c6c1daeSBarry Smith    Level: advanced
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith    Notes:
2665c6c1daeSBarry Smith    See "include/petscviewer.h" for available methods (for instance,
2678f6c3df8SBarry Smith    PETSCVIEWERSOCKET)
2685c6c1daeSBarry Smith 
2696a9046bcSBarry Smith .seealso: PetscViewerCreate(), PetscViewerGetType(), PetscViewerType, PetscViewerPushFormat()
2705c6c1daeSBarry Smith @*/
2715c6c1daeSBarry Smith PetscErrorCode  PetscViewerSetType(PetscViewer viewer,PetscViewerType type)
2725c6c1daeSBarry Smith {
2735c6c1daeSBarry Smith   PetscErrorCode ierr,(*r)(PetscViewer);
2745c6c1daeSBarry Smith   PetscBool      match;
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith   PetscFunctionBegin;
2775c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
2785c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
2795c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,type,&match);CHKERRQ(ierr);
2805c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2815c6c1daeSBarry Smith 
2825c6c1daeSBarry Smith   /* cleanup any old type that may be there */
2835c6c1daeSBarry Smith   if (viewer->data) {
2845c6c1daeSBarry Smith     ierr         = (*viewer->ops->destroy)(viewer);CHKERRQ(ierr);
285a297a907SKarl Rupp 
2860298fd71SBarry Smith     viewer->ops->destroy = NULL;
2875c6c1daeSBarry Smith     viewer->data         = 0;
2885c6c1daeSBarry Smith   }
2895c6c1daeSBarry Smith   ierr = PetscMemzero(viewer->ops,sizeof(struct _PetscViewerOps));CHKERRQ(ierr);
2905c6c1daeSBarry Smith 
2911c9cd337SJed Brown   ierr =  PetscFunctionListFind(PetscViewerList,type,&r);CHKERRQ(ierr);
2925c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscViewer type given: %s",type);
2935c6c1daeSBarry Smith 
2945c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)viewer,type);CHKERRQ(ierr);
2955c6c1daeSBarry Smith   ierr = (*r)(viewer);CHKERRQ(ierr);
2965c6c1daeSBarry Smith   PetscFunctionReturn(0);
2975c6c1daeSBarry Smith }
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith #undef __FUNCT__
3005c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRegister"
3011c84c290SBarry Smith /*@C
3021c84c290SBarry Smith    PetscViewerRegister - Adds a viewer
3031c84c290SBarry Smith 
3041c84c290SBarry Smith    Not Collective
3051c84c290SBarry Smith 
3061c84c290SBarry Smith    Input Parameters:
3071c84c290SBarry Smith +  name_solver - name of a new user-defined viewer
3081c84c290SBarry Smith -  routine_create - routine to create method context
3091c84c290SBarry Smith 
3101c84c290SBarry Smith    Level: developer
3111c84c290SBarry Smith    Notes:
3121c84c290SBarry Smith    PetscViewerRegister() may be called multiple times to add several user-defined viewers.
3131c84c290SBarry Smith 
3141c84c290SBarry Smith    Sample usage:
3151c84c290SBarry Smith .vb
316bdf89e91SBarry Smith    PetscViewerRegister("my_viewer_type",MyViewerCreate);
3171c84c290SBarry Smith .ve
3181c84c290SBarry Smith 
3191c84c290SBarry Smith    Then, your solver can be chosen with the procedural interface via
3201c84c290SBarry Smith $     PetscViewerSetType(viewer,"my_viewer_type")
3211c84c290SBarry Smith    or at runtime via the option
3221c84c290SBarry Smith $     -viewer_type my_viewer_type
3231c84c290SBarry Smith 
3241c84c290SBarry Smith   Concepts: registering^Viewers
3251c84c290SBarry Smith 
3261c84c290SBarry Smith .seealso: PetscViewerRegisterAll(), PetscViewerRegisterDestroy()
3271c84c290SBarry Smith  @*/
328bdf89e91SBarry Smith PetscErrorCode  PetscViewerRegister(const char *sname,PetscErrorCode (*function)(PetscViewer))
3295c6c1daeSBarry Smith {
3305c6c1daeSBarry Smith   PetscErrorCode ierr;
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith   PetscFunctionBegin;
333a240a19fSJed Brown   ierr = PetscFunctionListAdd(&PetscViewerList,sname,function);CHKERRQ(ierr);
3345c6c1daeSBarry Smith   PetscFunctionReturn(0);
3355c6c1daeSBarry Smith }
3365c6c1daeSBarry Smith 
3375c6c1daeSBarry Smith #undef __FUNCT__
3385c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerSetFromOptions"
3395c6c1daeSBarry Smith /*@C
3405c6c1daeSBarry Smith    PetscViewerSetFromOptions - Sets the graphics type from the options database.
3415c6c1daeSBarry Smith       Defaults to a PETSc X windows graphics.
3425c6c1daeSBarry Smith 
3435c6c1daeSBarry Smith    Collective on PetscViewer
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith    Input Parameter:
3465c6c1daeSBarry Smith .     PetscViewer - the graphics context
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith    Level: intermediate
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith    Notes:
3515c6c1daeSBarry Smith     Must be called after PetscViewerCreate() before the PetscViewer is used.
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith   Concepts: PetscViewer^setting options
3545c6c1daeSBarry Smith 
3555c6c1daeSBarry Smith .seealso: PetscViewerCreate(), PetscViewerSetType(), PetscViewerType
3565c6c1daeSBarry Smith 
3575c6c1daeSBarry Smith @*/
3585c6c1daeSBarry Smith PetscErrorCode  PetscViewerSetFromOptions(PetscViewer viewer)
3595c6c1daeSBarry Smith {
3605c6c1daeSBarry Smith   PetscErrorCode    ierr;
3615c6c1daeSBarry Smith   char              vtype[256];
3625c6c1daeSBarry Smith   PetscBool         flg;
3635c6c1daeSBarry Smith 
3645c6c1daeSBarry Smith   PetscFunctionBegin;
3655c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
3665c6c1daeSBarry Smith 
3675c6c1daeSBarry Smith   if (!PetscViewerList) {
368607a6623SBarry Smith     ierr = PetscViewerRegisterAll();CHKERRQ(ierr);
3695c6c1daeSBarry Smith   }
3705c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)viewer);CHKERRQ(ierr);
371a264d7a6SBarry Smith   ierr = PetscOptionsFList("-viewer_type","Type of PetscViewer","None",PetscViewerList,(char*)(((PetscObject)viewer)->type_name ? ((PetscObject)viewer)->type_name : PETSCVIEWERASCII),vtype,256,&flg);CHKERRQ(ierr);
3725c6c1daeSBarry Smith   if (flg) {
3735c6c1daeSBarry Smith     ierr = PetscViewerSetType(viewer,vtype);CHKERRQ(ierr);
3745c6c1daeSBarry Smith   }
3755c6c1daeSBarry Smith   /* type has not been set? */
3765c6c1daeSBarry Smith   if (!((PetscObject)viewer)->type_name) {
3775c6c1daeSBarry Smith     ierr = PetscViewerSetType(viewer,PETSCVIEWERASCII);CHKERRQ(ierr);
3785c6c1daeSBarry Smith   }
3795c6c1daeSBarry Smith   if (viewer->ops->setfromoptions) {
380e55864a3SBarry Smith     ierr = (*viewer->ops->setfromoptions)(PetscOptionsObject,viewer);CHKERRQ(ierr);
3815c6c1daeSBarry Smith   }
3825c6c1daeSBarry Smith 
3835c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
3840633abcbSJed Brown   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)viewer);CHKERRQ(ierr);
385ce1779c8SBarry Smith   ierr = PetscViewerViewFromOptions(viewer,NULL,"-viewer_view");CHKERRQ(ierr);
3865c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
3875c6c1daeSBarry Smith   PetscFunctionReturn(0);
3885c6c1daeSBarry Smith }
389816f7b76SBarry Smith 
390816f7b76SBarry Smith #undef __FUNCT__
391816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStart"
392816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStart(PetscViewer viewer,PetscInt *mcnt,PetscInt *cnt)
393816f7b76SBarry Smith {
394816f7b76SBarry Smith   PetscErrorCode ierr;
395816f7b76SBarry Smith   PetscFunctionBegin;
396816f7b76SBarry Smith   ierr = PetscViewerBinaryGetFlowControl(viewer,mcnt);CHKERRQ(ierr);
397816f7b76SBarry Smith   ierr = PetscViewerBinaryGetFlowControl(viewer,cnt);CHKERRQ(ierr);
398816f7b76SBarry Smith   PetscFunctionReturn(0);
399816f7b76SBarry Smith }
400816f7b76SBarry Smith 
401816f7b76SBarry Smith #undef __FUNCT__
402816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepMaster"
403816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepMaster(PetscViewer viewer,PetscInt i,PetscInt *mcnt,PetscInt cnt)
404816f7b76SBarry Smith {
405816f7b76SBarry Smith   PetscErrorCode ierr;
406816f7b76SBarry Smith   MPI_Comm       comm;
407816f7b76SBarry Smith 
408816f7b76SBarry Smith   PetscFunctionBegin;
409816f7b76SBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
410816f7b76SBarry Smith   if (i >= *mcnt) {
411816f7b76SBarry Smith     *mcnt += cnt;
412816f7b76SBarry Smith     ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr);
413816f7b76SBarry Smith   }
414816f7b76SBarry Smith   PetscFunctionReturn(0);
415816f7b76SBarry Smith }
416816f7b76SBarry Smith 
417816f7b76SBarry Smith #undef __FUNCT__
418816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndMaster"
419816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndMaster(PetscViewer viewer,PetscInt *mcnt)
420816f7b76SBarry Smith {
421816f7b76SBarry Smith   PetscErrorCode ierr;
422816f7b76SBarry Smith   MPI_Comm       comm;
423816f7b76SBarry Smith   PetscFunctionBegin;
424816f7b76SBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
425816f7b76SBarry Smith   *mcnt = 0;
426816f7b76SBarry Smith   ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr);
427816f7b76SBarry Smith   PetscFunctionReturn(0);
428816f7b76SBarry Smith }
429816f7b76SBarry Smith 
430816f7b76SBarry Smith #undef __FUNCT__
431816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlStepWorker"
432816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlStepWorker(PetscViewer viewer,PetscMPIInt rank,PetscInt *mcnt)
433816f7b76SBarry Smith {
434816f7b76SBarry Smith   PetscErrorCode ierr;
435816f7b76SBarry Smith   MPI_Comm       comm;
436816f7b76SBarry Smith   PetscFunctionBegin;
437816f7b76SBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
438816f7b76SBarry Smith   while (PETSC_TRUE) {
439816f7b76SBarry Smith     if (rank < *mcnt) break;
440816f7b76SBarry Smith     ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr);
441816f7b76SBarry Smith   }
442816f7b76SBarry Smith   PetscFunctionReturn(0);
443816f7b76SBarry Smith }
444816f7b76SBarry Smith 
445816f7b76SBarry Smith #undef __FUNCT__
446816f7b76SBarry Smith #define __FUNCT__ "PetscViewerFlowControlEndWorker"
447816f7b76SBarry Smith PetscErrorCode PetscViewerFlowControlEndWorker(PetscViewer viewer,PetscInt *mcnt)
448816f7b76SBarry Smith {
449816f7b76SBarry Smith   PetscErrorCode ierr;
450816f7b76SBarry Smith   MPI_Comm       comm;
451816f7b76SBarry Smith   PetscFunctionBegin;
452816f7b76SBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
453816f7b76SBarry Smith   while (PETSC_TRUE) {
454816f7b76SBarry Smith     ierr = MPI_Bcast(mcnt,1,MPIU_INT,0,comm);CHKERRQ(ierr);
455816f7b76SBarry Smith     if (!*mcnt) break;
456816f7b76SBarry Smith   }
457816f7b76SBarry Smith   PetscFunctionReturn(0);
458816f7b76SBarry Smith }
459