xref: /petsc/src/sys/info/verboseinfo.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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 /*@
32*811af0c4SBarry 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:
37*811af0c4SBarry Smith .   classid - `PetscClassid` retrieved from a `PetscObject` e.g. `VEC_CLASSID`
38e94e781bSJacob Faibussowitsch 
39e94e781bSJacob Faibussowitsch     Output Parameter:
40*811af0c4SBarry Smith .   enabled - `PetscBool` indicating whether this classid is allowed to print
41e94e781bSJacob Faibussowitsch 
42*811af0c4SBarry Smith     Note:
43*811af0c4SBarry Smith     Use `PETSC_SMALLEST_CLASSID` to check if "sys" `PetscInfo()` calls are enabled. When PETSc is configured with debugging
44*811af0c4SBarry 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;
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 /*@
58*811af0c4SBarry Smith     PetscInfoAllow - Enables/disables `PetscInfo()` messages
595c6c1daeSBarry Smith 
60fe9b927eSVaclav Hapla     Not Collective
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith     Input Parameter:
63*811af0c4SBarry Smith .   flag - `PETSC_TRUE` or `PETSC_FALSE`
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith     Level: advanced
665c6c1daeSBarry Smith 
67db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()`
685c6c1daeSBarry Smith @*/
699371c9d4SSatish Balay PetscErrorCode PetscInfoAllow(PetscBool flag) {
70e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
71e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
72e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
73e94e781bSJacob Faibussowitsch }
74e94e781bSJacob Faibussowitsch 
75e94e781bSJacob Faibussowitsch /*@C
76*811af0c4SBarry Smith     PetscInfoSetFile - Sets the printing destination for all `PetscInfo()` calls
77e94e781bSJacob Faibussowitsch 
78fe9b927eSVaclav Hapla     Not Collective
79e94e781bSJacob Faibussowitsch 
80d8d19677SJose E. Roman     Input Parameters:
81*811af0c4SBarry Smith +   filename - Name of the file where `PetscInfo()` will print to
82*811af0c4SBarry Smith -   mode - Write mode passed to PetscFOpen()`
83e94e781bSJacob Faibussowitsch 
84*811af0c4SBarry Smith     Note:
85*811af0c4SBarry Smith     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 @*/
919371c9d4SSatish 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));
1069371c9d4SSatish Balay     oldflag           = PetscLogPrintInfo;
1079371c9d4SSatish 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
118*811af0c4SBarry Smith     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:
129*811af0c4SBarry Smith     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 @*/
1379371c9d4SSatish 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
147*811af0c4SBarry Smith     PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
148e94e781bSJacob Faibussowitsch 
149e94e781bSJacob Faibussowitsch     Not Collective
150e94e781bSJacob Faibussowitsch 
151e94e781bSJacob Faibussowitsch     Input Parameters:
152*811af0c4SBarry Smith +   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:
158*811af0c4SBarry Smith     This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called.
159e94e781bSJacob Faibussowitsch 
160*811af0c4SBarry Smith     Names in the classnames list should correspond to the names returned by `PetscObjectGetClassName()`.
161e94e781bSJacob Faibussowitsch 
162e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
163*811af0c4SBarry Smith     The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away.
164e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
165*811af0c4SBarry Smith     Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`).
166*811af0c4SBarry Smith 
167*811af0c4SBarry Smith     Fortran Note:
168*811af0c4SBarry Smith     Not for use in Fortran
169e94e781bSJacob Faibussowitsch 
170e94e781bSJacob Faibussowitsch     Level: developer
171e94e781bSJacob Faibussowitsch 
172db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
173e94e781bSJacob Faibussowitsch @*/
1749371c9d4SSatish Balay PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames) {
175e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
17628b400f6SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
1779566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1789566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames));
179e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = N;
180e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
181e94e781bSJacob Faibussowitsch   {
182e94e781bSJacob Faibussowitsch     /* Process sys class right away */
183e94e781bSJacob Faibussowitsch     PetscClassId sysclassid = PETSC_SMALLEST_CLASSID;
1849566063dSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &sysclassid));
185e94e781bSJacob Faibussowitsch   }
1865f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
187e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
188e94e781bSJacob Faibussowitsch }
189e94e781bSJacob Faibussowitsch 
190e94e781bSJacob Faibussowitsch /*@C
191*811af0c4SBarry Smith     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
192e94e781bSJacob Faibussowitsch 
193e94e781bSJacob Faibussowitsch     Not Collective
194e94e781bSJacob Faibussowitsch 
19501d2d390SJose E. Roman     Input Parameter:
196e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
197e94e781bSJacob Faibussowitsch 
198e94e781bSJacob Faibussowitsch     Output Parameter:
199*811af0c4SBarry Smith .   found - `PetscBool` indicating whether the classname was found
200e94e781bSJacob Faibussowitsch 
201*811af0c4SBarry Smith     Note:
202*811af0c4SBarry Smith     Use `PetscObjectGetName()` to retrieve an appropriate classname
203e94e781bSJacob Faibussowitsch 
204e94e781bSJacob Faibussowitsch     Level: developer
205e94e781bSJacob Faibussowitsch 
206db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
207e94e781bSJacob Faibussowitsch @*/
2089371c9d4SSatish Balay PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) {
209e94e781bSJacob Faibussowitsch   PetscInt idx;
210e94e781bSJacob Faibussowitsch 
211e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
212e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2139566063dSJacob Faibussowitsch   PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &idx, found));
2145f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
215e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
216e94e781bSJacob Faibussowitsch }
217e94e781bSJacob Faibussowitsch 
218e94e781bSJacob Faibussowitsch /*@
219*811af0c4SBarry Smith     PetscInfoGetInfo - Returns the current state of several important flags for `PetscInfo()`
220e94e781bSJacob Faibussowitsch 
221e94e781bSJacob Faibussowitsch     Not Collective
222e94e781bSJacob Faibussowitsch 
223e94e781bSJacob Faibussowitsch     Output Parameters:
224*811af0c4SBarry Smith +   infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called
225*811af0c4SBarry Smith .   classesSet - `PETSC_TRUE` if the list of classes to filter for has been set
226*811af0c4SBarry Smith .   exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted
227*811af0c4SBarry Smith .   locked - `PETSC_TRUE` if the list of classes to filter for has been locked
228*811af0c4SBarry Smith -   commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all
229e94e781bSJacob Faibussowitsch     communicators
230e94e781bSJacob Faibussowitsch 
231*811af0c4SBarry Smith     Note:
232*811af0c4SBarry Smith     Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
233e94e781bSJacob Faibussowitsch 
234fe9b927eSVaclav Hapla     Level: developer
235e94e781bSJacob Faibussowitsch 
236db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
237e94e781bSJacob Faibussowitsch @*/
2389371c9d4SSatish Balay PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) {
239e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
240e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2415f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
242e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2435f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
244e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
245e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
246e94e781bSJacob Faibussowitsch }
247e94e781bSJacob Faibussowitsch 
248e94e781bSJacob Faibussowitsch /*@C
249*811af0c4SBarry Smith     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
250e94e781bSJacob Faibussowitsch 
251e94e781bSJacob Faibussowitsch     Not Collective
252e94e781bSJacob Faibussowitsch 
253e94e781bSJacob Faibussowitsch     Input Parameters:
254*811af0c4SBarry Smith +   classname - Name of the class to activate/deactivate `PetscInfo()` for
255e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
256e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
257e94e781bSJacob Faibussowitsch 
258e94e781bSJacob Faibussowitsch     Level: developer
259e94e781bSJacob Faibussowitsch 
260db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
261e94e781bSJacob Faibussowitsch @*/
2629371c9d4SSatish Balay PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[]) {
263e94e781bSJacob Faibussowitsch   PetscInt  i;
264e94e781bSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt, pkg;
265e94e781bSJacob Faibussowitsch   char      logList[256];
266e94e781bSJacob Faibussowitsch 
267e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
268e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2699566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
270e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
2719566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
272e94e781bSJacob Faibussowitsch   if (opt) {
2739566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
274e94e781bSJacob Faibussowitsch     if (pkg) {
27548a46eb9SPierre Jolivet       for (i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
276e94e781bSJacob Faibussowitsch     }
277e94e781bSJacob Faibussowitsch   }
2789566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
279e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
280e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
281e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
28248a46eb9SPierre Jolivet       for (i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
283e94e781bSJacob Faibussowitsch     }
284e94e781bSJacob Faibussowitsch   } else {
28548a46eb9SPierre Jolivet     for (i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
286e94e781bSJacob Faibussowitsch   }
287e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
288e94e781bSJacob Faibussowitsch }
289e94e781bSJacob Faibussowitsch 
290e94e781bSJacob Faibussowitsch /*@
291*811af0c4SBarry Smith     PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
292e94e781bSJacob Faibussowitsch 
293e94e781bSJacob Faibussowitsch     Not Collective
294e94e781bSJacob Faibussowitsch 
295e94e781bSJacob Faibussowitsch     Input Parameter:
296*811af0c4SBarry Smith .   commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
297e94e781bSJacob Faibussowitsch 
298fe9b927eSVaclav Hapla     Level: advanced
299e94e781bSJacob Faibussowitsch 
300db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()`
301e94e781bSJacob Faibussowitsch @*/
3029371c9d4SSatish Balay PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) {
303e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
304e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
305e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
306e94e781bSJacob Faibussowitsch }
307e94e781bSJacob Faibussowitsch 
308e94e781bSJacob Faibussowitsch /*@
309*811af0c4SBarry Smith     PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()`
310e94e781bSJacob Faibussowitsch 
311e94e781bSJacob Faibussowitsch     Not Collective
312e94e781bSJacob Faibussowitsch 
313e94e781bSJacob Faibussowitsch     Input Parameter:
314e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
315e94e781bSJacob Faibussowitsch 
316fe9b927eSVaclav Hapla     Options Database Keys:
317fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
318e94e781bSJacob Faibussowitsch 
319*811af0c4SBarry Smith     Note:
320*811af0c4SBarry Smith     This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
321e94e781bSJacob Faibussowitsch 
322fe9b927eSVaclav Hapla     Level: advanced
323e94e781bSJacob Faibussowitsch 
324db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
325e94e781bSJacob Faibussowitsch @*/
3269371c9d4SSatish Balay PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) {
327e94e781bSJacob Faibussowitsch   char              optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
328e94e781bSJacob Faibussowitsch   char            **loc1_array = NULL;
329e94e781bSJacob Faibussowitsch   PetscBool         set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE;
330e94e781bSJacob Faibussowitsch   size_t            size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0;
331e94e781bSJacob Faibussowitsch   int               nLoc1_       = 0;
332e94e781bSJacob Faibussowitsch   PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
333e94e781bSJacob Faibussowitsch 
334e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3359566063dSJacob Faibussowitsch   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead"));
3369566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, sizeof(optstring), &set));
337e94e781bSJacob Faibussowitsch   if (set) {
3385f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3399566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3409566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3419566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
342e94e781bSJacob Faibussowitsch     if (loc1_) {
343ebd100edSVaclav Hapla       *loc1_++ = 0;
344e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
345e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
346e94e781bSJacob Faibussowitsch         ++loc1_;
347e94e781bSJacob Faibussowitsch       }
3489566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
349e94e781bSJacob Faibussowitsch     }
350e94e781bSJacob Faibussowitsch     if (loc2_) {
351ebd100edSVaclav Hapla       *loc2_++ = 0;
352e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
353e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
354e94e781bSJacob Faibussowitsch         ++loc2_;
355e94e781bSJacob Faibussowitsch       }
356e94e781bSJacob Faibussowitsch     }
3579566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3589566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3599566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
360e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3619566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3629566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
363e94e781bSJacob Faibussowitsch     }
364e94e781bSJacob Faibussowitsch     if (size_loc2_) {
3659566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
3669566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
367e94e781bSJacob Faibussowitsch       if (foundSelf) {
368e94e781bSJacob Faibussowitsch         if (loc2_invert) {
369e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_NO_SELF;
370e94e781bSJacob Faibussowitsch         } else {
371e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_ONLY_SELF;
372e94e781bSJacob Faibussowitsch         }
373e94e781bSJacob Faibussowitsch       }
374e94e781bSJacob Faibussowitsch     }
3759566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
3769566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
3779566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
3789566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
3799566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
380e94e781bSJacob Faibussowitsch   }
381e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
382e94e781bSJacob Faibussowitsch }
383e94e781bSJacob Faibussowitsch 
384e94e781bSJacob Faibussowitsch /*@
385*811af0c4SBarry Smith   PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
386e94e781bSJacob Faibussowitsch 
387e94e781bSJacob Faibussowitsch   Not Collective
388e94e781bSJacob Faibussowitsch 
389*811af0c4SBarry Smith   Note:
390*811af0c4SBarry Smith   This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
391*811af0c4SBarry Smith   `PetscInfo()` calls down the line.
392e94e781bSJacob Faibussowitsch 
393fe9b927eSVaclav Hapla   Level: developer
3946c877ef6SSatish Balay 
395db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`
396e94e781bSJacob Faibussowitsch @*/
3979371c9d4SSatish Balay PetscErrorCode PetscInfoDestroy(void) {
3985f115e29SVaclav Hapla   int    err;
3995f115e29SVaclav Hapla   size_t i;
400e94e781bSJacob Faibussowitsch 
401e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4029566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4039566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
404e94e781bSJacob Faibussowitsch   err = fflush(PetscInfoFile);
40528b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
4061baa6e33SBarry Smith   if (PetscInfoFilename) PetscCall(PetscFClose(MPI_COMM_SELF, PetscInfoFile));
4079566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
408dd39110bSPierre Jolivet   for (i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); i++) PetscInfoFlags[i] = 1;
4095f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
410e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4115f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
412e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
413e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4145c6c1daeSBarry Smith   PetscFunctionReturn(0);
4155c6c1daeSBarry Smith }
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith /*@
418*811af0c4SBarry Smith   PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith   Not Collective
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith   Input Parameter:
423*811af0c4SBarry Smith . classid - The object class,  e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4245c6c1daeSBarry Smith 
425*811af0c4SBarry Smith   Note:
4265c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4275c6c1daeSBarry Smith 
4285c6c1daeSBarry Smith   Level: developer
4295c6c1daeSBarry Smith 
430db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4315c6c1daeSBarry Smith @*/
4329371c9d4SSatish Balay PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) {
4335c6c1daeSBarry Smith   PetscFunctionBegin;
434fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
435fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0;
4365c6c1daeSBarry Smith   PetscFunctionReturn(0);
4375c6c1daeSBarry Smith }
4385c6c1daeSBarry Smith 
4395c6c1daeSBarry Smith /*@
440*811af0c4SBarry Smith   PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith   Not Collective
4435c6c1daeSBarry Smith 
4445c6c1daeSBarry Smith   Input Parameter:
445*811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4465c6c1daeSBarry Smith 
447*811af0c4SBarry Smith   Note:
4485c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4495c6c1daeSBarry Smith 
4505c6c1daeSBarry Smith   Level: developer
4515c6c1daeSBarry Smith 
452db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4535c6c1daeSBarry Smith @*/
4549371c9d4SSatish Balay PetscErrorCode PetscInfoActivateClass(PetscClassId classid) {
4555c6c1daeSBarry Smith   PetscFunctionBegin;
456fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
457fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1;
4585c6c1daeSBarry Smith   PetscFunctionReturn(0);
4595c6c1daeSBarry Smith }
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith /*
4625c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
4635c6c1daeSBarry Smith   messages are also printed to the history file, called by default
4645c6c1daeSBarry Smith   .petschistory in ones home directory.
4655c6c1daeSBarry Smith */
46695c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
4675c6c1daeSBarry Smith 
4685c6c1daeSBarry Smith /*MC
469e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith    Synopsis:
472aaa7dc30SBarry Smith        #include <petscsys.h>
473fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
4747d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
4757d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
476fe9b927eSVaclav Hapla        ...
4775c6c1daeSBarry Smith 
478fe9b927eSVaclav Hapla     Collective on obj
4795c6c1daeSBarry Smith 
480d8d19677SJose E. Roman     Input Parameters:
481fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
4825c6c1daeSBarry Smith .   message - logging message
483fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
484fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
485e94e781bSJacob Faibussowitsch 
486e94e781bSJacob Faibussowitsch     Notes:
487*811af0c4SBarry Smith     `PetscInfo()` prints only from the first processor in the communicator of obj.
488*811af0c4SBarry Smith     If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
489fe9b927eSVaclav Hapla 
490fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
491fe9b927eSVaclav Hapla 
492fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
493fe9b927eSVaclav Hapla 
494*811af0c4SBarry Smith     No filename means standard output `PETSC_STDOUT` is used.
495fe9b927eSVaclav Hapla 
496fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
497fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
498fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
499fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
500fe9b927eSVaclav Hapla 
501*811af0c4SBarry 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.
502*811af0c4SBarry 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.
503fe9b927eSVaclav Hapla 
504fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
505fe9b927eSVaclav Hapla 
506fe9b927eSVaclav Hapla     Example of Usage:
507fe9b927eSVaclav Hapla $     Mat A;
508fe9b927eSVaclav Hapla $     PetscInt alpha;
509fe9b927eSVaclav Hapla $     ...
5107d3de750SJacob Faibussowitsch $     PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
511fe9b927eSVaclav Hapla 
512fe9b927eSVaclav Hapla     Options Examples:
513fe9b927eSVaclav Hapla     Each call of the form
514fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
5157d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1);
5167d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1, arg2);
517fe9b927eSVaclav Hapla     is evaluated as follows.
518fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
519fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
520fe9b927eSVaclav 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
521fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
522fe9b927eSVaclav Hapla     Note that
523fe9b927eSVaclav Hapla $     -info :sys:~self
524fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
525fe9b927eSVaclav Hapla 
526fe9b927eSVaclav Hapla     Fortran Note:
527*811af0c4SBarry Smith     This function does not take the obj argument, there is only the `PetscInfo()`
528*811af0c4SBarry Smith      version, not `PetscInfo()` etc.
5295c6c1daeSBarry Smith 
5305c6c1daeSBarry Smith     Level: intermediate
5315c6c1daeSBarry Smith 
532db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5335c6c1daeSBarry Smith M*/
5349371c9d4SSatish Balay PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) {
5355c6c1daeSBarry Smith   va_list      Argp;
536e94e781bSJacob Faibussowitsch   PetscMPIInt  rank = 0, urank, size = 1;
537fa2bb9feSLisandro Dalcin   PetscClassId classid;
538e94e781bSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE, oldflag;
5395c6c1daeSBarry Smith   char         string[8 * 1024];
540e94e781bSJacob Faibussowitsch   size_t       fullLength, len;
5415c6c1daeSBarry Smith   int          err;
5425c6c1daeSBarry Smith 
5435c6c1daeSBarry Smith   PetscFunctionBegin;
544940d77c0SToby Isaac   if (obj) PetscValidHeader(obj, 2);
545fa2bb9feSLisandro Dalcin   classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID;
5469566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
547e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
548e94e781bSJacob Faibussowitsch   PetscValidCharPointer(message, 3);
549e94e781bSJacob Faibussowitsch   if (obj) {
5509566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(obj->comm, &rank));
5519566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(obj->comm, &size));
552e94e781bSJacob Faibussowitsch   }
553e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5545c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
555e94e781bSJacob Faibussowitsch   if (!PetscInfoCommFilter && (size < 2)) {
556e94e781bSJacob Faibussowitsch     /* If no self printing is allowed, and size too small get out */
557e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
558e94e781bSJacob Faibussowitsch   } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) {
559e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
560e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
561e94e781bSJacob Faibussowitsch   }
562e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
5639371c9d4SSatish Balay   oldflag           = PetscLogPrintInfo;
5649371c9d4SSatish Balay   PetscLogPrintInfo = PETSC_FALSE;
5659566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
5665c6c1daeSBarry Smith   va_start(Argp, message);
5675c6c1daeSBarry Smith   sprintf(string, "[%d] %s(): ", urank, func);
5689566063dSJacob Faibussowitsch   PetscCall(PetscStrlen(string, &len));
5699566063dSJacob Faibussowitsch   PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
5709566063dSJacob Faibussowitsch   PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string));
5715c6c1daeSBarry Smith   err = fflush(PetscInfoFile);
57228b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
5735c6c1daeSBarry Smith   if (petsc_history) {
5745c6c1daeSBarry Smith     va_start(Argp, message);
5759566063dSJacob Faibussowitsch     PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
5765c6c1daeSBarry Smith   }
5775c6c1daeSBarry Smith   va_end(Argp);
578e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = oldflag;
5795c6c1daeSBarry Smith   PetscFunctionReturn(0);
5805c6c1daeSBarry Smith }
581