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