xref: /petsc/src/sys/classes/viewer/interface/viewreg.c (revision 648c30bcb65f74c3cbd15d7a91a7ed7c1890e25b)
1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/
2e8f14785SLisandro Dalcin #include <petsc/private/hashtable.h>
3e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
4e04113cfSBarry Smith   #include <petscviewersaws.h>
5bfb97211SBarry Smith #endif
65c6c1daeSBarry Smith 
702c9f0b5SLisandro Dalcin PetscFunctionList PetscViewerList = NULL;
85c6c1daeSBarry Smith 
99de0f6ecSBarry Smith PetscOptionsHelpPrinted PetscOptionsHelpPrintedSingleton = NULL;
109de0f6ecSBarry Smith KHASH_SET_INIT_STR(HTPrinted)
119de0f6ecSBarry Smith struct _n_PetscOptionsHelpPrinted {
129de0f6ecSBarry Smith   khash_t(HTPrinted) *printed;
139de0f6ecSBarry Smith   PetscSegBuffer      strings;
149de0f6ecSBarry Smith };
159de0f6ecSBarry Smith 
16d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHelpPrintedDestroy(PetscOptionsHelpPrinted *hp)
17d71ae5a4SJacob Faibussowitsch {
189de0f6ecSBarry Smith   PetscFunctionBegin;
193ba16761SJacob Faibussowitsch   if (!*hp) PetscFunctionReturn(PETSC_SUCCESS);
209de0f6ecSBarry Smith   kh_destroy(HTPrinted, (*hp)->printed);
219566063dSJacob Faibussowitsch   PetscCall(PetscSegBufferDestroy(&(*hp)->strings));
229566063dSJacob Faibussowitsch   PetscCall(PetscFree(*hp));
233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
249de0f6ecSBarry Smith }
259de0f6ecSBarry Smith 
269de0f6ecSBarry Smith /*@C
279de0f6ecSBarry Smith   PetscOptionsHelpPrintedCreate - Creates an object used to manage tracking which help messages have
289de0f6ecSBarry Smith   been printed so they will not be printed again.
299de0f6ecSBarry Smith 
3010450e9eSJacob Faibussowitsch   Output Parameter:
3110450e9eSJacob Faibussowitsch . hp - the created object
3210450e9eSJacob Faibussowitsch 
3320f4b53cSBarry Smith   Not Collective
349de0f6ecSBarry Smith 
359de0f6ecSBarry Smith   Level: developer
369de0f6ecSBarry Smith 
37db781477SPatrick Sanan .seealso: `PetscOptionsHelpPrintedCheck()`, `PetscOptionsHelpPrintChecked()`
389de0f6ecSBarry Smith @*/
39d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHelpPrintedCreate(PetscOptionsHelpPrinted *hp)
40d71ae5a4SJacob Faibussowitsch {
419de0f6ecSBarry Smith   PetscFunctionBegin;
429566063dSJacob Faibussowitsch   PetscCall(PetscNew(hp));
439de0f6ecSBarry Smith   (*hp)->printed = kh_init(HTPrinted);
449566063dSJacob Faibussowitsch   PetscCall(PetscSegBufferCreate(sizeof(char), 10000, &(*hp)->strings));
453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
469de0f6ecSBarry Smith }
479de0f6ecSBarry Smith 
489de0f6ecSBarry Smith /*@C
499de0f6ecSBarry Smith   PetscOptionsHelpPrintedCheck - Checks if a particular pre, name pair has previous been entered (meaning the help message was printed)
509de0f6ecSBarry Smith 
5120f4b53cSBarry Smith   Not Collective
529de0f6ecSBarry Smith 
539de0f6ecSBarry Smith   Input Parameters:
549de0f6ecSBarry Smith + hp   - the object used to manage tracking what help messages have been printed
553f423023SBarry Smith . pre  - the prefix part of the string, many be `NULL`
563f423023SBarry Smith - name - the string to look for (cannot be `NULL`)
579de0f6ecSBarry Smith 
589de0f6ecSBarry Smith   Output Parameter:
593f423023SBarry Smith . found - `PETSC_TRUE` if the string was already set
609de0f6ecSBarry Smith 
619de0f6ecSBarry Smith   Level: intermediate
629de0f6ecSBarry Smith 
63db781477SPatrick Sanan .seealso: `PetscOptionsHelpPrintedCreate()`
649de0f6ecSBarry Smith @*/
65d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrinted hp, const char *pre, const char *name, PetscBool *found)
66d71ae5a4SJacob Faibussowitsch {
679de0f6ecSBarry Smith   size_t l1, l2;
68c1449d8eSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
699de0f6ecSBarry Smith   char *both;
70e8f14785SLisandro Dalcin   int   newitem;
71c1449d8eSBarry Smith #endif
729de0f6ecSBarry Smith 
739de0f6ecSBarry Smith   PetscFunctionBegin;
749566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(pre, &l1));
759566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(name, &l2));
769de0f6ecSBarry Smith   if (l1 + l2 == 0) {
779de0f6ecSBarry Smith     *found = PETSC_FALSE;
783ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
799de0f6ecSBarry Smith   }
80c1449d8eSBarry Smith #if !defined(PETSC_HAVE_THREADSAFETY)
81c6a7a370SJeremy L Thompson   size_t lboth = l1 + l2 + 1;
82c6a7a370SJeremy L Thompson   PetscCall(PetscSegBufferGet(hp->strings, lboth, &both));
83c6a7a370SJeremy L Thompson   PetscCall(PetscStrncpy(both, pre, lboth));
84c6a7a370SJeremy L Thompson   PetscCall(PetscStrncpy(both + l1, name, l2 + 1));
859de0f6ecSBarry Smith   kh_put(HTPrinted, hp->printed, both, &newitem);
86c6a7a370SJeremy L Thompson   if (!newitem) PetscCall(PetscSegBufferUnuse(hp->strings, lboth));
879de0f6ecSBarry Smith   *found = newitem ? PETSC_FALSE : PETSC_TRUE;
88c1449d8eSBarry Smith #else
89c1449d8eSBarry Smith   *found = PETSC_FALSE;
90c1449d8eSBarry Smith #endif
913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9294d6a431SBarry Smith }
9394d6a431SBarry Smith 
94eb55bdffSLawrence Mitchell static PetscBool noviewer = PETSC_FALSE;
95*648c30bcSBarry Smith static PetscBool noviewers[PETSCVIEWERCREATEVIEWEROFFPUSHESMAX];
96eb55bdffSLawrence Mitchell static PetscInt  inoviewers = 0;
97eb55bdffSLawrence Mitchell 
98eb55bdffSLawrence Mitchell /*@
99*648c30bcSBarry Smith   PetscOptionsPushCreateViewerOff - sets if a `PetscOptionsCreateViewer()`, `PetscOptionsViewer(), and `PetscOptionsCreateViewers()` returns viewers.
100eb55bdffSLawrence Mitchell 
101eb55bdffSLawrence Mitchell   Logically Collective
102eb55bdffSLawrence Mitchell 
103eb55bdffSLawrence Mitchell   Input Parameter:
104811af0c4SBarry Smith . flg - `PETSC_TRUE` to turn off viewer creation, `PETSC_FALSE` to turn it on.
105eb55bdffSLawrence Mitchell 
106eb55bdffSLawrence Mitchell   Level: developer
107eb55bdffSLawrence Mitchell 
108811af0c4SBarry Smith   Note:
109c410d8ccSBarry Smith   Calling `XXXViewFromOptions` in an inner loop can be expensive.  This can appear, for example, when using
110*648c30bcSBarry Smith   many small subsolves.  Call this function to control viewer creation in `PetscOptionsCreateViewer()`, thus removing the expensive `XXXViewFromOptions` calls.
111c410d8ccSBarry Smith 
11210450e9eSJacob Faibussowitsch   Developer Notes:
113*648c30bcSBarry Smith   Instead of using this approach, the calls to `PetscOptionsCreateViewer()` can be moved into `XXXSetFromOptions()`
114eb55bdffSLawrence Mitchell 
115*648c30bcSBarry Smith .seealso: [](sec_viewers), `PetscOptionsCreateViewer()`, `PetscOptionsPopCreateViewerOff()`
116eb55bdffSLawrence Mitchell @*/
117*648c30bcSBarry Smith PetscErrorCode PetscOptionsPushCreateViewerOff(PetscBool flg)
118d71ae5a4SJacob Faibussowitsch {
119eb55bdffSLawrence Mitchell   PetscFunctionBegin;
120*648c30bcSBarry Smith   PetscCheck(inoviewers < PETSCVIEWERCREATEVIEWEROFFPUSHESMAX, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Too many PetscOptionsPushCreateViewerOff(), perhaps you forgot PetscOptionsPopCreateViewerOff()?");
121eb55bdffSLawrence Mitchell 
122eb55bdffSLawrence Mitchell   noviewers[inoviewers++] = noviewer;
123eb55bdffSLawrence Mitchell   noviewer                = flg;
1243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
125eb55bdffSLawrence Mitchell }
126eb55bdffSLawrence Mitchell 
127eb55bdffSLawrence Mitchell /*@
128*648c30bcSBarry Smith   PetscOptionsPopCreateViewerOff - reset whether `PetscOptionsCreateViewer()` returns a viewer.
129eb55bdffSLawrence Mitchell 
130eb55bdffSLawrence Mitchell   Logically Collective
131eb55bdffSLawrence Mitchell 
132eb55bdffSLawrence Mitchell   Level: developer
133eb55bdffSLawrence Mitchell 
134811af0c4SBarry Smith   Note:
135*648c30bcSBarry Smith   See `PetscOptionsPushCreateViewerOff()`
136eb55bdffSLawrence Mitchell 
137*648c30bcSBarry Smith .seealso: [](sec_viewers), `PetscOptionsCreateViewer()`, `PetscOptionsPushCreateViewerOff()`
138eb55bdffSLawrence Mitchell @*/
139*648c30bcSBarry Smith PetscErrorCode PetscOptionsPopCreateViewerOff(void)
140d71ae5a4SJacob Faibussowitsch {
141eb55bdffSLawrence Mitchell   PetscFunctionBegin;
142*648c30bcSBarry Smith   PetscCheck(inoviewers, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Too many PetscOptionsPopCreateViewerOff(), perhaps you forgot PetscOptionsPushCreateViewerOff()?");
143eb55bdffSLawrence Mitchell   noviewer = noviewers[--inoviewers];
1443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
145eb55bdffSLawrence Mitchell }
146eb55bdffSLawrence Mitchell 
147eb55bdffSLawrence Mitchell /*@
148*648c30bcSBarry Smith   PetscOptionsGetCreateViewerOff - do `PetscOptionsCreateViewer()`, `PetscOptionsViewer(), and `PetscOptionsCreateViewers()` return viewers
149eb55bdffSLawrence Mitchell 
150eb55bdffSLawrence Mitchell   Logically Collective
151eb55bdffSLawrence Mitchell 
152eb55bdffSLawrence Mitchell   Output Parameter:
153eb55bdffSLawrence Mitchell . flg - whether viewers are returned.
154eb55bdffSLawrence Mitchell 
155eb55bdffSLawrence Mitchell   Level: developer
156eb55bdffSLawrence Mitchell 
157*648c30bcSBarry Smith .seealso: [](sec_viewers), `PetscOptionsCreateViewer()`, `PetscOptionsPushCreateViewerOff()`, `PetscOptionsPopCreateViewerOff()`
158eb55bdffSLawrence Mitchell @*/
159*648c30bcSBarry Smith PetscErrorCode PetscOptionsGetCreateViewerOff(PetscBool *flg)
160d71ae5a4SJacob Faibussowitsch {
161eb55bdffSLawrence Mitchell   PetscFunctionBegin;
1624f572ea9SToby Isaac   PetscAssertPointer(flg, 1);
163eb55bdffSLawrence Mitchell   *flg = noviewer;
1643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
165eb55bdffSLawrence Mitchell }
166eb55bdffSLawrence Mitchell 
167*648c30bcSBarry Smith static PetscErrorCode PetscOptionsCreateViewers_Single(MPI_Comm comm, const char value[], PetscViewer *viewer, PetscViewerFormat *format)
168d71ae5a4SJacob Faibussowitsch {
16909222b14SToby Isaac   char    *loc0_vtype = NULL, *loc1_fname = NULL, *loc2_fmt = NULL, *loc3_fmode = NULL;
17009222b14SToby Isaac   PetscInt cnt;
17109222b14SToby Isaac   size_t   viewer_string_length;
172*648c30bcSBarry Smith   const char *viewers[] = {PETSCVIEWERASCII, PETSCVIEWERBINARY, PETSCVIEWERDRAW, PETSCVIEWERSOCKET, PETSCVIEWERMATLAB, PETSCVIEWERSAWS, PETSCVIEWERVTK, PETSCVIEWERHDF5, PETSCVIEWERGLVIS, PETSCVIEWEREXODUSII, NULL}; /* list should be automatically generated from PetscViewersList */
1732bf49c77SBarry Smith 
1742bf49c77SBarry Smith   PetscFunctionBegin;
17509222b14SToby Isaac   PetscCall(PetscStrlen(value, &viewer_string_length));
17609222b14SToby Isaac   if (!viewer_string_length) {
1776348e711SLisandro Dalcin     if (format) *format = PETSC_VIEWER_DEFAULT;
178*648c30bcSBarry Smith     if (viewer) {
179*648c30bcSBarry Smith       PetscCall(PetscViewerASCIIGetStdout(comm, viewer));
180*648c30bcSBarry Smith       PetscCall(PetscObjectReference((PetscObject)*viewer));
181*648c30bcSBarry Smith     }
18209222b14SToby Isaac     PetscFunctionReturn(PETSC_SUCCESS);
18309222b14SToby Isaac   }
1842bf49c77SBarry Smith 
1859566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(value, &loc0_vtype));
1869566063dSJacob Faibussowitsch   PetscCall(PetscStrchr(loc0_vtype, ':', &loc1_fname));
18735d27ee3SJed Brown   if (loc1_fname) {
18835d27ee3SJed Brown     *loc1_fname++ = 0;
1899566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc1_fname, ':', &loc2_fmt));
19035d27ee3SJed Brown   }
19135d27ee3SJed Brown   if (loc2_fmt) {
19235d27ee3SJed Brown     *loc2_fmt++ = 0;
1939566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc2_fmt, ':', &loc3_fmode));
19435d27ee3SJed Brown   }
19535d27ee3SJed Brown   if (loc3_fmode) *loc3_fmode++ = 0;
1969566063dSJacob Faibussowitsch   PetscCall(PetscStrendswithwhich(*loc0_vtype ? loc0_vtype : "ascii", viewers, &cnt));
19708401ef6SPierre Jolivet   PetscCheck(cnt <= (PetscInt)sizeof(viewers) - 1, comm, PETSC_ERR_ARG_OUTOFRANGE, "Unknown viewer type: %s", loc0_vtype);
198bb1d7374SBarry Smith   if (viewer) {
19935d27ee3SJed Brown     if (!loc1_fname) {
20043b63833SBarry Smith       switch (cnt) {
201d71ae5a4SJacob Faibussowitsch       case 0:
202d71ae5a4SJacob Faibussowitsch         PetscCall(PetscViewerASCIIGetStdout(comm, viewer));
203*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
204d71ae5a4SJacob Faibussowitsch         break;
20543b63833SBarry Smith       case 1:
2069566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_BINARY_(comm))) PetscCall(PETSC_ERR_PLIB);
207*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
20843b63833SBarry Smith         break;
20943b63833SBarry Smith       case 2:
2109566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_DRAW_(comm))) PetscCall(PETSC_ERR_PLIB);
211*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
21243b63833SBarry Smith         break;
213b58ca069SBarry Smith #if defined(PETSC_USE_SOCKET_VIEWER)
21443b63833SBarry Smith       case 3:
2159566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_SOCKET_(comm))) PetscCall(PETSC_ERR_PLIB);
216*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
21743b63833SBarry Smith         break;
218b58ca069SBarry Smith #endif
219d1e78c4fSBarry Smith #if defined(PETSC_HAVE_MATLAB)
22043b63833SBarry Smith       case 4:
2219566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_MATLAB_(comm))) PetscCall(PETSC_ERR_PLIB);
222*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
22343b63833SBarry Smith         break;
22443b63833SBarry Smith #endif
225e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
226bfb97211SBarry Smith       case 5:
2279566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_SAWS_(comm))) PetscCall(PETSC_ERR_PLIB);
228*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
229bfb97211SBarry Smith         break;
230bfb97211SBarry Smith #endif
231a75e6a4aSMatthew G. Knepley #if defined(PETSC_HAVE_HDF5)
232a75e6a4aSMatthew G. Knepley       case 7:
2339566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_HDF5_(comm))) PetscCall(PETSC_ERR_PLIB);
234*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
235a75e6a4aSMatthew G. Knepley         break;
236a75e6a4aSMatthew G. Knepley #endif
2378135c375SStefano Zampini       case 8:
2389566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_GLVIS_(comm))) PetscCall(PETSC_ERR_PLIB);
239*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
2408135c375SStefano Zampini         break;
2411e50132fSMatthew G. Knepley #if defined(PETSC_HAVE_EXODUSII)
2421e50132fSMatthew G. Knepley       case 9:
2439566063dSJacob Faibussowitsch         if (!(*viewer = PETSC_VIEWER_EXODUSII_(comm))) PetscCall(PETSC_ERR_PLIB);
244*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
2451e50132fSMatthew G. Knepley         break;
2461e50132fSMatthew G. Knepley #endif
247d71ae5a4SJacob Faibussowitsch       default:
24809222b14SToby Isaac         SETERRQ(comm, PETSC_ERR_SUP, "Unsupported viewer %s", loc0_vtype);
2497f677774SBarry Smith       }
2507f677774SBarry Smith     } else {
25135d27ee3SJed Brown       if (loc2_fmt && !*loc1_fname && (cnt == 0)) { /* ASCII format without file name */
2529566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIGetStdout(comm, viewer));
253*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
2547f677774SBarry Smith       } else {
2553550efbcSJed Brown         PetscFileMode fmode;
25609222b14SToby Isaac         PetscBool     flag = PETSC_FALSE;
25709222b14SToby Isaac 
2589566063dSJacob Faibussowitsch         PetscCall(PetscViewerCreate(comm, viewer));
2599566063dSJacob Faibussowitsch         PetscCall(PetscViewerSetType(*viewer, *loc0_vtype ? loc0_vtype : "ascii"));
2603550efbcSJed Brown         fmode = FILE_MODE_WRITE;
2613550efbcSJed Brown         if (loc3_fmode && *loc3_fmode) { /* Has non-empty file mode ("write" or "append") */
2629566063dSJacob Faibussowitsch           PetscCall(PetscEnumFind(PetscFileModes, loc3_fmode, (PetscEnum *)&fmode, &flag));
26328b400f6SJacob Faibussowitsch           PetscCheck(flag, comm, PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown file mode: %s", loc3_fmode);
2647f677774SBarry Smith         }
265acd7d2deSBarry Smith         if (loc2_fmt) {
2660ecfd9fcSLisandro Dalcin           PetscBool tk, im;
2679566063dSJacob Faibussowitsch           PetscCall(PetscStrcmp(loc1_fname, "tikz", &tk));
2689566063dSJacob Faibussowitsch           PetscCall(PetscStrcmp(loc1_fname, "image", &im));
2690ecfd9fcSLisandro Dalcin           if (tk || im) {
2709566063dSJacob Faibussowitsch             PetscCall(PetscViewerDrawSetInfo(*viewer, NULL, loc2_fmt, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE));
271acd7d2deSBarry Smith             *loc2_fmt = 0;
272acd7d2deSBarry Smith           }
273acd7d2deSBarry Smith         }
2749566063dSJacob Faibussowitsch         PetscCall(PetscViewerFileSetMode(*viewer, flag ? fmode : FILE_MODE_WRITE));
2759566063dSJacob Faibussowitsch         PetscCall(PetscViewerFileSetName(*viewer, loc1_fname));
2761baa6e33SBarry Smith         if (*loc1_fname) PetscCall(PetscViewerDrawSetDrawType(*viewer, loc1_fname));
2779566063dSJacob Faibussowitsch         PetscCall(PetscViewerSetFromOptions(*viewer));
27805315717SToby Isaac       }
279bb1d7374SBarry Smith     }
28052f76066SLisandro Dalcin   }
2811baa6e33SBarry Smith   if (viewer) PetscCall(PetscViewerSetUp(*viewer));
28235d27ee3SJed Brown   if (loc2_fmt && *loc2_fmt) {
283e156c29bSStefano Zampini     PetscViewerFormat tfmt;
28409222b14SToby Isaac     PetscBool         flag;
285d6acdc46SStefano Zampini 
2869566063dSJacob Faibussowitsch     PetscCall(PetscEnumFind(PetscViewerFormats, loc2_fmt, (PetscEnum *)&tfmt, &flag));
287d6acdc46SStefano Zampini     if (format) *format = tfmt;
2886adde796SStefano Zampini     PetscCheck(flag, comm, PETSC_ERR_SUP, "Unknown viewer format %s", loc2_fmt);
289d6acdc46SStefano Zampini   } else if (viewer && (cnt == 6) && format) { /* Get format from VTK viewer */
2909566063dSJacob Faibussowitsch     PetscCall(PetscViewerGetFormat(*viewer, format));
2917f677774SBarry Smith   }
2929566063dSJacob Faibussowitsch   PetscCall(PetscFree(loc0_vtype));
29309222b14SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
29409222b14SToby Isaac }
29509222b14SToby Isaac 
296*648c30bcSBarry Smith static PetscErrorCode PetscOptionsCreateViewers_Internal(MPI_Comm comm, PetscOptions options, const char pre[], const char name[], PetscInt *n_max_p, PetscViewer viewer[], PetscViewerFormat format[], PetscBool *set, const char func_name[], PetscBool allow_multiple)
29709222b14SToby Isaac {
29809222b14SToby Isaac   const char *value;
29909222b14SToby Isaac   PetscBool   flag, hashelp;
30009222b14SToby Isaac   PetscInt    n_max;
30109222b14SToby Isaac 
30209222b14SToby Isaac   PetscFunctionBegin;
30309222b14SToby Isaac   PetscAssertPointer(name, 4);
30409222b14SToby Isaac   PetscAssertPointer(n_max_p, 5);
30509222b14SToby Isaac   n_max = *n_max_p;
30609222b14SToby Isaac   PetscCheck(n_max >= 0, comm, PETSC_ERR_ARG_OUTOFRANGE, "Invalid size %" PetscInt_FMT " of passed arrays", *n_max_p);
30709222b14SToby Isaac   *n_max_p = 0;
30809222b14SToby Isaac 
30909222b14SToby Isaac   if (set) *set = PETSC_FALSE;
310*648c30bcSBarry Smith   PetscCall(PetscOptionsGetCreateViewerOff(&flag));
31109222b14SToby Isaac   if (flag) PetscFunctionReturn(PETSC_SUCCESS);
31209222b14SToby Isaac 
31309222b14SToby Isaac   PetscCall(PetscOptionsHasHelp(NULL, &hashelp));
31409222b14SToby Isaac   if (hashelp) {
31509222b14SToby Isaac     PetscBool found;
31609222b14SToby Isaac 
31709222b14SToby Isaac     if (!PetscOptionsHelpPrintedSingleton) PetscCall(PetscOptionsHelpPrintedCreate(&PetscOptionsHelpPrintedSingleton));
31809222b14SToby Isaac     PetscCall(PetscOptionsHelpPrintedCheck(PetscOptionsHelpPrintedSingleton, pre, name, &found));
31909222b14SToby Isaac     if (!found && viewer) {
32009222b14SToby Isaac       PetscCall((*PetscHelpPrintf)(comm, "----------------------------------------\nViewer (-%s%s) options:\n", pre ? pre : "", name + 1));
32109222b14SToby Isaac       PetscCall((*PetscHelpPrintf)(comm, "  -%s%s ascii[:[filename][:[format][:append]]]: %s (%s)\n", pre ? pre : "", name + 1, "Prints object to stdout or ASCII file", func_name));
32209222b14SToby Isaac       PetscCall((*PetscHelpPrintf)(comm, "  -%s%s binary[:[filename][:[format][:append]]]: %s (%s)\n", pre ? pre : "", name + 1, "Saves object to a binary file", func_name));
32309222b14SToby Isaac       PetscCall((*PetscHelpPrintf)(comm, "  -%s%s draw[:[drawtype][:filename|format]] %s (%s)\n", pre ? pre : "", name + 1, "Draws object", func_name));
32409222b14SToby Isaac       PetscCall((*PetscHelpPrintf)(comm, "  -%s%s socket[:port]: %s (%s)\n", pre ? pre : "", name + 1, "Pushes object to a Unix socket", func_name));
32509222b14SToby Isaac       PetscCall((*PetscHelpPrintf)(comm, "  -%s%s saws[:communicatorname]: %s (%s)\n", pre ? pre : "", name + 1, "Publishes object to SAWs", func_name));
32609222b14SToby Isaac       if (allow_multiple) PetscCall((*PetscHelpPrintf)(comm, "  -%s%s v1[,v2,...]: %s (%s)\n", pre ? pre : "", name + 1, "Multiple viewers", func_name));
3272bf49c77SBarry Smith     }
3282bf49c77SBarry Smith   }
32909222b14SToby Isaac 
33009222b14SToby Isaac   PetscCall(PetscOptionsFindPair(options, pre, name, &value, &flag));
33109222b14SToby Isaac   if (flag) {
33209222b14SToby Isaac     if (set) *set = PETSC_TRUE;
33309222b14SToby Isaac     if (!value) {
33409222b14SToby Isaac       PetscCheck(n_max > 0, comm, PETSC_ERR_ARG_SIZ, "More viewers (1) than max available (0)");
33509222b14SToby Isaac       if (format) *format = PETSC_VIEWER_DEFAULT;
336*648c30bcSBarry Smith       if (viewer) {
337*648c30bcSBarry Smith         PetscCall(PetscViewerASCIIGetStdout(comm, viewer));
338*648c30bcSBarry Smith         PetscCall(PetscObjectReference((PetscObject)*viewer));
339*648c30bcSBarry Smith       }
34009222b14SToby Isaac       *n_max_p = 1;
34109222b14SToby Isaac     } else {
34209222b14SToby Isaac       char  *loc0_viewer_string = NULL, *this_viewer_string = NULL;
34309222b14SToby Isaac       size_t viewer_string_length;
34409222b14SToby Isaac 
34509222b14SToby Isaac       PetscCall(PetscStrallocpy(value, &loc0_viewer_string));
34609222b14SToby Isaac       PetscCall(PetscStrlen(loc0_viewer_string, &viewer_string_length));
34709222b14SToby Isaac       this_viewer_string = loc0_viewer_string;
34809222b14SToby Isaac 
34909222b14SToby Isaac       do {
35009222b14SToby Isaac         PetscViewer       *this_viewer;
35109222b14SToby Isaac         PetscViewerFormat *this_viewer_format;
35209222b14SToby Isaac         char              *next_viewer_string = NULL;
35309222b14SToby Isaac         char              *comma_separator    = NULL;
35409222b14SToby Isaac         PetscInt           n                  = *n_max_p;
35509222b14SToby Isaac 
35609222b14SToby Isaac         PetscCheck(n < n_max, comm, PETSC_ERR_PLIB, "More viewers than max available (%d)", (int)n_max);
35709222b14SToby Isaac 
35809222b14SToby Isaac         PetscCall(PetscStrchr(this_viewer_string, ',', &comma_separator));
35909222b14SToby Isaac         if (comma_separator) {
360*648c30bcSBarry Smith           PetscCheck(allow_multiple, comm, PETSC_ERR_ARG_OUTOFRANGE, "Trying to pass multiple viewers to %s: only one allowed.  Use PetscOptionsCreateViewers() instead", func_name);
36109222b14SToby Isaac           *comma_separator   = 0;
36209222b14SToby Isaac           next_viewer_string = comma_separator + 1;
36309222b14SToby Isaac         }
3648e3a54c0SPierre Jolivet         this_viewer = PetscSafePointerPlusOffset(viewer, n);
36509222b14SToby Isaac         if (this_viewer) *this_viewer = NULL;
3668e3a54c0SPierre Jolivet         this_viewer_format = PetscSafePointerPlusOffset(format, n);
36709222b14SToby Isaac         if (this_viewer_format) *this_viewer_format = PETSC_VIEWER_DEFAULT;
368*648c30bcSBarry Smith         PetscCall(PetscOptionsCreateViewers_Single(comm, this_viewer_string, this_viewer, this_viewer_format));
36909222b14SToby Isaac         this_viewer_string = next_viewer_string;
37009222b14SToby Isaac         (*n_max_p)++;
37109222b14SToby Isaac       } while (this_viewer_string);
37209222b14SToby Isaac       PetscCall(PetscFree(loc0_viewer_string));
37309222b14SToby Isaac     }
37409222b14SToby Isaac   }
37509222b14SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
37609222b14SToby Isaac }
37709222b14SToby Isaac 
37809222b14SToby Isaac /*@C
379*648c30bcSBarry Smith   PetscOptionsCreateViewer - Creates a viewer appropriate for the type indicated by the user
38009222b14SToby Isaac 
38109222b14SToby Isaac   Collective
38209222b14SToby Isaac 
38309222b14SToby Isaac   Input Parameters:
38409222b14SToby Isaac + comm    - the communicator to own the viewer
38509222b14SToby Isaac . options - options database, use `NULL` for default global database
38609222b14SToby Isaac . pre     - the string to prepend to the name or `NULL`
387cd791dc2SBarry Smith - name    - the options database name that will be checked for
38809222b14SToby Isaac 
38909222b14SToby Isaac   Output Parameters:
39009222b14SToby Isaac + viewer - the viewer, pass `NULL` if not needed
39109222b14SToby Isaac . format - the `PetscViewerFormat` requested by the user, pass `NULL` if not needed
39209222b14SToby Isaac - set    - `PETSC_TRUE` if found, else `PETSC_FALSE`
39309222b14SToby Isaac 
39409222b14SToby Isaac   Level: intermediate
39509222b14SToby Isaac 
39609222b14SToby Isaac   Notes:
39789efdf64SMatthew G. Knepley   The argument has the following form
39889efdf64SMatthew G. Knepley .vb
39989efdf64SMatthew G. Knepley     type:filename:format:filemode
40089efdf64SMatthew G. Knepley .ve
40189efdf64SMatthew G. Knepley   where all parts are optional, but you need to include the colon to access the next part. The mode argument must a valid `PetscFileMode`, i.e. read, write, append, update, or append_update. For example, to read from an HDF5 file, use
40289efdf64SMatthew G. Knepley .vb
40389efdf64SMatthew G. Knepley     hdf5:sol.h5::read
40489efdf64SMatthew G. Knepley .ve
40589efdf64SMatthew G. Knepley 
40609222b14SToby Isaac   If no value is provided ascii:stdout is used
40709222b14SToby Isaac +       ascii[:[filename][:[format][:append]]]  -  defaults to stdout - format can be one of ascii_info, ascii_info_detail, or ascii_matlab,
40809222b14SToby Isaac   for example ascii::ascii_info prints just the information about the object not all details
40909222b14SToby Isaac   unless :append is given filename opens in write mode, overwriting what was already there
41009222b14SToby Isaac .       binary[:[filename][:[format][:append]]] -  defaults to the file binaryoutput
41109222b14SToby Isaac .       draw[:drawtype[:filename]]              -  for example, draw:tikz, draw:tikz:figure.tex  or draw:x
41209222b14SToby Isaac .       socket[:port]                           -  defaults to the standard output port
41309222b14SToby Isaac -       saws[:communicatorname]                 -   publishes object to the Scientific Application Webserver (SAWs)
41409222b14SToby Isaac 
41509222b14SToby Isaac   You can control whether calls to this function create a viewer (or return early with *set of `PETSC_FALSE`) with
416*648c30bcSBarry Smith   `PetscOptionsPushCreateViewerOff()`.  This is useful if calling many small subsolves, in which case XXXViewFromOptions can take
41709222b14SToby Isaac   an appreciable fraction of the runtime.
41809222b14SToby Isaac 
41909222b14SToby Isaac   If PETSc is configured with `--with-viewfromoptions=0` this function always returns with *set of `PETSC_FALSE`
42009222b14SToby Isaac 
421cd791dc2SBarry Smith   This routine is thread-safe for accessing predefined `PetscViewer`s like `PETSC_VIEWER_STDOUT_SELF` but not for accessing
422cd791dc2SBarry Smith   files by name.
423cd791dc2SBarry Smith 
424*648c30bcSBarry Smith .seealso: [](sec_viewers), `PetscViewerDestroy()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`,
42509222b14SToby Isaac           `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
42609222b14SToby Isaac           `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`,
42709222b14SToby Isaac           `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
42809222b14SToby Isaac           `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
42909222b14SToby Isaac           `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
430*648c30bcSBarry Smith           `PetscOptionsFList()`, `PetscOptionsEList()`, `PetscOptionsPushCreateViewerOff()`, `PetscOptionsPopCreateViewerOff()`,
431*648c30bcSBarry Smith           `PetscOptionsCreateViewerOff()`
43209222b14SToby Isaac @*/
433*648c30bcSBarry Smith PetscErrorCode PetscOptionsCreateViewer(MPI_Comm comm, PetscOptions options, const char pre[], const char name[], PetscViewer *viewer, PetscViewerFormat *format, PetscBool *set)
43409222b14SToby Isaac {
43509222b14SToby Isaac   PetscInt  n_max = 1;
43609222b14SToby Isaac   PetscBool set_internal;
43709222b14SToby Isaac 
43809222b14SToby Isaac   PetscFunctionBegin;
43909222b14SToby Isaac   if (viewer) *viewer = NULL;
44009222b14SToby Isaac   if (format) *format = PETSC_VIEWER_DEFAULT;
441*648c30bcSBarry Smith   PetscCall(PetscOptionsCreateViewers_Internal(comm, options, pre, name, &n_max, viewer, format, &set_internal, PETSC_FUNCTION_NAME, PETSC_FALSE));
44209222b14SToby Isaac   if (set_internal) PetscAssert(n_max == 1, comm, PETSC_ERR_PLIB, "Unexpected: %d != 1 viewers set", (int)n_max);
44309222b14SToby Isaac   if (set) *set = set_internal;
44409222b14SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
44509222b14SToby Isaac }
44609222b14SToby Isaac 
44709222b14SToby Isaac /*@C
448*648c30bcSBarry Smith   PetscOptionsCreateViewers - Create multiple viewers from a comma-separated list in the options database
44909222b14SToby Isaac 
45009222b14SToby Isaac   Collective
45109222b14SToby Isaac 
45209222b14SToby Isaac   Input Parameters:
453cd791dc2SBarry Smith + comm    - the communicator to own the viewers
45409222b14SToby Isaac . options - options database, use `NULL` for default global database
45509222b14SToby Isaac . pre     - the string to prepend to the name or `NULL`
456cd791dc2SBarry Smith . name    - the options database name that will be checked for
45709222b14SToby Isaac - n_max   - on input: the maximum number of viewers; on output: the number of viewers in the comma-separated list
45809222b14SToby Isaac 
45909222b14SToby Isaac   Output Parameters:
46009222b14SToby Isaac + viewers - an array to hold at least `n_max` `PetscViewer`s, or `NULL` if not needed; on output: if not `NULL`, the
46109222b14SToby Isaac             first `n_max` entries are initialized `PetscViewer`s
46209222b14SToby Isaac . formats - an array to hold at least `n_max` `PetscViewerFormat`s, or `NULL` if not needed; on output: if not
46309222b14SToby Isaac             `NULL`, the first `n_max` entries are valid `PetscViewewFormat`s
46409222b14SToby Isaac - set     - `PETSC_TRUE` if found, else `PETSC_FALSE`
46509222b14SToby Isaac 
46609222b14SToby Isaac   Level: intermediate
46709222b14SToby Isaac 
46809222b14SToby Isaac   Note:
469*648c30bcSBarry Smith   See `PetscOptionsCreateViewer()` for how the format strings for the viewers are interpreted.
470*648c30bcSBarry Smith 
471*648c30bcSBarry Smith   Use `PetscViewerDestroy()` on each viewer, otherwise a memory leak will occur.
47209222b14SToby Isaac 
47309222b14SToby Isaac   If PETSc is configured with `--with-viewfromoptions=0` this function always returns with `n_max` of 0 and `set` of `PETSC_FALSE`
47409222b14SToby Isaac 
475*648c30bcSBarry Smith .seealso: [](sec_viewers), `PetscOptionsCreateViewer()`
47609222b14SToby Isaac @*/
477*648c30bcSBarry Smith PetscErrorCode PetscOptionsCreateViewers(MPI_Comm comm, PetscOptions options, const char pre[], const char name[], PetscInt *n_max, PetscViewer viewers[], PetscViewerFormat formats[], PetscBool *set)
47809222b14SToby Isaac {
47909222b14SToby Isaac   PetscFunctionBegin;
480*648c30bcSBarry Smith   PetscCall(PetscOptionsCreateViewers_Internal(comm, options, pre, name, n_max, viewers, formats, set, PETSC_FUNCTION_NAME, PETSC_TRUE));
4813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4822bf49c77SBarry Smith }
4832bf49c77SBarry Smith 
4845c6c1daeSBarry Smith /*@
485c410d8ccSBarry Smith   PetscViewerCreate - Creates a viewing context. A `PetscViewer` represents a file, a graphical window, a Unix socket or a variety of other ways
486c410d8ccSBarry Smith   of viewing a PETSc object
4875c6c1daeSBarry Smith 
488d083f849SBarry Smith   Collective
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith   Input Parameter:
4915c6c1daeSBarry Smith . comm - MPI communicator
4925c6c1daeSBarry Smith 
4935c6c1daeSBarry Smith   Output Parameter:
494811af0c4SBarry Smith . inviewer - location to put the `PetscViewer` context
4955c6c1daeSBarry Smith 
4965c6c1daeSBarry Smith   Level: advanced
4975c6c1daeSBarry Smith 
498d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerDestroy()`, `PetscViewerSetType()`, `PetscViewerType`
4995c6c1daeSBarry Smith @*/
500d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerCreate(MPI_Comm comm, PetscViewer *inviewer)
501d71ae5a4SJacob Faibussowitsch {
5025c6c1daeSBarry Smith   PetscViewer viewer;
5035c6c1daeSBarry Smith 
5045c6c1daeSBarry Smith   PetscFunctionBegin;
505377f809aSBarry Smith   PetscAssertPointer(inviewer, 2);
5069566063dSJacob Faibussowitsch   PetscCall(PetscViewerInitializePackage());
5079566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(viewer, PETSC_VIEWER_CLASSID, "PetscViewer", "PetscViewer", "Viewer", comm, PetscViewerDestroy, PetscViewerView));
5085c6c1daeSBarry Smith   *inviewer    = viewer;
50902c9f0b5SLisandro Dalcin   viewer->data = NULL;
5103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5115c6c1daeSBarry Smith }
5125c6c1daeSBarry Smith 
513cc4c1da9SBarry Smith /*@
514811af0c4SBarry Smith   PetscViewerSetType - Builds `PetscViewer` for a particular implementation.
5155c6c1daeSBarry Smith 
516c3339decSBarry Smith   Collective
5175c6c1daeSBarry Smith 
518d8d19677SJose E. Roman   Input Parameters:
519811af0c4SBarry Smith + viewer - the `PetscViewer` context obtained with `PetscViewerCreate()`
520811af0c4SBarry Smith - type   - for example, `PETSCVIEWERASCII`
5215c6c1daeSBarry Smith 
5223c7db156SBarry Smith   Options Database Key:
5233c7db156SBarry Smith . -viewer_type  <type> - Sets the type; use -help for a list of available methods (for instance, ascii)
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith   Level: advanced
5265c6c1daeSBarry Smith 
527811af0c4SBarry Smith   Note:
5283f423023SBarry Smith   See `PetscViewerType` for possible values
5295c6c1daeSBarry Smith 
530d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerGetType()`, `PetscViewerType`, `PetscViewerPushFormat()`
5315c6c1daeSBarry Smith @*/
532d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetType(PetscViewer viewer, PetscViewerType type)
533d71ae5a4SJacob Faibussowitsch {
5345c6c1daeSBarry Smith   PetscBool match;
5355f80ce2aSJacob Faibussowitsch   PetscErrorCode (*r)(PetscViewer);
5365c6c1daeSBarry Smith 
5375c6c1daeSBarry Smith   PetscFunctionBegin;
5385c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5394f572ea9SToby Isaac   PetscAssertPointer(type, 2);
5409566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, type, &match));
5413ba16761SJacob Faibussowitsch   if (match) PetscFunctionReturn(PETSC_SUCCESS);
5425c6c1daeSBarry Smith 
5435c6c1daeSBarry Smith   /* cleanup any old type that may be there */
544dbbe0bcdSBarry Smith   PetscTryTypeMethod(viewer, destroy);
5450298fd71SBarry Smith   viewer->ops->destroy = NULL;
54602c9f0b5SLisandro Dalcin   viewer->data         = NULL;
547dbbe0bcdSBarry Smith 
5489566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(viewer->ops, sizeof(struct _PetscViewerOps)));
5495c6c1daeSBarry Smith 
5509566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(PetscViewerList, type, &r));
5516adde796SStefano Zampini   PetscCheck(r, PetscObjectComm((PetscObject)viewer), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unknown PetscViewer type given: %s", type);
5525c6c1daeSBarry Smith 
5539566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)viewer, type));
5549566063dSJacob Faibussowitsch   PetscCall((*r)(viewer));
5553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5565c6c1daeSBarry Smith }
5575c6c1daeSBarry Smith 
5581c84c290SBarry Smith /*@C
559c410d8ccSBarry Smith   PetscViewerRegister - Adds a viewer to those available for use with `PetscViewerSetType()`
5601c84c290SBarry Smith 
561cc4c1da9SBarry Smith   Not Collective, No Fortran Support
5621c84c290SBarry Smith 
5631c84c290SBarry Smith   Input Parameters:
5642fe279fdSBarry Smith + sname    - name of a new user-defined viewer
5652fe279fdSBarry Smith - function - routine to create method context
5661c84c290SBarry Smith 
5671c84c290SBarry Smith   Level: developer
568811af0c4SBarry Smith 
569811af0c4SBarry Smith   Note:
570811af0c4SBarry Smith   `PetscViewerRegister()` may be called multiple times to add several user-defined viewers.
5711c84c290SBarry Smith 
572aec76313SJacob Faibussowitsch   Example Usage:
5731c84c290SBarry Smith .vb
574bdf89e91SBarry Smith    PetscViewerRegister("my_viewer_type", MyViewerCreate);
5751c84c290SBarry Smith .ve
5761c84c290SBarry Smith 
5771c84c290SBarry Smith   Then, your solver can be chosen with the procedural interface via
5781c84c290SBarry Smith $     PetscViewerSetType(viewer, "my_viewer_type")
5791c84c290SBarry Smith   or at runtime via the option
5801c84c290SBarry Smith $     -viewer_type my_viewer_type
5811c84c290SBarry Smith 
582d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerRegisterAll()`
5831c84c290SBarry Smith  @*/
584d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerRegister(const char *sname, PetscErrorCode (*function)(PetscViewer))
585d71ae5a4SJacob Faibussowitsch {
5865c6c1daeSBarry Smith   PetscFunctionBegin;
5879566063dSJacob Faibussowitsch   PetscCall(PetscViewerInitializePackage());
5889566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&PetscViewerList, sname, function));
5893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5905c6c1daeSBarry Smith }
5915c6c1daeSBarry Smith 
5925c6c1daeSBarry Smith /*@C
5933f423023SBarry Smith   PetscViewerSetFromOptions - Sets various options for a viewer based on values in the options database.
5945c6c1daeSBarry Smith 
595c3339decSBarry Smith   Collective
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith   Input Parameter:
598811af0c4SBarry Smith . viewer - the viewer context
5995c6c1daeSBarry Smith 
6005c6c1daeSBarry Smith   Level: intermediate
6015c6c1daeSBarry Smith 
602811af0c4SBarry Smith   Note:
603c410d8ccSBarry Smith   Must be called after `PetscViewerCreate()` but before the `PetscViewer` is used.
6045c6c1daeSBarry Smith 
605d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerCreate()`, `PetscViewerSetType()`, `PetscViewerType`
6065c6c1daeSBarry Smith @*/
607d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetFromOptions(PetscViewer viewer)
608d71ae5a4SJacob Faibussowitsch {
6095c6c1daeSBarry Smith   char      vtype[256];
6105c6c1daeSBarry Smith   PetscBool flg;
6115c6c1daeSBarry Smith 
6125c6c1daeSBarry Smith   PetscFunctionBegin;
6135c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6145c6c1daeSBarry Smith 
61548a46eb9SPierre Jolivet   if (!PetscViewerList) PetscCall(PetscViewerRegisterAll());
616d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)viewer);
6179566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-viewer_type", "Type of PetscViewer", "None", PetscViewerList, (char *)(((PetscObject)viewer)->type_name ? ((PetscObject)viewer)->type_name : PETSCVIEWERASCII), vtype, 256, &flg));
6181baa6e33SBarry Smith   if (flg) PetscCall(PetscViewerSetType(viewer, vtype));
6195c6c1daeSBarry Smith   /* type has not been set? */
62048a46eb9SPierre Jolivet   if (!((PetscObject)viewer)->type_name) PetscCall(PetscViewerSetType(viewer, PETSCVIEWERASCII));
621dbbe0bcdSBarry Smith   PetscTryTypeMethod(viewer, setfromoptions, PetscOptionsObject);
6225c6c1daeSBarry Smith 
6235c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
624dbbe0bcdSBarry Smith   PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)viewer, PetscOptionsObject));
6259566063dSJacob Faibussowitsch   PetscCall(PetscViewerViewFromOptions(viewer, NULL, "-viewer_view"));
626d0609cedSBarry Smith   PetscOptionsEnd();
6273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6285c6c1daeSBarry Smith }
629816f7b76SBarry Smith 
630d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFlowControlStart(PetscViewer viewer, PetscInt *mcnt, PetscInt *cnt)
631d71ae5a4SJacob Faibussowitsch {
632816f7b76SBarry Smith   PetscFunctionBegin;
6339566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetFlowControl(viewer, mcnt));
6349566063dSJacob Faibussowitsch   PetscCall(PetscViewerBinaryGetFlowControl(viewer, cnt));
6353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
636816f7b76SBarry Smith }
637816f7b76SBarry Smith 
638d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFlowControlStepMain(PetscViewer viewer, PetscInt i, PetscInt *mcnt, PetscInt cnt)
639d71ae5a4SJacob Faibussowitsch {
640816f7b76SBarry Smith   MPI_Comm comm;
641816f7b76SBarry Smith 
642816f7b76SBarry Smith   PetscFunctionBegin;
6439566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
644816f7b76SBarry Smith   if (i >= *mcnt) {
645816f7b76SBarry Smith     *mcnt += cnt;
6469566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(mcnt, 1, MPIU_INT, 0, comm));
647816f7b76SBarry Smith   }
6483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
649816f7b76SBarry Smith }
650816f7b76SBarry Smith 
651d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFlowControlEndMain(PetscViewer viewer, PetscInt *mcnt)
652d71ae5a4SJacob Faibussowitsch {
653816f7b76SBarry Smith   MPI_Comm comm;
6544d86920dSPierre Jolivet 
655816f7b76SBarry Smith   PetscFunctionBegin;
6569566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
657816f7b76SBarry Smith   *mcnt = 0;
6589566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Bcast(mcnt, 1, MPIU_INT, 0, comm));
6593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
660816f7b76SBarry Smith }
661816f7b76SBarry Smith 
662d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFlowControlStepWorker(PetscViewer viewer, PetscMPIInt rank, PetscInt *mcnt)
663d71ae5a4SJacob Faibussowitsch {
664816f7b76SBarry Smith   MPI_Comm comm;
6654d86920dSPierre Jolivet 
666816f7b76SBarry Smith   PetscFunctionBegin;
6679566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
668816f7b76SBarry Smith   while (PETSC_TRUE) {
669816f7b76SBarry Smith     if (rank < *mcnt) break;
6709566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(mcnt, 1, MPIU_INT, 0, comm));
671816f7b76SBarry Smith   }
6723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
673816f7b76SBarry Smith }
674816f7b76SBarry Smith 
675d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerFlowControlEndWorker(PetscViewer viewer, PetscInt *mcnt)
676d71ae5a4SJacob Faibussowitsch {
677816f7b76SBarry Smith   MPI_Comm comm;
6784d86920dSPierre Jolivet 
679816f7b76SBarry Smith   PetscFunctionBegin;
6809566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
681816f7b76SBarry Smith   while (PETSC_TRUE) {
6829566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(mcnt, 1, MPIU_INT, 0, comm));
683816f7b76SBarry Smith     if (!*mcnt) break;
684816f7b76SBarry Smith   }
6853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
686816f7b76SBarry Smith }
687