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 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 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]); 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 70db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoEnabled()`, `PetscInfoGetInfo()`, `PetscInfoSetFromOptions()` 715c6c1daeSBarry Smith @*/ 72d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag) 73d71ae5a4SJacob Faibussowitsch { 74e94e781bSJacob Faibussowitsch PetscFunctionBegin; 75e94e781bSJacob Faibussowitsch PetscLogPrintInfo = flag; 763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 86667f096bSBarry Smith - mode - Write mode passed to `PetscFOpen()` 87e94e781bSJacob Faibussowitsch 88e94e781bSJacob Faibussowitsch Level: advanced 89e94e781bSJacob Faibussowitsch 90667f096bSBarry Smith Note: 91667f096bSBarry Smith Use `filename = NULL` to set `PetscInfo()` to write to `PETSC_STDOUT`. 92667f096bSBarry Smith 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 } 1243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 130cf53795eSBarry Smith Not Collective; No Fortran Support 131e94e781bSJacob Faibussowitsch 132e94e781bSJacob Faibussowitsch Output Parameters: 133e94e781bSJacob Faibussowitsch + filename - The name of the output file 134667f096bSBarry Smith - InfoFile - The `FILE` pointer for the output file 135e94e781bSJacob Faibussowitsch 136e94e781bSJacob Faibussowitsch Level: advanced 137e94e781bSJacob Faibussowitsch 138e94e781bSJacob Faibussowitsch Note: 139667f096bSBarry Smith This routine allocates and copies the `filename` so that the `filename` survives `PetscInfoDestroy()`. The user is 140667f096bSBarry Smith 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; 1513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 152e94e781bSJacob Faibussowitsch } 153e94e781bSJacob Faibussowitsch 154e94e781bSJacob Faibussowitsch /*@C 155811af0c4SBarry Smith PetscInfoSetClasses - Sets the classes which `PetscInfo()` is filtered for/against 156e94e781bSJacob Faibussowitsch 157667f096bSBarry Smith Not Collective; No Fortran Support 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 162667f096bSBarry Smith . 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 165667f096bSBarry Smith Level: developer 166667f096bSBarry Smith 167e94e781bSJacob Faibussowitsch Notes: 168811af0c4SBarry Smith This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called. 169e94e781bSJacob Faibussowitsch 170667f096bSBarry Smith Names in the `classnames` list should correspond to the names returned by `PetscObjectGetClassName()`. 171e94e781bSJacob Faibussowitsch 172e94e781bSJacob Faibussowitsch This function only sets the list of class names. 173811af0c4SBarry Smith The actual filtering is deferred to `PetscInfoProcessClass()`, except of sys which is processed right away. 174e94e781bSJacob Faibussowitsch The reason for this is that we need to set the list of included/excluded classes before their classids are known. 175811af0c4SBarry Smith Typically the classid is assigned and `PetscInfoProcessClass()` called in <Class>InitializePackage() (e.g. `VecInitializePackage()`). 176811af0c4SBarry Smith 177db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetClass()`, `PetscInfoProcessClass()`, `PetscInfoSetFromOptions()`, `PetscStrToArray()`, `PetscObjectGetName()` 178e94e781bSJacob Faibussowitsch @*/ 179d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt n, const char *const *classnames) 180d71ae5a4SJacob Faibussowitsch { 181e94e781bSJacob Faibussowitsch PetscFunctionBegin; 18228b400f6SJacob Faibussowitsch PetscCheck(!PetscInfoClassesLocked, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()"); 1839566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames)); 1848b86dd2eSJacob Faibussowitsch PetscCall(PetscStrNArrayallocpy(n, classnames, &PetscInfoClassnames)); 1858b86dd2eSJacob Faibussowitsch PetscInfoNumClasses = n; 186e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = exclude; 187e94e781bSJacob Faibussowitsch /* Process sys class right away */ 1888b86dd2eSJacob Faibussowitsch { 1898b86dd2eSJacob Faibussowitsch const PetscClassId id = PETSC_SMALLEST_CLASSID; 1908b86dd2eSJacob Faibussowitsch 1918b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &id)); 192e94e781bSJacob Faibussowitsch } 1935f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE; 1943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 195e94e781bSJacob Faibussowitsch } 196e94e781bSJacob Faibussowitsch 197e94e781bSJacob Faibussowitsch /*@C 198667f096bSBarry Smith PetscInfoGetClass - Indicates whether the provided `classname` is marked as a filter in `PetscInfo()` as set by `PetscInfoSetClasses()` 199e94e781bSJacob Faibussowitsch 200e94e781bSJacob Faibussowitsch Not Collective 201e94e781bSJacob Faibussowitsch 20201d2d390SJose E. Roman Input Parameter: 203e94e781bSJacob Faibussowitsch . classname - Name of the class to search for 204e94e781bSJacob Faibussowitsch 205e94e781bSJacob Faibussowitsch Output Parameter: 206811af0c4SBarry Smith . found - `PetscBool` indicating whether the classname was found 207e94e781bSJacob Faibussowitsch 208667f096bSBarry Smith Level: developer 209667f096bSBarry Smith 210811af0c4SBarry Smith Note: 211811af0c4SBarry Smith Use `PetscObjectGetName()` to retrieve an appropriate classname 212e94e781bSJacob Faibussowitsch 213db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetClasses()`, `PetscInfoSetFromOptions()`, `PetscObjectGetName()` 214e94e781bSJacob Faibussowitsch @*/ 215d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) 216d71ae5a4SJacob Faibussowitsch { 2178b86dd2eSJacob Faibussowitsch PetscInt unused; 218e94e781bSJacob Faibussowitsch 219e94e781bSJacob Faibussowitsch PetscFunctionBegin; 220e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 2218b86dd2eSJacob Faibussowitsch PetscValidBoolPointer(found, 2); 2228b86dd2eSJacob Faibussowitsch PetscCall(PetscEListFind(PetscInfoNumClasses, (const char *const *)PetscInfoClassnames, classname ? classname : "sys", &unused, found)); 2235f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_TRUE; 2243ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 225e94e781bSJacob Faibussowitsch } 226e94e781bSJacob Faibussowitsch 227e94e781bSJacob Faibussowitsch /*@ 228811af0c4SBarry Smith PetscInfoGetInfo - Returns the current state of several important flags for `PetscInfo()` 229e94e781bSJacob Faibussowitsch 230e94e781bSJacob Faibussowitsch Not Collective 231e94e781bSJacob Faibussowitsch 232e94e781bSJacob Faibussowitsch Output Parameters: 233811af0c4SBarry Smith + infoEnabled - `PETSC_TRUE` if `PetscInfoAllow`(`PETSC_TRUE`) has been called 234811af0c4SBarry Smith . classesSet - `PETSC_TRUE` if the list of classes to filter for has been set 235811af0c4SBarry Smith . exclude - `PETSC_TRUE` if the class filtering for `PetscInfo()` is inverted 236811af0c4SBarry Smith . locked - `PETSC_TRUE` if the list of classes to filter for has been locked 237811af0c4SBarry Smith - commSelfFlag - Enum indicating whether `PetscInfo()` will print for communicators of size 1, any size != 1, or all 238e94e781bSJacob Faibussowitsch communicators 239e94e781bSJacob Faibussowitsch 240667f096bSBarry Smith Level: developer 241667f096bSBarry Smith 242811af0c4SBarry Smith Note: 243811af0c4SBarry Smith Initially commSelfFlag = `PETSC_INFO_COMM_ALL` 244e94e781bSJacob Faibussowitsch 245db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFilterCommSelf`, `PetscInfoSetFromOptions()` 246e94e781bSJacob Faibussowitsch @*/ 247d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) 248d71ae5a4SJacob Faibussowitsch { 249e94e781bSJacob Faibussowitsch PetscFunctionBegin; 2508b86dd2eSJacob Faibussowitsch if (infoEnabled) PetscValidBoolPointer(infoEnabled, 1); 2518b86dd2eSJacob Faibussowitsch if (classesSet) PetscValidBoolPointer(classesSet, 2); 2528b86dd2eSJacob Faibussowitsch if (exclude) PetscValidBoolPointer(exclude, 3); 2538b86dd2eSJacob Faibussowitsch if (locked) PetscValidBoolPointer(locked, 4); 2548b86dd2eSJacob Faibussowitsch if (commSelfFlag) PetscValidPointer(commSelfFlag, 5); 255e94e781bSJacob Faibussowitsch if (infoEnabled) *infoEnabled = PetscLogPrintInfo; 2565f115e29SVaclav Hapla if (classesSet) *classesSet = PetscInfoClassesSet; 257e94e781bSJacob Faibussowitsch if (exclude) *exclude = PetscInfoInvertClasses; 2585f115e29SVaclav Hapla if (locked) *locked = PetscInfoClassesLocked; 259e94e781bSJacob Faibussowitsch if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter; 2603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 261e94e781bSJacob Faibussowitsch } 262e94e781bSJacob Faibussowitsch 263e94e781bSJacob Faibussowitsch /*@C 264811af0c4SBarry Smith PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of `PetscInfo()` 265e94e781bSJacob Faibussowitsch 266e94e781bSJacob Faibussowitsch Not Collective 267e94e781bSJacob Faibussowitsch 268e94e781bSJacob Faibussowitsch Input Parameters: 269811af0c4SBarry Smith + classname - Name of the class to activate/deactivate `PetscInfo()` for 270667f096bSBarry Smith . numClassID - Number of entries in `classIDs` 271667f096bSBarry Smith - classIDs - Array containing all of the `PetscClassId`s associated with `classname` 272e94e781bSJacob Faibussowitsch 273e94e781bSJacob Faibussowitsch Level: developer 274e94e781bSJacob Faibussowitsch 275db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoActivateClass()`, `PetscInfoDeactivateClass()`, `PetscInfoSetFromOptions()` 276e94e781bSJacob Faibussowitsch @*/ 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; 283e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 2848b86dd2eSJacob Faibussowitsch PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID); 2858b86dd2eSJacob Faibussowitsch if (numClassID) PetscValidPointer(classIDs, 3); 2869566063dSJacob Faibussowitsch PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL)); 287e94e781bSJacob Faibussowitsch /* -info_exclude is DEPRECATED */ 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 } 29755205543SJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) { 29855205543SJacob Faibussowitsch const PetscClassId idx = classIDs[i] - PETSC_SMALLEST_CLASSID; 29955205543SJacob Faibussowitsch 30055205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[idx])); 30155205543SJacob Faibussowitsch PetscCall(PetscStrallocpy(classname, PetscInfoNames + idx)); 30255205543SJacob Faibussowitsch } 3039566063dSJacob Faibussowitsch PetscCall(PetscInfoGetClass(classname, &found)); 304e94e781bSJacob Faibussowitsch if ((found && exclude) || (!found && !exclude)) { 305e94e781bSJacob Faibussowitsch if (PetscInfoNumClasses > 0) { 306e94e781bSJacob Faibussowitsch /* Check if -info was called empty */ 3078b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoDeactivateClass(classIDs[i])); 308e94e781bSJacob Faibussowitsch } 309e94e781bSJacob Faibussowitsch } else { 3108b86dd2eSJacob Faibussowitsch for (PetscInt i = 0; i < numClassID; ++i) PetscCall(PetscInfoActivateClass(classIDs[i])); 311e94e781bSJacob Faibussowitsch } 3123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 313e94e781bSJacob Faibussowitsch } 314e94e781bSJacob Faibussowitsch 315e94e781bSJacob Faibussowitsch /*@ 316811af0c4SBarry Smith PetscInfoSetFilterCommSelf - Sets `PetscInfoCommFlag` enum to determine communicator filtering for `PetscInfo()` 317e94e781bSJacob Faibussowitsch 318e94e781bSJacob Faibussowitsch Not Collective 319e94e781bSJacob Faibussowitsch 320e94e781bSJacob Faibussowitsch Input Parameter: 321811af0c4SBarry Smith . commSelfFlag - Enum value indicating method with which to filter `PetscInfo()` based on the size of the communicator of the object calling `PetscInfo()` 322e94e781bSJacob Faibussowitsch 323fe9b927eSVaclav Hapla Level: advanced 324e94e781bSJacob Faibussowitsch 325db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoGetInfo()` 326e94e781bSJacob Faibussowitsch @*/ 327d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) 328d71ae5a4SJacob Faibussowitsch { 329e94e781bSJacob Faibussowitsch PetscFunctionBegin; 330e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag; 3313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 332e94e781bSJacob Faibussowitsch } 333e94e781bSJacob Faibussowitsch 334e94e781bSJacob Faibussowitsch /*@ 335811af0c4SBarry Smith PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()` 336e94e781bSJacob Faibussowitsch 337e94e781bSJacob Faibussowitsch Not Collective 338e94e781bSJacob Faibussowitsch 339e94e781bSJacob Faibussowitsch Input Parameter: 340667f096bSBarry Smith . options - Options database, use `NULL` for default global database 341e94e781bSJacob Faibussowitsch 342667f096bSBarry Smith Options Database Key: 343fe9b927eSVaclav Hapla . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See PetscInfo(). 344e94e781bSJacob Faibussowitsch 345667f096bSBarry Smith Level: advanced 346667f096bSBarry Smith 347811af0c4SBarry Smith Note: 348811af0c4SBarry Smith This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves. 349e94e781bSJacob Faibussowitsch 350db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()` 351e94e781bSJacob Faibussowitsch @*/ 352d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) 353d71ae5a4SJacob Faibussowitsch { 3548b86dd2eSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN]; 3558b86dd2eSJacob Faibussowitsch PetscBool set; 356e94e781bSJacob Faibussowitsch 357e94e781bSJacob Faibussowitsch PetscFunctionBegin; 3589566063dSJacob Faibussowitsch PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use -info instead")); 3598b86dd2eSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set)); 360e94e781bSJacob Faibussowitsch if (set) { 3618b86dd2eSJacob Faibussowitsch size_t size_loc0_, size_loc1_, size_loc2_; 3628b86dd2eSJacob Faibussowitsch char *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL; 3638b86dd2eSJacob Faibussowitsch char **loc1_array = NULL; 3648b86dd2eSJacob Faibussowitsch PetscBool loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE; 3658b86dd2eSJacob Faibussowitsch int nLoc1_ = 0; 3668b86dd2eSJacob Faibussowitsch PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL; 3678b86dd2eSJacob Faibussowitsch 3685f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE; 3699566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE)); 3709566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(optstring, &loc0_)); 3719566063dSJacob Faibussowitsch PetscCall(PetscStrchr(loc0_, ':', &loc1_)); 372e94e781bSJacob Faibussowitsch if (loc1_) { 373ebd100edSVaclav Hapla *loc1_++ = 0; 374e94e781bSJacob Faibussowitsch if (*loc1_ == '~') { 375e94e781bSJacob Faibussowitsch loc1_invert = PETSC_TRUE; 376e94e781bSJacob Faibussowitsch ++loc1_; 377e94e781bSJacob Faibussowitsch } 3789566063dSJacob Faibussowitsch PetscCall(PetscStrchr(loc1_, ':', &loc2_)); 379e94e781bSJacob Faibussowitsch } 380e94e781bSJacob Faibussowitsch if (loc2_) { 381ebd100edSVaclav Hapla *loc2_++ = 0; 382e94e781bSJacob Faibussowitsch if (*loc2_ == '~') { 383e94e781bSJacob Faibussowitsch loc2_invert = PETSC_TRUE; 384e94e781bSJacob Faibussowitsch ++loc2_; 385e94e781bSJacob Faibussowitsch } 386e94e781bSJacob Faibussowitsch } 3879566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc0_, &size_loc0_)); 3889566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc1_, &size_loc1_)); 3899566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc2_, &size_loc2_)); 390e94e781bSJacob Faibussowitsch if (size_loc1_) { 3919566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(loc1_)); 3929566063dSJacob Faibussowitsch PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array)); 393e94e781bSJacob Faibussowitsch } 394e94e781bSJacob Faibussowitsch if (size_loc2_) { 3958b86dd2eSJacob Faibussowitsch PetscBool foundSelf; 3968b86dd2eSJacob Faibussowitsch 3979566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(loc2_)); 3989566063dSJacob Faibussowitsch PetscCall(PetscStrcmp("self", loc2_, &foundSelf)); 3998b86dd2eSJacob Faibussowitsch if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF; 400e94e781bSJacob Faibussowitsch } 4019566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w")); 4029566063dSJacob Faibussowitsch PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array)); 4039566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag)); 4049566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array)); 4059566063dSJacob Faibussowitsch PetscCall(PetscFree(loc0_)); 406e94e781bSJacob Faibussowitsch } 4073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 408e94e781bSJacob Faibussowitsch } 409e94e781bSJacob Faibussowitsch 410e94e781bSJacob Faibussowitsch /*@ 411811af0c4SBarry Smith PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures. 412e94e781bSJacob Faibussowitsch 413e94e781bSJacob Faibussowitsch Not Collective 414e94e781bSJacob Faibussowitsch 415667f096bSBarry Smith Level: developer 416667f096bSBarry Smith 417811af0c4SBarry Smith Note: 418811af0c4SBarry Smith This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent 419811af0c4SBarry Smith `PetscInfo()` calls down the line. 420e94e781bSJacob Faibussowitsch 421db781477SPatrick Sanan .seealso: `PetscInfo()`, `PetscInfoSetFromOptions()` 422e94e781bSJacob Faibussowitsch @*/ 423d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void) 424d71ae5a4SJacob Faibussowitsch { 425e94e781bSJacob Faibussowitsch PetscFunctionBegin; 4269566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_FALSE)); 4279566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames)); 428c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(PetscInfoFile)); 4298b86dd2eSJacob Faibussowitsch if (PetscInfoFilename) PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile)); 4309566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscInfoFilename)); 43155205543SJacob 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"); 43255205543SJacob Faibussowitsch for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) { 43355205543SJacob Faibussowitsch PetscInfoFlags[i] = 1; 43455205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[i])); 43555205543SJacob Faibussowitsch } 43655205543SJacob Faibussowitsch 4375f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_FALSE; 438e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE; 4395f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_FALSE; 440e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1; 441e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 4423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4435c6c1daeSBarry Smith } 4445c6c1daeSBarry Smith 445d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value) 446d71ae5a4SJacob Faibussowitsch { 4478b86dd2eSJacob Faibussowitsch PetscFunctionBegin; 4488b86dd2eSJacob Faibussowitsch if (!classid) classid = PETSC_SMALLEST_CLASSID; 4498b86dd2eSJacob Faibussowitsch PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value; 4503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4518b86dd2eSJacob Faibussowitsch } 4528b86dd2eSJacob Faibussowitsch 4535c6c1daeSBarry Smith /*@ 454811af0c4SBarry Smith PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class. 4555c6c1daeSBarry Smith 4565c6c1daeSBarry Smith Not Collective 4575c6c1daeSBarry Smith 4585c6c1daeSBarry Smith Input Parameter: 459811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc. 4605c6c1daeSBarry Smith 461667f096bSBarry Smith Level: developer 462667f096bSBarry Smith 463811af0c4SBarry Smith Note: 4645c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 4655c6c1daeSBarry Smith 466db781477SPatrick Sanan .seealso: `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 4675c6c1daeSBarry Smith @*/ 468d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) 469d71ae5a4SJacob Faibussowitsch { 4705c6c1daeSBarry Smith PetscFunctionBegin; 4718b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 0)); 4723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4735c6c1daeSBarry Smith } 4745c6c1daeSBarry Smith 4755c6c1daeSBarry Smith /*@ 476811af0c4SBarry Smith PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class. 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith Not Collective 4795c6c1daeSBarry Smith 4805c6c1daeSBarry Smith Input Parameter: 481811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc. 4825c6c1daeSBarry Smith 483667f096bSBarry Smith Level: developer 484667f096bSBarry Smith 485811af0c4SBarry Smith Note: 4865c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 4875c6c1daeSBarry Smith 488db781477SPatrick Sanan .seealso: `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 4895c6c1daeSBarry Smith @*/ 490d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid) 491d71ae5a4SJacob Faibussowitsch { 4925c6c1daeSBarry Smith PetscFunctionBegin; 4938b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 1)); 4943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4955c6c1daeSBarry Smith } 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith /* 4985c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 4995c6c1daeSBarry Smith messages are also printed to the history file, called by default 5005c6c1daeSBarry Smith .petschistory in ones home directory. 5015c6c1daeSBarry Smith */ 50295c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 5035c6c1daeSBarry Smith 5045c6c1daeSBarry Smith /*MC 505e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data 5065c6c1daeSBarry Smith 5075c6c1daeSBarry Smith Synopsis: 508aaa7dc30SBarry Smith #include <petscsys.h> 509fe9b927eSVaclav Hapla PetscErrorCode PetscInfo(PetscObject obj, const char message[]) 5107d3de750SJacob Faibussowitsch PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1) 5117d3de750SJacob Faibussowitsch PetscErrorCode PetscInfo(PetscObject obj, const char formatmessage[],arg1,arg2) 512fe9b927eSVaclav Hapla ... 5135c6c1daeSBarry Smith 514c3339decSBarry Smith Collective 5155c6c1daeSBarry Smith 516d8d19677SJose E. Roman Input Parameters: 517cd05f99aSJacob Faibussowitsch + obj - object most closely associated with the logging statement or `NULL` 5185c6c1daeSBarry Smith . message - logging message 519fe9b927eSVaclav Hapla . formatmessage - logging message using standard "printf" format 520fe9b927eSVaclav Hapla - arg1, arg2, ... - arguments of the format 521e94e781bSJacob Faibussowitsch 522667f096bSBarry Smith Level: intermediate 523667f096bSBarry Smith 524e94e781bSJacob Faibussowitsch Notes: 525811af0c4SBarry Smith `PetscInfo()` prints only from the first processor in the communicator of obj. 526811af0c4SBarry Smith If obj is NULL, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message. 527fe9b927eSVaclav Hapla 528fe9b927eSVaclav Hapla Extent of the printed messages can be controlled using the option database key -info as follows. 529fe9b927eSVaclav Hapla 530fe9b927eSVaclav Hapla $ -info [filename][:[~]<list,of,classnames>[:[~]self]] 531fe9b927eSVaclav Hapla 532811af0c4SBarry Smith No filename means standard output `PETSC_STDOUT` is used. 533fe9b927eSVaclav Hapla 534fe9b927eSVaclav Hapla The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp. 535fe9b927eSVaclav Hapla If this list is not specified, all classes are enabled. 536fe9b927eSVaclav Hapla Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled. 537fe9b927eSVaclav Hapla A special classname sys relates to PetscInfo() with obj being NULL. 538fe9b927eSVaclav Hapla 539811af0c4SBarry 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. 540811af0c4SBarry 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. 541fe9b927eSVaclav Hapla 542fe9b927eSVaclav Hapla All classname/self matching is case insensitive. Filename is case sensitive. 543fe9b927eSVaclav Hapla 544fe9b927eSVaclav Hapla Example of Usage: 545667f096bSBarry Smith .vb 546667f096bSBarry Smith Mat A; 547667f096bSBarry Smith PetscInt alpha; 548667f096bSBarry Smith ... 549667f096bSBarry Smith PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha); 550667f096bSBarry Smith .ve 551fe9b927eSVaclav Hapla 552fe9b927eSVaclav Hapla Options Examples: 553fe9b927eSVaclav Hapla Each call of the form 554667f096bSBarry Smith .vb 555667f096bSBarry Smith PetscInfo(obj, msg); 556667f096bSBarry Smith PetscInfo(obj, msg, arg1); 557667f096bSBarry Smith PetscInfo(obj, msg, arg1, arg2); 558667f096bSBarry Smith .ve 559fe9b927eSVaclav Hapla is evaluated as follows. 560667f096bSBarry Smith .vb 561667f096bSBarry Smith -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator 562667f096bSBarry Smith -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1 563667f096bSBarry 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 564667f096bSBarry Smith -info :sys prints to PETSC_STDOUT only if obj is NULL 565667f096bSBarry 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. 566667f096bSBarry Smith .ve 567fe9b927eSVaclav Hapla Fortran Note: 568811af0c4SBarry Smith This function does not take the obj argument, there is only the `PetscInfo()` 569811af0c4SBarry Smith version, not `PetscInfo()` etc. 5705c6c1daeSBarry Smith 571db781477SPatrick Sanan .seealso: `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 5725c6c1daeSBarry Smith M*/ 573d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) 574d71ae5a4SJacob Faibussowitsch { 5758b86dd2eSJacob Faibussowitsch PetscClassId classid = PETSC_SMALLEST_CLASSID; 5768b86dd2eSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE; 5778b86dd2eSJacob Faibussowitsch MPI_Comm comm = PETSC_COMM_SELF; 5788b86dd2eSJacob Faibussowitsch PetscMPIInt rank; 5795c6c1daeSBarry Smith 5805c6c1daeSBarry Smith PetscFunctionBegin; 5818b86dd2eSJacob Faibussowitsch if (obj) { 5828b86dd2eSJacob Faibussowitsch PetscValidHeader(obj, 2); 5838b86dd2eSJacob Faibussowitsch classid = obj->classid; 5848b86dd2eSJacob Faibussowitsch } 5858b86dd2eSJacob Faibussowitsch PetscValidCharPointer(message, 3); 5869566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(classid, &enabled)); 5873ba16761SJacob Faibussowitsch if (!enabled) PetscFunctionReturn(PETSC_SUCCESS); 5888b86dd2eSJacob Faibussowitsch if (obj) PetscCall(PetscObjectGetComm(obj, &comm)); 5898b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 590e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */ 5913ba16761SJacob Faibussowitsch if (rank) PetscFunctionReturn(PETSC_SUCCESS); 5928b86dd2eSJacob Faibussowitsch else { 5938b86dd2eSJacob Faibussowitsch PetscMPIInt size; 5948b86dd2eSJacob Faibussowitsch 5958b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 5968b86dd2eSJacob Faibussowitsch /* If no self printing is allowed, and size too small, get out */ 5973ba16761SJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(PETSC_SUCCESS); 598e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */ 5993ba16761SJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(PETSC_SUCCESS); 600e94e781bSJacob Faibussowitsch } 601e94e781bSJacob Faibussowitsch /* Mute info messages within this function */ 6028b86dd2eSJacob Faibussowitsch { 6038b86dd2eSJacob Faibussowitsch const PetscBool oldflag = PetscLogPrintInfo; 6048b86dd2eSJacob Faibussowitsch va_list Argp; 6058b86dd2eSJacob Faibussowitsch PetscMPIInt urank; 6068b86dd2eSJacob Faibussowitsch char string[8 * 1024]; 6078b86dd2eSJacob Faibussowitsch size_t fullLength, len; 6088b86dd2eSJacob Faibussowitsch 6099371c9d4SSatish Balay PetscLogPrintInfo = PETSC_FALSE; 6109566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank)); 61155205543SJacob Faibussowitsch PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func)); 6129566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string, &len)); 613*eae3dc7dSJacob Faibussowitsch va_start(Argp, message); 6149566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp)); 615*eae3dc7dSJacob Faibussowitsch va_end(Argp); 6169566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string)); 617c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(PetscInfoFile)); 6185c6c1daeSBarry Smith if (petsc_history) { 6195c6c1daeSBarry Smith va_start(Argp, message); 6209566063dSJacob Faibussowitsch PetscCall((*PetscVFPrintf)(petsc_history, message, Argp)); 6215c6c1daeSBarry Smith va_end(Argp); 622*eae3dc7dSJacob Faibussowitsch } 623e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 6248b86dd2eSJacob Faibussowitsch } 6253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6265c6c1daeSBarry Smith } 627