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 /*@ 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 @*/ 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 @*/ 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 931f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetFile()`, `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 1044f572ea9SToby Isaac PetscAssertPointer(filename, 1); 1054f572ea9SToby Isaac PetscAssertPointer(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 128aa76f320SBarry Smith PetscInfoGetFile - Gets the `filename` 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 1421f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetFile()`, `PetscInfoSetFromOptions()`, `PetscInfoDestroy()` 143e94e781bSJacob Faibussowitsch @*/ 144d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) 145d71ae5a4SJacob Faibussowitsch { 146e94e781bSJacob Faibussowitsch PetscFunctionBegin; 1474f572ea9SToby Isaac PetscAssertPointer(filename, 1); 1484f572ea9SToby Isaac PetscAssertPointer(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: 168d7ceb5a2SJacob Faibussowitsch This function CANNOT be called after `PetscInfoGetClass()` or `PetscInfoProcessClass()` has been called, unless the user calls `PetscInfoDestroy()` first. 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 1771f089562SBarry Smith .seealso: [](sec_PetscInfo), `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; 182d7ceb5a2SJacob 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"); 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 2131f089562SBarry Smith .seealso: [](sec_PetscInfo), `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; 2204f572ea9SToby Isaac PetscAssertPointer(classname, 1); 2214f572ea9SToby Isaac PetscAssertPointer(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 /*@ 2281f089562SBarry Smith PetscInfoGetInfo - Returns the current state of several 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 2451f089562SBarry Smith .seealso: [](sec_PetscInfo), `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; 2504f572ea9SToby Isaac if (infoEnabled) PetscAssertPointer(infoEnabled, 1); 2514f572ea9SToby Isaac if (classesSet) PetscAssertPointer(classesSet, 2); 2524f572ea9SToby Isaac if (exclude) PetscAssertPointer(exclude, 3); 2534f572ea9SToby Isaac if (locked) PetscAssertPointer(locked, 4); 2544f572ea9SToby Isaac if (commSelfFlag) PetscAssertPointer(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 273aa76f320SBarry Smith Options Database Key: 274aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, see `PetscInfo()`. 275aa76f320SBarry Smith 276e94e781bSJacob Faibussowitsch Level: developer 277e94e781bSJacob Faibussowitsch 2781f089562SBarry Smith .seealso: [](sec_PetscInfo), `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; 2864f572ea9SToby Isaac PetscAssertPointer(classname, 1); 2878b86dd2eSJacob Faibussowitsch PetscAssert(numClassID > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Number of classids %" PetscInt_FMT " <= 0", numClassID); 2884f572ea9SToby Isaac if (numClassID) PetscAssertPointer(classIDs, 3); 2899566063dSJacob Faibussowitsch PetscCall(PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL)); 290aa76f320SBarry Smith PetscCall(PetscOptionsDeprecated_Private(NULL, "-info_exclude", NULL, "3.13", "Use ~ with -info to indicate classes to exclude")); 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 } 3153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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 326aa76f320SBarry Smith Options Database Key: 327aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`. 328aa76f320SBarry Smith 329fe9b927eSVaclav Hapla Level: advanced 330e94e781bSJacob Faibussowitsch 3311f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoGetInfo()` 332e94e781bSJacob Faibussowitsch @*/ 333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) 334d71ae5a4SJacob Faibussowitsch { 335e94e781bSJacob Faibussowitsch PetscFunctionBegin; 336e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag; 3373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 338e94e781bSJacob Faibussowitsch } 339e94e781bSJacob Faibussowitsch 340e94e781bSJacob Faibussowitsch /*@ 341811af0c4SBarry Smith PetscInfoSetFromOptions - Configure `PetscInfo()` using command line options, enabling or disabling various calls to `PetscInfo()` 342e94e781bSJacob Faibussowitsch 343e94e781bSJacob Faibussowitsch Not Collective 344e94e781bSJacob Faibussowitsch 345e94e781bSJacob Faibussowitsch Input Parameter: 346667f096bSBarry Smith . options - Options database, use `NULL` for default global database 347e94e781bSJacob Faibussowitsch 348667f096bSBarry Smith Options Database Key: 349aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`. 350e94e781bSJacob Faibussowitsch 351667f096bSBarry Smith Level: advanced 352667f096bSBarry Smith 353811af0c4SBarry Smith Note: 354811af0c4SBarry Smith This function is called automatically during `PetscInitialize()` so users usually do not need to call it themselves. 355e94e781bSJacob Faibussowitsch 3561f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFile()`, `PetscInfoSetClasses()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()` 357e94e781bSJacob Faibussowitsch @*/ 358d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) 359d71ae5a4SJacob Faibussowitsch { 3608b86dd2eSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN]; 3618b86dd2eSJacob Faibussowitsch PetscBool set; 362e94e781bSJacob Faibussowitsch 363e94e781bSJacob Faibussowitsch PetscFunctionBegin; 3648b86dd2eSJacob Faibussowitsch PetscCall(PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_STATIC_ARRAY_LENGTH(optstring), &set)); 365e94e781bSJacob Faibussowitsch if (set) { 3668b86dd2eSJacob Faibussowitsch size_t size_loc0_, size_loc1_, size_loc2_; 3678b86dd2eSJacob Faibussowitsch char *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL; 3688b86dd2eSJacob Faibussowitsch char **loc1_array = NULL; 3698b86dd2eSJacob Faibussowitsch PetscBool loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE; 3708b86dd2eSJacob Faibussowitsch int nLoc1_ = 0; 3718b86dd2eSJacob Faibussowitsch PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL; 3728b86dd2eSJacob Faibussowitsch 3735f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE; 3749566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE)); 3759566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(optstring, &loc0_)); 3769566063dSJacob Faibussowitsch PetscCall(PetscStrchr(loc0_, ':', &loc1_)); 377e94e781bSJacob Faibussowitsch if (loc1_) { 378ebd100edSVaclav Hapla *loc1_++ = 0; 379e94e781bSJacob Faibussowitsch if (*loc1_ == '~') { 380e94e781bSJacob Faibussowitsch loc1_invert = PETSC_TRUE; 381e94e781bSJacob Faibussowitsch ++loc1_; 382e94e781bSJacob Faibussowitsch } 3839566063dSJacob Faibussowitsch PetscCall(PetscStrchr(loc1_, ':', &loc2_)); 384e94e781bSJacob Faibussowitsch } 385e94e781bSJacob Faibussowitsch if (loc2_) { 386ebd100edSVaclav Hapla *loc2_++ = 0; 387e94e781bSJacob Faibussowitsch if (*loc2_ == '~') { 388e94e781bSJacob Faibussowitsch loc2_invert = PETSC_TRUE; 389e94e781bSJacob Faibussowitsch ++loc2_; 390e94e781bSJacob Faibussowitsch } 391e94e781bSJacob Faibussowitsch } 3929566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc0_, &size_loc0_)); 3939566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc1_, &size_loc1_)); 3949566063dSJacob Faibussowitsch PetscCall(PetscStrlen(loc2_, &size_loc2_)); 395e94e781bSJacob Faibussowitsch if (size_loc1_) { 3969566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(loc1_)); 3979566063dSJacob Faibussowitsch PetscCall(PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array)); 398e94e781bSJacob Faibussowitsch } 399e94e781bSJacob Faibussowitsch if (size_loc2_) { 4008b86dd2eSJacob Faibussowitsch PetscBool foundSelf; 4018b86dd2eSJacob Faibussowitsch 4029566063dSJacob Faibussowitsch PetscCall(PetscStrtolower(loc2_)); 4039566063dSJacob Faibussowitsch PetscCall(PetscStrcmp("self", loc2_, &foundSelf)); 4048b86dd2eSJacob Faibussowitsch if (foundSelf) commSelfFlag = loc2_invert ? PETSC_INFO_COMM_NO_SELF : PETSC_INFO_COMM_ONLY_SELF; 405e94e781bSJacob Faibussowitsch } 4069566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w")); 4079566063dSJacob Faibussowitsch PetscCall(PetscInfoSetClasses(loc1_invert, (PetscInt)nLoc1_, (const char *const *)loc1_array)); 4089566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFilterCommSelf(commSelfFlag)); 4099566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(nLoc1_, loc1_array)); 4109566063dSJacob Faibussowitsch PetscCall(PetscFree(loc0_)); 411e94e781bSJacob Faibussowitsch } 4123ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 413e94e781bSJacob Faibussowitsch } 414e94e781bSJacob Faibussowitsch 415e94e781bSJacob Faibussowitsch /*@ 416811af0c4SBarry Smith PetscInfoDestroy - Destroys and resets internal `PetscInfo()` data structures. 417e94e781bSJacob Faibussowitsch 418e94e781bSJacob Faibussowitsch Not Collective 419e94e781bSJacob Faibussowitsch 420667f096bSBarry Smith Level: developer 421667f096bSBarry Smith 422d7ceb5a2SJacob Faibussowitsch Notes: 423811af0c4SBarry Smith This is automatically called in `PetscFinalize()`. Useful for changing filters mid-program, or culling subsequent 424811af0c4SBarry Smith `PetscInfo()` calls down the line. 425e94e781bSJacob Faibussowitsch 426d7ceb5a2SJacob Faibussowitsch Users calling this routine midway through a program should note that `PetscInfoDestroy()` 427d7ceb5a2SJacob Faibussowitsch constitutes a full reset of `PetscInfo()`. It flushes, then closes, the current info file, 428d7ceb5a2SJacob Faibussowitsch re-enables all classes, and resets all internal state. Finally -- and perhaps crucially -- it 429d7ceb5a2SJacob Faibussowitsch disables `PetscInfo()` as-if-by `PetscInfoAllow(PETSC_FALSE)`. 430d7ceb5a2SJacob Faibussowitsch 4311f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfo()`, `PetscInfoSetFromOptions()` 432e94e781bSJacob Faibussowitsch @*/ 433d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void) 434d71ae5a4SJacob Faibussowitsch { 435e94e781bSJacob Faibussowitsch PetscFunctionBegin; 4369566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_FALSE)); 4379566063dSJacob Faibussowitsch PetscCall(PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames)); 438d7ceb5a2SJacob Faibussowitsch if (PetscInfoFile) PetscCall(PetscFFlush(PetscInfoFile)); 439d7ceb5a2SJacob Faibussowitsch if (PetscInfoFilename) { 440d7ceb5a2SJacob Faibussowitsch PetscAssert(PetscInfoFile, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL, "Have non-null PetscInfo file '%s', but corresponding FILE handle is null!", PetscInfoFilename); 4419566063dSJacob Faibussowitsch PetscCall(PetscFree(PetscInfoFilename)); 442d7ceb5a2SJacob Faibussowitsch PetscCall(PetscFClose(PETSC_COMM_SELF, PetscInfoFile)); 443d7ceb5a2SJacob Faibussowitsch } 44455205543SJacob 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"); 44555205543SJacob Faibussowitsch for (size_t i = 0; i < PETSC_STATIC_ARRAY_LENGTH(PetscInfoFlags); ++i) { 44655205543SJacob Faibussowitsch PetscInfoFlags[i] = 1; 44755205543SJacob Faibussowitsch PetscCall(PetscFree(PetscInfoNames[i])); 44855205543SJacob Faibussowitsch } 44955205543SJacob Faibussowitsch 450d7ceb5a2SJacob Faibussowitsch PetscInfoFile = NULL; 4515f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_FALSE; 452e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE; 4535f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_FALSE; 454e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1; 455e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 4563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4575c6c1daeSBarry Smith } 4585c6c1daeSBarry Smith 459d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscInfoSetClassActivation_Private(PetscClassId classid, int value) 460d71ae5a4SJacob Faibussowitsch { 4618b86dd2eSJacob Faibussowitsch PetscFunctionBegin; 4628b86dd2eSJacob Faibussowitsch if (!classid) classid = PETSC_SMALLEST_CLASSID; 4638b86dd2eSJacob Faibussowitsch PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = value; 4643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4658b86dd2eSJacob Faibussowitsch } 4668b86dd2eSJacob Faibussowitsch 4675c6c1daeSBarry Smith /*@ 468811af0c4SBarry Smith PetscInfoDeactivateClass - Deactivates `PetscInfo()` messages for a PETSc object class. 4695c6c1daeSBarry Smith 4705c6c1daeSBarry Smith Not Collective 4715c6c1daeSBarry Smith 4725c6c1daeSBarry Smith Input Parameter: 473811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc. 4745c6c1daeSBarry Smith 475aa76f320SBarry Smith Options Database Key: 476aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`. 477aa76f320SBarry Smith 478667f096bSBarry Smith Level: developer 479667f096bSBarry Smith 480811af0c4SBarry Smith Note: 4815c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 4825c6c1daeSBarry Smith 4831f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoActivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 4845c6c1daeSBarry Smith @*/ 485d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) 486d71ae5a4SJacob Faibussowitsch { 4875c6c1daeSBarry Smith PetscFunctionBegin; 4888b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 0)); 4893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 4905c6c1daeSBarry Smith } 4915c6c1daeSBarry Smith 4925c6c1daeSBarry Smith /*@ 493811af0c4SBarry Smith PetscInfoActivateClass - Activates `PetscInfo()` messages for a PETSc object class. 4945c6c1daeSBarry Smith 4955c6c1daeSBarry Smith Not Collective 4965c6c1daeSBarry Smith 4975c6c1daeSBarry Smith Input Parameter: 498811af0c4SBarry Smith . classid - The object class, e.g., `MAT_CLASSID`, `SNES_CLASSID`, etc. 4995c6c1daeSBarry Smith 500aa76f320SBarry Smith Options Database Key: 501aa76f320SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed, See `PetscInfo()`. 502aa76f320SBarry Smith 503667f096bSBarry Smith Level: developer 504667f096bSBarry Smith 505811af0c4SBarry Smith Note: 5065c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 5075c6c1daeSBarry Smith 5081f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoDeactivateClass()`, `PetscInfo()`, `PetscInfoAllow()`, `PetscInfoSetFromOptions()` 5095c6c1daeSBarry Smith @*/ 510d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfoActivateClass(PetscClassId classid) 511d71ae5a4SJacob Faibussowitsch { 5125c6c1daeSBarry Smith PetscFunctionBegin; 5138b86dd2eSJacob Faibussowitsch PetscCall(PetscInfoSetClassActivation_Private(classid, 1)); 5143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5155c6c1daeSBarry Smith } 5165c6c1daeSBarry Smith 5175c6c1daeSBarry Smith /* 5185c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 5195c6c1daeSBarry Smith messages are also printed to the history file, called by default 5205c6c1daeSBarry Smith .petschistory in ones home directory. 5215c6c1daeSBarry Smith */ 52295c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 5235c6c1daeSBarry Smith 5245c6c1daeSBarry Smith /*MC 525e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data 5265c6c1daeSBarry Smith 5275c6c1daeSBarry Smith Synopsis: 52810450e9eSJacob Faibussowitsch #include <petsclog.h> 52910450e9eSJacob Faibussowitsch PetscErrorCode PetscInfo(PetscObject obj, const char message[], ...) 5305c6c1daeSBarry Smith 531c3339decSBarry Smith Collective 5325c6c1daeSBarry Smith 533d8d19677SJose E. Roman Input Parameters: 534cd05f99aSJacob Faibussowitsch + obj - object most closely associated with the logging statement or `NULL` 53510450e9eSJacob Faibussowitsch - message - logging message using standard "printf" format 536e94e781bSJacob Faibussowitsch 537aa76f320SBarry Smith Options Database Key: 5381f089562SBarry Smith . -info [filename][:[~]<list,of,classnames>[:[~]self]] - specify which informative messages are printed 539aa76f320SBarry Smith 540667f096bSBarry Smith Level: intermediate 541667f096bSBarry Smith 542e94e781bSJacob Faibussowitsch Notes: 5431f089562SBarry Smith `PetscInfo()` prints only from the first processor in the communicator of `obj`. 5441f089562SBarry Smith If `obj` is `NULL`, the `PETSC_COMM_SELF` communicator is used, i.e. every rank of `PETSC_COMM_WORLD` prints the message. 545fe9b927eSVaclav Hapla 5461f089562SBarry Smith The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. `vec,mat,ksp`. 547fe9b927eSVaclav Hapla If this list is not specified, all classes are enabled. 548fe9b927eSVaclav Hapla Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled. 5491f089562SBarry Smith A special classname `sys` relates to `PetscInfo()` with `obj` being `NULL`. 550fe9b927eSVaclav Hapla 551aa76f320SBarry Smith The optional keyword `self` specifies that `PetscInfo()` is enabled only for a communicator size of 1 (e.g. `PETSC_COMM_SELF`). 552aa76f320SBarry 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. 553fe9b927eSVaclav Hapla 554fe9b927eSVaclav Hapla All classname/self matching is case insensitive. Filename is case sensitive. 555fe9b927eSVaclav Hapla 556fe9b927eSVaclav Hapla Example of Usage: 557667f096bSBarry Smith .vb 558667f096bSBarry Smith Mat A; 559667f096bSBarry Smith PetscInt alpha; 560667f096bSBarry Smith ... 561667f096bSBarry Smith PetscInfo(A,"Matrix uses parameter alpha=%" PetscInt_FMT "\n",alpha); 562667f096bSBarry Smith .ve 563fe9b927eSVaclav Hapla 564aec76313SJacob Faibussowitsch Examples using Options: 565fe9b927eSVaclav Hapla Each call of the form 566667f096bSBarry Smith .vb 567667f096bSBarry Smith PetscInfo(obj, msg); 568667f096bSBarry Smith PetscInfo(obj, msg, arg1); 569667f096bSBarry Smith PetscInfo(obj, msg, arg1, arg2); 570667f096bSBarry Smith .ve 571fe9b927eSVaclav Hapla is evaluated as follows. 572667f096bSBarry Smith .vb 5731f089562SBarry Smith -info or -info :: prints `msg` to `PETSC_STDOUT`, for any PETSc `obj` regardless class or communicator 5741f089562SBarry Smith -info :mat:self prints `msg` to `PETSC_STDOUT` only if class of `obj` is `Mat`, and its communicator has size = 1 5751f089562SBarry 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 5761f089562SBarry Smith -info :sys prints to `PETSC_STDOUT` only if `obj` is `NULL` 5771f089562SBarry 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`. 578667f096bSBarry Smith .ve 579aec76313SJacob Faibussowitsch 580aec76313SJacob Faibussowitsch Fortran Notes: 581aa76f320SBarry Smith This function does not take the `obj` argument, there is only the `PetscInfo()` 582811af0c4SBarry Smith version, not `PetscInfo()` etc. 5835c6c1daeSBarry Smith 5841f089562SBarry Smith .seealso: [](sec_PetscInfo), `PetscInfoAllow()`, `PetscInfoSetFromOptions()`, `PetscInfoEnabled()`, `PetscInfoSetFile()`, `PetscInfoGetFile()`, `PetscInfoSetClasses()`, 5851f089562SBarry Smith `PetscInfoGetClass()`, `PetscInfoGetInfo()`, `PetscInfoProcessClass()`, `PetscInfoSetFilterCommSelf()`, `PetscInfoDestroy()`, `PetscInfoDeactivateClass()`, 5861f089562SBarry Smith `PetscInfoActivateClass()` 5875c6c1daeSBarry Smith M*/ 588d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscInfo_Private(const char func[], PetscObject obj, const char message[], ...) 589d71ae5a4SJacob Faibussowitsch { 5908b86dd2eSJacob Faibussowitsch PetscClassId classid = PETSC_SMALLEST_CLASSID; 5918b86dd2eSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE; 592*f8fe7dbcSStefano Zampini MPI_Comm comm = MPI_COMM_NULL; 593*f8fe7dbcSStefano Zampini PetscMPIInt rank = 0; 594b5d96b8dSStefano Zampini const char *otype = NULL; 5955c6c1daeSBarry Smith 5965c6c1daeSBarry Smith PetscFunctionBegin; 5978b86dd2eSJacob Faibussowitsch if (obj) { 5988b86dd2eSJacob Faibussowitsch PetscValidHeader(obj, 2); 5998b86dd2eSJacob Faibussowitsch classid = obj->classid; 6008b86dd2eSJacob Faibussowitsch } 6014f572ea9SToby Isaac PetscAssertPointer(message, 3); 6029566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(classid, &enabled)); 6033ba16761SJacob Faibussowitsch if (!enabled) PetscFunctionReturn(PETSC_SUCCESS); 604b5d96b8dSStefano Zampini if (obj) { 605b5d96b8dSStefano Zampini PetscCall(PetscObjectGetComm(obj, &comm)); 606b5d96b8dSStefano Zampini PetscCall(PetscObjectGetType(obj, &otype)); 6078b86dd2eSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 608*f8fe7dbcSStefano Zampini } 609e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */ 6103ba16761SJacob Faibussowitsch if (rank) PetscFunctionReturn(PETSC_SUCCESS); 6118b86dd2eSJacob Faibussowitsch else { 612*f8fe7dbcSStefano Zampini PetscMPIInt size = 1; 6138b86dd2eSJacob Faibussowitsch 614*f8fe7dbcSStefano Zampini if (comm != MPI_COMM_NULL) PetscCallMPI(MPI_Comm_size(comm, &size)); 6158b86dd2eSJacob Faibussowitsch /* If no self printing is allowed, and size too small, get out */ 6163ba16761SJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_NO_SELF) && (size < 2)) PetscFunctionReturn(PETSC_SUCCESS); 617e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */ 6183ba16761SJacob Faibussowitsch if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) PetscFunctionReturn(PETSC_SUCCESS); 619e94e781bSJacob Faibussowitsch } 620e94e781bSJacob Faibussowitsch /* Mute info messages within this function */ 6218b86dd2eSJacob Faibussowitsch { 6228b86dd2eSJacob Faibussowitsch const PetscBool oldflag = PetscLogPrintInfo; 6238b86dd2eSJacob Faibussowitsch va_list Argp; 6248b86dd2eSJacob Faibussowitsch PetscMPIInt urank; 6258b86dd2eSJacob Faibussowitsch char string[8 * 1024]; 6268b86dd2eSJacob Faibussowitsch size_t fullLength, len; 6278b86dd2eSJacob Faibussowitsch 6289371c9d4SSatish Balay PetscLogPrintInfo = PETSC_FALSE; 6299566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(MPI_COMM_WORLD, &urank)); 630b5d96b8dSStefano Zampini if (otype) { 631b5d96b8dSStefano Zampini PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s:%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], otype, func)); 632b5d96b8dSStefano Zampini } else { 63355205543SJacob Faibussowitsch PetscCall(PetscSNPrintf(string, PETSC_STATIC_ARRAY_LENGTH(string), "[%d] <%s> %s(): ", urank, PetscInfoNames[classid - PETSC_SMALLEST_CLASSID], func)); 634b5d96b8dSStefano Zampini } 6359566063dSJacob Faibussowitsch PetscCall(PetscStrlen(string, &len)); 636eae3dc7dSJacob Faibussowitsch va_start(Argp, message); 6379566063dSJacob Faibussowitsch PetscCall(PetscVSNPrintf(string + len, 8 * 1024 - len, message, &fullLength, Argp)); 638eae3dc7dSJacob Faibussowitsch va_end(Argp); 6399566063dSJacob Faibussowitsch PetscCall(PetscFPrintf(PETSC_COMM_SELF, PetscInfoFile, "%s", string)); 640c69effb2SJacob Faibussowitsch PetscCall(PetscFFlush(PetscInfoFile)); 6415c6c1daeSBarry Smith if (petsc_history) { 6425c6c1daeSBarry Smith va_start(Argp, message); 6439566063dSJacob Faibussowitsch PetscCall((*PetscVFPrintf)(petsc_history, message, Argp)); 6445c6c1daeSBarry Smith va_end(Argp); 645eae3dc7dSJacob Faibussowitsch } 646e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 6478b86dd2eSJacob Faibussowitsch } 6483ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6495c6c1daeSBarry Smith } 650