15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith PetscInfo() is contained in a different file from the other profiling to
35c6c1daeSBarry Smith allow it to be replaced at link time by an alternative routine.
45c6c1daeSBarry Smith */
5af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/
65c6c1daeSBarry Smith
75c6c1daeSBarry Smith /*
8e94e781bSJacob Faibussowitsch The next set of variables determine which, if any, PetscInfo() calls are used.
9e94e781bSJacob Faibussowitsch If PetscLogPrintInfo is false, no info messages are printed.
105c6c1daeSBarry Smith
115c6c1daeSBarry Smith If PetscInfoFlags[OBJECT_CLASSID - PETSC_SMALLEST_CLASSID] is zero, no messages related
125c6c1daeSBarry Smith to that object are printed. OBJECT_CLASSID is, for example, MAT_CLASSID.
13e94e781bSJacob Faibussowitsch Note for developers: the PetscInfoFlags array is currently 160 entries large, to ensure headroom. Perhaps it is worth
14e94e781bSJacob Faibussowitsch dynamically allocating this array intelligently rather than just some big number.
15e94e781bSJacob Faibussowitsch
16e94e781bSJacob Faibussowitsch PetscInfoFilename determines where PetscInfo() output is piped.
17e94e781bSJacob Faibussowitsch PetscInfoClassnames holds a char array of classes which are filtered out/for in PetscInfo() calls.
185c6c1daeSBarry Smith */
19908793a3SLisandro Dalcin const char *const PetscInfoCommFlags[] = {"all", "no_self", "only_self", "PetscInfoCommFlag", "PETSC_INFO_COMM_", NULL};
205f115e29SVaclav Hapla static PetscBool PetscInfoClassesLocked = PETSC_FALSE, PetscInfoInvertClasses = PETSC_FALSE, PetscInfoClassesSet = PETSC_FALSE;
21e94e781bSJacob Faibussowitsch static char **PetscInfoClassnames = NULL;
22e94e781bSJacob Faibussowitsch static char *PetscInfoFilename = NULL;
23e94e781bSJacob Faibussowitsch static PetscInt PetscInfoNumClasses = -1;
24e94e781bSJacob Faibussowitsch static PetscInfoCommFlag PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
2503fb14feSMatthew G. Knepley static int PetscInfoFlags[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2603fb14feSMatthew G. Knepley 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
2703fb14feSMatthew G. Knepley 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
2855205543SJacob Faibussowitsch static char *PetscInfoNames[PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags)] = {NULL};
295f115e29SVaclav Hapla PetscBool PetscLogPrintInfo = PETSC_FALSE;
30e94e781bSJacob Faibussowitsch FILE *PetscInfoFile = NULL;
315c6c1daeSBarry Smith
32e94e781bSJacob Faibussowitsch /*@
331f089562SBarry Smith PetscInfoEnabled - Checks whether a given `PetscClassid` is allowed to print using `PetscInfo()`
34e94e781bSJacob Faibussowitsch
35e94e781bSJacob Faibussowitsch Not Collective
36e94e781bSJacob Faibussowitsch
372fe279fdSBarry Smith Input Parameter:
38811af0c4SBarry Smith . classid - `PetscClassid` retrieved from a `PetscObject` e.g. `VEC_CLASSID`
39e94e781bSJacob Faibussowitsch
40e94e781bSJacob Faibussowitsch Output Parameter:
41811af0c4SBarry Smith . enabled - `PetscBool` indicating whether this classid is allowed to print
42e94e781bSJacob Faibussowitsch
43667f096bSBarry Smith Level: advanced
44667f096bSBarry Smith
45811af0c4SBarry Smith Note:
46811af0c4SBarry Smith Use `PETSC_SMALLEST_CLASSID` to check if "sys" `PetscInfo()` calls are enabled. When PETSc is configured with debugging
47811af0c4SBarry Smith support this function checks if classid >= `PETSC_SMALLEST_CLASSID`, otherwise it assumes valid classid.
48e94e781bSJacob Faibussowitsch
491f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoGetInfo()`, `PetscObjectGetClassid()`
50e94e781bSJacob Faibussowitsch @*/
PetscInfoEnabled(PetscClassId classid,PetscBool * enabled)51d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled)
52d71ae5a4SJacob Faibussowitsch {
53e94e781bSJacob Faibussowitsch PetscFunctionBegin;
544f572ea9SToby Isaac PetscAssertPointer(enabled, 2);
5508401ef6SPierre Jolivet PetscCheck(classid >= PETSC_SMALLEST_CLASSID, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Classid (current: %d) must be equal to or greater than PETSC_SMALLEST_CLASSID", classid);
56e94e781bSJacob Faibussowitsch *enabled = (PetscBool)(PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]);
573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
58e94e781bSJacob Faibussowitsch }
59e94e781bSJacob Faibussowitsch
60e94e781bSJacob Faibussowitsch /*@
61811af0c4SBarry Smith PetscInfoAllow - Enables/disables `PetscInfo()` messages
625c6c1daeSBarry Smith
63fe9b927eSVaclav Hapla Not Collective
645c6c1daeSBarry Smith
655c6c1daeSBarry Smith Input Parameter:
66811af0c4SBarry Smith . flag - `PETSC_TRUE` or `PETSC_FALSE`
675c6c1daeSBarry Smith
685c6c1daeSBarry Smith Level: advanced
695c6c1daeSBarry Smith
701f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()`
715c6c1daeSBarry Smith @*/
PetscInfoAllow(PetscBool flag)72d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag)
73d71ae5a4SJacob Faibussowitsch {
74e94e781bSJacob Faibussowitsch PetscFunctionBegin;
75e94e781bSJacob Faibussowitsch PetscLogPrintInfo = flag;
763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
77e94e781bSJacob Faibussowitsch }
78e94e781bSJacob Faibussowitsch
79cc4c1da9SBarry Smith /*@
80811af0c4SBarry Smith PetscInfoSetFile - Sets the printing destination for all `PetscInfo()` calls
81e94e781bSJacob Faibussowitsch
82fe9b927eSVaclav Hapla Not Collective
83e94e781bSJacob Faibussowitsch
84d8d19677SJose E. Roman Input Parameters:
85a3b724e8SBarry Smith + filename - Name of the file where `PetscInfo()` will print to, use `NULL` to write to `PETSC_STDOUT`.
86667f096bSBarry Smith - mode - Write mode passed to `PetscFOpen()`
87e94e781bSJacob Faibussowitsch
88e94e781bSJacob Faibussowitsch Level: advanced
89e94e781bSJacob Faibussowitsch
901f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()`
91e94e781bSJacob Faibussowitsch @*/
PetscInfoSetFile(const char filename[],const char mode[])92d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[])
93d71ae5a4SJacob Faibussowitsch {
945c6c1daeSBarry Smith PetscFunctionBegin;
95e94e781bSJacob Faibussowitsch if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT;
969566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscInfoFilename));
97e94e781bSJacob Faibussowitsch if (filename) {
988b86dd2eSJacob Faibussowitsch PetscMPIInt rank;
998b86dd2eSJacob Faibussowitsch char fname[PETSC_MAX_PATH_LEN], tname[11];
1008b86dd2eSJacob Faibussowitsch
1014f572ea9SToby Isaac PetscAssertPointer(filename, 1);
1024f572ea9SToby Isaac PetscAssertPointer(mode, 2);
1039566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(filename, fname));
1049566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(fname, &PetscInfoFilename));
1058b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1068b86dd2eSJacob Faibussowitsch PetscCall(PetscSNPrintf(tname, PETSC_STATIC_ARRAY_LENGTH(tname), ".%d", rank));
1078b86dd2eSJacob Faibussowitsch PetscCall(PetscStrlcat(fname, tname, PETSC_STATIC_ARRAY_LENGTH(fname)));
1088b86dd2eSJacob Faibussowitsch {
1098b86dd2eSJacob Faibussowitsch const PetscBool oldflag = PetscLogPrintInfo;
1108b86dd2eSJacob Faibussowitsch
1119371c9d4SSatish Balay PetscLogPrintInfo = PETSC_FALSE;
1128b86dd2eSJacob Faibussowitsch PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, mode, &PetscInfoFile));
113e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag;
1148b86dd2eSJacob Faibussowitsch /*
1158b86dd2eSJacob Faibussowitsch PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the
1168b86dd2eSJacob Faibussowitsch PetscInfo call inside it, and call it afterwards so that it actually writes to file
1178b86dd2eSJacob Faibussowitsch */
1188b86dd2eSJacob Faibussowitsch }
1199566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname));
120e94e781bSJacob Faibussowitsch }
1213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
122e94e781bSJacob Faibussowitsch }
123a297a907SKarl Rupp
124e94e781bSJacob Faibussowitsch /*@C
125aa76f320SBarry Smith PetscInfoGetFile - Gets the `filename` and `FILE` pointer of the file where `PetscInfo()` prints to
126e94e781bSJacob Faibussowitsch
127cf53795eSBarry Smith Not Collective; No Fortran Support
128e94e781bSJacob Faibussowitsch
129e94e781bSJacob Faibussowitsch Output Parameters:
130e94e781bSJacob Faibussowitsch + filename - The name of the output file
131667f096bSBarry Smith - InfoFile - The `FILE` pointer for the output file
132e94e781bSJacob Faibussowitsch
133e94e781bSJacob Faibussowitsch Level: advanced
134e94e781bSJacob Faibussowitsch
135e94e781bSJacob Faibussowitsch Note:
136667f096bSBarry Smith This routine allocates and copies the `filename` so that the `filename` survives `PetscInfoDestroy()`. The user is
137a3b724e8SBarry Smith therefore responsible for freeing the allocated `filename` pointer with `PetscFree()`
138e94e781bSJacob Faibussowitsch
1391f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()`
140e94e781bSJacob Faibussowitsch @*/
PetscInfoGetFile(char * filename[],FILE ** InfoFile)141cc4c1da9SBarry Smith PetscErrorCode PetscInfoGetFile(char *filename[], FILE **InfoFile)
142d71ae5a4SJacob Faibussowitsch {
143e94e781bSJacob Faibussowitsch PetscFunctionBegin;
1444f572ea9SToby Isaac PetscAssertPointer(filename, 1);
1454f572ea9SToby Isaac PetscAssertPointer(InfoFile, 2);
1469566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(PetscInfoFilename, filename));
147e94e781bSJacob Faibussowitsch *InfoFile = PetscInfoFile;
1483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
149e94e781bSJacob Faibussowitsch }
150e94e781bSJacob Faibussowitsch
151e94e781bSJacob Faibussowitsch /*@C
152811af0c4SBarry Smith PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against
153e94e781bSJacob Faibussowitsch
154667f096bSBarry Smith Not Collective; No Fortran Support
155e94e781bSJacob Faibussowitsch
156e94e781bSJacob Faibussowitsch Input Parameters:
157811af0c4SBarry Smith + exclude - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that
158e94e781bSJacob Faibussowitsch is NOT one of the classes specified
159667f096bSBarry Smith . n - Number of classes to filter for (size of `classnames`)
160e94e781bSJacob Faibussowitsch - classnames - String array containing the names of classes to filter for, e.g. "vec"
161e94e781bSJacob Faibussowitsch
162667f096bSBarry Smith Level: developer
163667f096bSBarry Smith
164e94e781bSJacob Faibussowitsch Notes:
165d7ceb5a2SJacob Faibussowitsch This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called, unless the user calls `PetscInfoDestroy()` first.
166e94e781bSJacob Faibussowitsch
167667f096bSBarry Smith Names in the `classnames` list should correspond to the names returned by `PetscObjectGetClassName()`.
168e94e781bSJacob Faibussowitsch
169e94e781bSJacob Faibussowitsch This function only sets the list of class names.
170811af0c4SBarry Smith The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away.
171e94e781bSJacob Faibussowitsch The reason for this is that we need to set the list of included/excluded classes before their classids are known.
172811af0c4SBarry Smith Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`).
173811af0c4SBarry Smith
1741f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()`
175e94e781bSJacob Faibussowitsch @*/
PetscInfoSetClasses(PetscBool exclude,PetscInt n,const char * const * classnames)176d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames)
177d71ae5a4SJacob Faibussowitsch {
178e94e781bSJacob Faibussowitsch PetscFunctionBegin;
179d7ceb5a2SJacob Faibussowitsch PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "Trying to modify PetscInfo() configuration after it has been locked to a read-only state. Usually, this is an *error*! To re-enable modification, you must reset PetscInfo() by calling PetscInfoDestroy() first");
1809566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
1818b86dd2eSJacob Faibussowitsch PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames));
1828b86dd2eSJacob Faibussowitsch PetscInfoNumClasses = n;
183e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = exclude;
184e94e781bSJacob Faibussowitsch /* Process sys class right away */
1858b86dd2eSJacob Faibussowitsch {
1868b86dd2eSJacob Faibussowitsch const PetscClassId id = PETSC_SMALLEST_CLASSID;
1878b86dd2eSJacob Faibussowitsch
1888b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &id));
189e94e781bSJacob Faibussowitsch }
1905f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE;
1913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
192e94e781bSJacob Faibussowitsch }
193e94e781bSJacob Faibussowitsch
194cc4c1da9SBarry Smith /*@
195667f096bSBarry Smith PetscInfoGetClass - Indicates whether the provided `classname` is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()`
196e94e781bSJacob Faibussowitsch
197e94e781bSJacob Faibussowitsch Not Collective
198e94e781bSJacob Faibussowitsch
19901d2d390SJose E. Roman Input Parameter:
200e94e781bSJacob Faibussowitsch . classname - Name of the class to search for
201e94e781bSJacob Faibussowitsch
202e94e781bSJacob Faibussowitsch Output Parameter:
203811af0c4SBarry Smith . found - `PetscBool` indicating whether the classname was found
204e94e781bSJacob Faibussowitsch
205667f096bSBarry Smith Level: developer
206667f096bSBarry Smith
207811af0c4SBarry Smith Note:
208811af0c4SBarry Smith Use `PetscObjectGetName()` to retrieve an appropriate classname
209e94e781bSJacob Faibussowitsch
2101f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()`
211e94e781bSJacob Faibussowitsch @*/
PetscInfoGetClass(const char classname[],PetscBool * found)212cc4c1da9SBarry Smith PetscErrorCode PetscInfoGetClass(const char classname[], PetscBool *found)
213d71ae5a4SJacob Faibussowitsch {
2148b86dd2eSJacob Faibussowitsch PetscInt unused;
215e94e781bSJacob Faibussowitsch
216e94e781bSJacob Faibussowitsch PetscFunctionBegin;
2174f572ea9SToby Isaac PetscAssertPointer(classname, 1);
2184f572ea9SToby Isaac PetscAssertPointer(found, 2);
2198b86dd2eSJacob Faibussowitsch PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found));
2205f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_TRUE;
2213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
222e94e781bSJacob Faibussowitsch }
223e94e781bSJacob Faibussowitsch
224e94e781bSJacob Faibussowitsch /*@
2251f089562SBarry Smith PetscInfoGetInfo - Returns the current state of several flags for `PetscInfo()`
226e94e781bSJacob Faibussowitsch
227e94e781bSJacob Faibussowitsch Not Collective
228e94e781bSJacob Faibussowitsch
229e94e781bSJacob Faibussowitsch Output Parameters:
230811af0c4SBarry Smith + infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called
231811af0c4SBarry Smith . classesSet - `PETSC_TRUE` if the list of classes to filter for has been set
232811af0c4SBarry Smith . exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted
233811af0c4SBarry Smith . locked - `PETSC_TRUE` if the list of classes to filter for has been locked
234811af0c4SBarry Smith - commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all
235e94e781bSJacob Faibussowitsch communicators
236e94e781bSJacob Faibussowitsch
237667f096bSBarry Smith Level: developer
238667f096bSBarry Smith
239811af0c4SBarry Smith Note:
240811af0c4SBarry Smith Initially commSelfFlag = `PETSC_INFO_COMM_ALL`
241e94e781bSJacob Faibussowitsch
2421f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()`
243e94e781bSJacob Faibussowitsch @*/
PetscInfoGetInfo(PetscBool * infoEnabled,PetscBool * classesSet,PetscBool * exclude,PetscBool * locked,PetscInfoCommFlag * commSelfFlag)244d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag)
245d71ae5a4SJacob Faibussowitsch {
246e94e781bSJacob Faibussowitsch PetscFunctionBegin;
2474f572ea9SToby Isaac if (infoEnabled) PetscAssertPointer(infoEnabled, 1);
2484f572ea9SToby Isaac if (classesSet) PetscAssertPointer(classesSet, 2);
2494f572ea9SToby Isaac if (exclude) PetscAssertPointer(exclude, 3);
2504f572ea9SToby Isaac if (locked) PetscAssertPointer(locked, 4);
2514f572ea9SToby Isaac if (commSelfFlag) PetscAssertPointer(commSelfFlag, 5);
252e94e781bSJacob Faibussowitsch if (infoEnabled) *infoEnabled = PetscLogPrintInfo;
2535f115e29SVaclav Hapla if (classesSet) *classesSet = PetscInfoClassesSet;
254e94e781bSJacob Faibussowitsch if (exclude) *exclude = PetscInfoInvertClasses;
2555f115e29SVaclav Hapla if (locked) *locked = PetscInfoClassesLocked;
256e94e781bSJacob Faibussowitsch if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter;
2573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
258e94e781bSJacob Faibussowitsch }
259e94e781bSJacob Faibussowitsch
260cc4c1da9SBarry Smith /*@
261811af0c4SBarry Smith PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()`
262e94e781bSJacob Faibussowitsch
263e94e781bSJacob Faibussowitsch Not Collective
264e94e781bSJacob Faibussowitsch
265e94e781bSJacob Faibussowitsch Input Parameters:
266811af0c4SBarry Smith + classname - Name of the class to activate/deactivate `PetscInfo()` for
267667f096bSBarry Smith . numClassID - Number of entries in `classIDs`
268667f096bSBarry Smith - classIDs - Array containing all of the `PetscClassId`s associated with `classname`
269e94e781bSJacob Faibussowitsch
270aa76f320SBarry Smith Options Database Key:
271aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, see `PetscInfo()`.
272aa76f320SBarry Smith
273e94e781bSJacob Faibussowitsch Level: developer
274e94e781bSJacob Faibussowitsch
2751f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()`
276e94e781bSJacob Faibussowitsch @*/
PetscInfoProcessClass(const char classname[],PetscInt numClassID,const PetscClassId classIDs[])277d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[])
278d71ae5a4SJacob Faibussowitsch {
2798b86dd2eSJacob Faibussowitsch PetscBool enabled, exclude, found, opt;
280e94e781bSJacob Faibussowitsch char logList[256];
281e94e781bSJacob Faibussowitsch
282e94e781bSJacob Faibussowitsch PetscFunctionBegin;
2834f572ea9SToby Isaac PetscAssertPointer(classname, 1);
2848b86dd2eSJacob Faibussowitsch PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID);
2854f572ea9SToby Isaac if (numClassID) PetscAssertPointer(classIDs, 3);
2869566063dSJacob Faibussowitsch PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL));
287aa76f320SBarry Smith PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use ~ with -info to indicate classes to exclude"));
2889566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt));
289e94e781bSJacob Faibussowitsch if (opt) {
2908b86dd2eSJacob Faibussowitsch PetscBool pkg;
2918b86dd2eSJacob Faibussowitsch
2929566063dSJacob Faibussowitsch PetscCall(PetscStrInList(classname, logList, ',', &pkg));
293e94e781bSJacob Faibussowitsch if (pkg) {
2948b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
295e94e781bSJacob Faibussowitsch }
296e94e781bSJacob Faibussowitsch }
297*835f2295SStefano Zampini PetscCheck(PETSC_LARGEST_CLASSID - PETSC_SMALLEST_CLASSID < (PetscInt)PETSC_STATIC_ARRAY_LENGTH(PetscInfoNames), PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscInfoNames array is too small for %s, need %d not %d", classname, PETSC_LARGEST_CLASSID - PETSC_SMALLEST_CLASSID + 1, (int)PETSC_STATIC_ARRAY_LENGTH(PetscInfoNames));
29855205543SJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) {
29955205543SJacob Faibussowitsch const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID;
30055205543SJacob Faibussowitsch
30155205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[idx]));
30255205543SJacob Faibussowitsch PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx));
30355205543SJacob Faibussowitsch }
3049566063dSJacob Faibussowitsch PetscCall(PetscInfoGetClass(classname, &found));
305e94e781bSJacob Faibussowitsch if ((found && exclude) || (!found && !exclude)) {
306e94e781bSJacob Faibussowitsch if (PetscInfoNumClasses > 0) {
307e94e781bSJacob Faibussowitsch /* Check if -info was called empty */
3088b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i]));
309e94e781bSJacob Faibussowitsch }
310e94e781bSJacob Faibussowitsch } else {
3118b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i]));
312e94e781bSJacob Faibussowitsch }
3133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
314e94e781bSJacob Faibussowitsch }
315e94e781bSJacob Faibussowitsch
316e94e781bSJacob Faibussowitsch /*@
317811af0c4SBarry Smith PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()`
318e94e781bSJacob Faibussowitsch
319e94e781bSJacob Faibussowitsch Not Collective
320e94e781bSJacob Faibussowitsch
321e94e781bSJacob Faibussowitsch Input Parameter:
322811af0c4SBarry Smith . commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()`
323e94e781bSJacob Faibussowitsch
324aa76f320SBarry Smith Options Database Key:
325aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
326aa76f320SBarry Smith
327fe9b927eSVaclav Hapla Level: advanced
328e94e781bSJacob Faibussowitsch
3291f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetInfo()`
330e94e781bSJacob Faibussowitsch @*/
PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)331d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag)
332d71ae5a4SJacob Faibussowitsch {
333e94e781bSJacob Faibussowitsch PetscFunctionBegin;
334e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag;
3353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
336e94e781bSJacob Faibussowitsch }
337e94e781bSJacob Faibussowitsch
338e94e781bSJacob Faibussowitsch /*@
339811af0c4SBarry Smith PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()`
340e94e781bSJacob Faibussowitsch
341e94e781bSJacob Faibussowitsch Not Collective
342e94e781bSJacob Faibussowitsch
343e94e781bSJacob Faibussowitsch Input Parameter:
344667f096bSBarry Smith . options - Options database, use `NULL` for default global database
345e94e781bSJacob Faibussowitsch
346667f096bSBarry Smith Options Database Key:
347aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
348e94e781bSJacob Faibussowitsch
349667f096bSBarry Smith Level: advanced
350667f096bSBarry Smith
351811af0c4SBarry Smith Note:
352811af0c4SBarry Smith This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves.
353e94e781bSJacob Faibussowitsch
3541f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`
355e94e781bSJacob Faibussowitsch @*/
PetscInfoSetFromOptions(PetscOptions options)356d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options)
357d71ae5a4SJacob Faibussowitsch {
3588b86dd2eSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN];
3598b86dd2eSJacob Faibussowitsch PetscBool set;
360e94e781bSJacob Faibussowitsch
361e94e781bSJacob Faibussowitsch PetscFunctionBegin;
3628b86dd2eSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set));
363e94e781bSJacob Faibussowitsch if (set) {
3648b86dd2eSJacob Faibussowitsch size_t size_loc0_, size_loc1_, size_loc2_;
3658b86dd2eSJacob Faibussowitsch char *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL;
3668b86dd2eSJacob Faibussowitsch char **loc1_array = NULL;
3678b86dd2eSJacob Faibussowitsch PetscBool loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE;
3688b86dd2eSJacob Faibussowitsch int nLoc1_ = 0;
3698b86dd2eSJacob Faibussowitsch PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL;
3708b86dd2eSJacob Faibussowitsch
3715f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE;
3729566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE));
3739566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(optstring, &loc0_));
3749566063dSJacob Faibussowitsch PetscCall(PetscStrchr(loc0_, ':', &loc1_));
375e94e781bSJacob Faibussowitsch if (loc1_) {
376ebd100edSVaclav Hapla *loc1_++ = 0;
377e94e781bSJacob Faibussowitsch if (*loc1_ == '~') {
378e94e781bSJacob Faibussowitsch loc1_invert = PETSC_TRUE;
379e94e781bSJacob Faibussowitsch ++loc1_;
380e94e781bSJacob Faibussowitsch }
3819566063dSJacob Faibussowitsch PetscCall(PetscStrchr(loc1_, ':', &loc2_));
382e94e781bSJacob Faibussowitsch }
383e94e781bSJacob Faibussowitsch if (loc2_) {
384ebd100edSVaclav Hapla *loc2_++ = 0;
385e94e781bSJacob Faibussowitsch if (*loc2_ == '~') {
386e94e781bSJacob Faibussowitsch loc2_invert = PETSC_TRUE;
387e94e781bSJacob Faibussowitsch ++loc2_;
388e94e781bSJacob Faibussowitsch }
389e94e781bSJacob Faibussowitsch }
3909566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc0_, &size_loc0_));
3919566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc1_, &size_loc1_));
3929566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc2_, &size_loc2_));
393e94e781bSJacob Faibussowitsch if (size_loc1_) {
3949566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(loc1_));
3959566063dSJacob Faibussowitsch PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array));
396e94e781bSJacob Faibussowitsch }
397e94e781bSJacob Faibussowitsch if (size_loc2_) {
3988b86dd2eSJacob Faibussowitsch PetscBool foundSelf;
3998b86dd2eSJacob Faibussowitsch
4009566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(loc2_));
4019566063dSJacob Faibussowitsch PetscCall(PetscStrcmp("self", loc2_, &foundSelf));
4028b86dd2eSJacob Faibussowitsch if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF;
403e94e781bSJacob Faibussowitsch }
4049566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w"));
405*835f2295SStefano Zampini PetscCall(PetscInfoSetClasses(loc1_invert, nLoc1_, (const char *const *)loc1_array));
4069566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag));
4079566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array));
4089566063dSJacob Faibussowitsch PetscCall(PetscFree(loc0_));
409e94e781bSJacob Faibussowitsch }
4103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
411e94e781bSJacob Faibussowitsch }
412e94e781bSJacob Faibussowitsch
413e94e781bSJacob Faibussowitsch /*@
414811af0c4SBarry Smith PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures.
415e94e781bSJacob Faibussowitsch
416e94e781bSJacob Faibussowitsch Not Collective
417e94e781bSJacob Faibussowitsch
418667f096bSBarry Smith Level: developer
419667f096bSBarry Smith
420d7ceb5a2SJacob Faibussowitsch Notes:
421811af0c4SBarry Smith This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent
422811af0c4SBarry Smith `PetscInfo()` calls down the line.
423e94e781bSJacob Faibussowitsch
424d7ceb5a2SJacob Faibussowitsch Users calling this routine midway through a program should note that `PetscInfoDestroy()`
425d7ceb5a2SJacob Faibussowitsch constitutes a full reset of `PetscInfo()`. It flushes, then closes, the current info file,
426d7ceb5a2SJacob Faibussowitsch re-enables all classes, and resets all internal state. Finally -- and perhaps crucially -- it
427d7ceb5a2SJacob Faibussowitsch disables `PetscInfo()` as-if-by `PetscInfoAllow(PETSC_FALSE)`.
428d7ceb5a2SJacob Faibussowitsch
4291f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetFromOptions()`
430e94e781bSJacob Faibussowitsch @*/
PetscInfoDestroy(void)431d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void)
432d71ae5a4SJacob Faibussowitsch {
433e94e781bSJacob Faibussowitsch PetscFunctionBegin;
4349566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_FALSE));
4359566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames));
436d7ceb5a2SJacob Faibussowitsch if (PetscInfoFile) PetscCall(PetscFFlush(PetscInfoFile));
437d7ceb5a2SJacob Faibussowitsch if (PetscInfoFilename) {
438d7ceb5a2SJacob Faibussowitsch PetscAssert(PetscInfoFile, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Have non-null PetscInfo file '%s', but corresponding FILE handle is null!", PetscInfoFilename);
4399566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscInfoFilename));
440d7ceb5a2SJacob Faibussowitsch PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile));
441d7ceb5a2SJacob Faibussowitsch }
44255205543SJacob Faibussowitsch PetscAssert(PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags) == PETSC_STATIC_ARRAY_LENGTH(PetscInfoNames), PETSC_COMM_SELF, PETSC_ERR_PLIB, "PetscInfoFlags and PetscInfoNames must be the same size");
44355205543SJacob Faibussowitsch for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) {
44455205543SJacob Faibussowitsch PetscInfoFlags[i] = 1;
44555205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[i]));
44655205543SJacob Faibussowitsch }
44755205543SJacob Faibussowitsch
448d7ceb5a2SJacob Faibussowitsch PetscInfoFile = NULL;
4495f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_FALSE;
450e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE;
4515f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_FALSE;
452e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1;
453e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL;
4543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4555c6c1daeSBarry Smith }
4565c6c1daeSBarry Smith
PetscInfoSetClassActivation_Private(PetscClassId classid,int value)457d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value)
458d71ae5a4SJacob Faibussowitsch {
4598b86dd2eSJacob Faibussowitsch PetscFunctionBegin;
4608b86dd2eSJacob Faibussowitsch if (!classid) classid = PETSC_SMALLEST_CLASSID;
4618b86dd2eSJacob Faibussowitsch PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value;
4623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4638b86dd2eSJacob Faibussowitsch }
4648b86dd2eSJacob Faibussowitsch
4655c6c1daeSBarry Smith /*@
466811af0c4SBarry Smith PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class.
4675c6c1daeSBarry Smith
4685c6c1daeSBarry Smith Not Collective
4695c6c1daeSBarry Smith
4705c6c1daeSBarry Smith Input Parameter:
471811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4725c6c1daeSBarry Smith
473aa76f320SBarry Smith Options Database Key:
474aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
475aa76f320SBarry Smith
476667f096bSBarry Smith Level: developer
477667f096bSBarry Smith
478811af0c4SBarry Smith Note:
4795c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object.
4805c6c1daeSBarry Smith
4811f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
4825c6c1daeSBarry Smith @*/
PetscInfoDeactivateClass(PetscClassId classid)483d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid)
484d71ae5a4SJacob Faibussowitsch {
4855c6c1daeSBarry Smith PetscFunctionBegin;
4868b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 0));
4873ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
4885c6c1daeSBarry Smith }
4895c6c1daeSBarry Smith
4905c6c1daeSBarry Smith /*@
491811af0c4SBarry Smith PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class.
4925c6c1daeSBarry Smith
4935c6c1daeSBarry Smith Not Collective
4945c6c1daeSBarry Smith
4955c6c1daeSBarry Smith Input Parameter:
496811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc.
4975c6c1daeSBarry Smith
498aa76f320SBarry Smith Options Database Key:
499aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`.
500aa76f320SBarry Smith
501667f096bSBarry Smith Level: developer
502667f096bSBarry Smith
503811af0c4SBarry Smith Note:
5045c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object.
5055c6c1daeSBarry Smith
5061f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()`
5075c6c1daeSBarry Smith @*/
PetscInfoActivateClass(PetscClassId classid)508d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid)
509d71ae5a4SJacob Faibussowitsch {
5105c6c1daeSBarry Smith PetscFunctionBegin;
5118b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 1));
5123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
5135c6c1daeSBarry Smith }
5145c6c1daeSBarry Smith
5155c6c1daeSBarry Smith /*
5165c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo()
5175c6c1daeSBarry Smith messages are also printed to the history file, called by default
5185c6c1daeSBarry Smith .petschistory in ones home directory.
5195c6c1daeSBarry Smith */
52095c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history;
5218c509928SStefano Zampini PETSC_INTERN PetscErrorCode PetscVFPrintf_Internal(FILE *, const char[], ...);
5225c6c1daeSBarry Smith
5235c6c1daeSBarry Smith /*MC
524e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data
5255c6c1daeSBarry Smith
5265c6c1daeSBarry Smith Synopsis:
52710450e9eSJacob Faibussowitsch #include <petsclog.h>
52810450e9eSJacob Faibussowitsch PetscErrorCode PetscInfo(PetscObject obj, const char message[], ...)
5295c6c1daeSBarry Smith
530c3339decSBarry Smith Collective
5315c6c1daeSBarry Smith
532d8d19677SJose E. Roman Input Parameters:
533cd05f99aSJacob Faibussowitsch + obj - object most closely associated with the logging statement or `NULL`
53410450e9eSJacob Faibussowitsch - message - logging message using standard "printf" format
535e94e781bSJacob Faibussowitsch
536aa76f320SBarry Smith Options Database Key:
5371f089562SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed
538aa76f320SBarry Smith
539667f096bSBarry Smith Level: intermediate
540667f096bSBarry Smith
541e94e781bSJacob Faibussowitsch Notes:
5421f089562SBarry Smith `PetscInfo()` prints only from the first processor in the communicator of `obj`.
5431f089562SBarry Smith If `obj` is `NULL`, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message.
544fe9b927eSVaclav Hapla
5451f089562SBarry Smith The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. `vec,mat,ksp`.
546fe9b927eSVaclav Hapla If this list is not specified, all classes are enabled.
547fe9b927eSVaclav Hapla Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled.
5481f089562SBarry Smith A special classname `sys` relates to `PetscInfo()` with `obj` being `NULL`.
549fe9b927eSVaclav Hapla
550aa76f320SBarry Smith The optional keyword `self` specifies that `PetscInfo()` is enabled only for a communicator size of 1 (e.g. `PETSC_COMM_SELF`).
551aa76f320SBarry Smith 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.
552fe9b927eSVaclav Hapla
553fe9b927eSVaclav Hapla All classname/self matching is case insensitive. Filename is case sensitive.
554fe9b927eSVaclav Hapla
555fe9b927eSVaclav Hapla Example of Usage:
556667f096bSBarry Smith .vb
557667f096bSBarry Smith Mat A;
558667f096bSBarry Smith PetscInt alpha;
559667f096bSBarry Smith ...
560667f096bSBarry Smith PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha);
561667f096bSBarry Smith .ve
562fe9b927eSVaclav Hapla
563aec76313SJacob Faibussowitsch Examples using Options:
564fe9b927eSVaclav Hapla Each call of the form
565667f096bSBarry Smith .vb
566667f096bSBarry Smith PetscInfo(obj, msg);
567667f096bSBarry Smith PetscInfo(obj, msg, arg1);
568667f096bSBarry Smith PetscInfo(obj, msg, arg1, arg2);
569667f096bSBarry Smith .ve
570fe9b927eSVaclav Hapla is evaluated as follows.
571667f096bSBarry Smith .vb
5721f089562SBarry Smith -info or -info :: prints `msg` to `PETSC_STDOUT`, for any PETSc `obj` regardless class or communicator
5731f089562SBarry Smith -info :mat:self prints `msg` to `PETSC_STDOUT` only if class of `obj` is `Mat`, and its communicator has size = 1
5741f089562SBarry Smith -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
5751f089562SBarry Smith -info :sys prints to `PETSC_STDOUT` only if `obj` is `NULL`
5761f089562SBarry Smith -info :sys:~self deactivates all info messages because `sys` means `obj` = `NULL` which implies `PETSC_COMM_SELF` but `~self` filters out everything on `PETSC_COMM_SELF`.
577667f096bSBarry Smith .ve
578aec76313SJacob Faibussowitsch
579aec76313SJacob Faibussowitsch Fortran Notes:
580aa76f320SBarry Smith This function does not take the `obj` argument, there is only the `PetscInfo()`
581811af0c4SBarry Smith version, not `PetscInfo()` etc.
5825c6c1daeSBarry Smith
5831f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoAllow()`, `PetscInfoSetFromOptions()`, `PetscInfoEnabled()`, `PetscInfoSetFile()`, `PetscInfoGetFile()`, `PetscInfoSetClasses()`,
5841f089562SBarry Smith `PetscInfoGetClass()`, `PetscInfoGetInfo()`, `PetscInfoProcessClass()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`, `PetscInfoDeactivateClass()`,
5851f089562SBarry Smith `PetscInfoActivateClass()`
5865c6c1daeSBarry Smith M*/
PetscInfo_Private(const char func[],PetscObject obj,const char message[],...)587d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...)
588d71ae5a4SJacob Faibussowitsch {
5898b86dd2eSJacob Faibussowitsch PetscClassId classid = PETSC_SMALLEST_CLASSID;
5908b86dd2eSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE;
591f8fe7dbcSStefano Zampini MPI_Comm comm = MPI_COMM_NULL;
592f8fe7dbcSStefano Zampini PetscMPIInt rank = 0;
593b5d96b8dSStefano Zampini const char *otype = NULL;
5945c6c1daeSBarry Smith
5955c6c1daeSBarry Smith PetscFunctionBegin;
5968b86dd2eSJacob Faibussowitsch if (obj) {
5978b86dd2eSJacob Faibussowitsch PetscValidHeader(obj, 2);
5988b86dd2eSJacob Faibussowitsch classid = obj->classid;
5998b86dd2eSJacob Faibussowitsch }
6004f572ea9SToby Isaac PetscAssertPointer(message, 3);
6019566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(classid, &enabled));
6023ba16761SJacob Faibussowitsch if (!enabled) PetscFunctionReturn(PETSC_SUCCESS);
603b5d96b8dSStefano Zampini if (obj) {
604b5d96b8dSStefano Zampini PetscCall(PetscObjectGetComm(obj, &comm));
605b5d96b8dSStefano Zampini PetscCall(PetscObjectGetType(obj, &otype));
6068b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank));
607f8fe7dbcSStefano Zampini }
608e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */
6093ba16761SJacob Faibussowitsch if (rank) PetscFunctionReturn(PETSC_SUCCESS);
6108b86dd2eSJacob Faibussowitsch else {
611f8fe7dbcSStefano Zampini PetscMPIInt size = 1;
6128b86dd2eSJacob Faibussowitsch
613f8fe7dbcSStefano Zampini if (comm != MPI_COMM_NULL) PetscCallMPI(MPI_Comm_size(comm, &size));
6148b86dd2eSJacob Faibussowitsch /* If no self printing is allowed, and size too small, get out */
6153ba16761SJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(PETSC_SUCCESS);
616e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */
6173ba16761SJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(PETSC_SUCCESS);
618e94e781bSJacob Faibussowitsch }
619e94e781bSJacob Faibussowitsch /* Mute info messages within this function */
6208b86dd2eSJacob Faibussowitsch {
6218b86dd2eSJacob Faibussowitsch const PetscBool oldflag = PetscLogPrintInfo;
6228b86dd2eSJacob Faibussowitsch va_list Argp;
6238b86dd2eSJacob Faibussowitsch PetscMPIInt urank;
6248b86dd2eSJacob Faibussowitsch char string[8 * 1024];
6258b86dd2eSJacob Faibussowitsch size_t fullLength, len;
6268b86dd2eSJacob Faibussowitsch
6279371c9d4SSatish Balay PetscLogPrintInfo = PETSC_FALSE;
6289566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank));
629b5d96b8dSStefano Zampini if (otype) {
630b5d96b8dSStefano Zampini PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s:%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], otype, func));
631b5d96b8dSStefano Zampini } else {
63255205543SJacob Faibussowitsch PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func));
633b5d96b8dSStefano Zampini }
6349566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string, &len));
635eae3dc7dSJacob Faibussowitsch va_start(Argp, message);
6369566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp));
637eae3dc7dSJacob Faibussowitsch va_end(Argp);
6388c509928SStefano Zampini PetscCall(PetscVFPrintf_Internal(PetscInfoFile, "%s", string));
639c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(PetscInfoFile));
6405c6c1daeSBarry Smith if (petsc_history) {
6415c6c1daeSBarry Smith va_start(Argp, message);
6429566063dSJacob Faibussowitsch PetscCall((*PetscVFPrintf)(petsc_history, message, Argp));
6435c6c1daeSBarry Smith va_end(Argp);
644eae3dc7dSJacob Faibussowitsch }
645e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag;
6468b86dd2eSJacob Faibussowitsch }
6473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
6485c6c1daeSBarry Smith }
649