xref: /petsc/src/sys/info/verboseinfo.c (revision c3339decea92175325d9368fa13196bcd0e0e58b)
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};
2855205543SJacob Faibussowitsch static char             *PetscInfoNames[PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags)] = {NULL};
295f115e29SVaclav Hapla PetscBool                PetscLogPrintInfo                                         = PETSC_FALSE;
30e94e781bSJacob Faibussowitsch FILE                    *PetscInfoFile                                             = NULL;
315c6c1daeSBarry Smith 
32e94e781bSJacob Faibussowitsch /*@
33811af0c4SBarry Smith     PetscInfoEnabled - Checks whether a given OBJECT_CLASSID is allowed to print using `PetscInfo()`
34e94e781bSJacob Faibussowitsch 
35e94e781bSJacob Faibussowitsch     Not Collective
36e94e781bSJacob Faibussowitsch 
37e94e781bSJacob Faibussowitsch     Input Parameters:
38811af0c4SBarry Smith .   classid - `PetscClassid` retrieved from a `PetscObject` e.g. `VEC_CLASSID`
39e94e781bSJacob Faibussowitsch 
40e94e781bSJacob Faibussowitsch     Output Parameter:
41811af0c4SBarry Smith .   enabled - `PetscBool` indicating whether this classid is allowed to print
42e94e781bSJacob Faibussowitsch 
43811af0c4SBarry Smith     Note:
44811af0c4SBarry Smith     Use `PETSC_SMALLEST_CLASSID` to check if "sys" `PetscInfo()` calls are enabled. When PETSc is configured with debugging
45811af0c4SBarry Smith     support this function checks if classid >= `PETSC_SMALLEST_CLASSID`, otherwise it assumes valid classid.
46e94e781bSJacob Faibussowitsch 
47fe9b927eSVaclav Hapla     Level: advanced
48e94e781bSJacob Faibussowitsch 
49db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoGetInfo()`, `PetscObjectGetClassid()`
50e94e781bSJacob Faibussowitsch @*/
51d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled)
52d71ae5a4SJacob Faibussowitsch {
53e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
548b86dd2eSJacob Faibussowitsch   PetscValidBoolPointer(enabled, 2);
5508401ef6SPierre 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);
56e94e781bSJacob Faibussowitsch   *enabled = (PetscBool)(PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
57e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
58e94e781bSJacob Faibussowitsch }
59e94e781bSJacob Faibussowitsch 
60e94e781bSJacob Faibussowitsch /*@
61811af0c4SBarry Smith     PetscInfoAllow - Enables/disables `PetscInfo()` messages
625c6c1daeSBarry Smith 
63fe9b927eSVaclav Hapla     Not Collective
645c6c1daeSBarry Smith 
655c6c1daeSBarry Smith     Input Parameter:
66811af0c4SBarry Smith .   flag - `PETSC_TRUE` or `PETSC_FALSE`
675c6c1daeSBarry Smith 
685c6c1daeSBarry Smith     Level: advanced
695c6c1daeSBarry Smith 
70db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()`
715c6c1daeSBarry Smith @*/
72d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag)
73d71ae5a4SJacob Faibussowitsch {
74e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
75e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
76e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
77e94e781bSJacob Faibussowitsch }
78e94e781bSJacob Faibussowitsch 
79e94e781bSJacob Faibussowitsch /*@C
80811af0c4SBarry Smith     PetscInfoSetFile - Sets the printing destination for all `PetscInfo()` calls
81e94e781bSJacob Faibussowitsch 
82fe9b927eSVaclav Hapla     Not Collective
83e94e781bSJacob Faibussowitsch 
84d8d19677SJose E. Roman     Input Parameters:
85811af0c4SBarry Smith +   filename - Name of the file where `PetscInfo()` will print to
86811af0c4SBarry Smith -   mode - Write mode passed to PetscFOpen()`
87e94e781bSJacob Faibussowitsch 
88811af0c4SBarry Smith     Note:
89811af0c4SBarry Smith     Use filename = NULL to set `PetscInfo()` to write to `PETSC_STDOUT`.
90e94e781bSJacob Faibussowitsch 
91e94e781bSJacob Faibussowitsch     Level: advanced
92e94e781bSJacob Faibussowitsch 
93db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()`
94e94e781bSJacob Faibussowitsch @*/
95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[])
96d71ae5a4SJacob Faibussowitsch {
975c6c1daeSBarry Smith   PetscFunctionBegin;
98e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
999566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
100e94e781bSJacob Faibussowitsch   if (filename) {
1018b86dd2eSJacob Faibussowitsch     PetscMPIInt rank;
1028b86dd2eSJacob Faibussowitsch     char        fname[PETSC_MAX_PATH_LEN], tname[11];
1038b86dd2eSJacob Faibussowitsch 
104e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1058b86dd2eSJacob Faibussowitsch     PetscValidCharPointer(mode, 2);
1069566063dSJacob Faibussowitsch     PetscCall(PetscFixFilename(filename, fname));
1079566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(fname, &PetscInfoFilename));
1088b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1098b86dd2eSJacob Faibussowitsch     PetscCall(PetscSNPrintf(tname, PETSC_STATIC_ARRAY_LENGTH(tname), ".%d", rank));
1108b86dd2eSJacob Faibussowitsch     PetscCall(PetscStrlcat(fname, tname, PETSC_STATIC_ARRAY_LENGTH(fname)));
1118b86dd2eSJacob Faibussowitsch     {
1128b86dd2eSJacob Faibussowitsch       const PetscBool oldflag = PetscLogPrintInfo;
1138b86dd2eSJacob Faibussowitsch 
1149371c9d4SSatish Balay       PetscLogPrintInfo = PETSC_FALSE;
1158b86dd2eSJacob Faibussowitsch       PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, mode, &PetscInfoFile));
116e94e781bSJacob Faibussowitsch       PetscLogPrintInfo = oldflag;
1178b86dd2eSJacob Faibussowitsch       /*
1188b86dd2eSJacob Faibussowitsch         PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the
1198b86dd2eSJacob Faibussowitsch         PetscInfo call inside it, and call it afterwards so that it actually writes to file
1208b86dd2eSJacob Faibussowitsch       */
1218b86dd2eSJacob Faibussowitsch     }
1229566063dSJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname));
123e94e781bSJacob Faibussowitsch   }
124e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
125e94e781bSJacob Faibussowitsch }
126a297a907SKarl Rupp 
127e94e781bSJacob Faibussowitsch /*@C
128811af0c4SBarry Smith     PetscInfoGetFile - Gets the name and FILE pointer of the file where `PetscInfo()` prints to
129e94e781bSJacob Faibussowitsch 
130e94e781bSJacob Faibussowitsch     Not Collective
131e94e781bSJacob Faibussowitsch 
132e94e781bSJacob Faibussowitsch     Output Parameters:
133e94e781bSJacob Faibussowitsch +   filename - The name of the output file
134e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
135e94e781bSJacob Faibussowitsch 
136e94e781bSJacob Faibussowitsch     Level: advanced
137e94e781bSJacob Faibussowitsch 
138e94e781bSJacob Faibussowitsch     Note:
139811af0c4SBarry Smith     This routine allocates and copies the filename so that the filename survives `PetscInfoDestroy()`. The user is
140e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
141e94e781bSJacob Faibussowitsch 
142e94e781bSJacob Faibussowitsch     Fortran Note:
143e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
144e94e781bSJacob Faibussowitsch 
145db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
146e94e781bSJacob Faibussowitsch @*/
147d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
148d71ae5a4SJacob Faibussowitsch {
149e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
150e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
151e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
1529566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
153e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
154e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
155e94e781bSJacob Faibussowitsch }
156e94e781bSJacob Faibussowitsch 
157e94e781bSJacob Faibussowitsch /*@C
158811af0c4SBarry Smith     PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
159e94e781bSJacob Faibussowitsch 
160e94e781bSJacob Faibussowitsch     Not Collective
161e94e781bSJacob Faibussowitsch 
162e94e781bSJacob Faibussowitsch     Input Parameters:
163811af0c4SBarry Smith +   exclude - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that
164e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
1658b86dd2eSJacob Faibussowitsch .   n - Number of classes to filter for (size of classnames)
166e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
167e94e781bSJacob Faibussowitsch 
168e94e781bSJacob Faibussowitsch     Notes:
169811af0c4SBarry Smith     This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called.
170e94e781bSJacob Faibussowitsch 
171811af0c4SBarry Smith     Names in the classnames list should correspond to the names returned by `PetscObjectGetClassName()`.
172e94e781bSJacob Faibussowitsch 
173e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
174811af0c4SBarry Smith     The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away.
175e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
176811af0c4SBarry Smith     Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`).
177811af0c4SBarry Smith 
178811af0c4SBarry Smith     Fortran Note:
179811af0c4SBarry Smith     Not for use in Fortran
180e94e781bSJacob Faibussowitsch 
181e94e781bSJacob Faibussowitsch     Level: developer
182e94e781bSJacob Faibussowitsch 
183db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
184e94e781bSJacob Faibussowitsch @*/
185d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames)
186d71ae5a4SJacob Faibussowitsch {
187e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
18828b400f6SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
1899566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1908b86dd2eSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames));
1918b86dd2eSJacob Faibussowitsch   PetscInfoNumClasses    = n;
192e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
193e94e781bSJacob Faibussowitsch   /* Process sys class right away */
1948b86dd2eSJacob Faibussowitsch   {
1958b86dd2eSJacob Faibussowitsch     const PetscClassId id = PETSC_SMALLEST_CLASSID;
1968b86dd2eSJacob Faibussowitsch 
1978b86dd2eSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &id));
198e94e781bSJacob Faibussowitsch   }
1995f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
200e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
201e94e781bSJacob Faibussowitsch }
202e94e781bSJacob Faibussowitsch 
203e94e781bSJacob Faibussowitsch /*@C
204811af0c4SBarry Smith     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
205e94e781bSJacob Faibussowitsch 
206e94e781bSJacob Faibussowitsch     Not Collective
207e94e781bSJacob Faibussowitsch 
20801d2d390SJose E. Roman     Input Parameter:
209e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
210e94e781bSJacob Faibussowitsch 
211e94e781bSJacob Faibussowitsch     Output Parameter:
212811af0c4SBarry Smith .   found - `PetscBool` indicating whether the classname was found
213e94e781bSJacob Faibussowitsch 
214811af0c4SBarry Smith     Note:
215811af0c4SBarry Smith     Use `PetscObjectGetName()` to retrieve an appropriate classname
216e94e781bSJacob Faibussowitsch 
217e94e781bSJacob Faibussowitsch     Level: developer
218e94e781bSJacob Faibussowitsch 
219db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
220e94e781bSJacob Faibussowitsch @*/
221d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
222d71ae5a4SJacob Faibussowitsch {
2238b86dd2eSJacob Faibussowitsch   PetscInt unused;
224e94e781bSJacob Faibussowitsch 
225e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
226e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2278b86dd2eSJacob Faibussowitsch   PetscValidBoolPointer(found, 2);
2288b86dd2eSJacob Faibussowitsch   PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found));
2295f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
230e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
231e94e781bSJacob Faibussowitsch }
232e94e781bSJacob Faibussowitsch 
233e94e781bSJacob Faibussowitsch /*@
234811af0c4SBarry Smith     PetscInfoGetInfo - Returns the current state of several important flags for `PetscInfo()`
235e94e781bSJacob Faibussowitsch 
236e94e781bSJacob Faibussowitsch     Not Collective
237e94e781bSJacob Faibussowitsch 
238e94e781bSJacob Faibussowitsch     Output Parameters:
239811af0c4SBarry Smith +   infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called
240811af0c4SBarry Smith .   classesSet - `PETSC_TRUE` if the list of classes to filter for has been set
241811af0c4SBarry Smith .   exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted
242811af0c4SBarry Smith .   locked - `PETSC_TRUE` if the list of classes to filter for has been locked
243811af0c4SBarry Smith -   commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all
244e94e781bSJacob Faibussowitsch     communicators
245e94e781bSJacob Faibussowitsch 
246811af0c4SBarry Smith     Note:
247811af0c4SBarry Smith     Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
248e94e781bSJacob Faibussowitsch 
249fe9b927eSVaclav Hapla     Level: developer
250e94e781bSJacob Faibussowitsch 
251db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
252e94e781bSJacob Faibussowitsch @*/
253d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
254d71ae5a4SJacob Faibussowitsch {
255e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
2568b86dd2eSJacob Faibussowitsch   if (infoEnabled) PetscValidBoolPointer(infoEnabled, 1);
2578b86dd2eSJacob Faibussowitsch   if (classesSet) PetscValidBoolPointer(classesSet, 2);
2588b86dd2eSJacob Faibussowitsch   if (exclude) PetscValidBoolPointer(exclude, 3);
2598b86dd2eSJacob Faibussowitsch   if (locked) PetscValidBoolPointer(locked, 4);
2608b86dd2eSJacob Faibussowitsch   if (commSelfFlag) PetscValidPointer(commSelfFlag, 5);
261e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2625f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
263e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2645f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
265e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
266e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
267e94e781bSJacob Faibussowitsch }
268e94e781bSJacob Faibussowitsch 
269e94e781bSJacob Faibussowitsch /*@C
270811af0c4SBarry Smith     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
271e94e781bSJacob Faibussowitsch 
272e94e781bSJacob Faibussowitsch     Not Collective
273e94e781bSJacob Faibussowitsch 
274e94e781bSJacob Faibussowitsch     Input Parameters:
275811af0c4SBarry Smith +   classname - Name of the class to activate/deactivate `PetscInfo()` for
276e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
277e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
278e94e781bSJacob Faibussowitsch 
279e94e781bSJacob Faibussowitsch     Level: developer
280e94e781bSJacob Faibussowitsch 
281db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
282e94e781bSJacob Faibussowitsch @*/
283d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[])
284d71ae5a4SJacob Faibussowitsch {
2858b86dd2eSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt;
286e94e781bSJacob Faibussowitsch   char      logList[256];
287e94e781bSJacob Faibussowitsch 
288e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
289e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2908b86dd2eSJacob Faibussowitsch   PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID);
2918b86dd2eSJacob Faibussowitsch   if (numClassID) PetscValidPointer(classIDs, 3);
2929566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
293e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
2949566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
295e94e781bSJacob Faibussowitsch   if (opt) {
2968b86dd2eSJacob Faibussowitsch     PetscBool pkg;
2978b86dd2eSJacob Faibussowitsch 
2989566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
299e94e781bSJacob Faibussowitsch     if (pkg) {
3008b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
301e94e781bSJacob Faibussowitsch     }
302e94e781bSJacob Faibussowitsch   }
30355205543SJacob Faibussowitsch   for (PetscInt i = 0; i < numClassID; ++i) {
30455205543SJacob Faibussowitsch     const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID;
30555205543SJacob Faibussowitsch 
30655205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[idx]));
30755205543SJacob Faibussowitsch     PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx));
30855205543SJacob Faibussowitsch   }
3099566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
310e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
311e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
312e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
3138b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
314e94e781bSJacob Faibussowitsch     }
315e94e781bSJacob Faibussowitsch   } else {
3168b86dd2eSJacob Faibussowitsch     for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
317e94e781bSJacob Faibussowitsch   }
318e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
319e94e781bSJacob Faibussowitsch }
320e94e781bSJacob Faibussowitsch 
321e94e781bSJacob Faibussowitsch /*@
322811af0c4SBarry Smith     PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
323e94e781bSJacob Faibussowitsch 
324e94e781bSJacob Faibussowitsch     Not Collective
325e94e781bSJacob Faibussowitsch 
326e94e781bSJacob Faibussowitsch     Input Parameter:
327811af0c4SBarry Smith .   commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
328e94e781bSJacob Faibussowitsch 
329fe9b927eSVaclav Hapla     Level: advanced
330e94e781bSJacob Faibussowitsch 
331db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()`
332e94e781bSJacob Faibussowitsch @*/
333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
334d71ae5a4SJacob Faibussowitsch {
335e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
336e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
337e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
338e94e781bSJacob Faibussowitsch }
339e94e781bSJacob Faibussowitsch 
340e94e781bSJacob Faibussowitsch /*@
341811af0c4SBarry Smith     PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()`
342e94e781bSJacob Faibussowitsch 
343e94e781bSJacob Faibussowitsch     Not Collective
344e94e781bSJacob Faibussowitsch 
345e94e781bSJacob Faibussowitsch     Input Parameter:
346e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
347e94e781bSJacob Faibussowitsch 
348fe9b927eSVaclav Hapla     Options Database Keys:
349fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
350e94e781bSJacob Faibussowitsch 
351811af0c4SBarry Smith     Note:
352811af0c4SBarry Smith     This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
353e94e781bSJacob Faibussowitsch 
354fe9b927eSVaclav Hapla     Level: advanced
355e94e781bSJacob Faibussowitsch 
356db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
357e94e781bSJacob Faibussowitsch @*/
358d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
359d71ae5a4SJacob Faibussowitsch {
3608b86dd2eSJacob Faibussowitsch   char      optstring[PETSC_MAX_PATH_LEN];
3618b86dd2eSJacob Faibussowitsch   PetscBool set;
362e94e781bSJacob Faibussowitsch 
363e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3649566063dSJacob Faibussowitsch   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead"));
3658b86dd2eSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set));
366e94e781bSJacob Faibussowitsch   if (set) {
3678b86dd2eSJacob Faibussowitsch     size_t            size_loc0_, size_loc1_, size_loc2_;
3688b86dd2eSJacob Faibussowitsch     char             *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
3698b86dd2eSJacob Faibussowitsch     char            **loc1_array  = NULL;
3708b86dd2eSJacob Faibussowitsch     PetscBool         loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE;
3718b86dd2eSJacob Faibussowitsch     int               nLoc1_       = 0;
3728b86dd2eSJacob Faibussowitsch     PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
3738b86dd2eSJacob Faibussowitsch 
3745f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3759566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3769566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3779566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
378e94e781bSJacob Faibussowitsch     if (loc1_) {
379ebd100edSVaclav Hapla       *loc1_++ = 0;
380e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
381e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
382e94e781bSJacob Faibussowitsch         ++loc1_;
383e94e781bSJacob Faibussowitsch       }
3849566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
385e94e781bSJacob Faibussowitsch     }
386e94e781bSJacob Faibussowitsch     if (loc2_) {
387ebd100edSVaclav Hapla       *loc2_++ = 0;
388e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
389e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
390e94e781bSJacob Faibussowitsch         ++loc2_;
391e94e781bSJacob Faibussowitsch       }
392e94e781bSJacob Faibussowitsch     }
3939566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3949566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3959566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
396e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3979566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3989566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
399e94e781bSJacob Faibussowitsch     }
400e94e781bSJacob Faibussowitsch     if (size_loc2_) {
4018b86dd2eSJacob Faibussowitsch       PetscBool foundSelf;
4028b86dd2eSJacob Faibussowitsch 
4039566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
4049566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
4058b86dd2eSJacob Faibussowitsch       if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF;
406e94e781bSJacob Faibussowitsch     }
4079566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
4089566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
4099566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
4109566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
4119566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
412e94e781bSJacob Faibussowitsch   }
413e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
414e94e781bSJacob Faibussowitsch }
415e94e781bSJacob Faibussowitsch 
416e94e781bSJacob Faibussowitsch /*@
417811af0c4SBarry Smith   PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
418e94e781bSJacob Faibussowitsch 
419e94e781bSJacob Faibussowitsch   Not Collective
420e94e781bSJacob Faibussowitsch 
421811af0c4SBarry Smith   Note:
422811af0c4SBarry Smith   This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
423811af0c4SBarry Smith   `PetscInfo()` calls down the line.
424e94e781bSJacob Faibussowitsch 
425fe9b927eSVaclav Hapla   Level: developer
4266c877ef6SSatish Balay 
427db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`
428e94e781bSJacob Faibussowitsch @*/
429d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
430d71ae5a4SJacob Faibussowitsch {
4315f115e29SVaclav Hapla   int err;
432e94e781bSJacob Faibussowitsch 
433e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4349566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4359566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
436e94e781bSJacob Faibussowitsch   err = fflush(PetscInfoFile);
43728b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
4388b86dd2eSJacob Faibussowitsch   if (PetscInfoFilename) PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile));
4399566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
44055205543SJacob Faibussowitsch   PetscAssert(PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags) == PETSC_STATIC_ARRAY_LENGTH(PetscInfoNames), PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscInfoFlags and PetscInfoNames must be the same size");
44155205543SJacob Faibussowitsch   for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) {
44255205543SJacob Faibussowitsch     PetscInfoFlags[i] = 1;
44355205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[i]));
44455205543SJacob Faibussowitsch   }
44555205543SJacob Faibussowitsch 
4465f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
447e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4485f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
449e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
450e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4515c6c1daeSBarry Smith   PetscFunctionReturn(0);
4525c6c1daeSBarry Smith }
4535c6c1daeSBarry Smith 
454d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value)
455d71ae5a4SJacob Faibussowitsch {
4568b86dd2eSJacob Faibussowitsch   PetscFunctionBegin;
4578b86dd2eSJacob Faibussowitsch   if (!classid) classid = PETSC_SMALLEST_CLASSID;
4588b86dd2eSJacob Faibussowitsch   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value;
4598b86dd2eSJacob Faibussowitsch   PetscFunctionReturn(0);
4608b86dd2eSJacob Faibussowitsch }
4618b86dd2eSJacob Faibussowitsch 
4625c6c1daeSBarry Smith /*@
463811af0c4SBarry Smith   PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4645c6c1daeSBarry Smith 
4655c6c1daeSBarry Smith   Not Collective
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith   Input Parameter:
468811af0c4SBarry Smith . classid - The object class,  e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4695c6c1daeSBarry Smith 
470811af0c4SBarry Smith   Note:
4715c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith   Level: developer
4745c6c1daeSBarry Smith 
475db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4765c6c1daeSBarry Smith @*/
477d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid)
478d71ae5a4SJacob Faibussowitsch {
4795c6c1daeSBarry Smith   PetscFunctionBegin;
4808b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 0));
4815c6c1daeSBarry Smith   PetscFunctionReturn(0);
4825c6c1daeSBarry Smith }
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith /*@
485811af0c4SBarry Smith   PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith   Not Collective
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith   Input Parameter:
490811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4915c6c1daeSBarry Smith 
492811af0c4SBarry Smith   Note:
4935c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith   Level: developer
4965c6c1daeSBarry Smith 
497db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4985c6c1daeSBarry Smith @*/
499d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid)
500d71ae5a4SJacob Faibussowitsch {
5015c6c1daeSBarry Smith   PetscFunctionBegin;
5028b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 1));
5035c6c1daeSBarry Smith   PetscFunctionReturn(0);
5045c6c1daeSBarry Smith }
5055c6c1daeSBarry Smith 
5065c6c1daeSBarry Smith /*
5075c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
5085c6c1daeSBarry Smith   messages are also printed to the history file, called by default
5095c6c1daeSBarry Smith   .petschistory in ones home directory.
5105c6c1daeSBarry Smith */
51195c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
5125c6c1daeSBarry Smith 
5135c6c1daeSBarry Smith /*MC
514e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
5155c6c1daeSBarry Smith 
5165c6c1daeSBarry Smith    Synopsis:
517aaa7dc30SBarry Smith        #include <petscsys.h>
518fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
5197d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
5207d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
521fe9b927eSVaclav Hapla        ...
5225c6c1daeSBarry Smith 
523*c3339decSBarry Smith     Collective
5245c6c1daeSBarry Smith 
525d8d19677SJose E. Roman     Input Parameters:
526fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
5275c6c1daeSBarry Smith .   message - logging message
528fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
529fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
530e94e781bSJacob Faibussowitsch 
531e94e781bSJacob Faibussowitsch     Notes:
532811af0c4SBarry Smith     `PetscInfo()` prints only from the first processor in the communicator of obj.
533811af0c4SBarry Smith     If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
534fe9b927eSVaclav Hapla 
535fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
536fe9b927eSVaclav Hapla 
537fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
538fe9b927eSVaclav Hapla 
539811af0c4SBarry Smith     No filename means standard output `PETSC_STDOUT` is used.
540fe9b927eSVaclav Hapla 
541fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
542fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
543fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
544fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
545fe9b927eSVaclav Hapla 
546811af0c4SBarry 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.
547811af0c4SBarry 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.
548fe9b927eSVaclav Hapla 
549fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
550fe9b927eSVaclav Hapla 
551fe9b927eSVaclav Hapla     Example of Usage:
552fe9b927eSVaclav Hapla $     Mat A;
553fe9b927eSVaclav Hapla $     PetscInt alpha;
554fe9b927eSVaclav Hapla $     ...
5557d3de750SJacob Faibussowitsch $     PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
556fe9b927eSVaclav Hapla 
557fe9b927eSVaclav Hapla     Options Examples:
558fe9b927eSVaclav Hapla     Each call of the form
559fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
5607d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1);
5617d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1, arg2);
562fe9b927eSVaclav Hapla     is evaluated as follows.
563fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
564fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
565fe9b927eSVaclav 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
566fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
567fe9b927eSVaclav Hapla     Note that
568fe9b927eSVaclav Hapla $     -info :sys:~self
569fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
570fe9b927eSVaclav Hapla 
571fe9b927eSVaclav Hapla     Fortran Note:
572811af0c4SBarry Smith     This function does not take the obj argument, there is only the `PetscInfo()`
573811af0c4SBarry Smith      version, not `PetscInfo()` etc.
5745c6c1daeSBarry Smith 
5755c6c1daeSBarry Smith     Level: intermediate
5765c6c1daeSBarry Smith 
577db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5785c6c1daeSBarry Smith M*/
579d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...)
580d71ae5a4SJacob Faibussowitsch {
5818b86dd2eSJacob Faibussowitsch   PetscClassId classid = PETSC_SMALLEST_CLASSID;
5828b86dd2eSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE;
5838b86dd2eSJacob Faibussowitsch   MPI_Comm     comm    = PETSC_COMM_SELF;
5848b86dd2eSJacob Faibussowitsch   PetscMPIInt  rank;
5855c6c1daeSBarry Smith 
5865c6c1daeSBarry Smith   PetscFunctionBegin;
5878b86dd2eSJacob Faibussowitsch   if (obj) {
5888b86dd2eSJacob Faibussowitsch     PetscValidHeader(obj, 2);
5898b86dd2eSJacob Faibussowitsch     classid = obj->classid;
5908b86dd2eSJacob Faibussowitsch   }
5918b86dd2eSJacob Faibussowitsch   PetscValidCharPointer(message, 3);
5929566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
593e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
5948b86dd2eSJacob Faibussowitsch   if (obj) PetscCall(PetscObjectGetComm(obj, &comm));
5958b86dd2eSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
596e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5975c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
5988b86dd2eSJacob Faibussowitsch   else {
5998b86dd2eSJacob Faibussowitsch     PetscMPIInt size;
6008b86dd2eSJacob Faibussowitsch 
6018b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(comm, &size));
6028b86dd2eSJacob Faibussowitsch     /* If no self printing is allowed, and size too small, get out */
6038b86dd2eSJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(0);
604e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
6058b86dd2eSJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(0);
606e94e781bSJacob Faibussowitsch   }
607e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
6088b86dd2eSJacob Faibussowitsch   {
6098b86dd2eSJacob Faibussowitsch     const PetscBool oldflag = PetscLogPrintInfo;
6108b86dd2eSJacob Faibussowitsch     va_list         Argp;
6118b86dd2eSJacob Faibussowitsch     PetscMPIInt     urank;
6128b86dd2eSJacob Faibussowitsch     int             err;
6138b86dd2eSJacob Faibussowitsch     char            string[8 * 1024];
6148b86dd2eSJacob Faibussowitsch     size_t          fullLength, len;
6158b86dd2eSJacob Faibussowitsch 
6169371c9d4SSatish Balay     PetscLogPrintInfo = PETSC_FALSE;
6179566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
6185c6c1daeSBarry Smith     va_start(Argp, message);
61955205543SJacob Faibussowitsch     PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func));
6209566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(string, &len));
6219566063dSJacob Faibussowitsch     PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
6229566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string));
6235c6c1daeSBarry Smith     err = fflush(PetscInfoFile);
62428b400f6SJacob Faibussowitsch     PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
6255c6c1daeSBarry Smith     if (petsc_history) {
6265c6c1daeSBarry Smith       va_start(Argp, message);
6279566063dSJacob Faibussowitsch       PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
6285c6c1daeSBarry Smith     }
6295c6c1daeSBarry Smith     va_end(Argp);
630e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
6318b86dd2eSJacob Faibussowitsch   }
6325c6c1daeSBarry Smith   PetscFunctionReturn(0);
6335c6c1daeSBarry Smith }
634