xref: /petsc/src/sys/info/verboseinfo.c (revision 8b86dd2ee2f9cfc0672efa8d65ff1071d586f9de)
15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith       PetscInfo() is contained in a different file from the other profiling to
35c6c1daeSBarry Smith    allow it to be replaced at link time by an alternative routine.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I    "petscsys.h"   I*/
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith /*
8e94e781bSJacob Faibussowitsch   The next set of variables determine which, if any, PetscInfo() calls are used.
9e94e781bSJacob Faibussowitsch   If PetscLogPrintInfo is false, no info messages are printed.
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith   If PetscInfoFlags[OBJECT_CLASSID - PETSC_SMALLEST_CLASSID] is zero, no messages related
125c6c1daeSBarry Smith   to that object are printed. OBJECT_CLASSID is, for example, MAT_CLASSID.
13e94e781bSJacob Faibussowitsch   Note for developers: the PetscInfoFlags array is currently 160 entries large, to ensure headroom. Perhaps it is worth
14e94e781bSJacob Faibussowitsch   dynamically allocating this array intelligently rather than just some big number.
15e94e781bSJacob Faibussowitsch 
16e94e781bSJacob Faibussowitsch   PetscInfoFilename determines where PetscInfo() output is piped.
17e94e781bSJacob Faibussowitsch   PetscInfoClassnames holds a char array of classes which are filtered out/for in PetscInfo() calls.
185c6c1daeSBarry Smith */
19908793a3SLisandro Dalcin const char *const        PetscInfoCommFlags[]   = {"all", "no_self", "only_self", "PetscInfoCommFlag", "PETSC_INFO_COMM_", NULL};
205f115e29SVaclav Hapla static PetscBool         PetscInfoClassesLocked = PETSC_FALSE, PetscInfoInvertClasses = PETSC_FALSE, PetscInfoClassesSet = PETSC_FALSE;
21e94e781bSJacob Faibussowitsch static char            **PetscInfoClassnames = NULL;
22e94e781bSJacob Faibussowitsch static char             *PetscInfoFilename   = NULL;
23e94e781bSJacob Faibussowitsch static PetscInt          PetscInfoNumClasses = -1;
24e94e781bSJacob Faibussowitsch static PetscInfoCommFlag PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
259371c9d4SSatish Balay static int               PetscInfoFlags[]    = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
269371c9d4SSatish Balay                                                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
279371c9d4SSatish Balay                                                 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
285f115e29SVaclav Hapla PetscBool                PetscLogPrintInfo   = PETSC_FALSE;
29e94e781bSJacob Faibussowitsch FILE                    *PetscInfoFile       = NULL;
305c6c1daeSBarry Smith 
31e94e781bSJacob Faibussowitsch /*@
32811af0c4SBarry Smith     PetscInfoEnabled - Checks whether a given OBJECT_CLASSID is allowed to print using `PetscInfo()`
33e94e781bSJacob Faibussowitsch 
34e94e781bSJacob Faibussowitsch     Not Collective
35e94e781bSJacob Faibussowitsch 
36e94e781bSJacob Faibussowitsch     Input Parameters:
37811af0c4SBarry Smith .   classid - `PetscClassid` retrieved from a `PetscObject` e.g. `VEC_CLASSID`
38e94e781bSJacob Faibussowitsch 
39e94e781bSJacob Faibussowitsch     Output Parameter:
40811af0c4SBarry Smith .   enabled - `PetscBool` indicating whether this classid is allowed to print
41e94e781bSJacob Faibussowitsch 
42811af0c4SBarry Smith     Note:
43811af0c4SBarry Smith     Use `PETSC_SMALLEST_CLASSID` to check if "sys" `PetscInfo()` calls are enabled. When PETSc is configured with debugging
44811af0c4SBarry Smith     support this function checks if classid >= `PETSC_SMALLEST_CLASSID`, otherwise it assumes valid classid.
45e94e781bSJacob Faibussowitsch 
46fe9b927eSVaclav Hapla     Level: advanced
47e94e781bSJacob Faibussowitsch 
48db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoGetInfo()`, `PetscObjectGetClassid()`
49e94e781bSJacob Faibussowitsch @*/
509371c9d4SSatish Balay PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled) {
51e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
52*8b86dd2eSJacob Faibussowitsch   PetscValidBoolPointer(enabled, 2);
5308401ef6SPierre Jolivet   PetscCheck(classid >= PETSC_SMALLEST_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Classid (current: %d) must be equal to or greater than PETSC_SMALLEST_CLASSID", classid);
54e94e781bSJacob Faibussowitsch   *enabled = (PetscBool)(PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
55e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
56e94e781bSJacob Faibussowitsch }
57e94e781bSJacob Faibussowitsch 
58e94e781bSJacob Faibussowitsch /*@
59811af0c4SBarry Smith     PetscInfoAllow - Enables/disables `PetscInfo()` messages
605c6c1daeSBarry Smith 
61fe9b927eSVaclav Hapla     Not Collective
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith     Input Parameter:
64811af0c4SBarry Smith .   flag - `PETSC_TRUE` or `PETSC_FALSE`
655c6c1daeSBarry Smith 
665c6c1daeSBarry Smith     Level: advanced
675c6c1daeSBarry Smith 
68db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()`
695c6c1daeSBarry Smith @*/
709371c9d4SSatish Balay PetscErrorCode PetscInfoAllow(PetscBool flag) {
71e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
72e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
73e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
74e94e781bSJacob Faibussowitsch }
75e94e781bSJacob Faibussowitsch 
76e94e781bSJacob Faibussowitsch /*@C
77811af0c4SBarry Smith     PetscInfoSetFile - Sets the printing destination for all `PetscInfo()` calls
78e94e781bSJacob Faibussowitsch 
79fe9b927eSVaclav Hapla     Not Collective
80e94e781bSJacob Faibussowitsch 
81d8d19677SJose E. Roman     Input Parameters:
82811af0c4SBarry Smith +   filename - Name of the file where `PetscInfo()` will print to
83811af0c4SBarry Smith -   mode - Write mode passed to PetscFOpen()`
84e94e781bSJacob Faibussowitsch 
85811af0c4SBarry Smith     Note:
86811af0c4SBarry Smith     Use filename = NULL to set `PetscInfo()` to write to `PETSC_STDOUT`.
87e94e781bSJacob Faibussowitsch 
88e94e781bSJacob Faibussowitsch     Level: advanced
89e94e781bSJacob Faibussowitsch 
90db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()`
91e94e781bSJacob Faibussowitsch @*/
929371c9d4SSatish Balay PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[]) {
935c6c1daeSBarry Smith   PetscFunctionBegin;
94e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
959566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
96e94e781bSJacob Faibussowitsch   if (filename) {
97*8b86dd2eSJacob Faibussowitsch     PetscMPIInt rank;
98*8b86dd2eSJacob Faibussowitsch     char        fname[PETSC_MAX_PATH_LEN], tname[11];
99*8b86dd2eSJacob Faibussowitsch 
100e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
101*8b86dd2eSJacob Faibussowitsch     PetscValidCharPointer(mode, 2);
1029566063dSJacob Faibussowitsch     PetscCall(PetscFixFilename(filename, fname));
1039566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(fname, &PetscInfoFilename));
104*8b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
105*8b86dd2eSJacob Faibussowitsch     PetscCall(PetscSNPrintf(tname, PETSC_STATIC_ARRAY_LENGTH(tname), ".%d", rank));
106*8b86dd2eSJacob Faibussowitsch     PetscCall(PetscStrlcat(fname, tname, PETSC_STATIC_ARRAY_LENGTH(fname)));
107*8b86dd2eSJacob Faibussowitsch     {
108*8b86dd2eSJacob Faibussowitsch       const PetscBool oldflag = PetscLogPrintInfo;
109*8b86dd2eSJacob Faibussowitsch 
1109371c9d4SSatish Balay       PetscLogPrintInfo = PETSC_FALSE;
111*8b86dd2eSJacob Faibussowitsch       PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, mode, &PetscInfoFile));
112e94e781bSJacob Faibussowitsch       PetscLogPrintInfo = oldflag;
113*8b86dd2eSJacob Faibussowitsch       /*
114*8b86dd2eSJacob Faibussowitsch         PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the
115*8b86dd2eSJacob Faibussowitsch         PetscInfo call inside it, and call it afterwards so that it actually writes to file
116*8b86dd2eSJacob Faibussowitsch       */
117*8b86dd2eSJacob Faibussowitsch     }
1189566063dSJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname));
119e94e781bSJacob Faibussowitsch   }
120e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
121e94e781bSJacob Faibussowitsch }
122a297a907SKarl Rupp 
123e94e781bSJacob Faibussowitsch /*@C
124811af0c4SBarry Smith     PetscInfoGetFile - Gets the name and FILE pointer of the file where `PetscInfo()` prints to
125e94e781bSJacob Faibussowitsch 
126e94e781bSJacob Faibussowitsch     Not Collective
127e94e781bSJacob Faibussowitsch 
128e94e781bSJacob Faibussowitsch     Output Parameters:
129e94e781bSJacob Faibussowitsch +   filename - The name of the output file
130e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
131e94e781bSJacob Faibussowitsch 
132e94e781bSJacob Faibussowitsch     Level: advanced
133e94e781bSJacob Faibussowitsch 
134e94e781bSJacob Faibussowitsch     Note:
135811af0c4SBarry Smith     This routine allocates and copies the filename so that the filename survives `PetscInfoDestroy()`. The user is
136e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
137e94e781bSJacob Faibussowitsch 
138e94e781bSJacob Faibussowitsch     Fortran Note:
139e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
140e94e781bSJacob Faibussowitsch 
141db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
142e94e781bSJacob Faibussowitsch @*/
1439371c9d4SSatish Balay PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) {
144e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
145e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
146e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
1479566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
148e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
149e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
150e94e781bSJacob Faibussowitsch }
151e94e781bSJacob Faibussowitsch 
152e94e781bSJacob Faibussowitsch /*@C
153811af0c4SBarry Smith     PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
154e94e781bSJacob Faibussowitsch 
155e94e781bSJacob Faibussowitsch     Not Collective
156e94e781bSJacob Faibussowitsch 
157e94e781bSJacob Faibussowitsch     Input Parameters:
158811af0c4SBarry Smith +   exclude - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that
159e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
160*8b86dd2eSJacob Faibussowitsch .   n - Number of classes to filter for (size of classnames)
161e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
162e94e781bSJacob Faibussowitsch 
163e94e781bSJacob Faibussowitsch     Notes:
164811af0c4SBarry Smith     This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called.
165e94e781bSJacob Faibussowitsch 
166811af0c4SBarry Smith     Names in the classnames list should correspond to the names returned by `PetscObjectGetClassName()`.
167e94e781bSJacob Faibussowitsch 
168e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
169811af0c4SBarry Smith     The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away.
170e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
171811af0c4SBarry Smith     Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`).
172811af0c4SBarry Smith 
173811af0c4SBarry Smith     Fortran Note:
174811af0c4SBarry Smith     Not for use in Fortran
175e94e781bSJacob Faibussowitsch 
176e94e781bSJacob Faibussowitsch     Level: developer
177e94e781bSJacob Faibussowitsch 
178db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
179e94e781bSJacob Faibussowitsch @*/
180*8b86dd2eSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames) {
181e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
18228b400f6SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
1839566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
184*8b86dd2eSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames));
185*8b86dd2eSJacob Faibussowitsch   PetscInfoNumClasses    = n;
186e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
187e94e781bSJacob Faibussowitsch   /* Process sys class right away */
188*8b86dd2eSJacob Faibussowitsch   {
189*8b86dd2eSJacob Faibussowitsch     const PetscClassId id = PETSC_SMALLEST_CLASSID;
190*8b86dd2eSJacob Faibussowitsch 
191*8b86dd2eSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &id));
192e94e781bSJacob Faibussowitsch   }
1935f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
194e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
195e94e781bSJacob Faibussowitsch }
196e94e781bSJacob Faibussowitsch 
197e94e781bSJacob Faibussowitsch /*@C
198811af0c4SBarry Smith     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
199e94e781bSJacob Faibussowitsch 
200e94e781bSJacob Faibussowitsch     Not Collective
201e94e781bSJacob Faibussowitsch 
20201d2d390SJose E. Roman     Input Parameter:
203e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
204e94e781bSJacob Faibussowitsch 
205e94e781bSJacob Faibussowitsch     Output Parameter:
206811af0c4SBarry Smith .   found - `PetscBool` indicating whether the classname was found
207e94e781bSJacob Faibussowitsch 
208811af0c4SBarry Smith     Note:
209811af0c4SBarry Smith     Use `PetscObjectGetName()` to retrieve an appropriate classname
210e94e781bSJacob Faibussowitsch 
211e94e781bSJacob Faibussowitsch     Level: developer
212e94e781bSJacob Faibussowitsch 
213db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
214e94e781bSJacob Faibussowitsch @*/
2159371c9d4SSatish Balay PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) {
216*8b86dd2eSJacob Faibussowitsch   PetscInt unused;
217e94e781bSJacob Faibussowitsch 
218e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
219e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
220*8b86dd2eSJacob Faibussowitsch   PetscValidBoolPointer(found, 2);
221*8b86dd2eSJacob Faibussowitsch   PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found));
2225f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
223e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
224e94e781bSJacob Faibussowitsch }
225e94e781bSJacob Faibussowitsch 
226e94e781bSJacob Faibussowitsch /*@
227811af0c4SBarry Smith     PetscInfoGetInfo - Returns the current state of several important flags for `PetscInfo()`
228e94e781bSJacob Faibussowitsch 
229e94e781bSJacob Faibussowitsch     Not Collective
230e94e781bSJacob Faibussowitsch 
231e94e781bSJacob Faibussowitsch     Output Parameters:
232811af0c4SBarry Smith +   infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called
233811af0c4SBarry Smith .   classesSet - `PETSC_TRUE` if the list of classes to filter for has been set
234811af0c4SBarry Smith .   exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted
235811af0c4SBarry Smith .   locked - `PETSC_TRUE` if the list of classes to filter for has been locked
236811af0c4SBarry Smith -   commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all
237e94e781bSJacob Faibussowitsch     communicators
238e94e781bSJacob Faibussowitsch 
239811af0c4SBarry Smith     Note:
240811af0c4SBarry Smith     Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
241e94e781bSJacob Faibussowitsch 
242fe9b927eSVaclav Hapla     Level: developer
243e94e781bSJacob Faibussowitsch 
244db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
245e94e781bSJacob Faibussowitsch @*/
2469371c9d4SSatish Balay PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) {
247e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
248*8b86dd2eSJacob Faibussowitsch   if (infoEnabled) PetscValidBoolPointer(infoEnabled, 1);
249*8b86dd2eSJacob Faibussowitsch   if (classesSet) PetscValidBoolPointer(classesSet, 2);
250*8b86dd2eSJacob Faibussowitsch   if (exclude) PetscValidBoolPointer(exclude, 3);
251*8b86dd2eSJacob Faibussowitsch   if (locked) PetscValidBoolPointer(locked, 4);
252*8b86dd2eSJacob Faibussowitsch   if (commSelfFlag) PetscValidPointer(commSelfFlag, 5);
253e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2545f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
255e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2565f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
257e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
258e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
259e94e781bSJacob Faibussowitsch }
260e94e781bSJacob Faibussowitsch 
261e94e781bSJacob Faibussowitsch /*@C
262811af0c4SBarry Smith     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
263e94e781bSJacob Faibussowitsch 
264e94e781bSJacob Faibussowitsch     Not Collective
265e94e781bSJacob Faibussowitsch 
266e94e781bSJacob Faibussowitsch     Input Parameters:
267811af0c4SBarry Smith +   classname - Name of the class to activate/deactivate `PetscInfo()` for
268e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
269e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
270e94e781bSJacob Faibussowitsch 
271e94e781bSJacob Faibussowitsch     Level: developer
272e94e781bSJacob Faibussowitsch 
273db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
274e94e781bSJacob Faibussowitsch @*/
275*8b86dd2eSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[]) {
276*8b86dd2eSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt;
277e94e781bSJacob Faibussowitsch   char      logList[256];
278e94e781bSJacob Faibussowitsch 
279e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
280e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
281*8b86dd2eSJacob Faibussowitsch   PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID);
282*8b86dd2eSJacob Faibussowitsch   if (numClassID) PetscValidPointer(classIDs, 3);
2839566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
284e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
2859566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
286e94e781bSJacob Faibussowitsch   if (opt) {
287*8b86dd2eSJacob Faibussowitsch     PetscBool pkg;
288*8b86dd2eSJacob Faibussowitsch 
2899566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
290e94e781bSJacob Faibussowitsch     if (pkg) {
291*8b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
292e94e781bSJacob Faibussowitsch     }
293e94e781bSJacob Faibussowitsch   }
2949566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
295e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
296e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
297e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
298*8b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
299e94e781bSJacob Faibussowitsch     }
300e94e781bSJacob Faibussowitsch   } else {
301*8b86dd2eSJacob Faibussowitsch     for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
302e94e781bSJacob Faibussowitsch   }
303e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
304e94e781bSJacob Faibussowitsch }
305e94e781bSJacob Faibussowitsch 
306e94e781bSJacob Faibussowitsch /*@
307811af0c4SBarry Smith     PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
308e94e781bSJacob Faibussowitsch 
309e94e781bSJacob Faibussowitsch     Not Collective
310e94e781bSJacob Faibussowitsch 
311e94e781bSJacob Faibussowitsch     Input Parameter:
312811af0c4SBarry Smith .   commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
313e94e781bSJacob Faibussowitsch 
314fe9b927eSVaclav Hapla     Level: advanced
315e94e781bSJacob Faibussowitsch 
316db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()`
317e94e781bSJacob Faibussowitsch @*/
3189371c9d4SSatish Balay PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) {
319e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
320e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
321e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
322e94e781bSJacob Faibussowitsch }
323e94e781bSJacob Faibussowitsch 
324e94e781bSJacob Faibussowitsch /*@
325811af0c4SBarry Smith     PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()`
326e94e781bSJacob Faibussowitsch 
327e94e781bSJacob Faibussowitsch     Not Collective
328e94e781bSJacob Faibussowitsch 
329e94e781bSJacob Faibussowitsch     Input Parameter:
330e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
331e94e781bSJacob Faibussowitsch 
332fe9b927eSVaclav Hapla     Options Database Keys:
333fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
334e94e781bSJacob Faibussowitsch 
335811af0c4SBarry Smith     Note:
336811af0c4SBarry Smith     This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
337e94e781bSJacob Faibussowitsch 
338fe9b927eSVaclav Hapla     Level: advanced
339e94e781bSJacob Faibussowitsch 
340db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
341e94e781bSJacob Faibussowitsch @*/
3429371c9d4SSatish Balay PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) {
343*8b86dd2eSJacob Faibussowitsch   char      optstring[PETSC_MAX_PATH_LEN];
344*8b86dd2eSJacob Faibussowitsch   PetscBool set;
345e94e781bSJacob Faibussowitsch 
346e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3479566063dSJacob Faibussowitsch   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead"));
348*8b86dd2eSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set));
349e94e781bSJacob Faibussowitsch   if (set) {
350*8b86dd2eSJacob Faibussowitsch     size_t            size_loc0_, size_loc1_, size_loc2_;
351*8b86dd2eSJacob Faibussowitsch     char             *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
352*8b86dd2eSJacob Faibussowitsch     char            **loc1_array  = NULL;
353*8b86dd2eSJacob Faibussowitsch     PetscBool         loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE;
354*8b86dd2eSJacob Faibussowitsch     int               nLoc1_       = 0;
355*8b86dd2eSJacob Faibussowitsch     PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
356*8b86dd2eSJacob Faibussowitsch 
3575f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3589566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3599566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3609566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
361e94e781bSJacob Faibussowitsch     if (loc1_) {
362ebd100edSVaclav Hapla       *loc1_++ = 0;
363e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
364e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
365e94e781bSJacob Faibussowitsch         ++loc1_;
366e94e781bSJacob Faibussowitsch       }
3679566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
368e94e781bSJacob Faibussowitsch     }
369e94e781bSJacob Faibussowitsch     if (loc2_) {
370ebd100edSVaclav Hapla       *loc2_++ = 0;
371e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
372e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
373e94e781bSJacob Faibussowitsch         ++loc2_;
374e94e781bSJacob Faibussowitsch       }
375e94e781bSJacob Faibussowitsch     }
3769566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3779566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3789566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
379e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3809566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3819566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
382e94e781bSJacob Faibussowitsch     }
383e94e781bSJacob Faibussowitsch     if (size_loc2_) {
384*8b86dd2eSJacob Faibussowitsch       PetscBool foundSelf;
385*8b86dd2eSJacob Faibussowitsch 
3869566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
3879566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
388*8b86dd2eSJacob Faibussowitsch       if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF;
389e94e781bSJacob Faibussowitsch     }
3909566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
3919566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
3929566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
3939566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
3949566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
395e94e781bSJacob Faibussowitsch   }
396e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
397e94e781bSJacob Faibussowitsch }
398e94e781bSJacob Faibussowitsch 
399e94e781bSJacob Faibussowitsch /*@
400811af0c4SBarry Smith   PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
401e94e781bSJacob Faibussowitsch 
402e94e781bSJacob Faibussowitsch   Not Collective
403e94e781bSJacob Faibussowitsch 
404811af0c4SBarry Smith   Note:
405811af0c4SBarry Smith   This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
406811af0c4SBarry Smith   `PetscInfo()` calls down the line.
407e94e781bSJacob Faibussowitsch 
408fe9b927eSVaclav Hapla   Level: developer
4096c877ef6SSatish Balay 
410db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`
411e94e781bSJacob Faibussowitsch @*/
4129371c9d4SSatish Balay PetscErrorCode PetscInfoDestroy(void) {
4135f115e29SVaclav Hapla   int err;
414e94e781bSJacob Faibussowitsch 
415e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4169566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4179566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
418e94e781bSJacob Faibussowitsch   err = fflush(PetscInfoFile);
41928b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
420*8b86dd2eSJacob Faibussowitsch   if (PetscInfoFilename) PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile));
4219566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
422*8b86dd2eSJacob Faibussowitsch   for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) PetscInfoFlags[i] = 1;
4235f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
424e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4255f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
426e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
427e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4285c6c1daeSBarry Smith   PetscFunctionReturn(0);
4295c6c1daeSBarry Smith }
4305c6c1daeSBarry Smith 
431*8b86dd2eSJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value) {
432*8b86dd2eSJacob Faibussowitsch   PetscFunctionBegin;
433*8b86dd2eSJacob Faibussowitsch   if (!classid) classid = PETSC_SMALLEST_CLASSID;
434*8b86dd2eSJacob Faibussowitsch   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value;
435*8b86dd2eSJacob Faibussowitsch   PetscFunctionReturn(0);
436*8b86dd2eSJacob Faibussowitsch }
437*8b86dd2eSJacob Faibussowitsch 
4385c6c1daeSBarry Smith /*@
439811af0c4SBarry Smith   PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4405c6c1daeSBarry Smith 
4415c6c1daeSBarry Smith   Not Collective
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith   Input Parameter:
444811af0c4SBarry Smith . classid - The object class,  e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4455c6c1daeSBarry Smith 
446811af0c4SBarry Smith   Note:
4475c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith   Level: developer
4505c6c1daeSBarry Smith 
451db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4525c6c1daeSBarry Smith @*/
4539371c9d4SSatish Balay PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) {
4545c6c1daeSBarry Smith   PetscFunctionBegin;
455*8b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 0));
4565c6c1daeSBarry Smith   PetscFunctionReturn(0);
4575c6c1daeSBarry Smith }
4585c6c1daeSBarry Smith 
4595c6c1daeSBarry Smith /*@
460811af0c4SBarry Smith   PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4615c6c1daeSBarry Smith 
4625c6c1daeSBarry Smith   Not Collective
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith   Input Parameter:
465811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4665c6c1daeSBarry Smith 
467811af0c4SBarry Smith   Note:
4685c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4695c6c1daeSBarry Smith 
4705c6c1daeSBarry Smith   Level: developer
4715c6c1daeSBarry Smith 
472db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4735c6c1daeSBarry Smith @*/
4749371c9d4SSatish Balay PetscErrorCode PetscInfoActivateClass(PetscClassId classid) {
4755c6c1daeSBarry Smith   PetscFunctionBegin;
476*8b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 1));
4775c6c1daeSBarry Smith   PetscFunctionReturn(0);
4785c6c1daeSBarry Smith }
4795c6c1daeSBarry Smith 
4805c6c1daeSBarry Smith /*
4815c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
4825c6c1daeSBarry Smith   messages are also printed to the history file, called by default
4835c6c1daeSBarry Smith   .petschistory in ones home directory.
4845c6c1daeSBarry Smith */
48595c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith /*MC
488e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith    Synopsis:
491aaa7dc30SBarry Smith        #include <petscsys.h>
492fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
4937d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
4947d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
495fe9b927eSVaclav Hapla        ...
4965c6c1daeSBarry Smith 
497fe9b927eSVaclav Hapla     Collective on obj
4985c6c1daeSBarry Smith 
499d8d19677SJose E. Roman     Input Parameters:
500fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
5015c6c1daeSBarry Smith .   message - logging message
502fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
503fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
504e94e781bSJacob Faibussowitsch 
505e94e781bSJacob Faibussowitsch     Notes:
506811af0c4SBarry Smith     `PetscInfo()` prints only from the first processor in the communicator of obj.
507811af0c4SBarry Smith     If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
508fe9b927eSVaclav Hapla 
509fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
510fe9b927eSVaclav Hapla 
511fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
512fe9b927eSVaclav Hapla 
513811af0c4SBarry Smith     No filename means standard output `PETSC_STDOUT` is used.
514fe9b927eSVaclav Hapla 
515fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
516fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
517fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
518fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
519fe9b927eSVaclav Hapla 
520811af0c4SBarry Smith     The optional self keyword specifies that PetscInfo() is enabled only for communicator size = 1 (e.g. `PETSC_COMM_SELF`), i.e. only `PetscInfo()` calls which print from every rank of `PETSC_COMM_WORLD` are enabled.
521811af0c4SBarry Smith     By contrast, ~self means that PetscInfo() is enabled only for communicator size > 1 (e.g. `PETSC_COMM_WORLD`), i.e. those `PetscInfo()` calls which print from every rank of `PETSC_COMM_WORLD` are disabled.
522fe9b927eSVaclav Hapla 
523fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
524fe9b927eSVaclav Hapla 
525fe9b927eSVaclav Hapla     Example of Usage:
526fe9b927eSVaclav Hapla $     Mat A;
527fe9b927eSVaclav Hapla $     PetscInt alpha;
528fe9b927eSVaclav Hapla $     ...
5297d3de750SJacob Faibussowitsch $     PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
530fe9b927eSVaclav Hapla 
531fe9b927eSVaclav Hapla     Options Examples:
532fe9b927eSVaclav Hapla     Each call of the form
533fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
5347d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1);
5357d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1, arg2);
536fe9b927eSVaclav Hapla     is evaluated as follows.
537fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
538fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
539fe9b927eSVaclav Hapla $     -info myInfoFileName:~vec:~self prints msg to file named myInfoFileName, only if the obj's class is NULL or other than Vec, and obj's communicator has size > 1
540fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
541fe9b927eSVaclav Hapla     Note that
542fe9b927eSVaclav Hapla $     -info :sys:~self
543fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
544fe9b927eSVaclav Hapla 
545fe9b927eSVaclav Hapla     Fortran Note:
546811af0c4SBarry Smith     This function does not take the obj argument, there is only the `PetscInfo()`
547811af0c4SBarry Smith      version, not `PetscInfo()` etc.
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith     Level: intermediate
5505c6c1daeSBarry Smith 
551db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5525c6c1daeSBarry Smith M*/
5539371c9d4SSatish Balay PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) {
554*8b86dd2eSJacob Faibussowitsch   PetscClassId classid = PETSC_SMALLEST_CLASSID;
555*8b86dd2eSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE;
556*8b86dd2eSJacob Faibussowitsch   MPI_Comm     comm    = PETSC_COMM_SELF;
557*8b86dd2eSJacob Faibussowitsch   PetscMPIInt  rank;
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith   PetscFunctionBegin;
560*8b86dd2eSJacob Faibussowitsch   if (obj) {
561*8b86dd2eSJacob Faibussowitsch     PetscValidHeader(obj, 2);
562*8b86dd2eSJacob Faibussowitsch     classid = obj->classid;
563*8b86dd2eSJacob Faibussowitsch   }
564*8b86dd2eSJacob Faibussowitsch   PetscValidCharPointer(message, 3);
5659566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
566e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
567*8b86dd2eSJacob Faibussowitsch   if (obj) PetscCall(PetscObjectGetComm(obj, &comm));
568*8b86dd2eSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
569e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5705c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
571*8b86dd2eSJacob Faibussowitsch   else {
572*8b86dd2eSJacob Faibussowitsch     PetscMPIInt size;
573*8b86dd2eSJacob Faibussowitsch 
574*8b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(comm, &size));
575*8b86dd2eSJacob Faibussowitsch     /* If no self printing is allowed, and size too small, get out */
576*8b86dd2eSJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(0);
577e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
578*8b86dd2eSJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(0);
579e94e781bSJacob Faibussowitsch   }
580e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
581*8b86dd2eSJacob Faibussowitsch   {
582*8b86dd2eSJacob Faibussowitsch     const PetscBool oldflag = PetscLogPrintInfo;
583*8b86dd2eSJacob Faibussowitsch     va_list         Argp;
584*8b86dd2eSJacob Faibussowitsch     PetscMPIInt     urank;
585*8b86dd2eSJacob Faibussowitsch     int             err;
586*8b86dd2eSJacob Faibussowitsch     char            string[8 * 1024];
587*8b86dd2eSJacob Faibussowitsch     size_t          fullLength, len;
588*8b86dd2eSJacob Faibussowitsch 
5899371c9d4SSatish Balay     PetscLogPrintInfo = PETSC_FALSE;
5909566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
5915c6c1daeSBarry Smith     va_start(Argp, message);
592*8b86dd2eSJacob Faibussowitsch     PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] %s(): ", urank, func));
5939566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(string, &len));
5949566063dSJacob Faibussowitsch     PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
5959566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string));
5965c6c1daeSBarry Smith     err = fflush(PetscInfoFile);
59728b400f6SJacob Faibussowitsch     PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
5985c6c1daeSBarry Smith     if (petsc_history) {
5995c6c1daeSBarry Smith       va_start(Argp, message);
6009566063dSJacob Faibussowitsch       PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
6015c6c1daeSBarry Smith     }
6025c6c1daeSBarry Smith     va_end(Argp);
603e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
604*8b86dd2eSJacob Faibussowitsch   }
6055c6c1daeSBarry Smith   PetscFunctionReturn(0);
6065c6c1daeSBarry Smith }
607