xref: /petsc/src/sys/info/verboseinfo.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
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;
25*9371c9d4SSatish 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,
26*9371c9d4SSatish 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,
27*9371c9d4SSatish 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 /*@
32e94e781bSJacob Faibussowitsch     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:
37e94e781bSJacob Faibussowitsch .   classid - PetscClassid retrieved from a PetscObject e.g. VEC_CLASSID
38e94e781bSJacob Faibussowitsch 
39e94e781bSJacob Faibussowitsch     Output Parameter:
40e94e781bSJacob Faibussowitsch .   enabled - PetscBool indicating whether this classid is allowed to print
41e94e781bSJacob Faibussowitsch 
42e94e781bSJacob Faibussowitsch     Notes:
43e94e781bSJacob Faibussowitsch     Use PETSC_SMALLEST_CLASSID to check if "sys" PetscInfo() calls are enabled. When PETSc is configured with debugging
44e94e781bSJacob Faibussowitsch     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 @*/
50*9371c9d4SSatish Balay PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled) {
51e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
5208401ef6SPierre 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);
53e94e781bSJacob Faibussowitsch   *enabled = (PetscBool)(PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
54e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
55e94e781bSJacob Faibussowitsch }
56e94e781bSJacob Faibussowitsch 
57e94e781bSJacob Faibussowitsch /*@
58fe9b927eSVaclav Hapla     PetscInfoAllow - Enables/disables PetscInfo() messages
595c6c1daeSBarry Smith 
60fe9b927eSVaclav Hapla     Not Collective
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith     Input Parameter:
63e94e781bSJacob Faibussowitsch .   flag - PETSC_TRUE or PETSC_FALSE
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith     Level: advanced
665c6c1daeSBarry Smith 
67db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()`
685c6c1daeSBarry Smith @*/
69*9371c9d4SSatish Balay PetscErrorCode PetscInfoAllow(PetscBool flag) {
70e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
71e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
72e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
73e94e781bSJacob Faibussowitsch }
74e94e781bSJacob Faibussowitsch 
75e94e781bSJacob Faibussowitsch /*@C
76fe9b927eSVaclav Hapla     PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls
77e94e781bSJacob Faibussowitsch 
78fe9b927eSVaclav Hapla     Not Collective
79e94e781bSJacob Faibussowitsch 
80d8d19677SJose E. Roman     Input Parameters:
81e94e781bSJacob Faibussowitsch +   filename - Name of the file where PetscInfo() will print to
82e94e781bSJacob Faibussowitsch -   mode - Write mode passed to PetscFOpen()
83e94e781bSJacob Faibussowitsch 
84e94e781bSJacob Faibussowitsch     Notes:
85fe9b927eSVaclav Hapla     Use filename=NULL to set PetscInfo() to write to PETSC_STDOUT.
86e94e781bSJacob Faibussowitsch 
87e94e781bSJacob Faibussowitsch     Level: advanced
88e94e781bSJacob Faibussowitsch 
89db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()`
90e94e781bSJacob Faibussowitsch @*/
91*9371c9d4SSatish Balay PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[]) {
92fa2bb9feSLisandro Dalcin   char        fname[PETSC_MAX_PATH_LEN], tname[11];
935c6c1daeSBarry Smith   PetscMPIInt rank;
945c6c1daeSBarry Smith 
955c6c1daeSBarry Smith   PetscFunctionBegin;
96e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
979566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
98e94e781bSJacob Faibussowitsch   if (filename) {
99e94e781bSJacob Faibussowitsch     PetscBool oldflag;
100e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1019566063dSJacob Faibussowitsch     PetscCall(PetscFixFilename(filename, fname));
1029566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(fname, &PetscInfoFilename));
1039566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
1045c6c1daeSBarry Smith     sprintf(tname, ".%d", rank);
1059566063dSJacob Faibussowitsch     PetscCall(PetscStrcat(fname, tname));
106*9371c9d4SSatish Balay     oldflag           = PetscLogPrintInfo;
107*9371c9d4SSatish Balay     PetscLogPrintInfo = PETSC_FALSE;
1089566063dSJacob Faibussowitsch     PetscCall(PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile));
109e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
110e94e781bSJacob Faibussowitsch     /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and
111e94e781bSJacob Faibussowitsch      call it afterwards so that it actually writes to file */
1129566063dSJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname));
113e94e781bSJacob Faibussowitsch   }
114e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
115e94e781bSJacob Faibussowitsch }
116a297a907SKarl Rupp 
117e94e781bSJacob Faibussowitsch /*@C
118e94e781bSJacob Faibussowitsch     PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to
119e94e781bSJacob Faibussowitsch 
120e94e781bSJacob Faibussowitsch     Not Collective
121e94e781bSJacob Faibussowitsch 
122e94e781bSJacob Faibussowitsch     Output Parameters:
123e94e781bSJacob Faibussowitsch +   filename - The name of the output file
124e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
125e94e781bSJacob Faibussowitsch 
126e94e781bSJacob Faibussowitsch     Level: advanced
127e94e781bSJacob Faibussowitsch 
128e94e781bSJacob Faibussowitsch     Note:
129e94e781bSJacob Faibussowitsch     This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is
130e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
131e94e781bSJacob Faibussowitsch 
132e94e781bSJacob Faibussowitsch     Fortran Note:
133e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
134e94e781bSJacob Faibussowitsch 
135db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
136e94e781bSJacob Faibussowitsch @*/
137*9371c9d4SSatish Balay PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) {
138e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
139e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
140e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
1419566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
142e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
143e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
144e94e781bSJacob Faibussowitsch }
145e94e781bSJacob Faibussowitsch 
146e94e781bSJacob Faibussowitsch /*@C
147e94e781bSJacob Faibussowitsch     PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against
148e94e781bSJacob Faibussowitsch 
149e94e781bSJacob Faibussowitsch     Not Collective
150e94e781bSJacob Faibussowitsch 
151e94e781bSJacob Faibussowitsch     Input Parameters:
152e94e781bSJacob Faibussowitsch +   exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that
153e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
154e94e781bSJacob Faibussowitsch .   N - Number of classes to filter for (size of classnames)
155e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
156e94e781bSJacob Faibussowitsch 
157e94e781bSJacob Faibussowitsch     Notes:
158e94e781bSJacob Faibussowitsch     Not for use in Fortran
159e94e781bSJacob Faibussowitsch 
160e94e781bSJacob Faibussowitsch     This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called.
161e94e781bSJacob Faibussowitsch 
162e94e781bSJacob Faibussowitsch     Names in the classnames list should correspond to the names returned by PetscObjectGetClassName().
163e94e781bSJacob Faibussowitsch 
164e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
165e94e781bSJacob Faibussowitsch     The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away.
166e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
167e94e781bSJacob Faibussowitsch     Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()).
168e94e781bSJacob Faibussowitsch 
169e94e781bSJacob Faibussowitsch     Level: developer
170e94e781bSJacob Faibussowitsch 
171db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
172e94e781bSJacob Faibussowitsch @*/
173*9371c9d4SSatish Balay PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames) {
174e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
17528b400f6SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
1769566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1779566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames));
178e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = N;
179e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
180e94e781bSJacob Faibussowitsch   {
181e94e781bSJacob Faibussowitsch     /* Process sys class right away */
182e94e781bSJacob Faibussowitsch     PetscClassId sysclassid = PETSC_SMALLEST_CLASSID;
1839566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &sysclassid));
184e94e781bSJacob Faibussowitsch   }
1855f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
186e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
187e94e781bSJacob Faibussowitsch }
188e94e781bSJacob Faibussowitsch 
189e94e781bSJacob Faibussowitsch /*@C
190e94e781bSJacob Faibussowitsch     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses()
191e94e781bSJacob Faibussowitsch 
192e94e781bSJacob Faibussowitsch     Not Collective
193e94e781bSJacob Faibussowitsch 
19401d2d390SJose E. Roman     Input Parameter:
195e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
196e94e781bSJacob Faibussowitsch 
197e94e781bSJacob Faibussowitsch     Output Parameter:
198e94e781bSJacob Faibussowitsch .   found - PetscBool indicating whether the classname was found
199e94e781bSJacob Faibussowitsch 
200e94e781bSJacob Faibussowitsch     Notes:
201e94e781bSJacob Faibussowitsch     Use PetscObjectGetName() to retrieve an appropriate classname
202e94e781bSJacob Faibussowitsch 
203e94e781bSJacob Faibussowitsch     Level: developer
204e94e781bSJacob Faibussowitsch 
205db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
206e94e781bSJacob Faibussowitsch @*/
207*9371c9d4SSatish Balay PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) {
208e94e781bSJacob Faibussowitsch   PetscInt idx;
209e94e781bSJacob Faibussowitsch 
210e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
211e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2129566063dSJacob Faibussowitsch   PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &idx, found));
2135f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
214e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
215e94e781bSJacob Faibussowitsch }
216e94e781bSJacob Faibussowitsch 
217e94e781bSJacob Faibussowitsch /*@
218e94e781bSJacob Faibussowitsch     PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo()
219e94e781bSJacob Faibussowitsch 
220e94e781bSJacob Faibussowitsch     Not Collective
221e94e781bSJacob Faibussowitsch 
222e94e781bSJacob Faibussowitsch     Output Parameters:
223e94e781bSJacob Faibussowitsch +   infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called
224ebd100edSVaclav Hapla .   classesSet - PETSC_TRUE if the list of classes to filter for has been set
225e94e781bSJacob Faibussowitsch .   exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted
226e94e781bSJacob Faibussowitsch .   locked - PETSC_TRUE if the list of classes to filter for has been locked
227e94e781bSJacob Faibussowitsch -   commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all
228e94e781bSJacob Faibussowitsch     communicators
229e94e781bSJacob Faibussowitsch 
230e94e781bSJacob Faibussowitsch     Notes:
231e94e781bSJacob Faibussowitsch     Initially commSelfFlag = PETSC_INFO_COMM_ALL
232e94e781bSJacob Faibussowitsch 
233fe9b927eSVaclav Hapla     Level: developer
234e94e781bSJacob Faibussowitsch 
235db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
236e94e781bSJacob Faibussowitsch @*/
237*9371c9d4SSatish Balay PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) {
238e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
239e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2405f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
241e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2425f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
243e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
244e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
245e94e781bSJacob Faibussowitsch }
246e94e781bSJacob Faibussowitsch 
247e94e781bSJacob Faibussowitsch /*@C
248e94e781bSJacob Faibussowitsch     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo()
249e94e781bSJacob Faibussowitsch 
250e94e781bSJacob Faibussowitsch     Not Collective
251e94e781bSJacob Faibussowitsch 
252e94e781bSJacob Faibussowitsch     Input Parameters:
253e94e781bSJacob Faibussowitsch +   classname - Name of the class to activate/deactivate PetscInfo() for
254e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
255e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
256e94e781bSJacob Faibussowitsch 
257e94e781bSJacob Faibussowitsch     Level: developer
258e94e781bSJacob Faibussowitsch 
259db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
260e94e781bSJacob Faibussowitsch @*/
261*9371c9d4SSatish Balay PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[]) {
262e94e781bSJacob Faibussowitsch   PetscInt  i;
263e94e781bSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt, pkg;
264e94e781bSJacob Faibussowitsch   char      logList[256];
265e94e781bSJacob Faibussowitsch 
266e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
267e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2689566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
269e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
2709566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
271e94e781bSJacob Faibussowitsch   if (opt) {
2729566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
273e94e781bSJacob Faibussowitsch     if (pkg) {
274*9371c9d4SSatish Balay       for (i = 0; i < numClassID; ++i) { PetscCall(PetscInfoDeactivateClass(classIDs[i])); }
275e94e781bSJacob Faibussowitsch     }
276e94e781bSJacob Faibussowitsch   }
2779566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
278e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
279e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
280e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
281*9371c9d4SSatish Balay       for (i = 0; i < numClassID; ++i) { PetscCall(PetscInfoDeactivateClass(classIDs[i])); }
282e94e781bSJacob Faibussowitsch     }
283e94e781bSJacob Faibussowitsch   } else {
284*9371c9d4SSatish Balay     for (i = 0; i < numClassID; ++i) { PetscCall(PetscInfoActivateClass(classIDs[i])); }
285e94e781bSJacob Faibussowitsch   }
286e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
287e94e781bSJacob Faibussowitsch }
288e94e781bSJacob Faibussowitsch 
289e94e781bSJacob Faibussowitsch /*@
290e94e781bSJacob Faibussowitsch     PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo()
291e94e781bSJacob Faibussowitsch 
292e94e781bSJacob Faibussowitsch     Not Collective
293e94e781bSJacob Faibussowitsch 
294e94e781bSJacob Faibussowitsch     Input Parameter:
295fe9b927eSVaclav Hapla .   commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator of the object calling PetscInfo()
296e94e781bSJacob Faibussowitsch 
297fe9b927eSVaclav Hapla     Level: advanced
298e94e781bSJacob Faibussowitsch 
299db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()`
300e94e781bSJacob Faibussowitsch @*/
301*9371c9d4SSatish Balay PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) {
302e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
303e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
304e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
305e94e781bSJacob Faibussowitsch }
306e94e781bSJacob Faibussowitsch 
307e94e781bSJacob Faibussowitsch /*@
308fe9b927eSVaclav Hapla     PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to PetscInfo()
309e94e781bSJacob Faibussowitsch 
310e94e781bSJacob Faibussowitsch     Not Collective
311e94e781bSJacob Faibussowitsch 
312e94e781bSJacob Faibussowitsch     Input Parameter:
313e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
314e94e781bSJacob Faibussowitsch 
315fe9b927eSVaclav Hapla     Options Database Keys:
316fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
317e94e781bSJacob Faibussowitsch 
318e94e781bSJacob Faibussowitsch     Notes:
319fe9b927eSVaclav Hapla     This function is called automatically during PetscInitialize() so users usually do not need to call it themselves.
320e94e781bSJacob Faibussowitsch 
321fe9b927eSVaclav Hapla     Level: advanced
322e94e781bSJacob Faibussowitsch 
323db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
324e94e781bSJacob Faibussowitsch @*/
325*9371c9d4SSatish Balay PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) {
326e94e781bSJacob Faibussowitsch   char              optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
327e94e781bSJacob Faibussowitsch   char            **loc1_array = NULL;
328e94e781bSJacob Faibussowitsch   PetscBool         set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE;
329e94e781bSJacob Faibussowitsch   size_t            size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0;
330e94e781bSJacob Faibussowitsch   int               nLoc1_       = 0;
331e94e781bSJacob Faibussowitsch   PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
332e94e781bSJacob Faibussowitsch 
333e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3349566063dSJacob Faibussowitsch   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead"));
3359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, sizeof(optstring), &set));
336e94e781bSJacob Faibussowitsch   if (set) {
3375f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3389566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3399566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3409566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
341e94e781bSJacob Faibussowitsch     if (loc1_) {
342ebd100edSVaclav Hapla       *loc1_++ = 0;
343e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
344e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
345e94e781bSJacob Faibussowitsch         ++loc1_;
346e94e781bSJacob Faibussowitsch       }
3479566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
348e94e781bSJacob Faibussowitsch     }
349e94e781bSJacob Faibussowitsch     if (loc2_) {
350ebd100edSVaclav Hapla       *loc2_++ = 0;
351e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
352e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
353e94e781bSJacob Faibussowitsch         ++loc2_;
354e94e781bSJacob Faibussowitsch       }
355e94e781bSJacob Faibussowitsch     }
3569566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3579566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3589566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
359e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3609566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3619566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
362e94e781bSJacob Faibussowitsch     }
363e94e781bSJacob Faibussowitsch     if (size_loc2_) {
3649566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
3659566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
366e94e781bSJacob Faibussowitsch       if (foundSelf) {
367e94e781bSJacob Faibussowitsch         if (loc2_invert) {
368e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_NO_SELF;
369e94e781bSJacob Faibussowitsch         } else {
370e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_ONLY_SELF;
371e94e781bSJacob Faibussowitsch         }
372e94e781bSJacob Faibussowitsch       }
373e94e781bSJacob Faibussowitsch     }
3749566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
3759566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
3769566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
3779566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
3789566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
379e94e781bSJacob Faibussowitsch   }
380e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
381e94e781bSJacob Faibussowitsch }
382e94e781bSJacob Faibussowitsch 
383e94e781bSJacob Faibussowitsch /*@
384e94e781bSJacob Faibussowitsch   PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures.
385e94e781bSJacob Faibussowitsch 
386e94e781bSJacob Faibussowitsch   Not Collective
387e94e781bSJacob Faibussowitsch 
388e94e781bSJacob Faibussowitsch   Notes:
389e94e781bSJacob Faibussowitsch   This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent
390e94e781bSJacob Faibussowitsch   PetscInfo() calls down the line.
391e94e781bSJacob Faibussowitsch 
392fe9b927eSVaclav Hapla   Level: developer
3936c877ef6SSatish Balay 
394db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`
395e94e781bSJacob Faibussowitsch @*/
396*9371c9d4SSatish Balay PetscErrorCode PetscInfoDestroy(void) {
3975f115e29SVaclav Hapla   int    err;
3985f115e29SVaclav Hapla   size_t i;
399e94e781bSJacob Faibussowitsch 
400e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4019566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4029566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
403e94e781bSJacob Faibussowitsch   err = fflush(PetscInfoFile);
40428b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
4051baa6e33SBarry Smith   if (PetscInfoFilename) PetscCall(PetscFClose(MPI_COMM_SELF, PetscInfoFile));
4069566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
407dd39110bSPierre Jolivet   for (i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); i++) PetscInfoFlags[i] = 1;
4085f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
409e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4105f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
411e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
412e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4135c6c1daeSBarry Smith   PetscFunctionReturn(0);
4145c6c1daeSBarry Smith }
4155c6c1daeSBarry Smith 
4165c6c1daeSBarry Smith /*@
417fa2bb9feSLisandro Dalcin   PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class.
4185c6c1daeSBarry Smith 
4195c6c1daeSBarry Smith   Not Collective
4205c6c1daeSBarry Smith 
4215c6c1daeSBarry Smith   Input Parameter:
422fa2bb9feSLisandro Dalcin . classid - The object class,  e.g., MAT_CLASSID, SNES_CLASSID, etc.
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith   Notes:
4255c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith   Level: developer
4285c6c1daeSBarry Smith 
429db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4305c6c1daeSBarry Smith @*/
431*9371c9d4SSatish Balay PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) {
4325c6c1daeSBarry Smith   PetscFunctionBegin;
433fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
434fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0;
4355c6c1daeSBarry Smith   PetscFunctionReturn(0);
4365c6c1daeSBarry Smith }
4375c6c1daeSBarry Smith 
4385c6c1daeSBarry Smith /*@
439fa2bb9feSLisandro Dalcin   PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class.
4405c6c1daeSBarry Smith 
4415c6c1daeSBarry Smith   Not Collective
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith   Input Parameter:
444fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
4455c6c1daeSBarry Smith 
4465c6c1daeSBarry Smith   Notes:
4475c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith   Level: developer
4505c6c1daeSBarry Smith 
451db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4525c6c1daeSBarry Smith @*/
453*9371c9d4SSatish Balay PetscErrorCode PetscInfoActivateClass(PetscClassId classid) {
4545c6c1daeSBarry Smith   PetscFunctionBegin;
455fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
456fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1;
4575c6c1daeSBarry Smith   PetscFunctionReturn(0);
4585c6c1daeSBarry Smith }
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith /*
4615c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
4625c6c1daeSBarry Smith   messages are also printed to the history file, called by default
4635c6c1daeSBarry Smith   .petschistory in ones home directory.
4645c6c1daeSBarry Smith */
46595c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith /*MC
468e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
4695c6c1daeSBarry Smith 
4705c6c1daeSBarry Smith    Synopsis:
471aaa7dc30SBarry Smith        #include <petscsys.h>
472fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
4737d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
4747d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
475fe9b927eSVaclav Hapla        ...
4765c6c1daeSBarry Smith 
477fe9b927eSVaclav Hapla     Collective on obj
4785c6c1daeSBarry Smith 
479d8d19677SJose E. Roman     Input Parameters:
480fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
4815c6c1daeSBarry Smith .   message - logging message
482fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
483fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
484e94e781bSJacob Faibussowitsch 
485e94e781bSJacob Faibussowitsch     Notes:
486fe9b927eSVaclav Hapla     PetscInfo() prints only from the first processor in the communicator of obj.
487fe9b927eSVaclav Hapla     If obj is NULL, the PETSC_COMM_SELF communicator is used, i.e. every rank of PETSC_COMM_WORLD prints the message.
488fe9b927eSVaclav Hapla 
489fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
490fe9b927eSVaclav Hapla 
491fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
492fe9b927eSVaclav Hapla 
493fe9b927eSVaclav Hapla     No filename means standard output PETSC_STDOUT is used.
494fe9b927eSVaclav Hapla 
495fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
496fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
497fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
498fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
499fe9b927eSVaclav Hapla 
500fe9b927eSVaclav Hapla     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.
501fe9b927eSVaclav Hapla     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.
502fe9b927eSVaclav Hapla 
503fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
504fe9b927eSVaclav Hapla 
505fe9b927eSVaclav Hapla     Example of Usage:
506fe9b927eSVaclav Hapla $     Mat A;
507fe9b927eSVaclav Hapla $     PetscInt alpha;
508fe9b927eSVaclav Hapla $     ...
5097d3de750SJacob Faibussowitsch $     PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
510fe9b927eSVaclav Hapla 
511fe9b927eSVaclav Hapla     Options Examples:
512fe9b927eSVaclav Hapla     Each call of the form
513fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
5147d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1);
5157d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1, arg2);
516fe9b927eSVaclav Hapla     is evaluated as follows.
517fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
518fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
519fe9b927eSVaclav 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
520fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
521fe9b927eSVaclav Hapla     Note that
522fe9b927eSVaclav Hapla $     -info :sys:~self
523fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
524fe9b927eSVaclav Hapla 
525fe9b927eSVaclav Hapla     Fortran Note:
526fe9b927eSVaclav Hapla     This function does not take the obj argument, there is only the PetscInfo()
5277d3de750SJacob Faibussowitsch      version, not PetscInfo() etc.
5285c6c1daeSBarry Smith 
5295c6c1daeSBarry Smith     Level: intermediate
5305c6c1daeSBarry Smith 
531db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5325c6c1daeSBarry Smith M*/
533*9371c9d4SSatish Balay PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) {
5345c6c1daeSBarry Smith   va_list      Argp;
535e94e781bSJacob Faibussowitsch   PetscMPIInt  rank = 0, urank, size = 1;
536fa2bb9feSLisandro Dalcin   PetscClassId classid;
537e94e781bSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE, oldflag;
5385c6c1daeSBarry Smith   char         string[8 * 1024];
539e94e781bSJacob Faibussowitsch   size_t       fullLength, len;
5405c6c1daeSBarry Smith   int          err;
5415c6c1daeSBarry Smith 
5425c6c1daeSBarry Smith   PetscFunctionBegin;
543940d77c0SToby Isaac   if (obj) PetscValidHeader(obj, 2);
544fa2bb9feSLisandro Dalcin   classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID;
5459566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
546e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
547e94e781bSJacob Faibussowitsch   PetscValidCharPointer(message, 3);
548e94e781bSJacob Faibussowitsch   if (obj) {
5499566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(obj->comm, &rank));
5509566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(obj->comm, &size));
551e94e781bSJacob Faibussowitsch   }
552e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5535c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
554e94e781bSJacob Faibussowitsch   if (!PetscInfoCommFilter && (size < 2)) {
555e94e781bSJacob Faibussowitsch     /* If no self printing is allowed, and size too small get out */
556e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
557e94e781bSJacob Faibussowitsch   } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) {
558e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
559e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
560e94e781bSJacob Faibussowitsch   }
561e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
562*9371c9d4SSatish Balay   oldflag           = PetscLogPrintInfo;
563*9371c9d4SSatish Balay   PetscLogPrintInfo = PETSC_FALSE;
5649566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
5655c6c1daeSBarry Smith   va_start(Argp, message);
5665c6c1daeSBarry Smith   sprintf(string, "[%d] %s(): ", urank, func);
5679566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(string, &len));
5689566063dSJacob Faibussowitsch   PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
5699566063dSJacob Faibussowitsch   PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string));
5705c6c1daeSBarry Smith   err = fflush(PetscInfoFile);
57128b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
5725c6c1daeSBarry Smith   if (petsc_history) {
5735c6c1daeSBarry Smith     va_start(Argp, message);
5749566063dSJacob Faibussowitsch     PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
5755c6c1daeSBarry Smith   }
5765c6c1daeSBarry Smith   va_end(Argp);
577e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = oldflag;
5785c6c1daeSBarry Smith   PetscFunctionReturn(0);
5795c6c1daeSBarry Smith }
580