xref: /petsc/src/sys/info/verboseinfo.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
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;
25e94e781bSJacob Faibussowitsch static int                PetscInfoFlags[]  = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
26e94e781bSJacob Faibussowitsch                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
27e94e781bSJacob Faibussowitsch                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
28e94e781bSJacob Faibussowitsch                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
29e94e781bSJacob Faibussowitsch                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
30e94e781bSJacob Faibussowitsch                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
31fa2bb9feSLisandro Dalcin                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
32fa2bb9feSLisandro Dalcin                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
33fa2bb9feSLisandro Dalcin                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
34fa2bb9feSLisandro Dalcin                                                1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
355f115e29SVaclav Hapla PetscBool                 PetscLogPrintInfo = PETSC_FALSE;
36e94e781bSJacob Faibussowitsch FILE                      *PetscInfoFile = NULL;
375c6c1daeSBarry Smith 
38e94e781bSJacob Faibussowitsch /*@
39e94e781bSJacob Faibussowitsch     PetscInfoEnabled - Checks whether a given OBJECT_CLASSID is allowed to print using PetscInfo()
40e94e781bSJacob Faibussowitsch 
41e94e781bSJacob Faibussowitsch     Not Collective
42e94e781bSJacob Faibussowitsch 
43e94e781bSJacob Faibussowitsch     Input Parameters:
44e94e781bSJacob Faibussowitsch .   classid - PetscClassid retrieved from a PetscObject e.g. VEC_CLASSID
45e94e781bSJacob Faibussowitsch 
46e94e781bSJacob Faibussowitsch     Output Parameter:
47e94e781bSJacob Faibussowitsch .   enabled - PetscBool indicating whether this classid is allowed to print
48e94e781bSJacob Faibussowitsch 
49e94e781bSJacob Faibussowitsch     Notes:
50e94e781bSJacob Faibussowitsch     Use PETSC_SMALLEST_CLASSID to check if "sys" PetscInfo() calls are enabled. When PETSc is configured with debugging
51e94e781bSJacob Faibussowitsch     support this function checks if classid >= PETSC_SMALLEST_CLASSID, otherwise it assumes valid classid.
52e94e781bSJacob Faibussowitsch 
53fe9b927eSVaclav Hapla     Level: advanced
54e94e781bSJacob Faibussowitsch 
55e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoGetInfo(), PetscObjectGetClassid()
56e94e781bSJacob Faibussowitsch @*/
57e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled)
58e94e781bSJacob Faibussowitsch {
59e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
602c71b3e2SJacob Faibussowitsch   PetscCheckFalse(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);
61e94e781bSJacob Faibussowitsch   *enabled = (PetscBool) (PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
62e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
63e94e781bSJacob Faibussowitsch }
64e94e781bSJacob Faibussowitsch 
65e94e781bSJacob Faibussowitsch /*@
66fe9b927eSVaclav Hapla     PetscInfoAllow - Enables/disables PetscInfo() messages
675c6c1daeSBarry Smith 
68fe9b927eSVaclav Hapla     Not Collective
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith     Input Parameter:
71e94e781bSJacob Faibussowitsch .   flag - PETSC_TRUE or PETSC_FALSE
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith     Level: advanced
745c6c1daeSBarry Smith 
75e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoEnabled(), PetscInfoGetInfo(), PetscInfoSetFromOptions()
765c6c1daeSBarry Smith @*/
77e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag)
78e94e781bSJacob Faibussowitsch {
79e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
80e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
81e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
82e94e781bSJacob Faibussowitsch }
83e94e781bSJacob Faibussowitsch 
84e94e781bSJacob Faibussowitsch /*@C
85fe9b927eSVaclav Hapla     PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls
86e94e781bSJacob Faibussowitsch 
87fe9b927eSVaclav Hapla     Not Collective
88e94e781bSJacob Faibussowitsch 
89d8d19677SJose E. Roman     Input Parameters:
90e94e781bSJacob Faibussowitsch +   filename - Name of the file where PetscInfo() will print to
91e94e781bSJacob Faibussowitsch -   mode - Write mode passed to PetscFOpen()
92e94e781bSJacob Faibussowitsch 
93e94e781bSJacob Faibussowitsch     Notes:
94fe9b927eSVaclav Hapla     Use filename=NULL to set PetscInfo() to write to PETSC_STDOUT.
95e94e781bSJacob Faibussowitsch 
96e94e781bSJacob Faibussowitsch     Level: advanced
97e94e781bSJacob Faibussowitsch 
98e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscFOpen()
99e94e781bSJacob Faibussowitsch @*/
100e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[])
1015c6c1daeSBarry Smith {
102fa2bb9feSLisandro Dalcin   char            fname[PETSC_MAX_PATH_LEN], tname[11];
1035c6c1daeSBarry Smith   PetscMPIInt     rank;
1045c6c1daeSBarry Smith 
1055c6c1daeSBarry Smith   PetscFunctionBegin;
106e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
1075f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(PetscInfoFilename));
108e94e781bSJacob Faibussowitsch   if (filename) {
109e94e781bSJacob Faibussowitsch     PetscBool  oldflag;
110e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1115f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFixFilename(filename, fname));
1125f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrallocpy(fname, &PetscInfoFilename));
1135f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_rank(MPI_COMM_WORLD, &rank));
1145c6c1daeSBarry Smith     sprintf(tname, ".%d", rank);
1155f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrcat(fname, tname));
116e94e781bSJacob Faibussowitsch     oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
1175f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile));
118e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
119e94e781bSJacob Faibussowitsch     /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and
120e94e781bSJacob Faibussowitsch      call it afterwards so that it actually writes to file */
1215f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname));
122e94e781bSJacob Faibussowitsch   }
123e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
124e94e781bSJacob Faibussowitsch }
125a297a907SKarl Rupp 
126e94e781bSJacob Faibussowitsch /*@C
127e94e781bSJacob Faibussowitsch     PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to
128e94e781bSJacob Faibussowitsch 
129e94e781bSJacob Faibussowitsch     Not Collective
130e94e781bSJacob Faibussowitsch 
131e94e781bSJacob Faibussowitsch     Output Parameters:
132e94e781bSJacob Faibussowitsch +   filename - The name of the output file
133e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
134e94e781bSJacob Faibussowitsch 
135e94e781bSJacob Faibussowitsch     Level: advanced
136e94e781bSJacob Faibussowitsch 
137e94e781bSJacob Faibussowitsch     Note:
138e94e781bSJacob Faibussowitsch     This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is
139e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
140e94e781bSJacob Faibussowitsch 
141e94e781bSJacob Faibussowitsch     Fortran Note:
142e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
143e94e781bSJacob Faibussowitsch 
144e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy()
145e94e781bSJacob Faibussowitsch @*/
146e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
147e94e781bSJacob Faibussowitsch {
148e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
149e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
150e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
1515f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrallocpy(PetscInfoFilename, filename));
152e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
153e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
154e94e781bSJacob Faibussowitsch }
155e94e781bSJacob Faibussowitsch 
156e94e781bSJacob Faibussowitsch /*@C
157e94e781bSJacob Faibussowitsch     PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against
158e94e781bSJacob Faibussowitsch 
159e94e781bSJacob Faibussowitsch     Not Collective
160e94e781bSJacob Faibussowitsch 
161e94e781bSJacob Faibussowitsch     Input Parameters:
162e94e781bSJacob Faibussowitsch +   exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that
163e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
164e94e781bSJacob Faibussowitsch .   N - Number of classes to filter for (size of classnames)
165e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
166e94e781bSJacob Faibussowitsch 
167e94e781bSJacob Faibussowitsch     Notes:
168e94e781bSJacob Faibussowitsch     Not for use in Fortran
169e94e781bSJacob Faibussowitsch 
170e94e781bSJacob Faibussowitsch     This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called.
171e94e781bSJacob Faibussowitsch 
172e94e781bSJacob Faibussowitsch     Names in the classnames list should correspond to the names returned by PetscObjectGetClassName().
173e94e781bSJacob Faibussowitsch 
174e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
175e94e781bSJacob Faibussowitsch     The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away.
176e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
177e94e781bSJacob Faibussowitsch     Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()).
178e94e781bSJacob Faibussowitsch 
179e94e781bSJacob Faibussowitsch     Level: developer
180e94e781bSJacob Faibussowitsch 
181e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName()
182e94e781bSJacob Faibussowitsch @*/
183e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames)
184e94e781bSJacob Faibussowitsch {
185e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
186*28b400f6SJacob Faibussowitsch   PetscCheck(!PetscInfoClassesLocked,PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
1875f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1885f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames));
189e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = N;
190e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
191e94e781bSJacob Faibussowitsch   {
192e94e781bSJacob Faibussowitsch     /* Process sys class right away */
193e94e781bSJacob Faibussowitsch     PetscClassId  sysclassid = PETSC_SMALLEST_CLASSID;
1945f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfoProcessClass("sys", 1, &sysclassid));
195e94e781bSJacob Faibussowitsch   }
1965f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
197e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
198e94e781bSJacob Faibussowitsch }
199e94e781bSJacob Faibussowitsch 
200e94e781bSJacob Faibussowitsch /*@C
201e94e781bSJacob Faibussowitsch     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses()
202e94e781bSJacob Faibussowitsch 
203e94e781bSJacob Faibussowitsch     Not Collective
204e94e781bSJacob Faibussowitsch 
20501d2d390SJose E. Roman     Input Parameter:
206e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
207e94e781bSJacob Faibussowitsch 
208e94e781bSJacob Faibussowitsch     Output Parameter:
209e94e781bSJacob Faibussowitsch .   found - PetscBool indicating whether the classname was found
210e94e781bSJacob Faibussowitsch 
211e94e781bSJacob Faibussowitsch     Notes:
212e94e781bSJacob Faibussowitsch     Use PetscObjectGetName() to retrieve an appropriate classname
213e94e781bSJacob Faibussowitsch 
214e94e781bSJacob Faibussowitsch     Level: developer
215e94e781bSJacob Faibussowitsch 
216e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName()
217e94e781bSJacob Faibussowitsch @*/
218e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
219e94e781bSJacob Faibussowitsch {
220e94e781bSJacob Faibussowitsch   PetscInt        idx;
221e94e781bSJacob Faibussowitsch 
222e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
223e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname,1);
2245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found));
2255f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
226e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
227e94e781bSJacob Faibussowitsch }
228e94e781bSJacob Faibussowitsch 
229e94e781bSJacob Faibussowitsch /*@
230e94e781bSJacob Faibussowitsch     PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo()
231e94e781bSJacob Faibussowitsch 
232e94e781bSJacob Faibussowitsch     Not Collective
233e94e781bSJacob Faibussowitsch 
234e94e781bSJacob Faibussowitsch     Output Parameters:
235e94e781bSJacob Faibussowitsch +   infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called
236ebd100edSVaclav Hapla .   classesSet - PETSC_TRUE if the list of classes to filter for has been set
237e94e781bSJacob Faibussowitsch .   exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted
238e94e781bSJacob Faibussowitsch .   locked - PETSC_TRUE if the list of classes to filter for has been locked
239e94e781bSJacob Faibussowitsch -   commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all
240e94e781bSJacob Faibussowitsch     communicators
241e94e781bSJacob Faibussowitsch 
242e94e781bSJacob Faibussowitsch     Notes:
243e94e781bSJacob Faibussowitsch     Initially commSelfFlag = PETSC_INFO_COMM_ALL
244e94e781bSJacob Faibussowitsch 
245fe9b927eSVaclav Hapla     Level: developer
246e94e781bSJacob Faibussowitsch 
247e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions()
248e94e781bSJacob Faibussowitsch @*/
249ebd100edSVaclav Hapla PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
250e94e781bSJacob Faibussowitsch {
251e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
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;
257e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
258e94e781bSJacob Faibussowitsch }
259e94e781bSJacob Faibussowitsch 
260e94e781bSJacob Faibussowitsch /*@C
261e94e781bSJacob Faibussowitsch     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:
266e94e781bSJacob Faibussowitsch +   classname - Name of the class to activate/deactivate PetscInfo() for
267e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
268e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
269e94e781bSJacob Faibussowitsch 
270e94e781bSJacob Faibussowitsch     Level: developer
271e94e781bSJacob Faibussowitsch 
272e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions()
273e94e781bSJacob Faibussowitsch @*/
274e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[])
275e94e781bSJacob Faibussowitsch {
276e94e781bSJacob Faibussowitsch   PetscInt        i;
277e94e781bSJacob Faibussowitsch   PetscBool       enabled, exclude, found, opt, pkg;
278e94e781bSJacob Faibussowitsch   char            logList[256];
279e94e781bSJacob Faibussowitsch 
280e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
281e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
2825f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
283e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
2845f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt));
285e94e781bSJacob Faibussowitsch   if (opt) {
2865f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrInList(classname,logList,',',&pkg));
287e94e781bSJacob Faibussowitsch     if (pkg) {
288e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
2895f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscInfoDeactivateClass(classIDs[i]));
290e94e781bSJacob Faibussowitsch       }
291e94e781bSJacob Faibussowitsch     }
292e94e781bSJacob Faibussowitsch   }
2935f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscInfoGetClass(classname, &found));
294e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
295e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
296e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
297e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
2985f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscInfoDeactivateClass(classIDs[i]));
299e94e781bSJacob Faibussowitsch       }
300e94e781bSJacob Faibussowitsch     }
301e94e781bSJacob Faibussowitsch   } else {
302e94e781bSJacob Faibussowitsch     for (i = 0; i < numClassID; ++i) {
3035f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscInfoActivateClass(classIDs[i]));
304e94e781bSJacob Faibussowitsch     }
305e94e781bSJacob Faibussowitsch   }
306e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
307e94e781bSJacob Faibussowitsch }
308e94e781bSJacob Faibussowitsch 
309e94e781bSJacob Faibussowitsch /*@
310e94e781bSJacob Faibussowitsch     PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo()
311e94e781bSJacob Faibussowitsch 
312e94e781bSJacob Faibussowitsch     Not Collective
313e94e781bSJacob Faibussowitsch 
314e94e781bSJacob Faibussowitsch     Input Parameter:
315fe9b927eSVaclav Hapla .   commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator of the object calling PetscInfo()
316e94e781bSJacob Faibussowitsch 
317fe9b927eSVaclav Hapla     Level: advanced
318e94e781bSJacob Faibussowitsch 
319e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo()
320e94e781bSJacob Faibussowitsch @*/
321e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
322e94e781bSJacob Faibussowitsch {
323e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
324e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
325e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
326e94e781bSJacob Faibussowitsch }
327e94e781bSJacob Faibussowitsch 
328e94e781bSJacob Faibussowitsch /*@
329fe9b927eSVaclav Hapla     PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to PetscInfo()
330e94e781bSJacob Faibussowitsch 
331e94e781bSJacob Faibussowitsch     Not Collective
332e94e781bSJacob Faibussowitsch 
333e94e781bSJacob Faibussowitsch     Input Parameter:
334e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
335e94e781bSJacob Faibussowitsch 
336fe9b927eSVaclav Hapla     Options Database Keys:
337fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
338e94e781bSJacob Faibussowitsch 
339e94e781bSJacob Faibussowitsch     Notes:
340fe9b927eSVaclav Hapla     This function is called automatically during PetscInitialize() so users usually do not need to call it themselves.
341e94e781bSJacob Faibussowitsch 
342fe9b927eSVaclav Hapla     Level: advanced
343e94e781bSJacob Faibussowitsch 
344e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy()
345e94e781bSJacob Faibussowitsch @*/
346e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
347e94e781bSJacob Faibussowitsch {
348e94e781bSJacob Faibussowitsch   char               optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
349e94e781bSJacob Faibussowitsch   char               **loc1_array = NULL;
350e94e781bSJacob Faibussowitsch   PetscBool          set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE;
351e94e781bSJacob Faibussowitsch   size_t             size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0;
352e94e781bSJacob Faibussowitsch   int                nLoc1_ = 0;
353e94e781bSJacob Faibussowitsch   PetscInfoCommFlag  commSelfFlag = PETSC_INFO_COMM_ALL;
354e94e781bSJacob Faibussowitsch 
355e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
3565f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead"));
3575f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(options, NULL, "-info", optstring, sizeof(optstring), &set));
358e94e781bSJacob Faibussowitsch   if (set) {
3595f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
3605f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfoAllow(PETSC_TRUE));
3615f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrallocpy(optstring,&loc0_));
3625f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrchr(loc0_,':',&loc1_));
363e94e781bSJacob Faibussowitsch     if (loc1_) {
364ebd100edSVaclav Hapla       *loc1_++ = 0;
365e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
366e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
367e94e781bSJacob Faibussowitsch         ++loc1_;
368e94e781bSJacob Faibussowitsch       }
3695f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrchr(loc1_,':',&loc2_));
370e94e781bSJacob Faibussowitsch     }
371e94e781bSJacob Faibussowitsch     if (loc2_) {
372ebd100edSVaclav Hapla       *loc2_++ = 0;
373e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
374e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
375e94e781bSJacob Faibussowitsch         ++loc2_;
376e94e781bSJacob Faibussowitsch       }
377e94e781bSJacob Faibussowitsch     }
3785f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(loc0_, &size_loc0_));
3795f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(loc1_, &size_loc1_));
3805f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrlen(loc2_, &size_loc2_));
381e94e781bSJacob Faibussowitsch     if (size_loc1_) {
3825f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrtolower(loc1_));
3835f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
384e94e781bSJacob Faibussowitsch     }
385e94e781bSJacob Faibussowitsch     if (size_loc2_) {
3865f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrtolower(loc2_));
3875f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscStrcmp("self", loc2_, &foundSelf));
388e94e781bSJacob Faibussowitsch       if (foundSelf) {
389e94e781bSJacob Faibussowitsch         if (loc2_invert) {
390e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_NO_SELF;
391e94e781bSJacob Faibussowitsch         } else {
392e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_ONLY_SELF;
393e94e781bSJacob Faibussowitsch         }
394e94e781bSJacob Faibussowitsch       }
395e94e781bSJacob Faibussowitsch     }
3965f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
3975f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfoSetClasses(loc1_invert, (PetscInt) nLoc1_, (const char *const *) loc1_array));
3985f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscInfoSetFilterCommSelf(commSelfFlag));
3995f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrToArrayDestroy(nLoc1_, loc1_array));
4005f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(loc0_));
401e94e781bSJacob Faibussowitsch   }
402e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
403e94e781bSJacob Faibussowitsch }
404e94e781bSJacob Faibussowitsch 
405e94e781bSJacob Faibussowitsch /*@
406e94e781bSJacob Faibussowitsch   PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures.
407e94e781bSJacob Faibussowitsch 
408e94e781bSJacob Faibussowitsch   Not Collective
409e94e781bSJacob Faibussowitsch 
410e94e781bSJacob Faibussowitsch   Notes:
411e94e781bSJacob Faibussowitsch   This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent
412e94e781bSJacob Faibussowitsch   PetscInfo() calls down the line.
413e94e781bSJacob Faibussowitsch 
414fe9b927eSVaclav Hapla   Level: developer
4156c877ef6SSatish Balay 
416e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions()
417e94e781bSJacob Faibussowitsch @*/
418e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
419e94e781bSJacob Faibussowitsch {
4205f115e29SVaclav Hapla   int             err;
4215f115e29SVaclav Hapla   size_t          i;
422e94e781bSJacob Faibussowitsch 
423e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
4245f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscInfoAllow(PETSC_FALSE));
4255f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
426e94e781bSJacob Faibussowitsch   err  = fflush(PetscInfoFile);
427*28b400f6SJacob Faibussowitsch   PetscCheck(!err,PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
428e94e781bSJacob Faibussowitsch   if (PetscInfoFilename) {
4295f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFClose(MPI_COMM_SELF, PetscInfoFile));
430e94e781bSJacob Faibussowitsch   }
4315f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree(PetscInfoFilename));
4325f115e29SVaclav Hapla   for (i=0; i<sizeof(PetscInfoFlags)/sizeof(PetscInfoFlags[0]); i++) PetscInfoFlags[i] = 1;
4335f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
434e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4355f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_FALSE;
436e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = -1;
437e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
4385c6c1daeSBarry Smith   PetscFunctionReturn(0);
4395c6c1daeSBarry Smith }
4405c6c1daeSBarry Smith 
4415c6c1daeSBarry Smith /*@
442fa2bb9feSLisandro Dalcin   PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class.
4435c6c1daeSBarry Smith 
4445c6c1daeSBarry Smith   Not Collective
4455c6c1daeSBarry Smith 
4465c6c1daeSBarry Smith   Input Parameter:
447fa2bb9feSLisandro Dalcin . classid - The object class,  e.g., MAT_CLASSID, SNES_CLASSID, etc.
4485c6c1daeSBarry Smith 
4495c6c1daeSBarry Smith   Notes:
4505c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith   Level: developer
4535c6c1daeSBarry Smith 
454e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4555c6c1daeSBarry Smith @*/
456fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoDeactivateClass(PetscClassId classid)
4575c6c1daeSBarry Smith {
4585c6c1daeSBarry Smith   PetscFunctionBegin;
459fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
460fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0;
4615c6c1daeSBarry Smith   PetscFunctionReturn(0);
4625c6c1daeSBarry Smith }
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith /*@
465fa2bb9feSLisandro Dalcin   PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class.
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith   Not Collective
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith   Input Parameter:
470fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith   Notes:
4735c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4745c6c1daeSBarry Smith 
4755c6c1daeSBarry Smith   Level: developer
4765c6c1daeSBarry Smith 
477e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4785c6c1daeSBarry Smith @*/
479fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoActivateClass(PetscClassId classid)
4805c6c1daeSBarry Smith {
4815c6c1daeSBarry Smith   PetscFunctionBegin;
482fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
483fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1;
4845c6c1daeSBarry Smith   PetscFunctionReturn(0);
4855c6c1daeSBarry Smith }
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith /*
4885c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
4895c6c1daeSBarry Smith   messages are also printed to the history file, called by default
4905c6c1daeSBarry Smith   .petschistory in ones home directory.
4915c6c1daeSBarry Smith */
49295c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
4935c6c1daeSBarry Smith 
4945c6c1daeSBarry Smith /*MC
495e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith    Synopsis:
498aaa7dc30SBarry Smith        #include <petscsys.h>
499fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
5007d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1)
5017d3de750SJacob Faibussowitsch        PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2)
502fe9b927eSVaclav Hapla        ...
5035c6c1daeSBarry Smith 
504fe9b927eSVaclav Hapla     Collective on obj
5055c6c1daeSBarry Smith 
506d8d19677SJose E. Roman     Input Parameters:
507fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
5085c6c1daeSBarry Smith .   message - logging message
509fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
510fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
511e94e781bSJacob Faibussowitsch 
512e94e781bSJacob Faibussowitsch     Notes:
513fe9b927eSVaclav Hapla     PetscInfo() prints only from the first processor in the communicator of obj.
514fe9b927eSVaclav Hapla     If obj is NULL, the PETSC_COMM_SELF communicator is used, i.e. every rank of PETSC_COMM_WORLD prints the message.
515fe9b927eSVaclav Hapla 
516fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
517fe9b927eSVaclav Hapla 
518fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
519fe9b927eSVaclav Hapla 
520fe9b927eSVaclav Hapla     No filename means standard output PETSC_STDOUT is used.
521fe9b927eSVaclav Hapla 
522fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
523fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
524fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
525fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
526fe9b927eSVaclav Hapla 
527fe9b927eSVaclav Hapla     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.
528fe9b927eSVaclav Hapla     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.
529fe9b927eSVaclav Hapla 
530fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
531fe9b927eSVaclav Hapla 
532fe9b927eSVaclav Hapla     Example of Usage:
533fe9b927eSVaclav Hapla $     Mat A;
534fe9b927eSVaclav Hapla $     PetscInt alpha;
535fe9b927eSVaclav Hapla $     ...
5367d3de750SJacob Faibussowitsch $     PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
537fe9b927eSVaclav Hapla 
538fe9b927eSVaclav Hapla     Options Examples:
539fe9b927eSVaclav Hapla     Each call of the form
540fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
5417d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1);
5427d3de750SJacob Faibussowitsch $     PetscInfo(obj, msg, arg1, arg2);
543fe9b927eSVaclav Hapla     is evaluated as follows.
544fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
545fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
546fe9b927eSVaclav 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
547fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
548fe9b927eSVaclav Hapla     Note that
549fe9b927eSVaclav Hapla $     -info :sys:~self
550fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
551fe9b927eSVaclav Hapla 
552fe9b927eSVaclav Hapla     Fortran Note:
553fe9b927eSVaclav Hapla     This function does not take the obj argument, there is only the PetscInfo()
5547d3de750SJacob Faibussowitsch      version, not PetscInfo() etc.
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith     Level: intermediate
5575c6c1daeSBarry Smith 
558e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions()
5595c6c1daeSBarry Smith M*/
560fe9b927eSVaclav Hapla PetscErrorCode  PetscInfo_Private(const char func[],PetscObject obj, const char message[], ...)
5615c6c1daeSBarry Smith {
5625c6c1daeSBarry Smith   va_list        Argp;
563e94e781bSJacob Faibussowitsch   PetscMPIInt    rank = 0,urank,size = 1;
564fa2bb9feSLisandro Dalcin   PetscClassId   classid;
565e94e781bSJacob Faibussowitsch   PetscBool      enabled = PETSC_FALSE, oldflag;
5665c6c1daeSBarry Smith   char           string[8*1024];
567e94e781bSJacob Faibussowitsch   size_t         fullLength,len;
5685c6c1daeSBarry Smith   int            err;
5695c6c1daeSBarry Smith 
5705c6c1daeSBarry Smith   PetscFunctionBegin;
571940d77c0SToby Isaac   if (obj) PetscValidHeader(obj,2);
572fa2bb9feSLisandro Dalcin   classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID;
5735f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscInfoEnabled(classid, &enabled));
574e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
575e94e781bSJacob Faibussowitsch   PetscValidCharPointer(message,3);
576e94e781bSJacob Faibussowitsch   if (obj) {
5775f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_rank(obj->comm, &rank));
5785f80ce2aSJacob Faibussowitsch     CHKERRMPI(MPI_Comm_size(obj->comm, &size));
579e94e781bSJacob Faibussowitsch   }
580e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5815c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
582e94e781bSJacob Faibussowitsch   if (!PetscInfoCommFilter && (size < 2)) {
583e94e781bSJacob Faibussowitsch     /* If no self printing is allowed, and size too small get out */
584e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
585e94e781bSJacob Faibussowitsch   } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) {
586e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
587e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
588e94e781bSJacob Faibussowitsch   }
589e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
590e94e781bSJacob Faibussowitsch   oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
5915f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
5925c6c1daeSBarry Smith   va_start(Argp, message);
5935c6c1daeSBarry Smith   sprintf(string, "[%d] %s(): ",urank,func);
5945f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrlen(string, &len));
5955f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp));
5965f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string));
5975c6c1daeSBarry Smith   err  = fflush(PetscInfoFile);
598*28b400f6SJacob Faibussowitsch   PetscCheck(!err,PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
5995c6c1daeSBarry Smith   if (petsc_history) {
6005c6c1daeSBarry Smith     va_start(Argp, message);
6015f80ce2aSJacob Faibussowitsch     CHKERRQ((*PetscVFPrintf)(petsc_history, message, Argp));
6025c6c1daeSBarry Smith   }
6035c6c1daeSBarry Smith   va_end(Argp);
604e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = oldflag;
6055c6c1daeSBarry Smith   PetscFunctionReturn(0);
6065c6c1daeSBarry Smith }
607