xref: /petsc/src/sys/info/verboseinfo.c (revision 589a23caa660d2a5f330cc8d1ed213e9cfaf51a7)
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 */
19e94e781bSJacob Faibussowitsch const char * const        PetscInfoCommFlags[] = {"all", "no_self", "only_self", "PetscInfoCommFlag", "PETSC_INFO_COMM_", 0};
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;
60e94e781bSJacob Faibussowitsch   if (classid < PETSC_SMALLEST_CLASSID) SETERRQ1(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 
89e94e781bSJacob Faibussowitsch     Input Parameter:
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   PetscErrorCode  ierr;
1055c6c1daeSBarry Smith 
1065c6c1daeSBarry Smith   PetscFunctionBegin;
107e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
108e94e781bSJacob Faibussowitsch   ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr);
109e94e781bSJacob Faibussowitsch   if (filename) {
110e94e781bSJacob Faibussowitsch     PetscBool  oldflag;
111e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1125c6c1daeSBarry Smith     ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr);
113e94e781bSJacob Faibussowitsch     ierr = PetscStrallocpy(fname, &PetscInfoFilename);CHKERRQ(ierr);
114e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);CHKERRQ(ierr);
1155c6c1daeSBarry Smith     sprintf(tname, ".%d", rank);
1165c6c1daeSBarry Smith     ierr = PetscStrcat(fname, tname);CHKERRQ(ierr);
117e94e781bSJacob Faibussowitsch     oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
118e94e781bSJacob Faibussowitsch     ierr = PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile);CHKERRQ(ierr);
119e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
120e94e781bSJacob Faibussowitsch     /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and
121e94e781bSJacob Faibussowitsch      call it afterwards so that it actually writes to file */
122e94e781bSJacob Faibussowitsch     ierr = PetscInfo1(NULL, "Opened PetscInfo file %s\n", fname);CHKERRQ(ierr);
123e94e781bSJacob Faibussowitsch   }
124e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
125e94e781bSJacob Faibussowitsch }
126a297a907SKarl Rupp 
127e94e781bSJacob Faibussowitsch /*@C
128e94e781bSJacob Faibussowitsch     PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to
129e94e781bSJacob Faibussowitsch 
130e94e781bSJacob Faibussowitsch     Not Collective
131e94e781bSJacob Faibussowitsch 
132e94e781bSJacob Faibussowitsch     Output Parameters:
133e94e781bSJacob Faibussowitsch +   filename - The name of the output file
134e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
135e94e781bSJacob Faibussowitsch 
136e94e781bSJacob Faibussowitsch     Level: advanced
137e94e781bSJacob Faibussowitsch 
138e94e781bSJacob Faibussowitsch     Note:
139e94e781bSJacob Faibussowitsch     This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is
140e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
141e94e781bSJacob Faibussowitsch 
142e94e781bSJacob Faibussowitsch     Fortran Note:
143e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
144e94e781bSJacob Faibussowitsch 
145e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy()
146e94e781bSJacob Faibussowitsch @*/
147e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
148e94e781bSJacob Faibussowitsch {
149e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
150e94e781bSJacob Faibussowitsch 
151e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
152e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
153e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
154e94e781bSJacob Faibussowitsch   ierr = PetscStrallocpy(PetscInfoFilename, filename);CHKERRQ(ierr);
155e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
156e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
157e94e781bSJacob Faibussowitsch }
158e94e781bSJacob Faibussowitsch 
159e94e781bSJacob Faibussowitsch /*@C
160e94e781bSJacob Faibussowitsch     PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against
161e94e781bSJacob Faibussowitsch 
162e94e781bSJacob Faibussowitsch     Not Collective
163e94e781bSJacob Faibussowitsch 
164e94e781bSJacob Faibussowitsch     Input Parameters:
165e94e781bSJacob Faibussowitsch +   exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that
166e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
167e94e781bSJacob Faibussowitsch .   N - Number of classes to filter for (size of classnames)
168e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
169e94e781bSJacob Faibussowitsch 
170e94e781bSJacob Faibussowitsch     Notes:
171e94e781bSJacob Faibussowitsch     Not for use in Fortran
172e94e781bSJacob Faibussowitsch 
173e94e781bSJacob Faibussowitsch     This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called.
174e94e781bSJacob Faibussowitsch 
175e94e781bSJacob Faibussowitsch     Names in the classnames list should correspond to the names returned by PetscObjectGetClassName().
176e94e781bSJacob Faibussowitsch 
177e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
178e94e781bSJacob Faibussowitsch     The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away.
179e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
180e94e781bSJacob Faibussowitsch     Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()).
181e94e781bSJacob Faibussowitsch 
182e94e781bSJacob Faibussowitsch     Level: developer
183e94e781bSJacob Faibussowitsch 
184e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName()
185e94e781bSJacob Faibussowitsch @*/
186e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames)
187e94e781bSJacob Faibussowitsch {
188e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
189e94e781bSJacob Faibussowitsch 
190e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
1915f115e29SVaclav Hapla   if (PetscInfoClassesLocked) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
192e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr);
193e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames);CHKERRQ(ierr);
194e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = N;
195e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
196e94e781bSJacob Faibussowitsch   {
197e94e781bSJacob Faibussowitsch     /* Process sys class right away */
198e94e781bSJacob Faibussowitsch     PetscClassId  sysclassid = PETSC_SMALLEST_CLASSID;
199e94e781bSJacob Faibussowitsch     ierr = PetscInfoProcessClass("sys", 1, &sysclassid);CHKERRQ(ierr);
200e94e781bSJacob Faibussowitsch   }
2015f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_TRUE;
202e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
203e94e781bSJacob Faibussowitsch }
204e94e781bSJacob Faibussowitsch 
205e94e781bSJacob Faibussowitsch /*@C
206e94e781bSJacob Faibussowitsch     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses()
207e94e781bSJacob Faibussowitsch 
208e94e781bSJacob Faibussowitsch     Not Collective
209e94e781bSJacob Faibussowitsch 
210e94e781bSJacob Faibussowitsch     Input Paramater:
211e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
212e94e781bSJacob Faibussowitsch 
213e94e781bSJacob Faibussowitsch     Output Parameter:
214e94e781bSJacob Faibussowitsch .   found - PetscBool indicating whether the classname was found
215e94e781bSJacob Faibussowitsch 
216e94e781bSJacob Faibussowitsch     Notes:
217e94e781bSJacob Faibussowitsch     Use PetscObjectGetName() to retrieve an appropriate classname
218e94e781bSJacob Faibussowitsch 
219e94e781bSJacob Faibussowitsch     Level: developer
220e94e781bSJacob Faibussowitsch 
221e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName()
222e94e781bSJacob Faibussowitsch @*/
223e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
224e94e781bSJacob Faibussowitsch {
225e94e781bSJacob Faibussowitsch   PetscInt        idx;
226e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
227e94e781bSJacob Faibussowitsch 
228e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
229e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname,1);
230e94e781bSJacob Faibussowitsch   ierr = PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found);CHKERRQ(ierr);
2315f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_TRUE;
232e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
233e94e781bSJacob Faibussowitsch }
234e94e781bSJacob Faibussowitsch 
235e94e781bSJacob Faibussowitsch /*@
236e94e781bSJacob Faibussowitsch     PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo()
237e94e781bSJacob Faibussowitsch 
238e94e781bSJacob Faibussowitsch     Not Collective
239e94e781bSJacob Faibussowitsch 
240e94e781bSJacob Faibussowitsch     Output Parameters:
241e94e781bSJacob Faibussowitsch +   infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called
242ebd100edSVaclav Hapla .   classesSet - PETSC_TRUE if the list of classes to filter for has been set
243e94e781bSJacob Faibussowitsch .   exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted
244e94e781bSJacob Faibussowitsch .   locked - PETSC_TRUE if the list of classes to filter for has been locked
245e94e781bSJacob Faibussowitsch -   commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all
246e94e781bSJacob Faibussowitsch     communicators
247e94e781bSJacob Faibussowitsch 
248e94e781bSJacob Faibussowitsch     Notes:
249e94e781bSJacob Faibussowitsch     Initially commSelfFlag = PETSC_INFO_COMM_ALL
250e94e781bSJacob Faibussowitsch 
251fe9b927eSVaclav Hapla     Level: developer
252e94e781bSJacob Faibussowitsch 
253e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions()
254e94e781bSJacob Faibussowitsch @*/
255ebd100edSVaclav Hapla PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
256e94e781bSJacob Faibussowitsch {
257e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
258e94e781bSJacob Faibussowitsch   if (infoEnabled)  *infoEnabled  = PetscLogPrintInfo;
2595f115e29SVaclav Hapla   if (classesSet)   *classesSet   = PetscInfoClassesSet;
260e94e781bSJacob Faibussowitsch   if (exclude)      *exclude      = PetscInfoInvertClasses;
2615f115e29SVaclav Hapla   if (locked)       *locked       = PetscInfoClassesLocked;
262e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
263e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
264e94e781bSJacob Faibussowitsch }
265e94e781bSJacob Faibussowitsch 
266e94e781bSJacob Faibussowitsch /*@C
267e94e781bSJacob Faibussowitsch     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo()
268e94e781bSJacob Faibussowitsch 
269e94e781bSJacob Faibussowitsch     Not Collective
270e94e781bSJacob Faibussowitsch 
271e94e781bSJacob Faibussowitsch     Input Parameters:
272e94e781bSJacob Faibussowitsch +   classname - Name of the class to activate/deactivate PetscInfo() for
273e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
274e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
275e94e781bSJacob Faibussowitsch 
276e94e781bSJacob Faibussowitsch     Level: developer
277e94e781bSJacob Faibussowitsch 
278e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions()
279e94e781bSJacob Faibussowitsch @*/
280e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[])
281e94e781bSJacob Faibussowitsch {
282e94e781bSJacob Faibussowitsch   PetscInt        i;
283e94e781bSJacob Faibussowitsch   PetscBool       enabled, exclude, found, opt, pkg;
284e94e781bSJacob Faibussowitsch   char            logList[256];
285e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
286e94e781bSJacob Faibussowitsch 
287e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
288e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
289e94e781bSJacob Faibussowitsch   ierr = PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL);CHKERRQ(ierr);
290e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
291e94e781bSJacob Faibussowitsch   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
292e94e781bSJacob Faibussowitsch   if (opt) {
293e94e781bSJacob Faibussowitsch     ierr = PetscStrInList(classname,logList,',',&pkg);CHKERRQ(ierr);
294e94e781bSJacob Faibussowitsch     if (pkg) {
295e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
296e94e781bSJacob Faibussowitsch         ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr);
297e94e781bSJacob Faibussowitsch       }
298e94e781bSJacob Faibussowitsch     }
299e94e781bSJacob Faibussowitsch   }
300e94e781bSJacob Faibussowitsch   ierr = PetscInfoGetClass(classname, &found);CHKERRQ(ierr);
301e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
302e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
303e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
304e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
305e94e781bSJacob Faibussowitsch         ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr);
306e94e781bSJacob Faibussowitsch       }
307e94e781bSJacob Faibussowitsch     }
308e94e781bSJacob Faibussowitsch   } else {
309e94e781bSJacob Faibussowitsch     for (i = 0; i < numClassID; ++i) {
310e94e781bSJacob Faibussowitsch       ierr = PetscInfoActivateClass(classIDs[i]);CHKERRQ(ierr);
311e94e781bSJacob Faibussowitsch     }
312e94e781bSJacob Faibussowitsch   }
313e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
314e94e781bSJacob Faibussowitsch }
315e94e781bSJacob Faibussowitsch 
316e94e781bSJacob Faibussowitsch /*@
317e94e781bSJacob Faibussowitsch     PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo()
318e94e781bSJacob Faibussowitsch 
319e94e781bSJacob Faibussowitsch     Not Collective
320e94e781bSJacob Faibussowitsch 
321e94e781bSJacob Faibussowitsch     Input Parameter:
322fe9b927eSVaclav Hapla .   commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator of the object calling PetscInfo()
323e94e781bSJacob Faibussowitsch 
324fe9b927eSVaclav Hapla     Level: advanced
325e94e781bSJacob Faibussowitsch 
326e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo()
327e94e781bSJacob Faibussowitsch @*/
328e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
329e94e781bSJacob Faibussowitsch {
330e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
331e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
332e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
333e94e781bSJacob Faibussowitsch }
334e94e781bSJacob Faibussowitsch 
335e94e781bSJacob Faibussowitsch /*@
336fe9b927eSVaclav Hapla     PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to PetscInfo()
337e94e781bSJacob Faibussowitsch 
338e94e781bSJacob Faibussowitsch     Not Collective
339e94e781bSJacob Faibussowitsch 
340e94e781bSJacob Faibussowitsch     Input Parameter:
341e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
342e94e781bSJacob Faibussowitsch 
343fe9b927eSVaclav Hapla     Options Database Keys:
344fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
345e94e781bSJacob Faibussowitsch 
346e94e781bSJacob Faibussowitsch     Notes:
347fe9b927eSVaclav Hapla     This function is called automatically during PetscInitialize() so users usually do not need to call it themselves.
348e94e781bSJacob Faibussowitsch 
349fe9b927eSVaclav Hapla     Level: advanced
350e94e781bSJacob Faibussowitsch 
351e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy()
352e94e781bSJacob Faibussowitsch @*/
353e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
354e94e781bSJacob Faibussowitsch {
355e94e781bSJacob Faibussowitsch   char               optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
356e94e781bSJacob Faibussowitsch   char               **loc1_array = NULL;
357e94e781bSJacob Faibussowitsch   PetscBool          set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE;
358e94e781bSJacob Faibussowitsch   size_t             size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0;
359e94e781bSJacob Faibussowitsch   int                nLoc1_ = 0;
360e94e781bSJacob Faibussowitsch   PetscInfoCommFlag  commSelfFlag = PETSC_INFO_COMM_ALL;
361e94e781bSJacob Faibussowitsch   PetscErrorCode     ierr;
362e94e781bSJacob Faibussowitsch 
363e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
364e94e781bSJacob Faibussowitsch   ierr = PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead");CHKERRQ(ierr);
365*589a23caSBarry Smith   ierr = PetscOptionsGetString(options, NULL, "-info", optstring, sizeof(optstring), &set);CHKERRQ(ierr);
366e94e781bSJacob Faibussowitsch   if (set) {
3675f115e29SVaclav Hapla     PetscInfoClassesSet = PETSC_TRUE;
368e94e781bSJacob Faibussowitsch     ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr);
369ebd100edSVaclav Hapla     ierr = PetscStrallocpy(optstring,&loc0_);CHKERRQ(ierr);
370ebd100edSVaclav Hapla     ierr = PetscStrchr(loc0_,':',&loc1_);CHKERRQ(ierr);
371e94e781bSJacob Faibussowitsch     if (loc1_) {
372ebd100edSVaclav Hapla       *loc1_++ = 0;
373e94e781bSJacob Faibussowitsch       if (*loc1_ == '~') {
374e94e781bSJacob Faibussowitsch         loc1_invert = PETSC_TRUE;
375e94e781bSJacob Faibussowitsch         ++loc1_;
376e94e781bSJacob Faibussowitsch       }
377ebd100edSVaclav Hapla       ierr = PetscStrchr(loc1_,':',&loc2_);CHKERRQ(ierr);
378e94e781bSJacob Faibussowitsch     }
379e94e781bSJacob Faibussowitsch     if (loc2_) {
380ebd100edSVaclav Hapla       *loc2_++ = 0;
381e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
382e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
383e94e781bSJacob Faibussowitsch         ++loc2_;
384e94e781bSJacob Faibussowitsch       }
385e94e781bSJacob Faibussowitsch     }
386e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc0_, &size_loc0_);CHKERRQ(ierr);
387e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc1_, &size_loc1_);CHKERRQ(ierr);
388e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc2_, &size_loc2_);CHKERRQ(ierr);
389e94e781bSJacob Faibussowitsch     if (size_loc1_) {
390e94e781bSJacob Faibussowitsch       ierr = PetscStrtolower(loc1_);CHKERRQ(ierr);
3915f115e29SVaclav Hapla       ierr = PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array);CHKERRQ(ierr);
392e94e781bSJacob Faibussowitsch     }
393e94e781bSJacob Faibussowitsch     if (size_loc2_) {
394e94e781bSJacob Faibussowitsch       ierr = PetscStrtolower(loc2_);CHKERRQ(ierr);
3955f115e29SVaclav Hapla       ierr = PetscStrcmp("self", loc2_, &foundSelf);CHKERRQ(ierr);
396e94e781bSJacob Faibussowitsch       if (foundSelf) {
397e94e781bSJacob Faibussowitsch         if (loc2_invert) {
398e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_NO_SELF;
399e94e781bSJacob Faibussowitsch         } else {
400e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_ONLY_SELF;
401e94e781bSJacob Faibussowitsch         }
402e94e781bSJacob Faibussowitsch       }
403e94e781bSJacob Faibussowitsch     }
4045f115e29SVaclav Hapla     ierr = PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w");CHKERRQ(ierr);
405e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetClasses(loc1_invert, (PetscInt) nLoc1_, (const char *const *) loc1_array);CHKERRQ(ierr);
406e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFilterCommSelf(commSelfFlag);CHKERRQ(ierr);
407e94e781bSJacob Faibussowitsch     ierr = PetscStrToArrayDestroy(nLoc1_, loc1_array);CHKERRQ(ierr);
408ebd100edSVaclav Hapla     ierr = PetscFree(loc0_);CHKERRQ(ierr);
409e94e781bSJacob Faibussowitsch   }
410e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
411e94e781bSJacob Faibussowitsch }
412e94e781bSJacob Faibussowitsch 
413e94e781bSJacob Faibussowitsch /*@
414e94e781bSJacob Faibussowitsch   PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures.
415e94e781bSJacob Faibussowitsch 
416e94e781bSJacob Faibussowitsch   Not Collective
417e94e781bSJacob Faibussowitsch 
418e94e781bSJacob Faibussowitsch   Notes:
419e94e781bSJacob Faibussowitsch   This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent
420e94e781bSJacob Faibussowitsch   PetscInfo() calls down the line.
421e94e781bSJacob Faibussowitsch 
422fe9b927eSVaclav Hapla   Level: developer
4236c877ef6SSatish Balay 
424e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions()
425e94e781bSJacob Faibussowitsch @*/
426e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
427e94e781bSJacob Faibussowitsch {
428e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
4295f115e29SVaclav Hapla   int             err;
4305f115e29SVaclav Hapla   size_t          i;
431e94e781bSJacob Faibussowitsch 
432e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
433e94e781bSJacob Faibussowitsch   ierr = PetscInfoAllow(PETSC_FALSE);CHKERRQ(ierr);
434e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr);
435e94e781bSJacob Faibussowitsch   err  = fflush(PetscInfoFile);
436e94e781bSJacob Faibussowitsch   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
437e94e781bSJacob Faibussowitsch   if (PetscInfoFilename) {
438e94e781bSJacob Faibussowitsch     ierr  = PetscFClose(MPI_COMM_SELF, PetscInfoFile);CHKERRQ(ierr);
439e94e781bSJacob Faibussowitsch   }
440e94e781bSJacob Faibussowitsch   ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr);
4415f115e29SVaclav Hapla   for (i=0; i<sizeof(PetscInfoFlags)/sizeof(PetscInfoFlags[0]); i++) PetscInfoFlags[i] = 1;
4425f115e29SVaclav Hapla   PetscInfoClassesLocked = PETSC_FALSE;
443e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
4445f115e29SVaclav Hapla   PetscInfoClassesSet = PETSC_FALSE;
445e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = -1;
446e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
4475c6c1daeSBarry Smith   PetscFunctionReturn(0);
4485c6c1daeSBarry Smith }
4495c6c1daeSBarry Smith 
4505c6c1daeSBarry Smith /*@
451fa2bb9feSLisandro Dalcin   PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class.
4525c6c1daeSBarry Smith 
4535c6c1daeSBarry Smith   Not Collective
4545c6c1daeSBarry Smith 
4555c6c1daeSBarry Smith   Input Parameter:
456fa2bb9feSLisandro Dalcin . classid - The object class,  e.g., MAT_CLASSID, SNES_CLASSID, etc.
4575c6c1daeSBarry Smith 
4585c6c1daeSBarry Smith   Notes:
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 
463e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4645c6c1daeSBarry Smith @*/
465fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoDeactivateClass(PetscClassId classid)
4665c6c1daeSBarry Smith {
4675c6c1daeSBarry Smith   PetscFunctionBegin;
468fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
469fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0;
4705c6c1daeSBarry Smith   PetscFunctionReturn(0);
4715c6c1daeSBarry Smith }
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith /*@
474fa2bb9feSLisandro Dalcin   PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class.
4755c6c1daeSBarry Smith 
4765c6c1daeSBarry Smith   Not Collective
4775c6c1daeSBarry Smith 
4785c6c1daeSBarry Smith   Input Parameter:
479fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith   Notes:
4825c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith   Level: developer
4855c6c1daeSBarry Smith 
486e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4875c6c1daeSBarry Smith @*/
488fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoActivateClass(PetscClassId classid)
4895c6c1daeSBarry Smith {
4905c6c1daeSBarry Smith   PetscFunctionBegin;
491fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
492fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1;
4935c6c1daeSBarry Smith   PetscFunctionReturn(0);
4945c6c1daeSBarry Smith }
4955c6c1daeSBarry Smith 
4965c6c1daeSBarry Smith /*
4975c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
4985c6c1daeSBarry Smith   messages are also printed to the history file, called by default
4995c6c1daeSBarry Smith   .petschistory in ones home directory.
5005c6c1daeSBarry Smith */
50195c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
5025c6c1daeSBarry Smith 
5035c6c1daeSBarry Smith /*MC
504e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
5055c6c1daeSBarry Smith 
5065c6c1daeSBarry Smith    Synopsis:
507aaa7dc30SBarry Smith        #include <petscsys.h>
508fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
509fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo1(PetscObject obj, const char formatmessage[],arg1)
510fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo2(PetscObject obj, const char formatmessage[],arg1,arg2)
511fe9b927eSVaclav Hapla        ...
5125c6c1daeSBarry Smith 
513fe9b927eSVaclav Hapla     Collective on obj
5145c6c1daeSBarry Smith 
5155c6c1daeSBarry Smith     Input Parameter:
516fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
5175c6c1daeSBarry Smith .   message - logging message
518fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
519fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
520e94e781bSJacob Faibussowitsch 
521e94e781bSJacob Faibussowitsch     Notes:
522fe9b927eSVaclav Hapla     PetscInfo() prints only from the first processor in the communicator of obj.
523fe9b927eSVaclav Hapla     If obj is NULL, the PETSC_COMM_SELF communicator is used, i.e. every rank of PETSC_COMM_WORLD prints the message.
524fe9b927eSVaclav Hapla 
525fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
526fe9b927eSVaclav Hapla 
527fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
528fe9b927eSVaclav Hapla 
529fe9b927eSVaclav Hapla     No filename means standard output PETSC_STDOUT is used.
530fe9b927eSVaclav Hapla 
531fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
532fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
533fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
534fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
535fe9b927eSVaclav Hapla 
536fe9b927eSVaclav 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.
537fe9b927eSVaclav 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.
538fe9b927eSVaclav Hapla 
539fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
540fe9b927eSVaclav Hapla 
541fe9b927eSVaclav Hapla     Example of Usage:
542fe9b927eSVaclav Hapla $     Mat A;
543fe9b927eSVaclav Hapla $     PetscInt alpha;
544fe9b927eSVaclav Hapla $     ...
545fe9b927eSVaclav Hapla $     PetscInfo1(A,"Matrix uses parameter alpha=%D\n",alpha);
546fe9b927eSVaclav Hapla 
547fe9b927eSVaclav Hapla     Options Examples:
548fe9b927eSVaclav Hapla     Each call of the form
549fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
550fe9b927eSVaclav Hapla $     PetscInfo1(obj, msg, arg1);
551fe9b927eSVaclav Hapla $     PetscInfo2(obj, msg, arg1, arg2);
552fe9b927eSVaclav Hapla     is evaluated as follows.
553fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
554fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
555fe9b927eSVaclav 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
556fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
557fe9b927eSVaclav Hapla     Note that
558fe9b927eSVaclav Hapla $     -info :sys:~self
559fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
560fe9b927eSVaclav Hapla 
561fe9b927eSVaclav Hapla     Fortran Note:
562fe9b927eSVaclav Hapla     This function does not take the obj argument, there is only the PetscInfo()
563fe9b927eSVaclav Hapla      version, not PetscInfo1() etc.
5645c6c1daeSBarry Smith 
5655c6c1daeSBarry Smith     Level: intermediate
5665c6c1daeSBarry Smith 
567e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions()
5685c6c1daeSBarry Smith M*/
569fe9b927eSVaclav Hapla PetscErrorCode  PetscInfo_Private(const char func[],PetscObject obj, const char message[], ...)
5705c6c1daeSBarry Smith {
5715c6c1daeSBarry Smith   va_list        Argp;
572e94e781bSJacob Faibussowitsch   PetscMPIInt    rank = 0,urank,size = 1;
573fa2bb9feSLisandro Dalcin   PetscClassId   classid;
574e94e781bSJacob Faibussowitsch   PetscBool      enabled = PETSC_FALSE, oldflag;
5755c6c1daeSBarry Smith   char           string[8*1024];
5765c6c1daeSBarry Smith   PetscErrorCode ierr;
577e94e781bSJacob Faibussowitsch   size_t         fullLength,len;
5785c6c1daeSBarry Smith   int            err;
5795c6c1daeSBarry Smith 
5805c6c1daeSBarry Smith   PetscFunctionBegin;
581940d77c0SToby Isaac   if (obj) PetscValidHeader(obj,2);
582fa2bb9feSLisandro Dalcin   classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID;
583e94e781bSJacob Faibussowitsch   ierr = PetscInfoEnabled(classid, &enabled);CHKERRQ(ierr);
584e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
585e94e781bSJacob Faibussowitsch   PetscValidCharPointer(message,3);
586e94e781bSJacob Faibussowitsch   if (obj) {
587e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr);
588e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_size(obj->comm, &size);CHKERRQ(ierr);
589e94e781bSJacob Faibussowitsch   }
590e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5915c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
592e94e781bSJacob Faibussowitsch   if (!PetscInfoCommFilter && (size < 2)) {
593e94e781bSJacob Faibussowitsch     /* If no self printing is allowed, and size too small get out */
594e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
595e94e781bSJacob Faibussowitsch   } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) {
596e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
597e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
598e94e781bSJacob Faibussowitsch   }
599e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
600e94e781bSJacob Faibussowitsch   oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
6015c6c1daeSBarry Smith   ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr);
6025c6c1daeSBarry Smith   va_start(Argp, message);
6035c6c1daeSBarry Smith   sprintf(string, "[%d] %s(): ",urank,func);
6045c6c1daeSBarry Smith   ierr = PetscStrlen(string, &len);CHKERRQ(ierr);
605a2ea699eSBarry Smith   ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);CHKERRQ(ierr);
6065c6c1daeSBarry Smith   ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr);
6075c6c1daeSBarry Smith   err  = fflush(PetscInfoFile);
6085c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6095c6c1daeSBarry Smith   if (petsc_history) {
6105c6c1daeSBarry Smith     va_start(Argp, message);
611a2ea699eSBarry Smith     ierr = (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr);
6125c6c1daeSBarry Smith   }
6135c6c1daeSBarry Smith   va_end(Argp);
614e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = oldflag;
6155c6c1daeSBarry Smith   PetscFunctionReturn(0);
6165c6c1daeSBarry Smith }
617