xref: /petsc/src/sys/info/verboseinfo.c (revision a3b724e88d046d3fedf46cc78f622355d8be981f)
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 /*@
331f089562SBarry Smith   PetscInfoEnabled - Checks whether a given `PetscClassid` 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 
491f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoGetInfo()`, `PetscObjectGetClassid()`
50e94e781bSJacob Faibussowitsch @*/
51d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled)
52d71ae5a4SJacob Faibussowitsch {
53e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
544f572ea9SToby Isaac   PetscAssertPointer(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 
701f089562SBarry Smith .seealso: [](sec_PetscInfo), `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:
85*a3b724e8SBarry Smith + filename - Name of the file where `PetscInfo()` will print to, use `NULL` to write to `PETSC_STDOUT`.
86667f096bSBarry Smith - mode     - Write mode passed to `PetscFOpen()`
87e94e781bSJacob Faibussowitsch 
88e94e781bSJacob Faibussowitsch   Level: advanced
89e94e781bSJacob Faibussowitsch 
901f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()`
91e94e781bSJacob Faibussowitsch @*/
92d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[])
93d71ae5a4SJacob Faibussowitsch {
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 
1014f572ea9SToby Isaac     PetscAssertPointer(filename, 1);
1024f572ea9SToby Isaac     PetscAssertPointer(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   }
1213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
122e94e781bSJacob Faibussowitsch }
123a297a907SKarl Rupp 
124e94e781bSJacob Faibussowitsch /*@C
125aa76f320SBarry Smith   PetscInfoGetFile - Gets the `filename` and `FILE` pointer of the file where `PetscInfo()` prints to
126e94e781bSJacob Faibussowitsch 
127cf53795eSBarry Smith   Not Collective; No Fortran Support
128e94e781bSJacob Faibussowitsch 
129e94e781bSJacob Faibussowitsch   Output Parameters:
130e94e781bSJacob Faibussowitsch + filename - The name of the output file
131667f096bSBarry Smith - InfoFile - The `FILE` pointer for the output file
132e94e781bSJacob Faibussowitsch 
133e94e781bSJacob Faibussowitsch   Level: advanced
134e94e781bSJacob Faibussowitsch 
135e94e781bSJacob Faibussowitsch   Note:
136667f096bSBarry Smith   This routine allocates and copies the `filename` so that the `filename` survives `PetscInfoDestroy()`. The user is
137*a3b724e8SBarry Smith   therefore responsible for freeing the allocated `filename` pointer with `PetscFree()`
138e94e781bSJacob Faibussowitsch 
1391f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
140e94e781bSJacob Faibussowitsch @*/
141d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
142d71ae5a4SJacob Faibussowitsch {
143e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
1444f572ea9SToby Isaac   PetscAssertPointer(filename, 1);
1454f572ea9SToby Isaac   PetscAssertPointer(InfoFile, 2);
1469566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
147e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
1483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
149e94e781bSJacob Faibussowitsch }
150e94e781bSJacob Faibussowitsch 
151e94e781bSJacob Faibussowitsch /*@C
152811af0c4SBarry Smith   PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
153e94e781bSJacob Faibussowitsch 
154667f096bSBarry Smith   Not Collective; No Fortran Support
155e94e781bSJacob Faibussowitsch 
156e94e781bSJacob Faibussowitsch   Input Parameters:
157811af0c4SBarry Smith + exclude    - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that
158e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
159667f096bSBarry Smith . n          - Number of classes to filter for (size of `classnames`)
160e94e781bSJacob Faibussowitsch - classnames - String array containing the names of classes to filter for, e.g. "vec"
161e94e781bSJacob Faibussowitsch 
162667f096bSBarry Smith   Level: developer
163667f096bSBarry Smith 
164e94e781bSJacob Faibussowitsch   Notes:
165d7ceb5a2SJacob Faibussowitsch   This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called, unless the user calls `PetscInfoDestroy()` first.
166e94e781bSJacob Faibussowitsch 
167667f096bSBarry 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 
1741f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
175e94e781bSJacob Faibussowitsch @*/
176d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames)
177d71ae5a4SJacob Faibussowitsch {
178e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
179d7ceb5a2SJacob 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");
1809566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1818b86dd2eSJacob Faibussowitsch   PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames));
1828b86dd2eSJacob Faibussowitsch   PetscInfoNumClasses    = n;
183e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
184e94e781bSJacob Faibussowitsch   /* Process sys class right away */
1858b86dd2eSJacob Faibussowitsch   {
1868b86dd2eSJacob Faibussowitsch     const PetscClassId id = PETSC_SMALLEST_CLASSID;
1878b86dd2eSJacob Faibussowitsch 
1888b86dd2eSJacob Faibussowitsch     PetscCall(PetscInfoProcessClass("sys", 1, &id));
189e94e781bSJacob Faibussowitsch   }
1905f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
1913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
192e94e781bSJacob Faibussowitsch }
193e94e781bSJacob Faibussowitsch 
194e94e781bSJacob Faibussowitsch /*@C
195667f096bSBarry Smith   PetscInfoGetClass - Indicates whether the provided `classname` is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
196e94e781bSJacob Faibussowitsch 
197e94e781bSJacob Faibussowitsch   Not Collective
198e94e781bSJacob Faibussowitsch 
19901d2d390SJose E. Roman   Input Parameter:
200e94e781bSJacob Faibussowitsch . classname - Name of the class to search for
201e94e781bSJacob Faibussowitsch 
202e94e781bSJacob Faibussowitsch   Output Parameter:
203811af0c4SBarry Smith . found - `PetscBool` indicating whether the classname was found
204e94e781bSJacob Faibussowitsch 
205667f096bSBarry Smith   Level: developer
206667f096bSBarry Smith 
207811af0c4SBarry Smith   Note:
208811af0c4SBarry Smith   Use `PetscObjectGetName()` to retrieve an appropriate classname
209e94e781bSJacob Faibussowitsch 
2101f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
211e94e781bSJacob Faibussowitsch @*/
212d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
213d71ae5a4SJacob Faibussowitsch {
2148b86dd2eSJacob Faibussowitsch   PetscInt unused;
215e94e781bSJacob Faibussowitsch 
216e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
2174f572ea9SToby Isaac   PetscAssertPointer(classname, 1);
2184f572ea9SToby Isaac   PetscAssertPointer(found, 2);
2198b86dd2eSJacob Faibussowitsch   PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found));
2205f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
2213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
222e94e781bSJacob Faibussowitsch }
223e94e781bSJacob Faibussowitsch 
224e94e781bSJacob Faibussowitsch /*@
2251f089562SBarry Smith   PetscInfoGetInfo - Returns the current state of several flags for `PetscInfo()`
226e94e781bSJacob Faibussowitsch 
227e94e781bSJacob Faibussowitsch   Not Collective
228e94e781bSJacob Faibussowitsch 
229e94e781bSJacob Faibussowitsch   Output Parameters:
230811af0c4SBarry Smith + infoEnabled  - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called
231811af0c4SBarry Smith . classesSet   - `PETSC_TRUE` if the list of classes to filter for has been set
232811af0c4SBarry Smith . exclude      - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted
233811af0c4SBarry Smith . locked       - `PETSC_TRUE` if the list of classes to filter for has been locked
234811af0c4SBarry Smith - commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all
235e94e781bSJacob Faibussowitsch     communicators
236e94e781bSJacob Faibussowitsch 
237667f096bSBarry Smith   Level: developer
238667f096bSBarry Smith 
239811af0c4SBarry Smith   Note:
240811af0c4SBarry Smith   Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
241e94e781bSJacob Faibussowitsch 
2421f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
243e94e781bSJacob Faibussowitsch @*/
244d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
245d71ae5a4SJacob Faibussowitsch {
246e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
2474f572ea9SToby Isaac   if (infoEnabled) PetscAssertPointer(infoEnabled, 1);
2484f572ea9SToby Isaac   if (classesSet) PetscAssertPointer(classesSet, 2);
2494f572ea9SToby Isaac   if (exclude) PetscAssertPointer(exclude, 3);
2504f572ea9SToby Isaac   if (locked) PetscAssertPointer(locked, 4);
2514f572ea9SToby Isaac   if (commSelfFlag) PetscAssertPointer(commSelfFlag, 5);
252e94e781bSJacob Faibussowitsch   if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2535f115e29SVaclav Hapla   if (classesSet) *classesSet = PetscInfoClassesSet;
254e94e781bSJacob Faibussowitsch   if (exclude) *exclude = PetscInfoInvertClasses;
2555f115e29SVaclav Hapla   if (locked) *locked = PetscInfoClassesLocked;
256e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
2573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
258e94e781bSJacob Faibussowitsch }
259e94e781bSJacob Faibussowitsch 
260e94e781bSJacob Faibussowitsch /*@C
261811af0c4SBarry Smith   PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
262e94e781bSJacob Faibussowitsch 
263e94e781bSJacob Faibussowitsch   Not Collective
264e94e781bSJacob Faibussowitsch 
265e94e781bSJacob Faibussowitsch   Input Parameters:
266811af0c4SBarry Smith + classname  - Name of the class to activate/deactivate `PetscInfo()` for
267667f096bSBarry Smith . numClassID - Number of entries in `classIDs`
268667f096bSBarry Smith - classIDs   - Array containing all of the `PetscClassId`s associated with `classname`
269e94e781bSJacob Faibussowitsch 
270aa76f320SBarry Smith   Options Database Key:
271aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, see `PetscInfo()`.
272aa76f320SBarry Smith 
273e94e781bSJacob Faibussowitsch   Level: developer
274e94e781bSJacob Faibussowitsch 
2751f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
276e94e781bSJacob Faibussowitsch @*/
277d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[])
278d71ae5a4SJacob Faibussowitsch {
2798b86dd2eSJacob Faibussowitsch   PetscBool enabled, exclude, found, opt;
280e94e781bSJacob Faibussowitsch   char      logList[256];
281e94e781bSJacob Faibussowitsch 
282e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
2834f572ea9SToby Isaac   PetscAssertPointer(classname, 1);
2848b86dd2eSJacob Faibussowitsch   PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID);
2854f572ea9SToby Isaac   if (numClassID) PetscAssertPointer(classIDs, 3);
2869566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
287aa76f320SBarry Smith   PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use ~ with -info to indicate classes to exclude"));
2889566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
289e94e781bSJacob Faibussowitsch   if (opt) {
2908b86dd2eSJacob Faibussowitsch     PetscBool pkg;
2918b86dd2eSJacob Faibussowitsch 
2929566063dSJacob Faibussowitsch     PetscCall(PetscStrInList(classname, logList, ',', &pkg));
293e94e781bSJacob Faibussowitsch     if (pkg) {
2948b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
295e94e781bSJacob Faibussowitsch     }
296e94e781bSJacob Faibussowitsch   }
29755205543SJacob Faibussowitsch   for (PetscInt i = 0; i < numClassID; ++i) {
29855205543SJacob Faibussowitsch     const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID;
29955205543SJacob Faibussowitsch 
30055205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[idx]));
30155205543SJacob Faibussowitsch     PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx));
30255205543SJacob Faibussowitsch   }
3039566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetClass(classname, &found));
304e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
305e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
306e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
3078b86dd2eSJacob Faibussowitsch       for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
308e94e781bSJacob Faibussowitsch     }
309e94e781bSJacob Faibussowitsch   } else {
3108b86dd2eSJacob Faibussowitsch     for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
311e94e781bSJacob Faibussowitsch   }
3123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
313e94e781bSJacob Faibussowitsch }
314e94e781bSJacob Faibussowitsch 
315e94e781bSJacob Faibussowitsch /*@
316811af0c4SBarry Smith   PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
317e94e781bSJacob Faibussowitsch 
318e94e781bSJacob Faibussowitsch   Not Collective
319e94e781bSJacob Faibussowitsch 
320e94e781bSJacob Faibussowitsch   Input Parameter:
321811af0c4SBarry Smith . commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
322e94e781bSJacob Faibussowitsch 
323aa76f320SBarry Smith   Options Database Key:
324aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
325aa76f320SBarry Smith 
326fe9b927eSVaclav Hapla   Level: advanced
327e94e781bSJacob Faibussowitsch 
3281f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetInfo()`
329e94e781bSJacob Faibussowitsch @*/
330d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
331d71ae5a4SJacob Faibussowitsch {
332e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
333e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
3343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
335e94e781bSJacob Faibussowitsch }
336e94e781bSJacob Faibussowitsch 
337e94e781bSJacob Faibussowitsch /*@
338811af0c4SBarry Smith   PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()`
339e94e781bSJacob Faibussowitsch 
340e94e781bSJacob Faibussowitsch   Not Collective
341e94e781bSJacob Faibussowitsch 
342e94e781bSJacob Faibussowitsch   Input Parameter:
343667f096bSBarry Smith . options - Options database, use `NULL` for default global database
344e94e781bSJacob Faibussowitsch 
345667f096bSBarry Smith   Options Database Key:
346aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
347e94e781bSJacob Faibussowitsch 
348667f096bSBarry Smith   Level: advanced
349667f096bSBarry Smith 
350811af0c4SBarry Smith   Note:
351811af0c4SBarry Smith   This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
352e94e781bSJacob Faibussowitsch 
3531f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
354e94e781bSJacob Faibussowitsch @*/
355d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
356d71ae5a4SJacob Faibussowitsch {
3578b86dd2eSJacob Faibussowitsch   char      optstring[PETSC_MAX_PATH_LEN];
3588b86dd2eSJacob Faibussowitsch   PetscBool set;
359e94e781bSJacob Faibussowitsch 
360e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3618b86dd2eSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set));
362e94e781bSJacob Faibussowitsch   if (set) {
3638b86dd2eSJacob Faibussowitsch     size_t            size_loc0_, size_loc1_, size_loc2_;
3648b86dd2eSJacob Faibussowitsch     char             *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
3658b86dd2eSJacob Faibussowitsch     char            **loc1_array  = NULL;
3668b86dd2eSJacob Faibussowitsch     PetscBool         loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE;
3678b86dd2eSJacob Faibussowitsch     int               nLoc1_       = 0;
3688b86dd2eSJacob Faibussowitsch     PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
3698b86dd2eSJacob Faibussowitsch 
3705f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3719566063dSJacob Faibussowitsch     PetscCall(PetscInfoAllow(PETSC_TRUE));
3729566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(optstring, &loc0_));
3739566063dSJacob Faibussowitsch     PetscCall(PetscStrchr(loc0_, ':', &loc1_));
374e94e781bSJacob Faibussowitsch     if (loc1_) {
375ebd100edSVaclav Hapla       *loc1_++ = 0;
376e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
377e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
378e94e781bSJacob Faibussowitsch         ++loc1_;
379e94e781bSJacob Faibussowitsch       }
3809566063dSJacob Faibussowitsch       PetscCall(PetscStrchr(loc1_, ':', &loc2_));
381e94e781bSJacob Faibussowitsch     }
382e94e781bSJacob Faibussowitsch     if (loc2_) {
383ebd100edSVaclav Hapla       *loc2_++ = 0;
384e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
385e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
386e94e781bSJacob Faibussowitsch         ++loc2_;
387e94e781bSJacob Faibussowitsch       }
388e94e781bSJacob Faibussowitsch     }
3899566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc0_, &size_loc0_));
3909566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc1_, &size_loc1_));
3919566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(loc2_, &size_loc2_));
392e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3939566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc1_));
3949566063dSJacob Faibussowitsch       PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
395e94e781bSJacob Faibussowitsch     }
396e94e781bSJacob Faibussowitsch     if (size_loc2_) {
3978b86dd2eSJacob Faibussowitsch       PetscBool foundSelf;
3988b86dd2eSJacob Faibussowitsch 
3999566063dSJacob Faibussowitsch       PetscCall(PetscStrtolower(loc2_));
4009566063dSJacob Faibussowitsch       PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
4018b86dd2eSJacob Faibussowitsch       if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF;
402e94e781bSJacob Faibussowitsch     }
4039566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
4049566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array));
4059566063dSJacob Faibussowitsch     PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
4069566063dSJacob Faibussowitsch     PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
4079566063dSJacob Faibussowitsch     PetscCall(PetscFree(loc0_));
408e94e781bSJacob Faibussowitsch   }
4093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
410e94e781bSJacob Faibussowitsch }
411e94e781bSJacob Faibussowitsch 
412e94e781bSJacob Faibussowitsch /*@
413811af0c4SBarry Smith   PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
414e94e781bSJacob Faibussowitsch 
415e94e781bSJacob Faibussowitsch   Not Collective
416e94e781bSJacob Faibussowitsch 
417667f096bSBarry Smith   Level: developer
418667f096bSBarry Smith 
419d7ceb5a2SJacob Faibussowitsch   Notes:
420811af0c4SBarry Smith   This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
421811af0c4SBarry Smith   `PetscInfo()` calls down the line.
422e94e781bSJacob Faibussowitsch 
423d7ceb5a2SJacob Faibussowitsch   Users calling this routine midway through a program should note that `PetscInfoDestroy()`
424d7ceb5a2SJacob Faibussowitsch   constitutes a full reset of `PetscInfo()`. It flushes, then closes, the current info file,
425d7ceb5a2SJacob Faibussowitsch   re-enables all classes, and resets all internal state. Finally -- and perhaps crucially -- it
426d7ceb5a2SJacob Faibussowitsch   disables `PetscInfo()` as-if-by `PetscInfoAllow(PETSC_FALSE)`.
427d7ceb5a2SJacob Faibussowitsch 
4281f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetFromOptions()`
429e94e781bSJacob Faibussowitsch @*/
430d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
431d71ae5a4SJacob Faibussowitsch {
432e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4339566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_FALSE));
4349566063dSJacob Faibussowitsch   PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
435d7ceb5a2SJacob Faibussowitsch   if (PetscInfoFile) PetscCall(PetscFFlush(PetscInfoFile));
436d7ceb5a2SJacob Faibussowitsch   if (PetscInfoFilename) {
437d7ceb5a2SJacob Faibussowitsch     PetscAssert(PetscInfoFile, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Have non-null PetscInfo file '%s', but corresponding FILE handle is null!", PetscInfoFilename);
4389566063dSJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoFilename));
439d7ceb5a2SJacob Faibussowitsch     PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile));
440d7ceb5a2SJacob Faibussowitsch   }
44155205543SJacob 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");
44255205543SJacob Faibussowitsch   for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) {
44355205543SJacob Faibussowitsch     PetscInfoFlags[i] = 1;
44455205543SJacob Faibussowitsch     PetscCall(PetscFree(PetscInfoNames[i]));
44555205543SJacob Faibussowitsch   }
44655205543SJacob Faibussowitsch 
447d7ceb5a2SJacob Faibussowitsch   PetscInfoFile          = NULL;
4485f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
449e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4505f115e29SVaclav Hapla   PetscInfoClassesSet    = PETSC_FALSE;
451e94e781bSJacob Faibussowitsch   PetscInfoNumClasses    = -1;
452e94e781bSJacob Faibussowitsch   PetscInfoCommFilter    = PETSC_INFO_COMM_ALL;
4533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4545c6c1daeSBarry Smith }
4555c6c1daeSBarry Smith 
456d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value)
457d71ae5a4SJacob Faibussowitsch {
4588b86dd2eSJacob Faibussowitsch   PetscFunctionBegin;
4598b86dd2eSJacob Faibussowitsch   if (!classid) classid = PETSC_SMALLEST_CLASSID;
4608b86dd2eSJacob Faibussowitsch   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value;
4613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4628b86dd2eSJacob Faibussowitsch }
4638b86dd2eSJacob Faibussowitsch 
4645c6c1daeSBarry Smith /*@
465811af0c4SBarry Smith   PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith   Not Collective
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith   Input Parameter:
470811af0c4SBarry Smith . classid - The object class,  e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4715c6c1daeSBarry Smith 
472aa76f320SBarry Smith   Options Database Key:
473aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
474aa76f320SBarry Smith 
475667f096bSBarry Smith   Level: developer
476667f096bSBarry Smith 
477811af0c4SBarry Smith   Note:
4785c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4795c6c1daeSBarry Smith 
4801f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4815c6c1daeSBarry Smith @*/
482d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid)
483d71ae5a4SJacob Faibussowitsch {
4845c6c1daeSBarry Smith   PetscFunctionBegin;
4858b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 0));
4863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4875c6c1daeSBarry Smith }
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith /*@
490811af0c4SBarry Smith   PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4915c6c1daeSBarry Smith 
4925c6c1daeSBarry Smith   Not Collective
4935c6c1daeSBarry Smith 
4945c6c1daeSBarry Smith   Input Parameter:
495811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4965c6c1daeSBarry Smith 
497aa76f320SBarry Smith   Options Database Key:
498aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
499aa76f320SBarry Smith 
500667f096bSBarry Smith   Level: developer
501667f096bSBarry Smith 
502811af0c4SBarry Smith   Note:
5035c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
5045c6c1daeSBarry Smith 
5051f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5065c6c1daeSBarry Smith @*/
507d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid)
508d71ae5a4SJacob Faibussowitsch {
5095c6c1daeSBarry Smith   PetscFunctionBegin;
5108b86dd2eSJacob Faibussowitsch   PetscCall(PetscInfoSetClassActivation_Private(classid, 1));
5113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5125c6c1daeSBarry Smith }
5135c6c1daeSBarry Smith 
5145c6c1daeSBarry Smith /*
5155c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
5165c6c1daeSBarry Smith   messages are also printed to the history file, called by default
5175c6c1daeSBarry Smith   .petschistory in ones home directory.
5185c6c1daeSBarry Smith */
51995c0884eSLisandro Dalcin PETSC_INTERN FILE          *petsc_history;
5208c509928SStefano Zampini PETSC_INTERN PetscErrorCode PetscVFPrintf_Internal(FILE *, const char[], ...);
5215c6c1daeSBarry Smith 
5225c6c1daeSBarry Smith /*MC
523e94e781bSJacob Faibussowitsch   PetscInfo - Logs informative data
5245c6c1daeSBarry Smith 
5255c6c1daeSBarry Smith   Synopsis:
52610450e9eSJacob Faibussowitsch   #include <petsclog.h>
52710450e9eSJacob Faibussowitsch   PetscErrorCode PetscInfo(PetscObject obj, const char message[], ...)
5285c6c1daeSBarry Smith 
529c3339decSBarry Smith   Collective
5305c6c1daeSBarry Smith 
531d8d19677SJose E. Roman   Input Parameters:
532cd05f99aSJacob Faibussowitsch + obj     - object most closely associated with the logging statement or `NULL`
53310450e9eSJacob Faibussowitsch - message - logging message using standard "printf" format
534e94e781bSJacob Faibussowitsch 
535aa76f320SBarry Smith   Options Database Key:
5361f089562SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed
537aa76f320SBarry Smith 
538667f096bSBarry Smith   Level: intermediate
539667f096bSBarry Smith 
540e94e781bSJacob Faibussowitsch   Notes:
5411f089562SBarry Smith   `PetscInfo()` prints only from the first processor in the communicator of `obj`.
5421f089562SBarry Smith   If `obj` is `NULL`, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
543fe9b927eSVaclav Hapla 
5441f089562SBarry Smith   The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. `vec,mat,ksp`.
545fe9b927eSVaclav Hapla   If this list is not specified, all classes are enabled.
546fe9b927eSVaclav Hapla   Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
5471f089562SBarry Smith   A special classname `sys` relates to `PetscInfo()` with `obj` being `NULL`.
548fe9b927eSVaclav Hapla 
549aa76f320SBarry Smith   The optional keyword `self` specifies that `PetscInfo()` is enabled only for a communicator size of 1 (e.g. `PETSC_COMM_SELF`).
550aa76f320SBarry 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.
551fe9b927eSVaclav Hapla 
552fe9b927eSVaclav Hapla   All classname/self matching is case insensitive. Filename is case sensitive.
553fe9b927eSVaclav Hapla 
554fe9b927eSVaclav Hapla   Example of Usage:
555667f096bSBarry Smith .vb
556667f096bSBarry Smith      Mat A;
557667f096bSBarry Smith      PetscInt alpha;
558667f096bSBarry Smith      ...
559667f096bSBarry Smith      PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
560667f096bSBarry Smith .ve
561fe9b927eSVaclav Hapla 
562aec76313SJacob Faibussowitsch   Examples using Options:
563fe9b927eSVaclav Hapla   Each call of the form
564667f096bSBarry Smith .vb
565667f096bSBarry Smith      PetscInfo(obj, msg);
566667f096bSBarry Smith      PetscInfo(obj, msg, arg1);
567667f096bSBarry Smith      PetscInfo(obj, msg, arg1, arg2);
568667f096bSBarry Smith .ve
569fe9b927eSVaclav Hapla   is evaluated as follows.
570667f096bSBarry Smith .vb
5711f089562SBarry Smith     -info or -info :: prints `msg` to `PETSC_STDOUT`, for any PETSc `obj` regardless class or communicator
5721f089562SBarry Smith     -info :mat:self prints `msg` to `PETSC_STDOUT` only if class of `obj` is `Mat`, and its communicator has size = 1
5731f089562SBarry 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
5741f089562SBarry Smith     -info :sys prints to `PETSC_STDOUT` only if `obj` is `NULL`
5751f089562SBarry 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`.
576667f096bSBarry Smith .ve
577aec76313SJacob Faibussowitsch 
578aec76313SJacob Faibussowitsch   Fortran Notes:
579aa76f320SBarry Smith   This function does not take the `obj` argument, there is only the `PetscInfo()`
580811af0c4SBarry Smith   version, not `PetscInfo()` etc.
5815c6c1daeSBarry Smith 
5821f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoAllow()`, `PetscInfoSetFromOptions()`, `PetscInfoEnabled()`, `PetscInfoSetFile()`, `PetscInfoGetFile()`, `PetscInfoSetClasses()`,
5831f089562SBarry Smith           `PetscInfoGetClass()`, `PetscInfoGetInfo()`, `PetscInfoProcessClass()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`, `PetscInfoDeactivateClass()`,
5841f089562SBarry Smith           `PetscInfoActivateClass()`
5855c6c1daeSBarry Smith M*/
586d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...)
587d71ae5a4SJacob Faibussowitsch {
5888b86dd2eSJacob Faibussowitsch   PetscClassId classid = PETSC_SMALLEST_CLASSID;
5898b86dd2eSJacob Faibussowitsch   PetscBool    enabled = PETSC_FALSE;
590f8fe7dbcSStefano Zampini   MPI_Comm     comm    = MPI_COMM_NULL;
591f8fe7dbcSStefano Zampini   PetscMPIInt  rank    = 0;
592b5d96b8dSStefano Zampini   const char  *otype   = NULL;
5935c6c1daeSBarry Smith 
5945c6c1daeSBarry Smith   PetscFunctionBegin;
5958b86dd2eSJacob Faibussowitsch   if (obj) {
5968b86dd2eSJacob Faibussowitsch     PetscValidHeader(obj, 2);
5978b86dd2eSJacob Faibussowitsch     classid = obj->classid;
5988b86dd2eSJacob Faibussowitsch   }
5994f572ea9SToby Isaac   PetscAssertPointer(message, 3);
6009566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(classid, &enabled));
6013ba16761SJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(PETSC_SUCCESS);
602b5d96b8dSStefano Zampini   if (obj) {
603b5d96b8dSStefano Zampini     PetscCall(PetscObjectGetComm(obj, &comm));
604b5d96b8dSStefano Zampini     PetscCall(PetscObjectGetType(obj, &otype));
6058b86dd2eSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_rank(comm, &rank));
606f8fe7dbcSStefano Zampini   }
607e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
6083ba16761SJacob Faibussowitsch   if (rank) PetscFunctionReturn(PETSC_SUCCESS);
6098b86dd2eSJacob Faibussowitsch   else {
610f8fe7dbcSStefano Zampini     PetscMPIInt size = 1;
6118b86dd2eSJacob Faibussowitsch 
612f8fe7dbcSStefano Zampini     if (comm != MPI_COMM_NULL) 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));
628b5d96b8dSStefano Zampini     if (otype) {
629b5d96b8dSStefano Zampini       PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s:%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], otype, func));
630b5d96b8dSStefano Zampini     } else {
63155205543SJacob Faibussowitsch       PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func));
632b5d96b8dSStefano Zampini     }
6339566063dSJacob Faibussowitsch     PetscCall(PetscStrlen(string, &len));
634eae3dc7dSJacob Faibussowitsch     va_start(Argp, message);
6359566063dSJacob Faibussowitsch     PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
636eae3dc7dSJacob Faibussowitsch     va_end(Argp);
6378c509928SStefano Zampini     PetscCall(PetscVFPrintf_Internal(PetscInfoFile, "%s", string));
638c69effb2SJacob Faibussowitsch     PetscCall(PetscFFlush(PetscInfoFile));
6395c6c1daeSBarry Smith     if (petsc_history) {
6405c6c1daeSBarry Smith       va_start(Argp, message);
6419566063dSJacob Faibussowitsch       PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
6425c6c1daeSBarry Smith       va_end(Argp);
643eae3dc7dSJacob Faibussowitsch     }
644e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
6458b86dd2eSJacob Faibussowitsch   }
6463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6475c6c1daeSBarry Smith }
648