xref: /petsc/src/sys/info/verboseinfo.c (revision 5520554388890bd89a1c1cf7870aedf4e71d512f)
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};
28*55205543SJacob 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 @*/
519371c9d4SSatish Balay PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled) {
52e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
538b86dd2eSJacob Faibussowitsch   PetscValidBoolPointer(enabled, 2);
5408401ef6SPierre 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);
55e94e781bSJacob Faibussowitsch   *enabled = (PetscBool)(PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
56e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
57e94e781bSJacob Faibussowitsch }
58e94e781bSJacob Faibussowitsch 
59e94e781bSJacob Faibussowitsch /*@
60811af0c4SBarry Smith     PetscInfoAllow - Enables/disables `PetscInfo()` messages
615c6c1daeSBarry Smith 
62fe9b927eSVaclav Hapla     Not Collective
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith     Input Parameter:
65811af0c4SBarry Smith .   flag - `PETSC_TRUE` or `PETSC_FALSE`
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith     Level: advanced
685c6c1daeSBarry Smith 
69db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()`
705c6c1daeSBarry Smith @*/
719371c9d4SSatish Balay PetscErrorCode PetscInfoAllow(PetscBool flag) {
72e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
73e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
74e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
75e94e781bSJacob Faibussowitsch }
76e94e781bSJacob Faibussowitsch 
77e94e781bSJacob Faibussowitsch /*@C
78811af0c4SBarry Smith     PetscInfoSetFile - Sets the printing destination for all `PetscInfo()` calls
79e94e781bSJacob Faibussowitsch 
80fe9b927eSVaclav Hapla     Not Collective
81e94e781bSJacob Faibussowitsch 
82d8d19677SJose E. Roman     Input Parameters:
83811af0c4SBarry Smith +   filename - Name of the file where `PetscInfo()` will print to
84811af0c4SBarry Smith -   mode - Write mode passed to PetscFOpen()`
85e94e781bSJacob Faibussowitsch 
86811af0c4SBarry Smith     Note:
87811af0c4SBarry Smith     Use filename = NULL to set `PetscInfo()` to write to `PETSC_STDOUT`.
88e94e781bSJacob Faibussowitsch 
89e94e781bSJacob Faibussowitsch     Level: advanced
90e94e781bSJacob Faibussowitsch 
91db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()`
92e94e781bSJacob Faibussowitsch @*/
939371c9d4SSatish Balay PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[]) {
945c6c1daeSBarry Smith   PetscFunctionBegin;
95e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
969566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
97e94e781bSJacob Faibussowitsch   if (filename) {
988b86dd2eSJacob Faibussowitsch     PetscMPIInt rank;
998b86dd2eSJacob Faibussowitsch     char        fname[PETSC_MAX_PATH_LEN], tname[11];
1008b86dd2eSJacob Faibussowitsch 
101e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1028b86dd2eSJacob Faibussowitsch     PetscValidCharPointer(mode, 2);
1039566063dSJacob Faibussowitsch     PetscCall(PetscFixFilename(filename, fname));
1049566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(fname, &PetscInfoFilename));
1058b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1068b86dd2eSJacob Faibussowitsch     PetscCall(PetscSNPrintf(tname, PETSC_STATIC_ARRAY_LENGTH(tname), ".%d", rank));
1078b86dd2eSJacob Faibussowitsch     PetscCall(PetscStrlcat(fname, tname, PETSC_STATIC_ARRAY_LENGTH(fname)));
1088b86dd2eSJacob Faibussowitsch     {
1098b86dd2eSJacob Faibussowitsch       const PetscBool oldflag = PetscLogPrintInfo;
1108b86dd2eSJacob Faibussowitsch 
1119371c9d4SSatish Balay       PetscLogPrintInfo = PETSC_FALSE;
1128b86dd2eSJacob Faibussowitsch       PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, mode, &PetscInfoFile));
113e94e781bSJacob Faibussowitsch       PetscLogPrintInfo = oldflag;
1148b86dd2eSJacob Faibussowitsch       /*
1158b86dd2eSJacob Faibussowitsch         PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the
1168b86dd2eSJacob Faibussowitsch         PetscInfo call inside it, and call it afterwards so that it actually writes to file
1178b86dd2eSJacob Faibussowitsch       */
1188b86dd2eSJacob Faibussowitsch     }
1199566063dSJacob Faibussowitsch     PetscCall(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname));
120e94e781bSJacob Faibussowitsch   }
121e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
122e94e781bSJacob Faibussowitsch }
123a297a907SKarl Rupp 
124e94e781bSJacob Faibussowitsch /*@C
125811af0c4SBarry Smith     PetscInfoGetFile - Gets the name and FILE pointer of the file where `PetscInfo()` prints to
126e94e781bSJacob Faibussowitsch 
127e94e781bSJacob Faibussowitsch     Not Collective
128e94e781bSJacob Faibussowitsch 
129e94e781bSJacob Faibussowitsch     Output Parameters:
130e94e781bSJacob Faibussowitsch +   filename - The name of the output file
131e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
132e94e781bSJacob Faibussowitsch 
133e94e781bSJacob Faibussowitsch     Level: advanced
134e94e781bSJacob Faibussowitsch 
135e94e781bSJacob Faibussowitsch     Note:
136811af0c4SBarry Smith     This routine allocates and copies the filename so that the filename survives `PetscInfoDestroy()`. The user is
137e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
138e94e781bSJacob Faibussowitsch 
139e94e781bSJacob Faibussowitsch     Fortran Note:
140e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
141e94e781bSJacob Faibussowitsch 
142db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
143e94e781bSJacob Faibussowitsch @*/
1449371c9d4SSatish Balay PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) {
145e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
146e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
147e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
1489566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
149e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
150e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
151e94e781bSJacob Faibussowitsch }
152e94e781bSJacob Faibussowitsch 
153e94e781bSJacob Faibussowitsch /*@C
154811af0c4SBarry Smith     PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
155e94e781bSJacob Faibussowitsch 
156e94e781bSJacob Faibussowitsch     Not Collective
157e94e781bSJacob Faibussowitsch 
158e94e781bSJacob Faibussowitsch     Input Parameters:
159811af0c4SBarry Smith +   exclude - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that
160e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
1618b86dd2eSJacob Faibussowitsch .   n - Number of classes to filter for (size of classnames)
162e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
163e94e781bSJacob Faibussowitsch 
164e94e781bSJacob Faibussowitsch     Notes:
165811af0c4SBarry Smith     This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called.
166e94e781bSJacob Faibussowitsch 
167811af0c4SBarry Smith     Names in the classnames list should correspond to the names returned by `PetscObjectGetClassName()`.
168e94e781bSJacob Faibussowitsch 
169e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
170811af0c4SBarry Smith     The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away.
171e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
172811af0c4SBarry Smith     Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`).
173811af0c4SBarry Smith 
174811af0c4SBarry Smith     Fortran Note:
175811af0c4SBarry Smith     Not for use in Fortran
176e94e781bSJacob Faibussowitsch 
177e94e781bSJacob Faibussowitsch     Level: developer
178e94e781bSJacob Faibussowitsch 
179db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
180e94e781bSJacob Faibussowitsch @*/
1818b86dd2eSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames) {
182e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
18328b400f6SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
1849566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1858b86dd2eSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames));
1868b86dd2eSJacob Faibussowitsch   PetscInfoNumClasses    = n;
187e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
188e94e781bSJacob Faibussowitsch   /* Process sys class right away */
1898b86dd2eSJacob Faibussowitsch   {
1908b86dd2eSJacob Faibussowitsch     const PetscClassId id = PETSC_SMALLEST_CLASSID;
1918b86dd2eSJacob Faibussowitsch 
1928b86dd2eSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &id));
193e94e781bSJacob Faibussowitsch   }
1945f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
195e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
196e94e781bSJacob Faibussowitsch }
197e94e781bSJacob Faibussowitsch 
198e94e781bSJacob Faibussowitsch /*@C
199811af0c4SBarry Smith     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
200e94e781bSJacob Faibussowitsch 
201e94e781bSJacob Faibussowitsch     Not Collective
202e94e781bSJacob Faibussowitsch 
20301d2d390SJose E. Roman     Input Parameter:
204e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
205e94e781bSJacob Faibussowitsch 
206e94e781bSJacob Faibussowitsch     Output Parameter:
207811af0c4SBarry Smith .   found - `PetscBool` indicating whether the classname was found
208e94e781bSJacob Faibussowitsch 
209811af0c4SBarry Smith     Note:
210811af0c4SBarry Smith     Use `PetscObjectGetName()` to retrieve an appropriate classname
211e94e781bSJacob Faibussowitsch 
212e94e781bSJacob Faibussowitsch     Level: developer
213e94e781bSJacob Faibussowitsch 
214db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
215e94e781bSJacob Faibussowitsch @*/
2169371c9d4SSatish Balay PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) {
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;
224e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
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 
240811af0c4SBarry Smith     Note:
241811af0c4SBarry Smith     Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
242e94e781bSJacob Faibussowitsch 
243fe9b927eSVaclav Hapla     Level: developer
244e94e781bSJacob Faibussowitsch 
245db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
246e94e781bSJacob Faibussowitsch @*/
2479371c9d4SSatish Balay PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) {
248e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
2498b86dd2eSJacob Faibussowitsch   if (infoEnabled) PetscValidBoolPointer(infoEnabled, 1);
2508b86dd2eSJacob Faibussowitsch   if (classesSet) PetscValidBoolPointer(classesSet, 2);
2518b86dd2eSJacob Faibussowitsch   if (exclude) PetscValidBoolPointer(exclude, 3);
2528b86dd2eSJacob Faibussowitsch   if (locked) PetscValidBoolPointer(locked, 4);
2538b86dd2eSJacob Faibussowitsch   if (commSelfFlag) PetscValidPointer(commSelfFlag, 5);
254e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2555f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
256e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2575f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
258e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
259e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
260e94e781bSJacob Faibussowitsch }
261e94e781bSJacob Faibussowitsch 
262e94e781bSJacob Faibussowitsch /*@C
263811af0c4SBarry Smith     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
264e94e781bSJacob Faibussowitsch 
265e94e781bSJacob Faibussowitsch     Not Collective
266e94e781bSJacob Faibussowitsch 
267e94e781bSJacob Faibussowitsch     Input Parameters:
268811af0c4SBarry Smith +   classname - Name of the class to activate/deactivate `PetscInfo()` for
269e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
270e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
271e94e781bSJacob Faibussowitsch 
272e94e781bSJacob Faibussowitsch     Level: developer
273e94e781bSJacob Faibussowitsch 
274db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
275e94e781bSJacob Faibussowitsch @*/
2768b86dd2eSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[]) {
2778b86dd2eSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt;
278e94e781bSJacob Faibussowitsch   char      logList[256];
279e94e781bSJacob Faibussowitsch 
280e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
281e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2828b86dd2eSJacob Faibussowitsch   PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID);
2838b86dd2eSJacob Faibussowitsch   if (numClassID) PetscValidPointer(classIDs, 3);
2849566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
285e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
2869566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
287e94e781bSJacob Faibussowitsch   if (opt) {
2888b86dd2eSJacob Faibussowitsch     PetscBool pkg;
2898b86dd2eSJacob Faibussowitsch 
2909566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
291e94e781bSJacob Faibussowitsch     if (pkg) {
2928b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
293e94e781bSJacob Faibussowitsch     }
294e94e781bSJacob Faibussowitsch   }
295*55205543SJacob Faibussowitsch   for (PetscInt i = 0; i < numClassID; ++i) {
296*55205543SJacob Faibussowitsch     const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID;
297*55205543SJacob Faibussowitsch 
298*55205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[idx]));
299*55205543SJacob Faibussowitsch     PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx));
300*55205543SJacob Faibussowitsch   }
3019566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
302e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
303e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
304e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
3058b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
306e94e781bSJacob Faibussowitsch     }
307e94e781bSJacob Faibussowitsch   } else {
3088b86dd2eSJacob Faibussowitsch     for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
309e94e781bSJacob Faibussowitsch   }
310e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
311e94e781bSJacob Faibussowitsch }
312e94e781bSJacob Faibussowitsch 
313e94e781bSJacob Faibussowitsch /*@
314811af0c4SBarry Smith     PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
315e94e781bSJacob Faibussowitsch 
316e94e781bSJacob Faibussowitsch     Not Collective
317e94e781bSJacob Faibussowitsch 
318e94e781bSJacob Faibussowitsch     Input Parameter:
319811af0c4SBarry Smith .   commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
320e94e781bSJacob Faibussowitsch 
321fe9b927eSVaclav Hapla     Level: advanced
322e94e781bSJacob Faibussowitsch 
323db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()`
324e94e781bSJacob Faibussowitsch @*/
3259371c9d4SSatish Balay PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) {
326e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
327e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
328e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
329e94e781bSJacob Faibussowitsch }
330e94e781bSJacob Faibussowitsch 
331e94e781bSJacob Faibussowitsch /*@
332811af0c4SBarry Smith     PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()`
333e94e781bSJacob Faibussowitsch 
334e94e781bSJacob Faibussowitsch     Not Collective
335e94e781bSJacob Faibussowitsch 
336e94e781bSJacob Faibussowitsch     Input Parameter:
337e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
338e94e781bSJacob Faibussowitsch 
339fe9b927eSVaclav Hapla     Options Database Keys:
340fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
341e94e781bSJacob Faibussowitsch 
342811af0c4SBarry Smith     Note:
343811af0c4SBarry Smith     This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
344e94e781bSJacob Faibussowitsch 
345fe9b927eSVaclav Hapla     Level: advanced
346e94e781bSJacob Faibussowitsch 
347db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
348e94e781bSJacob Faibussowitsch @*/
3499371c9d4SSatish Balay PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) {
3508b86dd2eSJacob Faibussowitsch   char      optstring[PETSC_MAX_PATH_LEN];
3518b86dd2eSJacob Faibussowitsch   PetscBool set;
352e94e781bSJacob Faibussowitsch 
353e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3549566063dSJacob Faibussowitsch   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead"));
3558b86dd2eSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set));
356e94e781bSJacob Faibussowitsch   if (set) {
3578b86dd2eSJacob Faibussowitsch     size_t            size_loc0_, size_loc1_, size_loc2_;
3588b86dd2eSJacob Faibussowitsch     char             *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
3598b86dd2eSJacob Faibussowitsch     char            **loc1_array  = NULL;
3608b86dd2eSJacob Faibussowitsch     PetscBool         loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE;
3618b86dd2eSJacob Faibussowitsch     int               nLoc1_       = 0;
3628b86dd2eSJacob Faibussowitsch     PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
3638b86dd2eSJacob Faibussowitsch 
3645f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3659566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3669566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3679566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
368e94e781bSJacob Faibussowitsch     if (loc1_) {
369ebd100edSVaclav Hapla       *loc1_++ = 0;
370e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
371e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
372e94e781bSJacob Faibussowitsch         ++loc1_;
373e94e781bSJacob Faibussowitsch       }
3749566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
375e94e781bSJacob Faibussowitsch     }
376e94e781bSJacob Faibussowitsch     if (loc2_) {
377ebd100edSVaclav Hapla       *loc2_++ = 0;
378e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
379e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
380e94e781bSJacob Faibussowitsch         ++loc2_;
381e94e781bSJacob Faibussowitsch       }
382e94e781bSJacob Faibussowitsch     }
3839566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3849566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3859566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
386e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3879566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3889566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
389e94e781bSJacob Faibussowitsch     }
390e94e781bSJacob Faibussowitsch     if (size_loc2_) {
3918b86dd2eSJacob Faibussowitsch       PetscBool foundSelf;
3928b86dd2eSJacob Faibussowitsch 
3939566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
3949566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
3958b86dd2eSJacob Faibussowitsch       if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF;
396e94e781bSJacob Faibussowitsch     }
3979566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
3989566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
3999566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
4009566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
4019566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
402e94e781bSJacob Faibussowitsch   }
403e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
404e94e781bSJacob Faibussowitsch }
405e94e781bSJacob Faibussowitsch 
406e94e781bSJacob Faibussowitsch /*@
407811af0c4SBarry Smith   PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
408e94e781bSJacob Faibussowitsch 
409e94e781bSJacob Faibussowitsch   Not Collective
410e94e781bSJacob Faibussowitsch 
411811af0c4SBarry Smith   Note:
412811af0c4SBarry Smith   This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
413811af0c4SBarry Smith   `PetscInfo()` calls down the line.
414e94e781bSJacob Faibussowitsch 
415fe9b927eSVaclav Hapla   Level: developer
4166c877ef6SSatish Balay 
417db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()`
418e94e781bSJacob Faibussowitsch @*/
4199371c9d4SSatish Balay PetscErrorCode PetscInfoDestroy(void) {
4205f115e29SVaclav Hapla   int err;
421e94e781bSJacob Faibussowitsch 
422e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4239566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4249566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
425e94e781bSJacob Faibussowitsch   err = fflush(PetscInfoFile);
42628b400f6SJacob Faibussowitsch   PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
4278b86dd2eSJacob Faibussowitsch   if (PetscInfoFilename) PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile));
4289566063dSJacob Faibussowitsch   PetscCall(PetscFree(PetscInfoFilename));
429*55205543SJacob 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");
430*55205543SJacob Faibussowitsch   for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) {
431*55205543SJacob Faibussowitsch     PetscInfoFlags[i] = 1;
432*55205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[i]));
433*55205543SJacob Faibussowitsch   }
434*55205543SJacob Faibussowitsch 
4355f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
436e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4375f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
438e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
439e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4405c6c1daeSBarry Smith   PetscFunctionReturn(0);
4415c6c1daeSBarry Smith }
4425c6c1daeSBarry Smith 
4438b86dd2eSJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value) {
4448b86dd2eSJacob Faibussowitsch   PetscFunctionBegin;
4458b86dd2eSJacob Faibussowitsch   if (!classid) classid = PETSC_SMALLEST_CLASSID;
4468b86dd2eSJacob Faibussowitsch   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value;
4478b86dd2eSJacob Faibussowitsch   PetscFunctionReturn(0);
4488b86dd2eSJacob Faibussowitsch }
4498b86dd2eSJacob Faibussowitsch 
4505c6c1daeSBarry Smith /*@
451811af0c4SBarry Smith   PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4525c6c1daeSBarry Smith 
4535c6c1daeSBarry Smith   Not Collective
4545c6c1daeSBarry Smith 
4555c6c1daeSBarry Smith   Input Parameter:
456811af0c4SBarry Smith . classid - The object class,  e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4575c6c1daeSBarry Smith 
458811af0c4SBarry Smith   Note:
4595c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith   Level: developer
4625c6c1daeSBarry Smith 
463db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4645c6c1daeSBarry Smith @*/
4659371c9d4SSatish Balay PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) {
4665c6c1daeSBarry Smith   PetscFunctionBegin;
4678b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 0));
4685c6c1daeSBarry Smith   PetscFunctionReturn(0);
4695c6c1daeSBarry Smith }
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith /*@
472811af0c4SBarry Smith   PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4735c6c1daeSBarry Smith 
4745c6c1daeSBarry Smith   Not Collective
4755c6c1daeSBarry Smith 
4765c6c1daeSBarry Smith   Input Parameter:
477811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4785c6c1daeSBarry Smith 
479811af0c4SBarry Smith   Note:
4805c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4815c6c1daeSBarry Smith 
4825c6c1daeSBarry Smith   Level: developer
4835c6c1daeSBarry Smith 
484db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4855c6c1daeSBarry Smith @*/
4869371c9d4SSatish Balay PetscErrorCode PetscInfoActivateClass(PetscClassId classid) {
4875c6c1daeSBarry Smith   PetscFunctionBegin;
4888b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 1));
4895c6c1daeSBarry Smith   PetscFunctionReturn(0);
4905c6c1daeSBarry Smith }
4915c6c1daeSBarry Smith 
4925c6c1daeSBarry Smith /*
4935c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
4945c6c1daeSBarry Smith   messages are also printed to the history file, called by default
4955c6c1daeSBarry Smith   .petschistory in ones home directory.
4965c6c1daeSBarry Smith */
49795c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
4985c6c1daeSBarry Smith 
4995c6c1daeSBarry Smith /*MC
500e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
5015c6c1daeSBarry Smith 
5025c6c1daeSBarry Smith    Synopsis:
503aaa7dc30SBarry Smith        #include <petscsys.h>
504fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
5057d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
5067d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
507fe9b927eSVaclav Hapla        ...
5085c6c1daeSBarry Smith 
509fe9b927eSVaclav Hapla     Collective on obj
5105c6c1daeSBarry Smith 
511d8d19677SJose E. Roman     Input Parameters:
512fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
5135c6c1daeSBarry Smith .   message - logging message
514fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
515fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
516e94e781bSJacob Faibussowitsch 
517e94e781bSJacob Faibussowitsch     Notes:
518811af0c4SBarry Smith     `PetscInfo()` prints only from the first processor in the communicator of obj.
519811af0c4SBarry Smith     If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
520fe9b927eSVaclav Hapla 
521fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
522fe9b927eSVaclav Hapla 
523fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
524fe9b927eSVaclav Hapla 
525811af0c4SBarry Smith     No filename means standard output `PETSC_STDOUT` is used.
526fe9b927eSVaclav Hapla 
527fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
528fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
529fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
530fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
531fe9b927eSVaclav Hapla 
532811af0c4SBarry 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.
533811af0c4SBarry 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.
534fe9b927eSVaclav Hapla 
535fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
536fe9b927eSVaclav Hapla 
537fe9b927eSVaclav Hapla     Example of Usage:
538fe9b927eSVaclav Hapla $     Mat A;
539fe9b927eSVaclav Hapla $     PetscInt alpha;
540fe9b927eSVaclav Hapla $     ...
5417d3de750SJacob Faibussowitsch $     PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
542fe9b927eSVaclav Hapla 
543fe9b927eSVaclav Hapla     Options Examples:
544fe9b927eSVaclav Hapla     Each call of the form
545fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
5467d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1);
5477d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1, arg2);
548fe9b927eSVaclav Hapla     is evaluated as follows.
549fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
550fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
551fe9b927eSVaclav 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
552fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
553fe9b927eSVaclav Hapla     Note that
554fe9b927eSVaclav Hapla $     -info :sys:~self
555fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
556fe9b927eSVaclav Hapla 
557fe9b927eSVaclav Hapla     Fortran Note:
558811af0c4SBarry Smith     This function does not take the obj argument, there is only the `PetscInfo()`
559811af0c4SBarry Smith      version, not `PetscInfo()` etc.
5605c6c1daeSBarry Smith 
5615c6c1daeSBarry Smith     Level: intermediate
5625c6c1daeSBarry Smith 
563db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5645c6c1daeSBarry Smith M*/
5659371c9d4SSatish Balay PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) {
5668b86dd2eSJacob Faibussowitsch   PetscClassId classid = PETSC_SMALLEST_CLASSID;
5678b86dd2eSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE;
5688b86dd2eSJacob Faibussowitsch   MPI_Comm     comm    = PETSC_COMM_SELF;
5698b86dd2eSJacob Faibussowitsch   PetscMPIInt  rank;
5705c6c1daeSBarry Smith 
5715c6c1daeSBarry Smith   PetscFunctionBegin;
5728b86dd2eSJacob Faibussowitsch   if (obj) {
5738b86dd2eSJacob Faibussowitsch     PetscValidHeader(obj, 2);
5748b86dd2eSJacob Faibussowitsch     classid = obj->classid;
5758b86dd2eSJacob Faibussowitsch   }
5768b86dd2eSJacob Faibussowitsch   PetscValidCharPointer(message, 3);
5779566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
578e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
5798b86dd2eSJacob Faibussowitsch   if (obj) PetscCall(PetscObjectGetComm(obj, &comm));
5808b86dd2eSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(comm, &rank));
581e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5825c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
5838b86dd2eSJacob Faibussowitsch   else {
5848b86dd2eSJacob Faibussowitsch     PetscMPIInt size;
5858b86dd2eSJacob Faibussowitsch 
5868b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_size(comm, &size));
5878b86dd2eSJacob Faibussowitsch     /* If no self printing is allowed, and size too small, get out */
5888b86dd2eSJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(0);
589e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
5908b86dd2eSJacob Faibussowitsch     if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(0);
591e94e781bSJacob Faibussowitsch   }
592e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
5938b86dd2eSJacob Faibussowitsch   {
5948b86dd2eSJacob Faibussowitsch     const PetscBool oldflag = PetscLogPrintInfo;
5958b86dd2eSJacob Faibussowitsch     va_list         Argp;
5968b86dd2eSJacob Faibussowitsch     PetscMPIInt     urank;
5978b86dd2eSJacob Faibussowitsch     int             err;
5988b86dd2eSJacob Faibussowitsch     char            string[8 * 1024];
5998b86dd2eSJacob Faibussowitsch     size_t          fullLength, len;
6008b86dd2eSJacob Faibussowitsch 
6019371c9d4SSatish Balay     PetscLogPrintInfo = PETSC_FALSE;
6029566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
6035c6c1daeSBarry Smith     va_start(Argp, message);
604*55205543SJacob Faibussowitsch     PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func));
6059566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(string, &len));
6069566063dSJacob Faibussowitsch     PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
6079566063dSJacob Faibussowitsch     PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string));
6085c6c1daeSBarry Smith     err = fflush(PetscInfoFile);
60928b400f6SJacob Faibussowitsch     PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file");
6105c6c1daeSBarry Smith     if (petsc_history) {
6115c6c1daeSBarry Smith       va_start(Argp, message);
6129566063dSJacob Faibussowitsch       PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
6135c6c1daeSBarry Smith     }
6145c6c1daeSBarry Smith     va_end(Argp);
615e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
6168b86dd2eSJacob Faibussowitsch   }
6175c6c1daeSBarry Smith   PetscFunctionReturn(0);
6185c6c1daeSBarry Smith }
619