xref: /petsc/src/sys/info/verboseinfo.c (revision fe9b927e09a39b0a73bbc8a0216c6d46256193f7)
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};
20e94e781bSJacob Faibussowitsch static PetscBool          PetscInfoClassnamesLocked = PETSC_FALSE, PetscInfoInvertClasses = 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};
35e94e781bSJacob Faibussowitsch PetscBool                 PetscLogPrintInfo = PETSC_FALSE, PetscInfoSetUp = 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 
53*fe9b927eSVaclav 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 defined(PETSC_USE_DEBUG)
61e94e781bSJacob 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);
62e94e781bSJacob Faibussowitsch #endif
63e94e781bSJacob Faibussowitsch   *enabled = (PetscBool) (PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
64e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
65e94e781bSJacob Faibussowitsch }
66e94e781bSJacob Faibussowitsch 
67e94e781bSJacob Faibussowitsch /*@
68*fe9b927eSVaclav Hapla     PetscInfoAllow - Enables/disables PetscInfo() messages
695c6c1daeSBarry Smith 
70*fe9b927eSVaclav Hapla     Not Collective
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith     Input Parameter:
73e94e781bSJacob Faibussowitsch .   flag - PETSC_TRUE or PETSC_FALSE
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith     Level: advanced
765c6c1daeSBarry Smith 
77e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoEnabled(), PetscInfoGetInfo(), PetscInfoSetFromOptions()
785c6c1daeSBarry Smith @*/
79e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag)
80e94e781bSJacob Faibussowitsch {
81e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
82e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
83e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
84e94e781bSJacob Faibussowitsch }
85e94e781bSJacob Faibussowitsch 
86e94e781bSJacob Faibussowitsch /*@C
87*fe9b927eSVaclav Hapla     PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls
88e94e781bSJacob Faibussowitsch 
89*fe9b927eSVaclav Hapla     Not Collective
90e94e781bSJacob Faibussowitsch 
91e94e781bSJacob Faibussowitsch     Input Parameter:
92e94e781bSJacob Faibussowitsch +   filename - Name of the file where PetscInfo() will print to
93e94e781bSJacob Faibussowitsch -   mode - Write mode passed to PetscFOpen()
94e94e781bSJacob Faibussowitsch 
95e94e781bSJacob Faibussowitsch     Notes:
96*fe9b927eSVaclav Hapla     Use filename=NULL to set PetscInfo() to write to PETSC_STDOUT.
97e94e781bSJacob Faibussowitsch 
98e94e781bSJacob Faibussowitsch     Level: advanced
99e94e781bSJacob Faibussowitsch 
100e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscFOpen()
101e94e781bSJacob Faibussowitsch @*/
102e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[])
1035c6c1daeSBarry Smith {
104fa2bb9feSLisandro Dalcin   char            fname[PETSC_MAX_PATH_LEN], tname[11];
1055c6c1daeSBarry Smith   PetscMPIInt     rank;
1065c6c1daeSBarry Smith   PetscErrorCode  ierr;
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   PetscFunctionBegin;
109e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
110e94e781bSJacob Faibussowitsch   ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr);
111e94e781bSJacob Faibussowitsch   if (filename) {
112e94e781bSJacob Faibussowitsch     PetscBool  oldflag;
113e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1145c6c1daeSBarry Smith     ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr);
115e94e781bSJacob Faibussowitsch     ierr = PetscStrallocpy(fname, &PetscInfoFilename);CHKERRQ(ierr);
116e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);CHKERRQ(ierr);
1175c6c1daeSBarry Smith     sprintf(tname, ".%d", rank);
1185c6c1daeSBarry Smith     ierr = PetscStrcat(fname, tname);CHKERRQ(ierr);
119e94e781bSJacob Faibussowitsch     oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
120e94e781bSJacob Faibussowitsch     ierr = PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile);CHKERRQ(ierr);
121e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
122e94e781bSJacob Faibussowitsch     /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and
123e94e781bSJacob Faibussowitsch      call it afterwards so that it actually writes to file */
124e94e781bSJacob Faibussowitsch     ierr = PetscInfo1(NULL, "Opened PetscInfo file %s\n", fname);CHKERRQ(ierr);
125e94e781bSJacob Faibussowitsch   }
126e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
127e94e781bSJacob Faibussowitsch }
128a297a907SKarl Rupp 
129e94e781bSJacob Faibussowitsch /*@C
130e94e781bSJacob Faibussowitsch     PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to
131e94e781bSJacob Faibussowitsch 
132e94e781bSJacob Faibussowitsch     Not Collective
133e94e781bSJacob Faibussowitsch 
134e94e781bSJacob Faibussowitsch     Output Parameters:
135e94e781bSJacob Faibussowitsch +   filename - The name of the output file
136e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
137e94e781bSJacob Faibussowitsch 
138e94e781bSJacob Faibussowitsch     Level: advanced
139e94e781bSJacob Faibussowitsch 
140e94e781bSJacob Faibussowitsch     Note:
141e94e781bSJacob Faibussowitsch     This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is
142e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
143e94e781bSJacob Faibussowitsch 
144e94e781bSJacob Faibussowitsch     Fortran Note:
145e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
146e94e781bSJacob Faibussowitsch 
147e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy()
148e94e781bSJacob Faibussowitsch @*/
149e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
150e94e781bSJacob Faibussowitsch {
151e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
152e94e781bSJacob Faibussowitsch 
153e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
154e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
155e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
156e94e781bSJacob Faibussowitsch   ierr = PetscStrallocpy(PetscInfoFilename, filename);CHKERRQ(ierr);
157e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
158e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
159e94e781bSJacob Faibussowitsch }
160e94e781bSJacob Faibussowitsch 
161e94e781bSJacob Faibussowitsch /*@C
162e94e781bSJacob Faibussowitsch     PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against
163e94e781bSJacob Faibussowitsch 
164e94e781bSJacob Faibussowitsch     Not Collective
165e94e781bSJacob Faibussowitsch 
166e94e781bSJacob Faibussowitsch     Input Parameters:
167e94e781bSJacob Faibussowitsch +   exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that
168e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
169e94e781bSJacob Faibussowitsch .   N - Number of classes to filter for (size of classnames)
170e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
171e94e781bSJacob Faibussowitsch 
172e94e781bSJacob Faibussowitsch     Notes:
173e94e781bSJacob Faibussowitsch     Not for use in Fortran
174e94e781bSJacob Faibussowitsch 
175e94e781bSJacob Faibussowitsch     This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called.
176e94e781bSJacob Faibussowitsch 
177e94e781bSJacob Faibussowitsch     Names in the classnames list should correspond to the names returned by PetscObjectGetClassName().
178e94e781bSJacob Faibussowitsch 
179e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
180e94e781bSJacob Faibussowitsch     The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away.
181e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
182e94e781bSJacob Faibussowitsch     Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()).
183e94e781bSJacob Faibussowitsch 
184e94e781bSJacob Faibussowitsch     Level: developer
185e94e781bSJacob Faibussowitsch 
186e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName()
187e94e781bSJacob Faibussowitsch @*/
188e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames)
189e94e781bSJacob Faibussowitsch {
190e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
191e94e781bSJacob Faibussowitsch 
192e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
193e94e781bSJacob Faibussowitsch   if (PetscInfoClassnamesLocked) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
194e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr);
195e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames);CHKERRQ(ierr);
196e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = N;
197e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
198e94e781bSJacob Faibussowitsch   {
199e94e781bSJacob Faibussowitsch     /* Process sys class right away */
200e94e781bSJacob Faibussowitsch     PetscClassId  sysclassid = PETSC_SMALLEST_CLASSID;
201e94e781bSJacob Faibussowitsch     ierr = PetscInfoProcessClass("sys", 1, &sysclassid);CHKERRQ(ierr);
202e94e781bSJacob Faibussowitsch   }
203e94e781bSJacob Faibussowitsch   PetscInfoSetUp = PETSC_TRUE;
204e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
205e94e781bSJacob Faibussowitsch }
206e94e781bSJacob Faibussowitsch 
207e94e781bSJacob Faibussowitsch /*@C
208e94e781bSJacob Faibussowitsch     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses()
209e94e781bSJacob Faibussowitsch 
210e94e781bSJacob Faibussowitsch     Not Collective
211e94e781bSJacob Faibussowitsch 
212e94e781bSJacob Faibussowitsch     Input Paramater:
213e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
214e94e781bSJacob Faibussowitsch 
215e94e781bSJacob Faibussowitsch     Output Parameter:
216e94e781bSJacob Faibussowitsch .   found - PetscBool indicating whether the classname was found
217e94e781bSJacob Faibussowitsch 
218e94e781bSJacob Faibussowitsch     Notes:
219e94e781bSJacob Faibussowitsch     Use PetscObjectGetName() to retrieve an appropriate classname
220e94e781bSJacob Faibussowitsch 
221e94e781bSJacob Faibussowitsch     Level: developer
222e94e781bSJacob Faibussowitsch 
223e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName()
224e94e781bSJacob Faibussowitsch @*/
225e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
226e94e781bSJacob Faibussowitsch {
227e94e781bSJacob Faibussowitsch   PetscInt        idx;
228e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
229e94e781bSJacob Faibussowitsch 
230e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
231e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname,1);
232e94e781bSJacob Faibussowitsch   ierr = PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found);CHKERRQ(ierr);
233e94e781bSJacob Faibussowitsch   PetscInfoClassnamesLocked = PETSC_TRUE;
234e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
235e94e781bSJacob Faibussowitsch }
236e94e781bSJacob Faibussowitsch 
237e94e781bSJacob Faibussowitsch /*@
238e94e781bSJacob Faibussowitsch     PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo()
239e94e781bSJacob Faibussowitsch 
240e94e781bSJacob Faibussowitsch     Not Collective
241e94e781bSJacob Faibussowitsch 
242e94e781bSJacob Faibussowitsch     Output Parameters:
243e94e781bSJacob Faibussowitsch +   infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called
244e94e781bSJacob Faibussowitsch .   exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted
245e94e781bSJacob Faibussowitsch .   locked - PETSC_TRUE if the list of classes to filter for has been locked
246e94e781bSJacob Faibussowitsch -   commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all
247e94e781bSJacob Faibussowitsch     communicators
248e94e781bSJacob Faibussowitsch 
249e94e781bSJacob Faibussowitsch     Notes:
250e94e781bSJacob Faibussowitsch     Initially commSelfFlag = PETSC_INFO_COMM_ALL
251e94e781bSJacob Faibussowitsch 
252*fe9b927eSVaclav Hapla     Level: developer
253e94e781bSJacob Faibussowitsch 
254e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions()
255e94e781bSJacob Faibussowitsch @*/
256e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *setup, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
257e94e781bSJacob Faibussowitsch {
258e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
259e94e781bSJacob Faibussowitsch   if (infoEnabled)  *infoEnabled  = PetscLogPrintInfo;
260e94e781bSJacob Faibussowitsch   if (setup)        *setup        = PetscInfoSetUp;
261e94e781bSJacob Faibussowitsch   if (exclude)      *exclude      = PetscInfoInvertClasses;
262e94e781bSJacob Faibussowitsch   if (locked)       *locked       = PetscInfoClassnamesLocked;
263e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
264e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
265e94e781bSJacob Faibussowitsch }
266e94e781bSJacob Faibussowitsch 
267e94e781bSJacob Faibussowitsch /*@C
268e94e781bSJacob Faibussowitsch     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo()
269e94e781bSJacob Faibussowitsch 
270e94e781bSJacob Faibussowitsch     Not Collective
271e94e781bSJacob Faibussowitsch 
272e94e781bSJacob Faibussowitsch     Input Parameters:
273e94e781bSJacob Faibussowitsch +   classname - Name of the class to activate/deactivate PetscInfo() for
274e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
275e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
276e94e781bSJacob Faibussowitsch 
277e94e781bSJacob Faibussowitsch     Level: developer
278e94e781bSJacob Faibussowitsch 
279e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions()
280e94e781bSJacob Faibussowitsch @*/
281e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[])
282e94e781bSJacob Faibussowitsch {
283e94e781bSJacob Faibussowitsch   PetscInt        i;
284e94e781bSJacob Faibussowitsch   PetscBool       enabled, exclude, found, opt, pkg;
285e94e781bSJacob Faibussowitsch   char            logList[256];
286e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
287e94e781bSJacob Faibussowitsch 
288e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
289e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
290e94e781bSJacob Faibussowitsch   ierr = PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL);CHKERRQ(ierr);
291e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
292e94e781bSJacob Faibussowitsch   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
293e94e781bSJacob Faibussowitsch   if (opt) {
294e94e781bSJacob Faibussowitsch     ierr = PetscStrInList(classname,logList,',',&pkg);CHKERRQ(ierr);
295e94e781bSJacob Faibussowitsch     if (pkg) {
296e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
297e94e781bSJacob Faibussowitsch         ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr);
298e94e781bSJacob Faibussowitsch       }
299e94e781bSJacob Faibussowitsch     }
300e94e781bSJacob Faibussowitsch   }
301e94e781bSJacob Faibussowitsch   ierr = PetscInfoGetClass(classname, &found);CHKERRQ(ierr);
302e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
303e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
304e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
305e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
306e94e781bSJacob Faibussowitsch         ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr);
307e94e781bSJacob Faibussowitsch       }
308e94e781bSJacob Faibussowitsch     }
309e94e781bSJacob Faibussowitsch   } else {
310e94e781bSJacob Faibussowitsch     for (i = 0; i < numClassID; ++i) {
311e94e781bSJacob Faibussowitsch       ierr = PetscInfoActivateClass(classIDs[i]);CHKERRQ(ierr);
312e94e781bSJacob Faibussowitsch     }
313e94e781bSJacob Faibussowitsch   }
314e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
315e94e781bSJacob Faibussowitsch }
316e94e781bSJacob Faibussowitsch 
317e94e781bSJacob Faibussowitsch /*@
318e94e781bSJacob Faibussowitsch     PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo()
319e94e781bSJacob Faibussowitsch 
320e94e781bSJacob Faibussowitsch     Not Collective
321e94e781bSJacob Faibussowitsch 
322e94e781bSJacob Faibussowitsch     Input Parameter:
323*fe9b927eSVaclav Hapla .   commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator of the object calling PetscInfo()
324e94e781bSJacob Faibussowitsch 
325*fe9b927eSVaclav Hapla     Level: advanced
326e94e781bSJacob Faibussowitsch 
327e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo()
328e94e781bSJacob Faibussowitsch @*/
329e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
330e94e781bSJacob Faibussowitsch {
331e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
332e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
333e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
334e94e781bSJacob Faibussowitsch }
335e94e781bSJacob Faibussowitsch 
336e94e781bSJacob Faibussowitsch /*@
337*fe9b927eSVaclav Hapla     PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to PetscInfo()
338e94e781bSJacob Faibussowitsch 
339e94e781bSJacob Faibussowitsch     Not Collective
340e94e781bSJacob Faibussowitsch 
341e94e781bSJacob Faibussowitsch     Input Parameter:
342e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
343e94e781bSJacob Faibussowitsch 
344*fe9b927eSVaclav Hapla     Options Database Keys:
345*fe9b927eSVaclav Hapla .   -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo().
346e94e781bSJacob Faibussowitsch 
347e94e781bSJacob Faibussowitsch     Notes:
348*fe9b927eSVaclav Hapla     This function is called automatically during PetscInitialize() so users usually do not need to call it themselves.
349e94e781bSJacob Faibussowitsch 
350*fe9b927eSVaclav Hapla     Level: advanced
351e94e781bSJacob Faibussowitsch 
352e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy()
353e94e781bSJacob Faibussowitsch @*/
354e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
355e94e781bSJacob Faibussowitsch {
356e94e781bSJacob Faibussowitsch   PetscToken         tok;
357e94e781bSJacob Faibussowitsch   char               optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
358e94e781bSJacob Faibussowitsch   char               **loc1_array = NULL;
359e94e781bSJacob Faibussowitsch   PetscBool          set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE;
360e94e781bSJacob Faibussowitsch   size_t             size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0;
361e94e781bSJacob Faibussowitsch   int                nLoc1_ = 0;
362e94e781bSJacob Faibussowitsch   PetscInfoCommFlag  commSelfFlag = PETSC_INFO_COMM_ALL;
363e94e781bSJacob Faibussowitsch   PetscErrorCode     ierr;
364e94e781bSJacob Faibussowitsch 
365e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
366e94e781bSJacob Faibussowitsch   ierr = PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead");CHKERRQ(ierr);
367e94e781bSJacob Faibussowitsch   ierr = PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_MAX_PATH_LEN, &set);CHKERRQ(ierr);
368e94e781bSJacob Faibussowitsch   if (set) {
369e94e781bSJacob Faibussowitsch     /* Allow sys class to be processed as part of setup */
370e94e781bSJacob Faibussowitsch     PetscInfoSetUp = PETSC_TRUE;
371e94e781bSJacob Faibussowitsch     ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr);
372e94e781bSJacob Faibussowitsch     ierr = PetscTokenCreate(optstring, ':', &tok);CHKERRQ(ierr);
373e94e781bSJacob Faibussowitsch     ierr = PetscTokenFind(tok, &loc0_);CHKERRQ(ierr);
374e94e781bSJacob Faibussowitsch     ierr = PetscTokenFind(tok, &loc1_);CHKERRQ(ierr);
375e94e781bSJacob Faibussowitsch     ierr = PetscTokenFind(tok, &loc2_);CHKERRQ(ierr);
376e94e781bSJacob Faibussowitsch     if (loc1_) {
377e94e781bSJacob Faibussowitsch       ierr = PetscStrcmp("self", (const char *) loc1_, &foundSelf);CHKERRQ(ierr);
378e94e781bSJacob Faibussowitsch       if (foundSelf) {
379e94e781bSJacob Faibussowitsch         /* side effect of PetscTokenFind() if tokens are next to each other, i.e. str="foo::bar", instead of "foo" "" "bar", returns "foo" "bar" "NULL" */
380e94e781bSJacob Faibussowitsch         loc2_ = loc1_;
381e94e781bSJacob Faibussowitsch         loc1_ = NULL;
382e94e781bSJacob Faibussowitsch       } else {
383e94e781bSJacob Faibussowitsch         if (*loc1_ == '~') {
384e94e781bSJacob Faibussowitsch           loc1_invert = PETSC_TRUE;
385e94e781bSJacob Faibussowitsch           ++loc1_;
386e94e781bSJacob Faibussowitsch         }
387e94e781bSJacob Faibussowitsch       }
388e94e781bSJacob Faibussowitsch     }
389e94e781bSJacob Faibussowitsch     if (loc2_) {
390e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
391e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
392e94e781bSJacob Faibussowitsch         ++loc2_;
393e94e781bSJacob Faibussowitsch       }
394e94e781bSJacob Faibussowitsch     }
395e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc0_, &size_loc0_);CHKERRQ(ierr);
396e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc1_, &size_loc1_);CHKERRQ(ierr);
397e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc2_, &size_loc2_);CHKERRQ(ierr);
398e94e781bSJacob Faibussowitsch     if (size_loc1_) {
399e94e781bSJacob Faibussowitsch       ierr = PetscStrtolower(loc1_);CHKERRQ(ierr);
400e94e781bSJacob Faibussowitsch       ierr = PetscStrToArray((const char *) loc1_, ',',(int *) &nLoc1_, &loc1_array);CHKERRQ(ierr);
401e94e781bSJacob Faibussowitsch     }
402e94e781bSJacob Faibussowitsch     if (size_loc2_) {
403e94e781bSJacob Faibussowitsch       ierr = PetscStrtolower(loc2_);CHKERRQ(ierr);
404e94e781bSJacob Faibussowitsch       ierr = PetscStrcmp("self", (const char *) loc2_, &foundSelf);CHKERRQ(ierr);
405e94e781bSJacob Faibussowitsch       if (foundSelf) {
406e94e781bSJacob Faibussowitsch         if (loc2_invert) {
407e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_NO_SELF;
408e94e781bSJacob Faibussowitsch         } else {
409e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_ONLY_SELF;
410e94e781bSJacob Faibussowitsch         }
411e94e781bSJacob Faibussowitsch       }
412e94e781bSJacob Faibussowitsch     }
413e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFile((const char *) size_loc0_ ? loc0_ : NULL, "w");CHKERRQ(ierr);
414e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetClasses(loc1_invert,(PetscInt) nLoc1_, (const char *const *) loc1_array);CHKERRQ(ierr);
415e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFilterCommSelf(commSelfFlag);CHKERRQ(ierr);
416e94e781bSJacob Faibussowitsch     ierr = PetscStrToArrayDestroy(nLoc1_, loc1_array);CHKERRQ(ierr);
417e94e781bSJacob Faibussowitsch     ierr = PetscTokenDestroy(&tok);CHKERRQ(ierr);
418e94e781bSJacob Faibussowitsch   }
419e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
420e94e781bSJacob Faibussowitsch }
421e94e781bSJacob Faibussowitsch 
422e94e781bSJacob Faibussowitsch /*@
423e94e781bSJacob Faibussowitsch   PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures.
424e94e781bSJacob Faibussowitsch 
425e94e781bSJacob Faibussowitsch   Not Collective
426e94e781bSJacob Faibussowitsch 
427e94e781bSJacob Faibussowitsch   Notes:
428e94e781bSJacob Faibussowitsch   This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent
429e94e781bSJacob Faibussowitsch   PetscInfo() calls down the line.
430e94e781bSJacob Faibussowitsch 
431*fe9b927eSVaclav Hapla   Level: developer
4326c877ef6SSatish Balay 
433e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions()
434e94e781bSJacob Faibussowitsch @*/
435e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
436e94e781bSJacob Faibussowitsch {
437e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
438e94e781bSJacob Faibussowitsch   int             err;
439e94e781bSJacob Faibussowitsch 
440e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
441e94e781bSJacob Faibussowitsch   ierr = PetscInfoAllow(PETSC_FALSE);CHKERRQ(ierr);
442e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr);
443e94e781bSJacob Faibussowitsch   err  = fflush(PetscInfoFile);
444e94e781bSJacob Faibussowitsch   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
445e94e781bSJacob Faibussowitsch   if (PetscInfoFilename) {
446e94e781bSJacob Faibussowitsch     ierr  = PetscFClose(MPI_COMM_SELF, PetscInfoFile);CHKERRQ(ierr);
447e94e781bSJacob Faibussowitsch   }
448e94e781bSJacob Faibussowitsch   ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr);
449e94e781bSJacob Faibussowitsch   memset(PetscInfoFlags, 1, (size_t) 160*sizeof(PetscInfoFlags[0]));
450e94e781bSJacob Faibussowitsch   PetscInfoClassnamesLocked = PETSC_FALSE;
451e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
452e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = -1;
453e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
454e94e781bSJacob Faibussowitsch   PetscInfoSetUp = PETSC_FALSE;
4555c6c1daeSBarry Smith   PetscFunctionReturn(0);
4565c6c1daeSBarry Smith }
4575c6c1daeSBarry Smith 
4585c6c1daeSBarry Smith /*@
459fa2bb9feSLisandro Dalcin   PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class.
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith   Not Collective
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith   Input Parameter:
464fa2bb9feSLisandro Dalcin . classid - The object class,  e.g., MAT_CLASSID, SNES_CLASSID, etc.
4655c6c1daeSBarry Smith 
4665c6c1daeSBarry Smith   Notes:
4675c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith   Level: developer
4705c6c1daeSBarry Smith 
471e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4725c6c1daeSBarry Smith @*/
473fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoDeactivateClass(PetscClassId classid)
4745c6c1daeSBarry Smith {
4755c6c1daeSBarry Smith   PetscFunctionBegin;
476fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
477fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0;
4785c6c1daeSBarry Smith   PetscFunctionReturn(0);
4795c6c1daeSBarry Smith }
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith /*@
482fa2bb9feSLisandro Dalcin   PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class.
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith   Not Collective
4855c6c1daeSBarry Smith 
4865c6c1daeSBarry Smith   Input Parameter:
487fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
4885c6c1daeSBarry Smith 
4895c6c1daeSBarry Smith   Notes:
4905c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
4915c6c1daeSBarry Smith 
4925c6c1daeSBarry Smith   Level: developer
4935c6c1daeSBarry Smith 
494e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4955c6c1daeSBarry Smith @*/
496fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoActivateClass(PetscClassId classid)
4975c6c1daeSBarry Smith {
4985c6c1daeSBarry Smith   PetscFunctionBegin;
499fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
500fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1;
5015c6c1daeSBarry Smith   PetscFunctionReturn(0);
5025c6c1daeSBarry Smith }
5035c6c1daeSBarry Smith 
5045c6c1daeSBarry Smith /*
5055c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
5065c6c1daeSBarry Smith   messages are also printed to the history file, called by default
5075c6c1daeSBarry Smith   .petschistory in ones home directory.
5085c6c1daeSBarry Smith */
50995c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith /*MC
512e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
5135c6c1daeSBarry Smith 
5145c6c1daeSBarry Smith    Synopsis:
515aaa7dc30SBarry Smith        #include <petscsys.h>
516*fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo(PetscObject obj, const char message[])
517*fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo1(PetscObject obj, const char formatmessage[],arg1)
518*fe9b927eSVaclav Hapla        PetscErrorCode PetscInfo2(PetscObject obj, const char formatmessage[],arg1,arg2)
519*fe9b927eSVaclav Hapla        ...
5205c6c1daeSBarry Smith 
521*fe9b927eSVaclav Hapla     Collective on obj
5225c6c1daeSBarry Smith 
5235c6c1daeSBarry Smith     Input Parameter:
524*fe9b927eSVaclav Hapla +   obj - object most closely associated with the logging statement or NULL
5255c6c1daeSBarry Smith .   message - logging message
526*fe9b927eSVaclav Hapla .   formatmessage - logging message using standard "printf" format
527*fe9b927eSVaclav Hapla -   arg1, arg2, ... - arguments of the format
528e94e781bSJacob Faibussowitsch 
529e94e781bSJacob Faibussowitsch     Notes:
530*fe9b927eSVaclav Hapla     PetscInfo() prints only from the first processor in the communicator of obj.
531*fe9b927eSVaclav Hapla     If obj is NULL, the PETSC_COMM_SELF communicator is used, i.e. every rank of PETSC_COMM_WORLD prints the message.
532*fe9b927eSVaclav Hapla 
533*fe9b927eSVaclav Hapla     Extent of the printed messages can be controlled using the option database key -info as follows.
534*fe9b927eSVaclav Hapla 
535*fe9b927eSVaclav Hapla $   -info [filename][:[~]<list,of,classnames>[:[~]self]]
536*fe9b927eSVaclav Hapla 
537*fe9b927eSVaclav Hapla     No filename means standard output PETSC_STDOUT is used.
538*fe9b927eSVaclav Hapla 
539*fe9b927eSVaclav Hapla     The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp.
540*fe9b927eSVaclav Hapla     If this list is not specified, all classes are enabled.
541*fe9b927eSVaclav Hapla     Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
542*fe9b927eSVaclav Hapla     A special classname sys relates to PetscInfo() with obj being NULL.
543*fe9b927eSVaclav Hapla 
544*fe9b927eSVaclav 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.
545*fe9b927eSVaclav 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.
546*fe9b927eSVaclav Hapla 
547*fe9b927eSVaclav Hapla     All classname/self matching is case insensitive. Filename is case sensitive.
548*fe9b927eSVaclav Hapla 
549*fe9b927eSVaclav Hapla     Example of Usage:
550*fe9b927eSVaclav Hapla $     Mat A;
551*fe9b927eSVaclav Hapla $     PetscInt alpha;
552*fe9b927eSVaclav Hapla $     ...
553*fe9b927eSVaclav Hapla $     PetscInfo1(A,"Matrix uses parameter alpha=%D\n",alpha);
554*fe9b927eSVaclav Hapla 
555*fe9b927eSVaclav Hapla     Options Examples:
556*fe9b927eSVaclav Hapla     Each call of the form
557*fe9b927eSVaclav Hapla $     PetscInfo(obj, msg);
558*fe9b927eSVaclav Hapla $     PetscInfo1(obj, msg, arg1);
559*fe9b927eSVaclav Hapla $     PetscInfo2(obj, msg, arg1, arg2);
560*fe9b927eSVaclav Hapla     is evaluated as follows.
561*fe9b927eSVaclav Hapla $     -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator
562*fe9b927eSVaclav Hapla $     -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1
563*fe9b927eSVaclav 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
564*fe9b927eSVaclav Hapla $     -info :sys prints to PETSC_STDOUT only if obj is NULL
565*fe9b927eSVaclav Hapla     Note that
566*fe9b927eSVaclav Hapla $     -info :sys:~self
567*fe9b927eSVaclav Hapla     deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF.
568*fe9b927eSVaclav Hapla 
569*fe9b927eSVaclav Hapla     Fortran Note:
570*fe9b927eSVaclav Hapla     This function does not take the obj argument, there is only the PetscInfo()
571*fe9b927eSVaclav Hapla      version, not PetscInfo1() etc.
5725c6c1daeSBarry Smith 
5735c6c1daeSBarry Smith     Level: intermediate
5745c6c1daeSBarry Smith 
575e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions()
5765c6c1daeSBarry Smith M*/
577*fe9b927eSVaclav Hapla PetscErrorCode  PetscInfo_Private(const char func[],PetscObject obj, const char message[], ...)
5785c6c1daeSBarry Smith {
5795c6c1daeSBarry Smith   va_list        Argp;
580e94e781bSJacob Faibussowitsch   PetscMPIInt    rank = 0,urank,size = 1;
581fa2bb9feSLisandro Dalcin   PetscClassId   classid;
582e94e781bSJacob Faibussowitsch   PetscBool      enabled = PETSC_FALSE, oldflag;
5835c6c1daeSBarry Smith   char           string[8*1024];
5845c6c1daeSBarry Smith   PetscErrorCode ierr;
585e94e781bSJacob Faibussowitsch   size_t         fullLength,len;
5865c6c1daeSBarry Smith   int            err;
5875c6c1daeSBarry Smith 
5885c6c1daeSBarry Smith   PetscFunctionBegin;
589940d77c0SToby Isaac   if (obj) PetscValidHeader(obj,2);
590fa2bb9feSLisandro Dalcin   classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID;
591e94e781bSJacob Faibussowitsch   ierr = PetscInfoEnabled(classid, &enabled);CHKERRQ(ierr);
592e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
593e94e781bSJacob Faibussowitsch   PetscValidCharPointer(message,3);
594e94e781bSJacob Faibussowitsch   if (obj) {
595e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr);
596e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_size(obj->comm, &size);CHKERRQ(ierr);
597e94e781bSJacob Faibussowitsch   }
598e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5995c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
600e94e781bSJacob Faibussowitsch   if (!PetscInfoCommFilter && (size < 2)) {
601e94e781bSJacob Faibussowitsch     /* If no self printing is allowed, and size too small get out */
602e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
603e94e781bSJacob Faibussowitsch   } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) {
604e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
605e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
606e94e781bSJacob Faibussowitsch   }
607e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
608e94e781bSJacob Faibussowitsch   oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
6095c6c1daeSBarry Smith   ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr);
6105c6c1daeSBarry Smith   va_start(Argp, message);
6115c6c1daeSBarry Smith   sprintf(string, "[%d] %s(): ",urank,func);
6125c6c1daeSBarry Smith   ierr = PetscStrlen(string, &len);CHKERRQ(ierr);
613a2ea699eSBarry Smith   ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);CHKERRQ(ierr);
6145c6c1daeSBarry Smith   ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr);
6155c6c1daeSBarry Smith   err  = fflush(PetscInfoFile);
6165c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6175c6c1daeSBarry Smith   if (petsc_history) {
6185c6c1daeSBarry Smith     va_start(Argp, message);
619a2ea699eSBarry Smith     ierr = (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr);
6205c6c1daeSBarry Smith   }
6215c6c1daeSBarry Smith   va_end(Argp);
622e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = oldflag;
6235c6c1daeSBarry Smith   PetscFunctionReturn(0);
6245c6c1daeSBarry Smith }
625