xref: /petsc/src/sys/info/verboseinfo.c (revision d7ceb5a29150314c0948811943d65083bce2ac82)
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 
372fe279fdSBarry Smith     Input Parameter:
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 
43667f096bSBarry Smith     Level: advanced
44667f096bSBarry Smith 
45811af0c4SBarry Smith     Note:
46811af0c4SBarry Smith     Use `PETSC_SMALLEST_CLASSID` to check if "sys" `PetscInfo()` calls are enabled. When PETSc is configured with debugging
47811af0c4SBarry Smith     support this function checks if classid >= `PETSC_SMALLEST_CLASSID`, otherwise it assumes valid classid.
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]);
573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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;
763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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
86667f096bSBarry Smith -   mode - Write mode passed to `PetscFOpen()`
87e94e781bSJacob Faibussowitsch 
88e94e781bSJacob Faibussowitsch     Level: advanced
89e94e781bSJacob Faibussowitsch 
90667f096bSBarry Smith     Note:
91667f096bSBarry Smith     Use `filename = NULL` to set `PetscInfo()` to write to `PETSC_STDOUT`.
92667f096bSBarry Smith 
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   }
1243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
125e94e781bSJacob Faibussowitsch }
126a297a907SKarl Rupp 
127e94e781bSJacob Faibussowitsch /*@C
128aa76f320SBarry Smith     PetscInfoGetFile - Gets the `filename` and `FILE` pointer of the file where `PetscInfo()` prints to
129e94e781bSJacob Faibussowitsch 
130cf53795eSBarry Smith     Not Collective; No Fortran Support
131e94e781bSJacob Faibussowitsch 
132e94e781bSJacob Faibussowitsch     Output Parameters:
133e94e781bSJacob Faibussowitsch +   filename - The name of the output file
134667f096bSBarry Smith -   InfoFile - The `FILE` pointer for the output file
135e94e781bSJacob Faibussowitsch 
136e94e781bSJacob Faibussowitsch     Level: advanced
137e94e781bSJacob Faibussowitsch 
138e94e781bSJacob Faibussowitsch     Note:
139667f096bSBarry Smith     This routine allocates and copies the `filename` so that the `filename` survives `PetscInfoDestroy()`. The user is
140667f096bSBarry Smith     therefore responsible for freeing the allocated `filename` pointer afterwards.
141e94e781bSJacob Faibussowitsch 
142db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
143e94e781bSJacob Faibussowitsch @*/
144d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
145d71ae5a4SJacob Faibussowitsch {
146e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
147e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
148e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
1499566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
150e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
1513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
152e94e781bSJacob Faibussowitsch }
153e94e781bSJacob Faibussowitsch 
154e94e781bSJacob Faibussowitsch /*@C
155811af0c4SBarry Smith     PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
156e94e781bSJacob Faibussowitsch 
157667f096bSBarry Smith     Not Collective; No Fortran Support
158e94e781bSJacob Faibussowitsch 
159e94e781bSJacob Faibussowitsch     Input Parameters:
160811af0c4SBarry Smith +   exclude - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that
161e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
162667f096bSBarry Smith .   n - Number of classes to filter for (size of `classnames`)
163e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
164e94e781bSJacob Faibussowitsch 
165667f096bSBarry Smith     Level: developer
166667f096bSBarry Smith 
167e94e781bSJacob Faibussowitsch     Notes:
168*d7ceb5a2SJacob Faibussowitsch     This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called, unless the user calls `PetscInfoDestroy()` first.
169e94e781bSJacob Faibussowitsch 
170667f096bSBarry Smith     Names in the `classnames` list should correspond to the names returned by `PetscObjectGetClassName()`.
171e94e781bSJacob Faibussowitsch 
172e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
173811af0c4SBarry Smith     The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away.
174e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
175811af0c4SBarry Smith     Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`).
176811af0c4SBarry Smith 
177db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
178e94e781bSJacob Faibussowitsch @*/
179d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames)
180d71ae5a4SJacob Faibussowitsch {
181e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
182*d7ceb5a2SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Trying to modify PetscInfo() configuration after it has been locked to a read-only state. Usually, this is an *error*! To re-enable modification, you must reset PetscInfo() by calling PetscInfoDestroy() first");
1839566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1848b86dd2eSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames));
1858b86dd2eSJacob Faibussowitsch   PetscInfoNumClasses    = n;
186e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
187e94e781bSJacob Faibussowitsch   /* Process sys class right away */
1888b86dd2eSJacob Faibussowitsch   {
1898b86dd2eSJacob Faibussowitsch     const PetscClassId id = PETSC_SMALLEST_CLASSID;
1908b86dd2eSJacob Faibussowitsch 
1918b86dd2eSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &id));
192e94e781bSJacob Faibussowitsch   }
1935f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
1943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
195e94e781bSJacob Faibussowitsch }
196e94e781bSJacob Faibussowitsch 
197e94e781bSJacob Faibussowitsch /*@C
198667f096bSBarry Smith     PetscInfoGetClass - Indicates whether the provided `classname` is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
199e94e781bSJacob Faibussowitsch 
200e94e781bSJacob Faibussowitsch     Not Collective
201e94e781bSJacob Faibussowitsch 
20201d2d390SJose E. Roman     Input Parameter:
203e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
204e94e781bSJacob Faibussowitsch 
205e94e781bSJacob Faibussowitsch     Output Parameter:
206811af0c4SBarry Smith .   found - `PetscBool` indicating whether the classname was found
207e94e781bSJacob Faibussowitsch 
208667f096bSBarry Smith     Level: developer
209667f096bSBarry Smith 
210811af0c4SBarry Smith     Note:
211811af0c4SBarry Smith     Use `PetscObjectGetName()` to retrieve an appropriate classname
212e94e781bSJacob Faibussowitsch 
213db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
214e94e781bSJacob Faibussowitsch @*/
215d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
216d71ae5a4SJacob Faibussowitsch {
2178b86dd2eSJacob Faibussowitsch   PetscInt unused;
218e94e781bSJacob Faibussowitsch 
219e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
220e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2218b86dd2eSJacob Faibussowitsch   PetscValidBoolPointer(found, 2);
2228b86dd2eSJacob Faibussowitsch   PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found));
2235f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
2243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
225e94e781bSJacob Faibussowitsch }
226e94e781bSJacob Faibussowitsch 
227e94e781bSJacob Faibussowitsch /*@
228811af0c4SBarry Smith     PetscInfoGetInfo - Returns the current state of several important flags for `PetscInfo()`
229e94e781bSJacob Faibussowitsch 
230e94e781bSJacob Faibussowitsch     Not Collective
231e94e781bSJacob Faibussowitsch 
232e94e781bSJacob Faibussowitsch     Output Parameters:
233811af0c4SBarry Smith +   infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called
234811af0c4SBarry Smith .   classesSet - `PETSC_TRUE` if the list of classes to filter for has been set
235811af0c4SBarry Smith .   exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted
236811af0c4SBarry Smith .   locked - `PETSC_TRUE` if the list of classes to filter for has been locked
237811af0c4SBarry Smith -   commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all
238e94e781bSJacob Faibussowitsch     communicators
239e94e781bSJacob Faibussowitsch 
240667f096bSBarry Smith     Level: developer
241667f096bSBarry Smith 
242811af0c4SBarry Smith     Note:
243811af0c4SBarry Smith     Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
244e94e781bSJacob Faibussowitsch 
245db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
246e94e781bSJacob Faibussowitsch @*/
247d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
248d71ae5a4SJacob Faibussowitsch {
249e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
2508b86dd2eSJacob Faibussowitsch   if (infoEnabled) PetscValidBoolPointer(infoEnabled, 1);
2518b86dd2eSJacob Faibussowitsch   if (classesSet) PetscValidBoolPointer(classesSet, 2);
2528b86dd2eSJacob Faibussowitsch   if (exclude) PetscValidBoolPointer(exclude, 3);
2538b86dd2eSJacob Faibussowitsch   if (locked) PetscValidBoolPointer(locked, 4);
2548b86dd2eSJacob Faibussowitsch   if (commSelfFlag) PetscValidPointer(commSelfFlag, 5);
255e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2565f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
257e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2585f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
259e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
2603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
261e94e781bSJacob Faibussowitsch }
262e94e781bSJacob Faibussowitsch 
263e94e781bSJacob Faibussowitsch /*@C
264811af0c4SBarry Smith     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
265e94e781bSJacob Faibussowitsch 
266e94e781bSJacob Faibussowitsch     Not Collective
267e94e781bSJacob Faibussowitsch 
268e94e781bSJacob Faibussowitsch     Input Parameters:
269811af0c4SBarry Smith +   classname - Name of the class to activate/deactivate `PetscInfo()` for
270667f096bSBarry Smith .   numClassID - Number of entries in `classIDs`
271667f096bSBarry Smith -   classIDs - Array containing all of the `PetscClassId`s associated with `classname`
272e94e781bSJacob Faibussowitsch 
273aa76f320SBarry Smith       Options Database Key:
274aa76f320SBarry Smith .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, see `PetscInfo()`.
275aa76f320SBarry Smith 
276e94e781bSJacob Faibussowitsch     Level: developer
277e94e781bSJacob Faibussowitsch 
278db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
279e94e781bSJacob Faibussowitsch @*/
280d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[])
281d71ae5a4SJacob Faibussowitsch {
2828b86dd2eSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt;
283e94e781bSJacob Faibussowitsch   char      logList[256];
284e94e781bSJacob Faibussowitsch 
285e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
286e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2878b86dd2eSJacob Faibussowitsch   PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID);
2888b86dd2eSJacob Faibussowitsch   if (numClassID) PetscValidPointer(classIDs, 3);
2899566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
290aa76f320SBarry Smith   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use ~ with -info to indicate classes to exclude"));
2919566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
292e94e781bSJacob Faibussowitsch   if (opt) {
2938b86dd2eSJacob Faibussowitsch     PetscBool pkg;
2948b86dd2eSJacob Faibussowitsch 
2959566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
296e94e781bSJacob Faibussowitsch     if (pkg) {
2978b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
298e94e781bSJacob Faibussowitsch     }
299e94e781bSJacob Faibussowitsch   }
30055205543SJacob Faibussowitsch   for (PetscInt i = 0; i < numClassID; ++i) {
30155205543SJacob Faibussowitsch     const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID;
30255205543SJacob Faibussowitsch 
30355205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[idx]));
30455205543SJacob Faibussowitsch     PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx));
30555205543SJacob Faibussowitsch   }
3069566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
307e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
308e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
309e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
3108b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
311e94e781bSJacob Faibussowitsch     }
312e94e781bSJacob Faibussowitsch   } else {
3138b86dd2eSJacob Faibussowitsch     for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
314e94e781bSJacob Faibussowitsch   }
3153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
316e94e781bSJacob Faibussowitsch }
317e94e781bSJacob Faibussowitsch 
318e94e781bSJacob Faibussowitsch /*@
319811af0c4SBarry Smith     PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
320e94e781bSJacob Faibussowitsch 
321e94e781bSJacob Faibussowitsch     Not Collective
322e94e781bSJacob Faibussowitsch 
323e94e781bSJacob Faibussowitsch     Input Parameter:
324811af0c4SBarry Smith .   commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
325e94e781bSJacob Faibussowitsch 
326aa76f320SBarry Smith     Options Database Key:
327aa76f320SBarry Smith .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
328aa76f320SBarry Smith 
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;
3373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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:
346667f096bSBarry Smith .   options - Options database, use `NULL` for default global database
347e94e781bSJacob Faibussowitsch 
348667f096bSBarry Smith     Options Database Key:
349aa76f320SBarry Smith .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
350e94e781bSJacob Faibussowitsch 
351667f096bSBarry Smith     Level: advanced
352667f096bSBarry Smith 
353811af0c4SBarry Smith     Note:
354811af0c4SBarry Smith     This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
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;
3648b86dd2eSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set));
365e94e781bSJacob Faibussowitsch   if (set) {
3668b86dd2eSJacob Faibussowitsch     size_t            size_loc0_, size_loc1_, size_loc2_;
3678b86dd2eSJacob Faibussowitsch     char             *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
3688b86dd2eSJacob Faibussowitsch     char            **loc1_array  = NULL;
3698b86dd2eSJacob Faibussowitsch     PetscBool         loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE;
3708b86dd2eSJacob Faibussowitsch     int               nLoc1_       = 0;
3718b86dd2eSJacob Faibussowitsch     PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
3728b86dd2eSJacob Faibussowitsch 
3735f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3749566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3759566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3769566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
377e94e781bSJacob Faibussowitsch     if (loc1_) {
378ebd100edSVaclav Hapla       *loc1_++ = 0;
379e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
380e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
381e94e781bSJacob Faibussowitsch         ++loc1_;
382e94e781bSJacob Faibussowitsch       }
3839566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
384e94e781bSJacob Faibussowitsch     }
385e94e781bSJacob Faibussowitsch     if (loc2_) {
386ebd100edSVaclav Hapla       *loc2_++ = 0;
387e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
388e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
389e94e781bSJacob Faibussowitsch         ++loc2_;
390e94e781bSJacob Faibussowitsch       }
391e94e781bSJacob Faibussowitsch     }
3929566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3939566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3949566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
395e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3969566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3979566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
398e94e781bSJacob Faibussowitsch     }
399e94e781bSJacob Faibussowitsch     if (size_loc2_) {
4008b86dd2eSJacob Faibussowitsch       PetscBool foundSelf;
4018b86dd2eSJacob Faibussowitsch 
4029566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
4039566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
4048b86dd2eSJacob Faibussowitsch       if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF;
405e94e781bSJacob Faibussowitsch     }
4069566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
4079566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
4089566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
4099566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
4109566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
411e94e781bSJacob Faibussowitsch   }
4123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
413e94e781bSJacob Faibussowitsch }
414e94e781bSJacob Faibussowitsch 
415e94e781bSJacob Faibussowitsch /*@
416811af0c4SBarry Smith   PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
417e94e781bSJacob Faibussowitsch 
418e94e781bSJacob Faibussowitsch   Not Collective
419e94e781bSJacob Faibussowitsch 
420667f096bSBarry Smith   Level: developer
421667f096bSBarry Smith 
422*d7ceb5a2SJacob Faibussowitsch   Notes:
423811af0c4SBarry Smith   This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
424811af0c4SBarry Smith   `PetscInfo()` calls down the line.
425e94e781bSJacob Faibussowitsch 
426*d7ceb5a2SJacob Faibussowitsch   Users calling this routine midway through a program should note that `PetscInfoDestroy()`
427*d7ceb5a2SJacob Faibussowitsch   constitutes a full reset of `PetscInfo()`. It flushes, then closes, the current info file,
428*d7ceb5a2SJacob Faibussowitsch   re-enables all classes, and resets all internal state. Finally -- and perhaps crucially -- it
429*d7ceb5a2SJacob Faibussowitsch   disables `PetscInfo()` as-if-by `PetscInfoAllow(PETSC_FALSE)`.
430*d7ceb5a2SJacob Faibussowitsch 
431db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`
432e94e781bSJacob Faibussowitsch @*/
433d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
434d71ae5a4SJacob Faibussowitsch {
435e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4369566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4379566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
438*d7ceb5a2SJacob Faibussowitsch   if (PetscInfoFile) PetscCall(PetscFFlush(PetscInfoFile));
439*d7ceb5a2SJacob Faibussowitsch   if (PetscInfoFilename) {
440*d7ceb5a2SJacob Faibussowitsch     PetscAssert(PetscInfoFile, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Have non-null PetscInfo file '%s', but corresponding FILE handle is null!", PetscInfoFilename);
4419566063dSJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoFilename));
442*d7ceb5a2SJacob Faibussowitsch     PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile));
443*d7ceb5a2SJacob Faibussowitsch   }
44455205543SJacob 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");
44555205543SJacob Faibussowitsch   for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) {
44655205543SJacob Faibussowitsch     PetscInfoFlags[i] = 1;
44755205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[i]));
44855205543SJacob Faibussowitsch   }
44955205543SJacob Faibussowitsch 
450*d7ceb5a2SJacob Faibussowitsch   PetscInfoFile          = NULL;
4515f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
452e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4535f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
454e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
455e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4575c6c1daeSBarry Smith }
4585c6c1daeSBarry Smith 
459d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value)
460d71ae5a4SJacob Faibussowitsch {
4618b86dd2eSJacob Faibussowitsch   PetscFunctionBegin;
4628b86dd2eSJacob Faibussowitsch   if (!classid) classid = PETSC_SMALLEST_CLASSID;
4638b86dd2eSJacob Faibussowitsch   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value;
4643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4658b86dd2eSJacob Faibussowitsch }
4668b86dd2eSJacob Faibussowitsch 
4675c6c1daeSBarry Smith /*@
468811af0c4SBarry Smith   PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4695c6c1daeSBarry Smith 
4705c6c1daeSBarry Smith   Not Collective
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith   Input Parameter:
473811af0c4SBarry Smith . classid - The object class,  e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4745c6c1daeSBarry Smith 
475aa76f320SBarry Smith     Options Database Key:
476aa76f320SBarry Smith .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
477aa76f320SBarry Smith 
478667f096bSBarry Smith   Level: developer
479667f096bSBarry Smith 
480811af0c4SBarry Smith   Note:
4815c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4825c6c1daeSBarry Smith 
483db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4845c6c1daeSBarry Smith @*/
485d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid)
486d71ae5a4SJacob Faibussowitsch {
4875c6c1daeSBarry Smith   PetscFunctionBegin;
4888b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 0));
4893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4905c6c1daeSBarry Smith }
4915c6c1daeSBarry Smith 
4925c6c1daeSBarry Smith /*@
493811af0c4SBarry Smith   PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4945c6c1daeSBarry Smith 
4955c6c1daeSBarry Smith   Not Collective
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith   Input Parameter:
498811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4995c6c1daeSBarry Smith 
500aa76f320SBarry Smith     Options Database Key:
501aa76f320SBarry Smith .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
502aa76f320SBarry Smith 
503667f096bSBarry Smith   Level: developer
504667f096bSBarry Smith 
505811af0c4SBarry Smith   Note:
5065c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
5075c6c1daeSBarry Smith 
508db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5095c6c1daeSBarry Smith @*/
510d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid)
511d71ae5a4SJacob Faibussowitsch {
5125c6c1daeSBarry Smith   PetscFunctionBegin;
5138b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 1));
5143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5155c6c1daeSBarry Smith }
5165c6c1daeSBarry Smith 
5175c6c1daeSBarry Smith /*
5185c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
5195c6c1daeSBarry Smith   messages are also printed to the history file, called by default
5205c6c1daeSBarry Smith   .petschistory in ones home directory.
5215c6c1daeSBarry Smith */
52295c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
5235c6c1daeSBarry Smith 
5245c6c1daeSBarry Smith /*MC
525e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
5265c6c1daeSBarry Smith 
5275c6c1daeSBarry Smith    Synopsis:
528aaa7dc30SBarry Smith        #include <petscsys.h>
529fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
5307d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
5317d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
532fe9b927eSVaclav Hapla        ...
5335c6c1daeSBarry Smith 
534c3339decSBarry Smith     Collective
5355c6c1daeSBarry Smith 
536d8d19677SJose E. Roman     Input Parameters:
537cd05f99aSJacob Faibussowitsch +   obj - object most closely associated with the logging statement or `NULL`
5385c6c1daeSBarry Smith .   message - logging message
539fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
540fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
541e94e781bSJacob Faibussowitsch 
542aa76f320SBarry Smith       Options Database Key:
543aa76f320SBarry Smith .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
544aa76f320SBarry Smith 
545667f096bSBarry Smith     Level: intermediate
546667f096bSBarry Smith 
547e94e781bSJacob Faibussowitsch     Notes:
548811af0c4SBarry Smith     `PetscInfo()` prints only from the first processor in the communicator of obj.
549811af0c4SBarry Smith     If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
550fe9b927eSVaclav Hapla 
551fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
552fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
553fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
554aa76f320SBarry Smith     A special classname `sys` relates to `PetscInfo()` with obj being `NULL`.
555fe9b927eSVaclav Hapla 
556aa76f320SBarry Smith     The optional keyword `self` specifies that `PetscInfo()` is enabled only for a communicator size of 1 (e.g. `PETSC_COMM_SELF`).
557aa76f320SBarry 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.
558fe9b927eSVaclav Hapla 
559fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
560fe9b927eSVaclav Hapla 
561fe9b927eSVaclav Hapla     Example of Usage:
562667f096bSBarry Smith .vb
563667f096bSBarry Smith      Mat A;
564667f096bSBarry Smith      PetscInt alpha;
565667f096bSBarry Smith      ...
566667f096bSBarry Smith      PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
567667f096bSBarry Smith .ve
568fe9b927eSVaclav Hapla 
569fe9b927eSVaclav Hapla     Options Examples:
570fe9b927eSVaclav Hapla     Each call of the form
571667f096bSBarry Smith .vb
572667f096bSBarry Smith      PetscInfo(obj, msg);
573667f096bSBarry Smith      PetscInfo(obj, msg, arg1);
574667f096bSBarry Smith      PetscInfo(obj, msg, arg1, arg2);
575667f096bSBarry Smith .ve
576fe9b927eSVaclav Hapla     is evaluated as follows.
577667f096bSBarry Smith .vb
578667f096bSBarry Smith     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
579667f096bSBarry Smith     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
580667f096bSBarry Smith     -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
581667f096bSBarry Smith     -info :sys prints to PETSC_STDOUT only if obj is NULL
582667f096bSBarry Smith     -info :sys:~self deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
583667f096bSBarry Smith .ve
584fe9b927eSVaclav Hapla     Fortran Note:
585aa76f320SBarry Smith     This function does not take the `obj` argument, there is only the `PetscInfo()`
586811af0c4SBarry Smith      version, not `PetscInfo()` etc.
5875c6c1daeSBarry Smith 
588db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5895c6c1daeSBarry Smith M*/
590d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...)
591d71ae5a4SJacob Faibussowitsch {
5928b86dd2eSJacob Faibussowitsch   PetscClassId classid = PETSC_SMALLEST_CLASSID;
5938b86dd2eSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE;
5948b86dd2eSJacob Faibussowitsch   MPI_Comm     comm    = PETSC_COMM_SELF;
5958b86dd2eSJacob Faibussowitsch   PetscMPIInt  rank;
5965c6c1daeSBarry Smith 
5975c6c1daeSBarry Smith   PetscFunctionBegin;
5988b86dd2eSJacob Faibussowitsch   if (obj) {
5998b86dd2eSJacob Faibussowitsch     PetscValidHeader(obj, 2);
6008b86dd2eSJacob Faibussowitsch     classid = obj->classid;
6018b86dd2eSJacob Faibussowitsch   }
6028b86dd2eSJacob Faibussowitsch   PetscValidCharPointer(message, 3);
6039566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
6043ba16761SJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(PETSC_SUCCESS);
6058b86dd2eSJacob Faibussowitsch   if (obj) PetscCall(PetscObjectGetComm(obj, &comm));
6068b86dd2eSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
607e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
6083ba16761SJacob Faibussowitsch   if (rank) PetscFunctionReturn(PETSC_SUCCESS);
6098b86dd2eSJacob Faibussowitsch   else {
6108b86dd2eSJacob Faibussowitsch     PetscMPIInt size;
6118b86dd2eSJacob Faibussowitsch 
6128b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(comm, &size));
6138b86dd2eSJacob Faibussowitsch     /* If no self printing is allowed, and size too small, get out */
6143ba16761SJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(PETSC_SUCCESS);
615e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
6163ba16761SJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(PETSC_SUCCESS);
617e94e781bSJacob Faibussowitsch   }
618e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
6198b86dd2eSJacob Faibussowitsch   {
6208b86dd2eSJacob Faibussowitsch     const PetscBool oldflag = PetscLogPrintInfo;
6218b86dd2eSJacob Faibussowitsch     va_list         Argp;
6228b86dd2eSJacob Faibussowitsch     PetscMPIInt     urank;
6238b86dd2eSJacob Faibussowitsch     char            string[8 * 1024];
6248b86dd2eSJacob Faibussowitsch     size_t          fullLength, len;
6258b86dd2eSJacob Faibussowitsch 
6269371c9d4SSatish Balay     PetscLogPrintInfo = PETSC_FALSE;
6279566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
62855205543SJacob Faibussowitsch     PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func));
6299566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(string, &len));
630eae3dc7dSJacob Faibussowitsch     va_start(Argp, message);
6319566063dSJacob Faibussowitsch     PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
632eae3dc7dSJacob Faibussowitsch     va_end(Argp);
6339566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string));
634c69effb2SJacob Faibussowitsch     PetscCall(PetscFFlush(PetscInfoFile));
6355c6c1daeSBarry Smith     if (petsc_history) {
6365c6c1daeSBarry Smith       va_start(Argp, message);
6379566063dSJacob Faibussowitsch       PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
6385c6c1daeSBarry Smith       va_end(Argp);
639eae3dc7dSJacob Faibussowitsch     }
640e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
6418b86dd2eSJacob Faibussowitsch   }
6423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6435c6c1daeSBarry Smith }
644