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; 259371c9d4SSatish Balay 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, 269371c9d4SSatish Balay 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, 279371c9d4SSatish Balay 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 /*@ 33811af0c4SBarry Smith PetscInfoEnabled - Checks whether a given OBJECT_CLASSID is allowed to print using `PetscInfo()` 34e94e781bSJacob Faibussowitsch 35e94e781bSJacob Faibussowitsch Not Collective 36e94e781bSJacob Faibussowitsch 37e94e781bSJacob Faibussowitsch Input Parameters: 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 43811af0c4SBarry Smith Note: 44811af0c4SBarry Smith Use `PETSC_SMALLEST_CLASSID` to check if "sys" `PetscInfo()` calls are enabled. When PETSc is configured with debugging 45811af0c4SBarry Smith support this function checks if classid >= `PETSC_SMALLEST_CLASSID`, otherwise it assumes valid classid. 46e94e781bSJacob Faibussowitsch 47fe9b927eSVaclav Hapla Level: advanced 48e94e781bSJacob Faibussowitsch 49db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoGetInfo()`, `PetscObjectGetClassid()` 50e94e781bSJacob Faibussowitsch @*/ 51d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled) 52d71ae5a4SJacob Faibussowitsch { 53e94e781bSJacob Faibussowitsch PetscFunctionBegin; 548b86dd2eSJacob Faibussowitsch PetscValidBoolPointer(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]); 57e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 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 70db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()` 715c6c1daeSBarry Smith @*/ 72d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag) 73d71ae5a4SJacob Faibussowitsch { 74e94e781bSJacob Faibussowitsch PetscFunctionBegin; 75e94e781bSJacob Faibussowitsch PetscLogPrintInfo = flag; 76e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 77e94e781bSJacob Faibussowitsch } 78e94e781bSJacob Faibussowitsch 79e94e781bSJacob Faibussowitsch /*@C 80811af0c4SBarry Smith PetscInfoSetFile - Sets the printing destination for all `PetscInfo()` calls 81e94e781bSJacob Faibussowitsch 82fe9b927eSVaclav Hapla Not Collective 83e94e781bSJacob Faibussowitsch 84d8d19677SJose E. Roman Input Parameters: 85811af0c4SBarry Smith + filename - Name of the file where `PetscInfo()` will print to 86811af0c4SBarry Smith - mode - Write mode passed to PetscFOpen()` 87e94e781bSJacob Faibussowitsch 88811af0c4SBarry Smith Note: 89811af0c4SBarry Smith Use filename = NULL to set `PetscInfo()` to write to `PETSC_STDOUT`. 90e94e781bSJacob Faibussowitsch 91e94e781bSJacob Faibussowitsch Level: advanced 92e94e781bSJacob Faibussowitsch 93db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscFOpen()` 94e94e781bSJacob Faibussowitsch @*/ 95d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[]) 96d71ae5a4SJacob Faibussowitsch { 975c6c1daeSBarry Smith PetscFunctionBegin; 98e94e781bSJacob Faibussowitsch if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT; 999566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscInfoFilename)); 100e94e781bSJacob Faibussowitsch if (filename) { 1018b86dd2eSJacob Faibussowitsch PetscMPIInt rank; 1028b86dd2eSJacob Faibussowitsch char fname[PETSC_MAX_PATH_LEN], tname[11]; 1038b86dd2eSJacob Faibussowitsch 104e94e781bSJacob Faibussowitsch PetscValidCharPointer(filename, 1); 1058b86dd2eSJacob Faibussowitsch PetscValidCharPointer(mode, 2); 1069566063dSJacob Faibussowitsch PetscCall(PetscFixFilename(filename, fname)); 1079566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(fname, &PetscInfoFilename)); 1088b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); 1098b86dd2eSJacob Faibussowitsch PetscCall(PetscSNPrintf(tname, PETSC_STATIC_ARRAY_LENGTH(tname), ".%d", rank)); 1108b86dd2eSJacob Faibussowitsch PetscCall(PetscStrlcat(fname, tname, PETSC_STATIC_ARRAY_LENGTH(fname))); 1118b86dd2eSJacob Faibussowitsch { 1128b86dd2eSJacob Faibussowitsch const PetscBool oldflag = PetscLogPrintInfo; 1138b86dd2eSJacob Faibussowitsch 1149371c9d4SSatish Balay PetscLogPrintInfo = PETSC_FALSE; 1158b86dd2eSJacob Faibussowitsch PetscCall(PetscFOpen(PETSC_COMM_SELF, fname, mode, &PetscInfoFile)); 116e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 1178b86dd2eSJacob Faibussowitsch /* 1188b86dd2eSJacob Faibussowitsch PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the 1198b86dd2eSJacob Faibussowitsch PetscInfo call inside it, and call it afterwards so that it actually writes to file 1208b86dd2eSJacob Faibussowitsch */ 1218b86dd2eSJacob Faibussowitsch } 1229566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Opened PetscInfo file %s\n", fname)); 123e94e781bSJacob Faibussowitsch } 124e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 125e94e781bSJacob Faibussowitsch } 126a297a907SKarl Rupp 127e94e781bSJacob Faibussowitsch /*@C 128811af0c4SBarry Smith PetscInfoGetFile - Gets the name and FILE pointer of the file where `PetscInfo()` prints to 129e94e781bSJacob Faibussowitsch 130*cf53795eSBarry Smith Not Collective; No Fortran Support 131e94e781bSJacob Faibussowitsch 132e94e781bSJacob Faibussowitsch Output Parameters: 133e94e781bSJacob Faibussowitsch + filename - The name of the output file 134e94e781bSJacob Faibussowitsch - InfoFile - The FILE pointer for the output file 135e94e781bSJacob Faibussowitsch 136e94e781bSJacob Faibussowitsch Level: advanced 137e94e781bSJacob Faibussowitsch 138e94e781bSJacob Faibussowitsch Note: 139811af0c4SBarry Smith This routine allocates and copies the filename so that the filename survives `PetscInfoDestroy()`. The user is 140e94e781bSJacob Faibussowitsch therefore responsible for freeing the allocated filename pointer afterwards. 141e94e781bSJacob Faibussowitsch 142db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()` 143e94e781bSJacob Faibussowitsch @*/ 144d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) 145d71ae5a4SJacob Faibussowitsch { 146e94e781bSJacob Faibussowitsch PetscFunctionBegin; 147e94e781bSJacob Faibussowitsch PetscValidPointer(filename, 1); 148e94e781bSJacob Faibussowitsch PetscValidPointer(InfoFile, 2); 1499566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(PetscInfoFilename, filename)); 150e94e781bSJacob Faibussowitsch *InfoFile = PetscInfoFile; 151e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 152e94e781bSJacob Faibussowitsch } 153e94e781bSJacob Faibussowitsch 154e94e781bSJacob Faibussowitsch /*@C 155811af0c4SBarry Smith PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against 156e94e781bSJacob Faibussowitsch 157e94e781bSJacob Faibussowitsch Not Collective 158e94e781bSJacob Faibussowitsch 159e94e781bSJacob Faibussowitsch Input Parameters: 160811af0c4SBarry Smith + exclude - Whether or not to invert the filter, i.e. if exclude is true, `PetscInfo()` will print from every class that 161e94e781bSJacob Faibussowitsch is NOT one of the classes specified 1628b86dd2eSJacob Faibussowitsch . n - Number of classes to filter for (size of classnames) 163e94e781bSJacob Faibussowitsch - classnames - String array containing the names of classes to filter for, e.g. "vec" 164e94e781bSJacob Faibussowitsch 165e94e781bSJacob Faibussowitsch Notes: 166811af0c4SBarry Smith This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called. 167e94e781bSJacob Faibussowitsch 168811af0c4SBarry Smith Names in the classnames list should correspond to the names returned by `PetscObjectGetClassName()`. 169e94e781bSJacob Faibussowitsch 170e94e781bSJacob Faibussowitsch This function only sets the list of class names. 171811af0c4SBarry Smith The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away. 172e94e781bSJacob Faibussowitsch The reason for this is that we need to set the list of included/excluded classes before their classids are known. 173811af0c4SBarry Smith Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`). 174811af0c4SBarry Smith 175811af0c4SBarry Smith Fortran Note: 176811af0c4SBarry Smith Not for use in Fortran 177e94e781bSJacob Faibussowitsch 178e94e781bSJacob Faibussowitsch Level: developer 179e94e781bSJacob Faibussowitsch 180db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()` 181e94e781bSJacob Faibussowitsch @*/ 182d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames) 183d71ae5a4SJacob Faibussowitsch { 184e94e781bSJacob Faibussowitsch PetscFunctionBegin; 18528b400f6SJacob Faibussowitsch PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()"); 1869566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames)); 1878b86dd2eSJacob Faibussowitsch PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames)); 1888b86dd2eSJacob Faibussowitsch PetscInfoNumClasses = n; 189e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = exclude; 190e94e781bSJacob Faibussowitsch /* Process sys class right away */ 1918b86dd2eSJacob Faibussowitsch { 1928b86dd2eSJacob Faibussowitsch const PetscClassId id = PETSC_SMALLEST_CLASSID; 1938b86dd2eSJacob Faibussowitsch 1948b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &id)); 195e94e781bSJacob Faibussowitsch } 1965f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE; 197e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 198e94e781bSJacob Faibussowitsch } 199e94e781bSJacob Faibussowitsch 200e94e781bSJacob Faibussowitsch /*@C 201811af0c4SBarry Smith PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()` 202e94e781bSJacob Faibussowitsch 203e94e781bSJacob Faibussowitsch Not Collective 204e94e781bSJacob Faibussowitsch 20501d2d390SJose E. Roman Input Parameter: 206e94e781bSJacob Faibussowitsch . classname - Name of the class to search for 207e94e781bSJacob Faibussowitsch 208e94e781bSJacob Faibussowitsch Output Parameter: 209811af0c4SBarry Smith . found - `PetscBool` indicating whether the classname was found 210e94e781bSJacob Faibussowitsch 211811af0c4SBarry Smith Note: 212811af0c4SBarry Smith Use `PetscObjectGetName()` to retrieve an appropriate classname 213e94e781bSJacob Faibussowitsch 214e94e781bSJacob Faibussowitsch Level: developer 215e94e781bSJacob Faibussowitsch 216db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()` 217e94e781bSJacob Faibussowitsch @*/ 218d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) 219d71ae5a4SJacob Faibussowitsch { 2208b86dd2eSJacob Faibussowitsch PetscInt unused; 221e94e781bSJacob Faibussowitsch 222e94e781bSJacob Faibussowitsch PetscFunctionBegin; 223e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 2248b86dd2eSJacob Faibussowitsch PetscValidBoolPointer(found, 2); 2258b86dd2eSJacob Faibussowitsch PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found)); 2265f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_TRUE; 227e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 228e94e781bSJacob Faibussowitsch } 229e94e781bSJacob Faibussowitsch 230e94e781bSJacob Faibussowitsch /*@ 231811af0c4SBarry Smith PetscInfoGetInfo - Returns the current state of several important flags for `PetscInfo()` 232e94e781bSJacob Faibussowitsch 233e94e781bSJacob Faibussowitsch Not Collective 234e94e781bSJacob Faibussowitsch 235e94e781bSJacob Faibussowitsch Output Parameters: 236811af0c4SBarry Smith + infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called 237811af0c4SBarry Smith . classesSet - `PETSC_TRUE` if the list of classes to filter for has been set 238811af0c4SBarry Smith . exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted 239811af0c4SBarry Smith . locked - `PETSC_TRUE` if the list of classes to filter for has been locked 240811af0c4SBarry Smith - commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all 241e94e781bSJacob Faibussowitsch communicators 242e94e781bSJacob Faibussowitsch 243811af0c4SBarry Smith Note: 244811af0c4SBarry Smith Initially commSelfFlag = `PETSC_INFO_COMM_ALL` 245e94e781bSJacob Faibussowitsch 246fe9b927eSVaclav Hapla Level: developer 247e94e781bSJacob Faibussowitsch 248db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()` 249e94e781bSJacob Faibussowitsch @*/ 250d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) 251d71ae5a4SJacob Faibussowitsch { 252e94e781bSJacob Faibussowitsch PetscFunctionBegin; 2538b86dd2eSJacob Faibussowitsch if (infoEnabled) PetscValidBoolPointer(infoEnabled, 1); 2548b86dd2eSJacob Faibussowitsch if (classesSet) PetscValidBoolPointer(classesSet, 2); 2558b86dd2eSJacob Faibussowitsch if (exclude) PetscValidBoolPointer(exclude, 3); 2568b86dd2eSJacob Faibussowitsch if (locked) PetscValidBoolPointer(locked, 4); 2578b86dd2eSJacob Faibussowitsch if (commSelfFlag) PetscValidPointer(commSelfFlag, 5); 258e94e781bSJacob Faibussowitsch if (infoEnabled) *infoEnabled = PetscLogPrintInfo; 2595f115e29SVaclav Hapla if (classesSet) *classesSet = PetscInfoClassesSet; 260e94e781bSJacob Faibussowitsch if (exclude) *exclude = PetscInfoInvertClasses; 2615f115e29SVaclav Hapla if (locked) *locked = PetscInfoClassesLocked; 262e94e781bSJacob Faibussowitsch if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter; 263e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 264e94e781bSJacob Faibussowitsch } 265e94e781bSJacob Faibussowitsch 266e94e781bSJacob Faibussowitsch /*@C 267811af0c4SBarry Smith PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()` 268e94e781bSJacob Faibussowitsch 269e94e781bSJacob Faibussowitsch Not Collective 270e94e781bSJacob Faibussowitsch 271e94e781bSJacob Faibussowitsch Input Parameters: 272811af0c4SBarry Smith + classname - Name of the class to activate/deactivate `PetscInfo()` for 273e94e781bSJacob Faibussowitsch . numClassID - Number of entries in classIDs 274e94e781bSJacob Faibussowitsch - classIDs - Array containing all of the PetscClassids associated with classname 275e94e781bSJacob Faibussowitsch 276e94e781bSJacob Faibussowitsch Level: developer 277e94e781bSJacob Faibussowitsch 278db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()` 279e94e781bSJacob Faibussowitsch @*/ 280d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, const PetscClassId classIDs[]) 281d71ae5a4SJacob Faibussowitsch { 2828b86dd2eSJacob Faibussowitsch PetscBool enabled, exclude, found, opt; 283e94e781bSJacob Faibussowitsch char logList[256]; 284e94e781bSJacob Faibussowitsch 285e94e781bSJacob Faibussowitsch PetscFunctionBegin; 286e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 2878b86dd2eSJacob Faibussowitsch PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID); 2888b86dd2eSJacob Faibussowitsch if (numClassID) PetscValidPointer(classIDs, 3); 2899566063dSJacob Faibussowitsch PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL)); 290e94e781bSJacob Faibussowitsch /* -info_exclude is DEPRECATED */ 2919566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-info_exclude", logList, sizeof(logList), &opt)); 292e94e781bSJacob Faibussowitsch if (opt) { 2938b86dd2eSJacob Faibussowitsch PetscBool pkg; 2948b86dd2eSJacob Faibussowitsch 2959566063dSJacob Faibussowitsch PetscCall(PetscStrInList(classname, logList, ',', &pkg)); 296e94e781bSJacob Faibussowitsch if (pkg) { 2978b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i])); 298e94e781bSJacob Faibussowitsch } 299e94e781bSJacob Faibussowitsch } 30055205543SJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) { 30155205543SJacob Faibussowitsch const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID; 30255205543SJacob Faibussowitsch 30355205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[idx])); 30455205543SJacob Faibussowitsch PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx)); 30555205543SJacob Faibussowitsch } 3069566063dSJacob Faibussowitsch PetscCall(PetscInfoGetClass(classname, &found)); 307e94e781bSJacob Faibussowitsch if ((found && exclude) || (!found && !exclude)) { 308e94e781bSJacob Faibussowitsch if (PetscInfoNumClasses > 0) { 309e94e781bSJacob Faibussowitsch /* Check if -info was called empty */ 3108b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i])); 311e94e781bSJacob Faibussowitsch } 312e94e781bSJacob Faibussowitsch } else { 3138b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i])); 314e94e781bSJacob Faibussowitsch } 315e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 316e94e781bSJacob Faibussowitsch } 317e94e781bSJacob Faibussowitsch 318e94e781bSJacob Faibussowitsch /*@ 319811af0c4SBarry Smith PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()` 320e94e781bSJacob Faibussowitsch 321e94e781bSJacob Faibussowitsch Not Collective 322e94e781bSJacob Faibussowitsch 323e94e781bSJacob Faibussowitsch Input Parameter: 324811af0c4SBarry Smith . commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()` 325e94e781bSJacob Faibussowitsch 326fe9b927eSVaclav Hapla Level: advanced 327e94e781bSJacob Faibussowitsch 328db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()` 329e94e781bSJacob Faibussowitsch @*/ 330d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) 331d71ae5a4SJacob Faibussowitsch { 332e94e781bSJacob Faibussowitsch PetscFunctionBegin; 333e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag; 334e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 335e94e781bSJacob Faibussowitsch } 336e94e781bSJacob Faibussowitsch 337e94e781bSJacob Faibussowitsch /*@ 338811af0c4SBarry Smith PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()` 339e94e781bSJacob Faibussowitsch 340e94e781bSJacob Faibussowitsch Not Collective 341e94e781bSJacob Faibussowitsch 342e94e781bSJacob Faibussowitsch Input Parameter: 343e94e781bSJacob Faibussowitsch . options - Options database, use NULL for default global database 344e94e781bSJacob Faibussowitsch 345fe9b927eSVaclav Hapla Options Database Keys: 346fe9b927eSVaclav Hapla . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo(). 347e94e781bSJacob Faibussowitsch 348811af0c4SBarry Smith Note: 349811af0c4SBarry Smith This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves. 350e94e781bSJacob Faibussowitsch 351fe9b927eSVaclav Hapla Level: advanced 352e94e781bSJacob Faibussowitsch 353db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()` 354e94e781bSJacob Faibussowitsch @*/ 355d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) 356d71ae5a4SJacob Faibussowitsch { 3578b86dd2eSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN]; 3588b86dd2eSJacob Faibussowitsch PetscBool set; 359e94e781bSJacob Faibussowitsch 360e94e781bSJacob Faibussowitsch PetscFunctionBegin; 3619566063dSJacob Faibussowitsch PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead")); 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")); 4059566063dSJacob Faibussowitsch PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)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 } 410e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 411e94e781bSJacob Faibussowitsch } 412e94e781bSJacob Faibussowitsch 413e94e781bSJacob Faibussowitsch /*@ 414811af0c4SBarry Smith PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures. 415e94e781bSJacob Faibussowitsch 416e94e781bSJacob Faibussowitsch Not Collective 417e94e781bSJacob Faibussowitsch 418811af0c4SBarry Smith Note: 419811af0c4SBarry Smith This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent 420811af0c4SBarry Smith `PetscInfo()` calls down the line. 421e94e781bSJacob Faibussowitsch 422fe9b927eSVaclav Hapla Level: developer 4236c877ef6SSatish Balay 424db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()` 425e94e781bSJacob Faibussowitsch @*/ 426d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void) 427d71ae5a4SJacob Faibussowitsch { 4285f115e29SVaclav Hapla int err; 429e94e781bSJacob Faibussowitsch 430e94e781bSJacob Faibussowitsch PetscFunctionBegin; 4319566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_FALSE)); 4329566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames)); 433e94e781bSJacob Faibussowitsch err = fflush(PetscInfoFile); 43428b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file"); 4358b86dd2eSJacob Faibussowitsch if (PetscInfoFilename) PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile)); 4369566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscInfoFilename)); 43755205543SJacob 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"); 43855205543SJacob Faibussowitsch for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) { 43955205543SJacob Faibussowitsch PetscInfoFlags[i] = 1; 44055205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[i])); 44155205543SJacob Faibussowitsch } 44255205543SJacob Faibussowitsch 4435f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_FALSE; 444e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE; 4455f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_FALSE; 446e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1; 447e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 4485c6c1daeSBarry Smith PetscFunctionReturn(0); 4495c6c1daeSBarry Smith } 4505c6c1daeSBarry Smith 451d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value) 452d71ae5a4SJacob Faibussowitsch { 4538b86dd2eSJacob Faibussowitsch PetscFunctionBegin; 4548b86dd2eSJacob Faibussowitsch if (!classid) classid = PETSC_SMALLEST_CLASSID; 4558b86dd2eSJacob Faibussowitsch PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value; 4568b86dd2eSJacob Faibussowitsch PetscFunctionReturn(0); 4578b86dd2eSJacob Faibussowitsch } 4588b86dd2eSJacob Faibussowitsch 4595c6c1daeSBarry Smith /*@ 460811af0c4SBarry Smith PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class. 4615c6c1daeSBarry Smith 4625c6c1daeSBarry Smith Not Collective 4635c6c1daeSBarry Smith 4645c6c1daeSBarry Smith Input Parameter: 465811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc. 4665c6c1daeSBarry Smith 467811af0c4SBarry Smith Note: 4685c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 4695c6c1daeSBarry Smith 4705c6c1daeSBarry Smith Level: developer 4715c6c1daeSBarry Smith 472db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 4735c6c1daeSBarry Smith @*/ 474d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) 475d71ae5a4SJacob Faibussowitsch { 4765c6c1daeSBarry Smith PetscFunctionBegin; 4778b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 0)); 4785c6c1daeSBarry Smith PetscFunctionReturn(0); 4795c6c1daeSBarry Smith } 4805c6c1daeSBarry Smith 4815c6c1daeSBarry Smith /*@ 482811af0c4SBarry Smith PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class. 4835c6c1daeSBarry Smith 4845c6c1daeSBarry Smith Not Collective 4855c6c1daeSBarry Smith 4865c6c1daeSBarry Smith Input Parameter: 487811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc. 4885c6c1daeSBarry Smith 489811af0c4SBarry Smith Note: 4905c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 4915c6c1daeSBarry Smith 4925c6c1daeSBarry Smith Level: developer 4935c6c1daeSBarry Smith 494db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 4955c6c1daeSBarry Smith @*/ 496d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid) 497d71ae5a4SJacob Faibussowitsch { 4985c6c1daeSBarry Smith PetscFunctionBegin; 4998b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 1)); 5005c6c1daeSBarry Smith PetscFunctionReturn(0); 5015c6c1daeSBarry Smith } 5025c6c1daeSBarry Smith 5035c6c1daeSBarry Smith /* 5045c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 5055c6c1daeSBarry Smith messages are also printed to the history file, called by default 5065c6c1daeSBarry Smith .petschistory in ones home directory. 5075c6c1daeSBarry Smith */ 50895c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 5095c6c1daeSBarry Smith 5105c6c1daeSBarry Smith /*MC 511e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data 5125c6c1daeSBarry Smith 5135c6c1daeSBarry Smith Synopsis: 514aaa7dc30SBarry Smith #include <petscsys.h> 515fe9b927eSVaclav Hapla PetscErrorCode PetscInfo(PetscObject obj, const char message[]) 5167d3de750SJacob Faibussowitsch PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1) 5177d3de750SJacob Faibussowitsch PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2) 518fe9b927eSVaclav Hapla ... 5195c6c1daeSBarry Smith 520c3339decSBarry Smith Collective 5215c6c1daeSBarry Smith 522d8d19677SJose E. Roman Input Parameters: 523fe9b927eSVaclav Hapla + obj - object most closely associated with the logging statement or NULL 5245c6c1daeSBarry Smith . message - logging message 525fe9b927eSVaclav Hapla . formatmessage - logging message using standard "printf" format 526fe9b927eSVaclav Hapla - arg1, arg2, ... - arguments of the format 527e94e781bSJacob Faibussowitsch 528e94e781bSJacob Faibussowitsch Notes: 529811af0c4SBarry Smith `PetscInfo()` prints only from the first processor in the communicator of obj. 530811af0c4SBarry Smith If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message. 531fe9b927eSVaclav Hapla 532fe9b927eSVaclav Hapla Extent of the printed messages can be controlled using the option database key -info as follows. 533fe9b927eSVaclav Hapla 534fe9b927eSVaclav Hapla $ -info [filename][:[~]<list,of,classnames>[:[~]self]] 535fe9b927eSVaclav Hapla 536811af0c4SBarry Smith No filename means standard output `PETSC_STDOUT` is used. 537fe9b927eSVaclav Hapla 538fe9b927eSVaclav Hapla The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp. 539fe9b927eSVaclav Hapla If this list is not specified, all classes are enabled. 540fe9b927eSVaclav Hapla Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled. 541fe9b927eSVaclav Hapla A special classname sys relates to PetscInfo() with obj being NULL. 542fe9b927eSVaclav Hapla 543811af0c4SBarry Smith The optional self keyword specifies that PetscInfo() is enabled only for communicator size = 1 (e.g. `PETSC_COMM_SELF`), i.e. only `PetscInfo()` calls which print from every rank of `PETSC_COMM_WORLD` are enabled. 544811af0c4SBarry 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. 545fe9b927eSVaclav Hapla 546fe9b927eSVaclav Hapla All classname/self matching is case insensitive. Filename is case sensitive. 547fe9b927eSVaclav Hapla 548fe9b927eSVaclav Hapla Example of Usage: 549fe9b927eSVaclav Hapla $ Mat A; 550fe9b927eSVaclav Hapla $ PetscInt alpha; 551fe9b927eSVaclav Hapla $ ... 5527d3de750SJacob Faibussowitsch $ PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha); 553fe9b927eSVaclav Hapla 554fe9b927eSVaclav Hapla Options Examples: 555fe9b927eSVaclav Hapla Each call of the form 556fe9b927eSVaclav Hapla $ PetscInfo(obj, msg); 5577d3de750SJacob Faibussowitsch $ PetscInfo(obj, msg, arg1); 5587d3de750SJacob Faibussowitsch $ PetscInfo(obj, msg, arg1, arg2); 559fe9b927eSVaclav Hapla is evaluated as follows. 560fe9b927eSVaclav Hapla $ -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator 561fe9b927eSVaclav Hapla $ -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1 562fe9b927eSVaclav Hapla $ -info myInfoFileName:~vec:~self prints msg to file named myInfoFileName, only if the obj's class is NULL or other than Vec, and obj's communicator has size > 1 563fe9b927eSVaclav Hapla $ -info :sys prints to PETSC_STDOUT only if obj is NULL 564fe9b927eSVaclav Hapla Note that 565fe9b927eSVaclav Hapla $ -info :sys:~self 566fe9b927eSVaclav Hapla deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF. 567fe9b927eSVaclav Hapla 568fe9b927eSVaclav Hapla Fortran Note: 569811af0c4SBarry Smith This function does not take the obj argument, there is only the `PetscInfo()` 570811af0c4SBarry Smith version, not `PetscInfo()` etc. 5715c6c1daeSBarry Smith 5725c6c1daeSBarry Smith Level: intermediate 5735c6c1daeSBarry Smith 574db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 5755c6c1daeSBarry Smith M*/ 576d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) 577d71ae5a4SJacob Faibussowitsch { 5788b86dd2eSJacob Faibussowitsch PetscClassId classid = PETSC_SMALLEST_CLASSID; 5798b86dd2eSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE; 5808b86dd2eSJacob Faibussowitsch MPI_Comm comm = PETSC_COMM_SELF; 5818b86dd2eSJacob Faibussowitsch PetscMPIInt rank; 5825c6c1daeSBarry Smith 5835c6c1daeSBarry Smith PetscFunctionBegin; 5848b86dd2eSJacob Faibussowitsch if (obj) { 5858b86dd2eSJacob Faibussowitsch PetscValidHeader(obj, 2); 5868b86dd2eSJacob Faibussowitsch classid = obj->classid; 5878b86dd2eSJacob Faibussowitsch } 5888b86dd2eSJacob Faibussowitsch PetscValidCharPointer(message, 3); 5899566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(classid, &enabled)); 590e94e781bSJacob Faibussowitsch if (!enabled) PetscFunctionReturn(0); 5918b86dd2eSJacob Faibussowitsch if (obj) PetscCall(PetscObjectGetComm(obj, &comm)); 5928b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 593e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */ 5945c6c1daeSBarry Smith if (rank) PetscFunctionReturn(0); 5958b86dd2eSJacob Faibussowitsch else { 5968b86dd2eSJacob Faibussowitsch PetscMPIInt size; 5978b86dd2eSJacob Faibussowitsch 5988b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 5998b86dd2eSJacob Faibussowitsch /* If no self printing is allowed, and size too small, get out */ 6008b86dd2eSJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(0); 601e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */ 6028b86dd2eSJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(0); 603e94e781bSJacob Faibussowitsch } 604e94e781bSJacob Faibussowitsch /* Mute info messages within this function */ 6058b86dd2eSJacob Faibussowitsch { 6068b86dd2eSJacob Faibussowitsch const PetscBool oldflag = PetscLogPrintInfo; 6078b86dd2eSJacob Faibussowitsch va_list Argp; 6088b86dd2eSJacob Faibussowitsch PetscMPIInt urank; 6098b86dd2eSJacob Faibussowitsch int err; 6108b86dd2eSJacob Faibussowitsch char string[8 * 1024]; 6118b86dd2eSJacob Faibussowitsch size_t fullLength, len; 6128b86dd2eSJacob Faibussowitsch 6139371c9d4SSatish Balay PetscLogPrintInfo = PETSC_FALSE; 6149566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank)); 6155c6c1daeSBarry Smith va_start(Argp, message); 61655205543SJacob Faibussowitsch PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func)); 6179566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string, &len)); 6189566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp)); 6199566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string)); 6205c6c1daeSBarry Smith err = fflush(PetscInfoFile); 62128b400f6SJacob Faibussowitsch PetscCheck(!err, PETSC_COMM_SELF, PETSC_ERR_SYS, "fflush() failed on file"); 6225c6c1daeSBarry Smith if (petsc_history) { 6235c6c1daeSBarry Smith va_start(Argp, message); 6249566063dSJacob Faibussowitsch PetscCall((*PetscVFPrintf)(petsc_history, message, Argp)); 6255c6c1daeSBarry Smith } 6265c6c1daeSBarry Smith va_end(Argp); 627e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 6288b86dd2eSJacob Faibussowitsch } 6295c6c1daeSBarry Smith PetscFunctionReturn(0); 6305c6c1daeSBarry Smith } 631