xref: /petsc/src/sys/info/verboseinfo.c (revision 6c877ef6e1e9f10bda97aab0939d4bfc172c4a91)
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 
53e94e781bSJacob Faibussowitsch     Level: beginner
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 /*@
68e94e781bSJacob Faibussowitsch     PetscInfoAllow - Causes PetscInfo() messages to be printed to PetscInfoFile
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith     Not Collective, each processor may call this separately, but printing is only
715c6c1daeSBarry Smith     turned on if the lowest processor number associated with the PetscObject associated
725c6c1daeSBarry Smith     with the call to PetscInfo() has called this routine.
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith     Input Parameter:
75e94e781bSJacob Faibussowitsch .   flag - PETSC_TRUE or PETSC_FALSE
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith     Level: advanced
785c6c1daeSBarry Smith 
79e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoEnabled(), PetscInfoGetInfo(), PetscInfoSetFromOptions()
805c6c1daeSBarry Smith @*/
81e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag)
82e94e781bSJacob Faibussowitsch {
83e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
84e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = flag;
85e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
86e94e781bSJacob Faibussowitsch }
87e94e781bSJacob Faibussowitsch 
88e94e781bSJacob Faibussowitsch /*@C
89e94e781bSJacob Faibussowitsch     PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls (i.e. set PetscInfoFile)
90e94e781bSJacob Faibussowitsch 
91e94e781bSJacob Faibussowitsch     Not Collective, any processor which has not called this routine will print to PETSC_SDOUT.
92e94e781bSJacob Faibussowitsch 
93e94e781bSJacob Faibussowitsch     Input Parameter:
94e94e781bSJacob Faibussowitsch +   filename - Name of the file where PetscInfo() will print to
95e94e781bSJacob Faibussowitsch -   mode - Write mode passed to PetscFOpen()
96e94e781bSJacob Faibussowitsch 
97e94e781bSJacob Faibussowitsch     Notes:
98e94e781bSJacob Faibussowitsch     By default PetscInfo() writes to PETSC_STDOUT. Use "stdout" or NULL to set PetscInfo() to write to stdout
99e94e781bSJacob Faibussowitsch 
100e94e781bSJacob Faibussowitsch     Level: advanced
101e94e781bSJacob Faibussowitsch 
102e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscFOpen()
103e94e781bSJacob Faibussowitsch @*/
104e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[])
1055c6c1daeSBarry Smith {
106fa2bb9feSLisandro Dalcin   char            fname[PETSC_MAX_PATH_LEN], tname[11];
1075c6c1daeSBarry Smith   PetscMPIInt     rank;
1085c6c1daeSBarry Smith   PetscErrorCode  ierr;
1095c6c1daeSBarry Smith 
1105c6c1daeSBarry Smith   PetscFunctionBegin;
111e94e781bSJacob Faibussowitsch   if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
112e94e781bSJacob Faibussowitsch   ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr);
113e94e781bSJacob Faibussowitsch   if (filename) {
114e94e781bSJacob Faibussowitsch     PetscBool  oldflag;
115e94e781bSJacob Faibussowitsch     PetscValidCharPointer(filename, 1);
1165c6c1daeSBarry Smith     ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr);
117e94e781bSJacob Faibussowitsch     ierr = PetscStrallocpy(fname, &PetscInfoFilename);CHKERRQ(ierr);
118e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);CHKERRQ(ierr);
1195c6c1daeSBarry Smith     sprintf(tname, ".%d", rank);
1205c6c1daeSBarry Smith     ierr = PetscStrcat(fname, tname);CHKERRQ(ierr);
121e94e781bSJacob Faibussowitsch     oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
122e94e781bSJacob Faibussowitsch     ierr = PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile);CHKERRQ(ierr);
123e94e781bSJacob Faibussowitsch     PetscLogPrintInfo = oldflag;
124e94e781bSJacob Faibussowitsch     /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and
125e94e781bSJacob Faibussowitsch      call it afterwards so that it actually writes to file */
126e94e781bSJacob Faibussowitsch     ierr = PetscInfo1(NULL, "Opened PetscInfo file %s\n", fname);CHKERRQ(ierr);
127e94e781bSJacob Faibussowitsch   }
128e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
129e94e781bSJacob Faibussowitsch }
130a297a907SKarl Rupp 
131e94e781bSJacob Faibussowitsch /*@C
132e94e781bSJacob Faibussowitsch     PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to
133e94e781bSJacob Faibussowitsch 
134e94e781bSJacob Faibussowitsch     Not Collective
135e94e781bSJacob Faibussowitsch 
136e94e781bSJacob Faibussowitsch     Output Parameters:
137e94e781bSJacob Faibussowitsch +   filename - The name of the output file
138e94e781bSJacob Faibussowitsch -   InfoFile - The FILE pointer for the output file
139e94e781bSJacob Faibussowitsch 
140e94e781bSJacob Faibussowitsch     Level: advanced
141e94e781bSJacob Faibussowitsch 
142e94e781bSJacob Faibussowitsch     Note:
143e94e781bSJacob Faibussowitsch     This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is
144e94e781bSJacob Faibussowitsch     therefore responsible for freeing the allocated filename pointer afterwards.
145e94e781bSJacob Faibussowitsch 
146e94e781bSJacob Faibussowitsch     Fortran Note:
147e94e781bSJacob Faibussowitsch     This routine is not supported in Fortran.
148e94e781bSJacob Faibussowitsch 
149e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy()
150e94e781bSJacob Faibussowitsch @*/
151e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile)
152e94e781bSJacob Faibussowitsch {
153e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
154e94e781bSJacob Faibussowitsch 
155e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
156e94e781bSJacob Faibussowitsch   PetscValidPointer(filename, 1);
157e94e781bSJacob Faibussowitsch   PetscValidPointer(InfoFile, 2);
158e94e781bSJacob Faibussowitsch   ierr = PetscStrallocpy(PetscInfoFilename, filename);CHKERRQ(ierr);
159e94e781bSJacob Faibussowitsch   *InfoFile = PetscInfoFile;
160e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
161e94e781bSJacob Faibussowitsch }
162e94e781bSJacob Faibussowitsch 
163e94e781bSJacob Faibussowitsch /*@C
164e94e781bSJacob Faibussowitsch     PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against
165e94e781bSJacob Faibussowitsch 
166e94e781bSJacob Faibussowitsch     Not Collective
167e94e781bSJacob Faibussowitsch 
168e94e781bSJacob Faibussowitsch     Input Parameters:
169e94e781bSJacob Faibussowitsch +   exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that
170e94e781bSJacob Faibussowitsch     is NOT one of the classes specified
171e94e781bSJacob Faibussowitsch .   N - Number of classes to filter for (size of classnames)
172e94e781bSJacob Faibussowitsch -   classnames - String array containing the names of classes to filter for, e.g. "vec"
173e94e781bSJacob Faibussowitsch 
174e94e781bSJacob Faibussowitsch     Notes:
175e94e781bSJacob Faibussowitsch     Not for use in Fortran
176e94e781bSJacob Faibussowitsch 
177e94e781bSJacob Faibussowitsch     This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called.
178e94e781bSJacob Faibussowitsch 
179e94e781bSJacob Faibussowitsch     Names in the classnames list should correspond to the names returned by PetscObjectGetClassName().
180e94e781bSJacob Faibussowitsch 
181e94e781bSJacob Faibussowitsch     This function only sets the list of class names.
182e94e781bSJacob Faibussowitsch     The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away.
183e94e781bSJacob Faibussowitsch     The reason for this is that we need to set the list of included/excluded classes before their classids are known.
184e94e781bSJacob Faibussowitsch     Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()).
185e94e781bSJacob Faibussowitsch 
186e94e781bSJacob Faibussowitsch     Level: developer
187e94e781bSJacob Faibussowitsch 
188e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName()
189e94e781bSJacob Faibussowitsch @*/
190e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames)
191e94e781bSJacob Faibussowitsch {
192e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
193e94e781bSJacob Faibussowitsch 
194e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
195e94e781bSJacob Faibussowitsch   if (PetscInfoClassnamesLocked) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()");
196e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr);
197e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames);CHKERRQ(ierr);
198e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = N;
199e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = exclude;
200e94e781bSJacob Faibussowitsch   {
201e94e781bSJacob Faibussowitsch     /* Process sys class right away */
202e94e781bSJacob Faibussowitsch     PetscClassId  sysclassid = PETSC_SMALLEST_CLASSID;
203e94e781bSJacob Faibussowitsch     ierr = PetscInfoProcessClass("sys", 1, &sysclassid);CHKERRQ(ierr);
204e94e781bSJacob Faibussowitsch   }
205e94e781bSJacob Faibussowitsch   PetscInfoSetUp = PETSC_TRUE;
206e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
207e94e781bSJacob Faibussowitsch }
208e94e781bSJacob Faibussowitsch 
209e94e781bSJacob Faibussowitsch /*@C
210e94e781bSJacob Faibussowitsch     PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses()
211e94e781bSJacob Faibussowitsch 
212e94e781bSJacob Faibussowitsch     Not Collective
213e94e781bSJacob Faibussowitsch 
214e94e781bSJacob Faibussowitsch     Input Paramater:
215e94e781bSJacob Faibussowitsch .   classname - Name of the class to search for
216e94e781bSJacob Faibussowitsch 
217e94e781bSJacob Faibussowitsch     Output Parameter:
218e94e781bSJacob Faibussowitsch .   found - PetscBool indicating whether the classname was found
219e94e781bSJacob Faibussowitsch 
220e94e781bSJacob Faibussowitsch     Notes:
221e94e781bSJacob Faibussowitsch     Use PetscObjectGetName() to retrieve an appropriate classname
222e94e781bSJacob Faibussowitsch 
223e94e781bSJacob Faibussowitsch     Level: developer
224e94e781bSJacob Faibussowitsch 
225e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName()
226e94e781bSJacob Faibussowitsch @*/
227e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found)
228e94e781bSJacob Faibussowitsch {
229e94e781bSJacob Faibussowitsch   PetscInt        idx;
230e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
231e94e781bSJacob Faibussowitsch 
232e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
233e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname,1);
234e94e781bSJacob Faibussowitsch   ierr = PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found);CHKERRQ(ierr);
235e94e781bSJacob Faibussowitsch   PetscInfoClassnamesLocked = PETSC_TRUE;
236e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
237e94e781bSJacob Faibussowitsch }
238e94e781bSJacob Faibussowitsch 
239e94e781bSJacob Faibussowitsch /*@
240e94e781bSJacob Faibussowitsch     PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo()
241e94e781bSJacob Faibussowitsch 
242e94e781bSJacob Faibussowitsch     Not Collective
243e94e781bSJacob Faibussowitsch 
244e94e781bSJacob Faibussowitsch     Output Parameters:
245e94e781bSJacob Faibussowitsch +   infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called
246e94e781bSJacob Faibussowitsch .   exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted
247e94e781bSJacob Faibussowitsch .   locked - PETSC_TRUE if the list of classes to filter for has been locked
248e94e781bSJacob Faibussowitsch -   commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all
249e94e781bSJacob Faibussowitsch     communicators
250e94e781bSJacob Faibussowitsch 
251e94e781bSJacob Faibussowitsch     Notes:
252e94e781bSJacob Faibussowitsch     Initially commSelfFlag = PETSC_INFO_COMM_ALL
253e94e781bSJacob Faibussowitsch 
254e94e781bSJacob Faibussowitsch     Level: beginner
255e94e781bSJacob Faibussowitsch 
256e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions()
257e94e781bSJacob Faibussowitsch @*/
258e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *setup, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
259e94e781bSJacob Faibussowitsch {
260e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
261e94e781bSJacob Faibussowitsch   if (infoEnabled)  *infoEnabled  = PetscLogPrintInfo;
262e94e781bSJacob Faibussowitsch   if (setup)        *setup        = PetscInfoSetUp;
263e94e781bSJacob Faibussowitsch   if (exclude)      *exclude      = PetscInfoInvertClasses;
264e94e781bSJacob Faibussowitsch   if (locked)       *locked       = PetscInfoClassnamesLocked;
265e94e781bSJacob Faibussowitsch   if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
266e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
267e94e781bSJacob Faibussowitsch }
268e94e781bSJacob Faibussowitsch 
269e94e781bSJacob Faibussowitsch /*@C
270e94e781bSJacob Faibussowitsch     PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo()
271e94e781bSJacob Faibussowitsch 
272e94e781bSJacob Faibussowitsch     Not Collective
273e94e781bSJacob Faibussowitsch 
274e94e781bSJacob Faibussowitsch     Input Parameters:
275e94e781bSJacob Faibussowitsch +   classname - Name of the class to activate/deactivate PetscInfo() for
276e94e781bSJacob Faibussowitsch .   numClassID - Number of entries in classIDs
277e94e781bSJacob Faibussowitsch -   classIDs - Array containing all of the PetscClassids associated with classname
278e94e781bSJacob Faibussowitsch 
279e94e781bSJacob Faibussowitsch     Note: This function contains the deprecation warning for -info_exclude
280e94e781bSJacob Faibussowitsch 
281e94e781bSJacob Faibussowitsch     Level: developer
282e94e781bSJacob Faibussowitsch 
283e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions()
284e94e781bSJacob Faibussowitsch @*/
285e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[])
286e94e781bSJacob Faibussowitsch {
287e94e781bSJacob Faibussowitsch   PetscInt        i;
288e94e781bSJacob Faibussowitsch   PetscBool       enabled, exclude, found, opt, pkg;
289e94e781bSJacob Faibussowitsch   char            logList[256];
290e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
291e94e781bSJacob Faibussowitsch 
292e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
293e94e781bSJacob Faibussowitsch   PetscValidCharPointer(classname, 1);
294e94e781bSJacob Faibussowitsch   ierr = PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL);CHKERRQ(ierr);
295e94e781bSJacob Faibussowitsch   /* -info_exclude is DEPRECATED */
296e94e781bSJacob Faibussowitsch   ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr);
297e94e781bSJacob Faibussowitsch   if (opt) {
298e94e781bSJacob Faibussowitsch     ierr = PetscStrInList(classname,logList,',',&pkg);CHKERRQ(ierr);
299e94e781bSJacob Faibussowitsch     if (pkg) {
300e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
301e94e781bSJacob Faibussowitsch         ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr);
302e94e781bSJacob Faibussowitsch       }
303e94e781bSJacob Faibussowitsch     }
304e94e781bSJacob Faibussowitsch   }
305e94e781bSJacob Faibussowitsch   ierr = PetscInfoGetClass(classname, &found);CHKERRQ(ierr);
306e94e781bSJacob Faibussowitsch   if ((found && exclude) || (!found && !exclude)) {
307e94e781bSJacob Faibussowitsch     if (PetscInfoNumClasses > 0) {
308e94e781bSJacob Faibussowitsch       /* Check if -info was called empty */
309e94e781bSJacob Faibussowitsch       for (i = 0; i < numClassID; ++i) {
310e94e781bSJacob Faibussowitsch         ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr);
311e94e781bSJacob Faibussowitsch       }
312e94e781bSJacob Faibussowitsch     }
313e94e781bSJacob Faibussowitsch   } else {
314e94e781bSJacob Faibussowitsch     for (i = 0; i < numClassID; ++i) {
315e94e781bSJacob Faibussowitsch       ierr = PetscInfoActivateClass(classIDs[i]);CHKERRQ(ierr);
316e94e781bSJacob Faibussowitsch     }
317e94e781bSJacob Faibussowitsch   }
318e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
319e94e781bSJacob Faibussowitsch }
320e94e781bSJacob Faibussowitsch 
321e94e781bSJacob Faibussowitsch /*@
322e94e781bSJacob Faibussowitsch     PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo()
323e94e781bSJacob Faibussowitsch 
324e94e781bSJacob Faibussowitsch     Not Collective
325e94e781bSJacob Faibussowitsch 
326e94e781bSJacob Faibussowitsch     Input Parameter:
327e94e781bSJacob Faibussowitsch .   commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator
328e94e781bSJacob Faibussowitsch of the object calling PetscInfo()
329e94e781bSJacob Faibussowitsch 
330e94e781bSJacob Faibussowitsch     Level: developer
331e94e781bSJacob Faibussowitsch 
332e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo()
333e94e781bSJacob Faibussowitsch @*/
334e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
335e94e781bSJacob Faibussowitsch {
336e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
337e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = commSelfFlag;
338e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
339e94e781bSJacob Faibussowitsch }
340e94e781bSJacob Faibussowitsch 
341e94e781bSJacob Faibussowitsch /*@
342e94e781bSJacob Faibussowitsch     PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to
343e94e781bSJacob Faibussowitsch     PetscInfo()
344e94e781bSJacob Faibussowitsch 
345e94e781bSJacob Faibussowitsch     Not Collective
346e94e781bSJacob Faibussowitsch 
347e94e781bSJacob Faibussowitsch     Input Parameter:
348e94e781bSJacob Faibussowitsch .   options - Options database, use NULL for default global database
349e94e781bSJacob Faibussowitsch 
350e94e781bSJacob Faibussowitsch     Options Database Key:
351e94e781bSJacob Faibussowitsch $   -info [optional filename][:[~]optional list,of,classnames][:[~]optional "self"]
352e94e781bSJacob Faibussowitsch 
353e94e781bSJacob Faibussowitsch     Notes:
354e94e781bSJacob Faibussowitsch     PetscInfo() defaults:
355e94e781bSJacob Faibussowitsch $   [optional filename] defaults to write output to PETSC_STDOUT
356e94e781bSJacob Faibussowitsch $   [optional list,of,classnames] defaults to enabling all classes
357e94e781bSJacob Faibussowitsch $   [optional "self"] default is that any communicator is allowed to print (albeit with the caveat that only the first rank on that communicator will print).
358e94e781bSJacob Faibussowitsch 
359e94e781bSJacob Faibussowitsch     Prepend `~` to first classname or "self" to invert either selection, i.e. -info :~ts,snes:~self will activate
360e94e781bSJacob Faibussowitsch     every PetscInfo() call on a communicator with size > 1, associated with TS or SNES objects. Note that command line options
361e94e781bSJacob Faibussowitsch     will also silence any user-written calls to PetscInfo() if an object which is filtered for is passed as the PetscObject
362e94e781bSJacob Faibussowitsch     argument to PetscInfo(). To filter for PetscInfo() calls not directly associated with an object (i.e. where *vobj ==
363e94e781bSJacob Faibussowitsch  NULL), use "sys".
364e94e781bSJacob Faibussowitsch 
365e94e781bSJacob Faibussowitsch     All classname/self matching is case insensitive. Filename IS case sensitive.
366e94e781bSJacob Faibussowitsch 
367e94e781bSJacob Faibussowitsch     Example:
368e94e781bSJacob Faibussowitsch $   -info :: OR -info will print to PETSC_STDOUT, print for ALL classes, and print for ALL communicator sizes
369e94e781bSJacob Faibussowitsch $   -info :mat:self will print to PETSC_STDOUT, print ONLY PetscInfo() calls associated to Mat objects, whose communicators are of
370e94e781bSJacob Faibussowitsch size = 1
371e94e781bSJacob Faibussowitsch $   -info myInfoFileName:~vec:~self will create and print to ./myInfoFileName, print all PetscInfo() calls NOT associated
372e94e781bSJacob Faibussowitsch with Vec Objects, whose communicators are of size > 1
373e94e781bSJacob Faibussowitsch 
374e94e781bSJacob Faibussowitsch     Level: beginner
375e94e781bSJacob Faibussowitsch 
376e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy()
377e94e781bSJacob Faibussowitsch @*/
378e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
379e94e781bSJacob Faibussowitsch {
380e94e781bSJacob Faibussowitsch   PetscToken         tok;
381e94e781bSJacob Faibussowitsch   char               optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
382e94e781bSJacob Faibussowitsch   char               **loc1_array = NULL;
383e94e781bSJacob Faibussowitsch   PetscBool          set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE;
384e94e781bSJacob Faibussowitsch   size_t             size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0;
385e94e781bSJacob Faibussowitsch   int                nLoc1_ = 0;
386e94e781bSJacob Faibussowitsch   PetscInfoCommFlag  commSelfFlag = PETSC_INFO_COMM_ALL;
387e94e781bSJacob Faibussowitsch   PetscErrorCode     ierr;
388e94e781bSJacob Faibussowitsch 
389e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
390e94e781bSJacob Faibussowitsch   ierr = PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead");CHKERRQ(ierr);
391e94e781bSJacob Faibussowitsch   ierr = PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_MAX_PATH_LEN, &set);CHKERRQ(ierr);
392e94e781bSJacob Faibussowitsch   if (set) {
393e94e781bSJacob Faibussowitsch     /* Allow sys class to be processed as part of setup */
394e94e781bSJacob Faibussowitsch     PetscInfoSetUp = PETSC_TRUE;
395e94e781bSJacob Faibussowitsch     ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr);
396e94e781bSJacob Faibussowitsch     ierr = PetscTokenCreate(optstring, ':', &tok);CHKERRQ(ierr);
397e94e781bSJacob Faibussowitsch     ierr = PetscTokenFind(tok, &loc0_);CHKERRQ(ierr);
398e94e781bSJacob Faibussowitsch     ierr = PetscTokenFind(tok, &loc1_);CHKERRQ(ierr);
399e94e781bSJacob Faibussowitsch     ierr = PetscTokenFind(tok, &loc2_);CHKERRQ(ierr);
400e94e781bSJacob Faibussowitsch     if (loc1_) {
401e94e781bSJacob Faibussowitsch       ierr = PetscStrcmp("self", (const char *) loc1_, &foundSelf);CHKERRQ(ierr);
402e94e781bSJacob Faibussowitsch       if (foundSelf) {
403e94e781bSJacob 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" */
404e94e781bSJacob Faibussowitsch         loc2_ = loc1_;
405e94e781bSJacob Faibussowitsch         loc1_ = NULL;
406e94e781bSJacob Faibussowitsch       } else {
407e94e781bSJacob Faibussowitsch         if (*loc1_ == '~') {
408e94e781bSJacob Faibussowitsch           loc1_invert = PETSC_TRUE;
409e94e781bSJacob Faibussowitsch           ++loc1_;
410e94e781bSJacob Faibussowitsch         }
411e94e781bSJacob Faibussowitsch       }
412e94e781bSJacob Faibussowitsch     }
413e94e781bSJacob Faibussowitsch     if (loc2_) {
414e94e781bSJacob Faibussowitsch       if (*loc2_ == '~') {
415e94e781bSJacob Faibussowitsch         loc2_invert = PETSC_TRUE;
416e94e781bSJacob Faibussowitsch         ++loc2_;
417e94e781bSJacob Faibussowitsch       }
418e94e781bSJacob Faibussowitsch     }
419e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc0_, &size_loc0_);CHKERRQ(ierr);
420e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc1_, &size_loc1_);CHKERRQ(ierr);
421e94e781bSJacob Faibussowitsch     ierr = PetscStrlen(loc2_, &size_loc2_);CHKERRQ(ierr);
422e94e781bSJacob Faibussowitsch     if (size_loc1_) {
423e94e781bSJacob Faibussowitsch       ierr = PetscStrtolower(loc1_);CHKERRQ(ierr);
424e94e781bSJacob Faibussowitsch       ierr = PetscStrToArray((const char *) loc1_, ',',(int *) &nLoc1_, &loc1_array);CHKERRQ(ierr);
425e94e781bSJacob Faibussowitsch     }
426e94e781bSJacob Faibussowitsch     if (size_loc2_) {
427e94e781bSJacob Faibussowitsch       ierr = PetscStrtolower(loc2_);CHKERRQ(ierr);
428e94e781bSJacob Faibussowitsch       ierr = PetscStrcmp("self", (const char *) loc2_, &foundSelf);CHKERRQ(ierr);
429e94e781bSJacob Faibussowitsch       if (foundSelf) {
430e94e781bSJacob Faibussowitsch         if (loc2_invert) {
431e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_NO_SELF;
432e94e781bSJacob Faibussowitsch         } else {
433e94e781bSJacob Faibussowitsch           commSelfFlag = PETSC_INFO_COMM_ONLY_SELF;
434e94e781bSJacob Faibussowitsch         }
435e94e781bSJacob Faibussowitsch       }
436e94e781bSJacob Faibussowitsch     }
437e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFile((const char *) size_loc0_ ? loc0_ : NULL, "w");CHKERRQ(ierr);
438e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetClasses(loc1_invert,(PetscInt) nLoc1_, (const char *const *) loc1_array);CHKERRQ(ierr);
439e94e781bSJacob Faibussowitsch     ierr = PetscInfoSetFilterCommSelf(commSelfFlag);CHKERRQ(ierr);
440e94e781bSJacob Faibussowitsch     ierr = PetscStrToArrayDestroy(nLoc1_, loc1_array);CHKERRQ(ierr);
441e94e781bSJacob Faibussowitsch     ierr = PetscTokenDestroy(&tok);CHKERRQ(ierr);
442e94e781bSJacob Faibussowitsch   }
443e94e781bSJacob Faibussowitsch   PetscFunctionReturn(0);
444e94e781bSJacob Faibussowitsch }
445e94e781bSJacob Faibussowitsch 
446e94e781bSJacob Faibussowitsch /*@
447e94e781bSJacob Faibussowitsch   PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures.
448e94e781bSJacob Faibussowitsch 
449e94e781bSJacob Faibussowitsch   Not Collective
450e94e781bSJacob Faibussowitsch 
451e94e781bSJacob Faibussowitsch   Notes:
452e94e781bSJacob Faibussowitsch   This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent
453e94e781bSJacob Faibussowitsch   PetscInfo() calls down the line.
454e94e781bSJacob Faibussowitsch 
455*6c877ef6SSatish Balay   Level: intermediate
456*6c877ef6SSatish Balay 
457e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions()
458e94e781bSJacob Faibussowitsch @*/
459e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
460e94e781bSJacob Faibussowitsch {
461e94e781bSJacob Faibussowitsch   PetscErrorCode  ierr;
462e94e781bSJacob Faibussowitsch   int             err;
463e94e781bSJacob Faibussowitsch 
464e94e781bSJacob Faibussowitsch   PetscFunctionBegin;
465e94e781bSJacob Faibussowitsch   ierr = PetscInfoAllow(PETSC_FALSE);CHKERRQ(ierr);
466e94e781bSJacob Faibussowitsch   ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr);
467e94e781bSJacob Faibussowitsch   err  = fflush(PetscInfoFile);
468e94e781bSJacob Faibussowitsch   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
469e94e781bSJacob Faibussowitsch   if (PetscInfoFilename) {
470e94e781bSJacob Faibussowitsch     ierr  = PetscFClose(MPI_COMM_SELF, PetscInfoFile);CHKERRQ(ierr);
471e94e781bSJacob Faibussowitsch   }
472e94e781bSJacob Faibussowitsch   ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr);
473e94e781bSJacob Faibussowitsch   memset(PetscInfoFlags, 1, (size_t) 160*sizeof(PetscInfoFlags[0]));
474e94e781bSJacob Faibussowitsch   PetscInfoClassnamesLocked = PETSC_FALSE;
475e94e781bSJacob Faibussowitsch   PetscInfoInvertClasses = PETSC_FALSE;
476e94e781bSJacob Faibussowitsch   PetscInfoNumClasses = -1;
477e94e781bSJacob Faibussowitsch   PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
478e94e781bSJacob Faibussowitsch   PetscInfoSetUp = PETSC_FALSE;
4795c6c1daeSBarry Smith   PetscFunctionReturn(0);
4805c6c1daeSBarry Smith }
4815c6c1daeSBarry Smith 
4825c6c1daeSBarry Smith /*@
483fa2bb9feSLisandro Dalcin   PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class.
4845c6c1daeSBarry Smith 
4855c6c1daeSBarry Smith   Not Collective
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith   Input Parameter:
488fa2bb9feSLisandro Dalcin . classid - The object class,  e.g., MAT_CLASSID, SNES_CLASSID, etc.
4895c6c1daeSBarry Smith 
4905c6c1daeSBarry Smith   Notes:
4915c6c1daeSBarry Smith   One can pass 0 to deactivate all messages that are not associated with an object.
4925c6c1daeSBarry Smith 
4935c6c1daeSBarry Smith   Level: developer
4945c6c1daeSBarry Smith 
495e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
4965c6c1daeSBarry Smith @*/
497fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoDeactivateClass(PetscClassId classid)
4985c6c1daeSBarry Smith {
4995c6c1daeSBarry Smith   PetscFunctionBegin;
500fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
501fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0;
5025c6c1daeSBarry Smith   PetscFunctionReturn(0);
5035c6c1daeSBarry Smith }
5045c6c1daeSBarry Smith 
5055c6c1daeSBarry Smith /*@
506fa2bb9feSLisandro Dalcin   PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class.
5075c6c1daeSBarry Smith 
5085c6c1daeSBarry Smith   Not Collective
5095c6c1daeSBarry Smith 
5105c6c1daeSBarry Smith   Input Parameter:
511fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
5125c6c1daeSBarry Smith 
5135c6c1daeSBarry Smith   Notes:
5145c6c1daeSBarry Smith   One can pass 0 to activate all messages that are not associated with an object.
5155c6c1daeSBarry Smith 
5165c6c1daeSBarry Smith   Level: developer
5175c6c1daeSBarry Smith 
518e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions()
5195c6c1daeSBarry Smith @*/
520fa2bb9feSLisandro Dalcin PetscErrorCode  PetscInfoActivateClass(PetscClassId classid)
5215c6c1daeSBarry Smith {
5225c6c1daeSBarry Smith   PetscFunctionBegin;
523fa2bb9feSLisandro Dalcin   if (!classid) classid = PETSC_SMALLEST_CLASSID;
524fa2bb9feSLisandro Dalcin   PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1;
5255c6c1daeSBarry Smith   PetscFunctionReturn(0);
5265c6c1daeSBarry Smith }
5275c6c1daeSBarry Smith 
5285c6c1daeSBarry Smith /*
5295c6c1daeSBarry Smith    If the option -history was used, then all printed PetscInfo()
5305c6c1daeSBarry Smith   messages are also printed to the history file, called by default
5315c6c1daeSBarry Smith   .petschistory in ones home directory.
5325c6c1daeSBarry Smith */
53395c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
5345c6c1daeSBarry Smith 
5355c6c1daeSBarry Smith /*MC
536e94e781bSJacob Faibussowitsch     PetscInfo - Logs informative data
5375c6c1daeSBarry Smith 
5385c6c1daeSBarry Smith    Synopsis:
539aaa7dc30SBarry Smith        #include <petscsys.h>
5405c6c1daeSBarry Smith        PetscErrorCode PetscInfo(void *vobj, const char message[])
5415c6c1daeSBarry Smith        PetscErrorCode PetscInfo1(void *vobj, const char formatmessage[],arg1)
5425c6c1daeSBarry Smith        PetscErrorCode PetscInfo2(void *vobj, const char formatmessage[],arg1,arg2)
5435c6c1daeSBarry Smith        etc
5445c6c1daeSBarry Smith 
5455c6c1daeSBarry Smith     Collective over PetscObject argument
5465c6c1daeSBarry Smith 
5475c6c1daeSBarry Smith     Input Parameter:
5480298fd71SBarry Smith +   vobj - object most closely associated with the logging statement or NULL
5495c6c1daeSBarry Smith .   message - logging message
5505c6c1daeSBarry Smith -   formatmessage - logging message using standard "printf" format
5515c6c1daeSBarry Smith 
5525c6c1daeSBarry Smith     Options Database Key:
553e94e781bSJacob Faibussowitsch $   -info [optional filename][:[~]optional list,of,classnames][:[~]optional "self"]
554e94e781bSJacob Faibussowitsch 
555e94e781bSJacob Faibussowitsch     Notes:
556e94e781bSJacob Faibussowitsch     For complete explanation of options database keys see PetscInfoSetFromOptions().
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith     Level: intermediate
5595c6c1daeSBarry Smith 
5605c6c1daeSBarry Smith     Fortran Note: This function does not take the vobj argument, there is only the PetscInfo()
5615c6c1daeSBarry Smith      version, not PetscInfo1() etc.
5625c6c1daeSBarry Smith 
5635c6c1daeSBarry Smith     Example of Usage:
5645c6c1daeSBarry Smith $
5655c6c1daeSBarry Smith $     Mat A
5665c6c1daeSBarry Smith $     double alpha
5675c6c1daeSBarry Smith $     PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha);
5685c6c1daeSBarry Smith $
5695c6c1daeSBarry Smith 
570e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions()
5715c6c1daeSBarry Smith M*/
5725c6c1daeSBarry Smith PetscErrorCode  PetscInfo_Private(const char func[],void *vobj, const char message[], ...)
5735c6c1daeSBarry Smith {
5745c6c1daeSBarry Smith   va_list        Argp;
575e94e781bSJacob Faibussowitsch   PetscMPIInt    rank = 0,urank,size = 1;
5765c6c1daeSBarry Smith   PetscObject    obj = (PetscObject)vobj;
577fa2bb9feSLisandro Dalcin   PetscClassId   classid;
578e94e781bSJacob Faibussowitsch   PetscBool      enabled = PETSC_FALSE, oldflag;
5795c6c1daeSBarry Smith   char           string[8*1024];
5805c6c1daeSBarry Smith   PetscErrorCode ierr;
581e94e781bSJacob Faibussowitsch   size_t         fullLength,len;
5825c6c1daeSBarry Smith   int            err;
5835c6c1daeSBarry Smith 
5845c6c1daeSBarry Smith   PetscFunctionBegin;
585940d77c0SToby Isaac   if (obj) PetscValidHeader(obj,2);
586fa2bb9feSLisandro Dalcin   classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID;
587e94e781bSJacob Faibussowitsch   ierr = PetscInfoEnabled(classid, &enabled);CHKERRQ(ierr);
588e94e781bSJacob Faibussowitsch   if (!enabled) PetscFunctionReturn(0);
589e94e781bSJacob Faibussowitsch   PetscValidCharPointer(message,3);
590e94e781bSJacob Faibussowitsch   if (obj) {
591e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr);
592e94e781bSJacob Faibussowitsch     ierr = MPI_Comm_size(obj->comm, &size);CHKERRQ(ierr);
593e94e781bSJacob Faibussowitsch   }
594e94e781bSJacob Faibussowitsch   /* rank > 0 always jumps out */
5955c6c1daeSBarry Smith   if (rank) PetscFunctionReturn(0);
596e94e781bSJacob Faibussowitsch   if (!PetscInfoCommFilter && (size < 2)) {
597e94e781bSJacob Faibussowitsch     /* If no self printing is allowed, and size too small get out */
598e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
599e94e781bSJacob Faibussowitsch   } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) {
600e94e781bSJacob Faibussowitsch     /* If ONLY self printing, and size too big, get out */
601e94e781bSJacob Faibussowitsch     PetscFunctionReturn(0);
602e94e781bSJacob Faibussowitsch   }
603e94e781bSJacob Faibussowitsch   /* Mute info messages within this function */
604e94e781bSJacob Faibussowitsch   oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE;
6055c6c1daeSBarry Smith   ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr);
6065c6c1daeSBarry Smith   va_start(Argp, message);
6075c6c1daeSBarry Smith   sprintf(string, "[%d] %s(): ",urank,func);
6085c6c1daeSBarry Smith   ierr = PetscStrlen(string, &len);CHKERRQ(ierr);
609a2ea699eSBarry Smith   ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);CHKERRQ(ierr);
6105c6c1daeSBarry Smith   ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr);
6115c6c1daeSBarry Smith   err  = fflush(PetscInfoFile);
6125c6c1daeSBarry Smith   if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
6135c6c1daeSBarry Smith   if (petsc_history) {
6145c6c1daeSBarry Smith     va_start(Argp, message);
615a2ea699eSBarry Smith     ierr = (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr);
6165c6c1daeSBarry Smith   }
6175c6c1daeSBarry Smith   va_end(Argp);
618e94e781bSJacob Faibussowitsch   PetscLogPrintInfo = oldflag;
6195c6c1daeSBarry Smith   PetscFunctionReturn(0);
6205c6c1daeSBarry Smith }
621