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 */ 19e94e781bSJacob Faibussowitsch const char * const PetscInfoCommFlags[] = {"all", "no_self", "only_self", "PetscInfoCommFlag", "PETSC_INFO_COMM_", 0}; 20*5f115e29SVaclav 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; 25e94e781bSJacob Faibussowitsch static int PetscInfoFlags[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 26e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 27e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 28e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 29e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 30e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 31fa2bb9feSLisandro Dalcin 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 32fa2bb9feSLisandro Dalcin 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 33fa2bb9feSLisandro Dalcin 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 34fa2bb9feSLisandro Dalcin 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; 35*5f115e29SVaclav Hapla PetscBool PetscLogPrintInfo = PETSC_FALSE; 36e94e781bSJacob Faibussowitsch FILE *PetscInfoFile = NULL; 375c6c1daeSBarry Smith 38e94e781bSJacob Faibussowitsch /*@ 39e94e781bSJacob Faibussowitsch PetscInfoEnabled - Checks whether a given OBJECT_CLASSID is allowed to print using PetscInfo() 40e94e781bSJacob Faibussowitsch 41e94e781bSJacob Faibussowitsch Not Collective 42e94e781bSJacob Faibussowitsch 43e94e781bSJacob Faibussowitsch Input Parameters: 44e94e781bSJacob Faibussowitsch . classid - PetscClassid retrieved from a PetscObject e.g. VEC_CLASSID 45e94e781bSJacob Faibussowitsch 46e94e781bSJacob Faibussowitsch Output Parameter: 47e94e781bSJacob Faibussowitsch . enabled - PetscBool indicating whether this classid is allowed to print 48e94e781bSJacob Faibussowitsch 49e94e781bSJacob Faibussowitsch Notes: 50e94e781bSJacob Faibussowitsch Use PETSC_SMALLEST_CLASSID to check if "sys" PetscInfo() calls are enabled. When PETSc is configured with debugging 51e94e781bSJacob Faibussowitsch support this function checks if classid >= PETSC_SMALLEST_CLASSID, otherwise it assumes valid classid. 52e94e781bSJacob Faibussowitsch 53fe9b927eSVaclav Hapla Level: advanced 54e94e781bSJacob Faibussowitsch 55e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoGetInfo(), PetscObjectGetClassid() 56e94e781bSJacob Faibussowitsch @*/ 57e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled) 58e94e781bSJacob Faibussowitsch { 59e94e781bSJacob Faibussowitsch PetscFunctionBegin; 60e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_DEBUG) 61e94e781bSJacob Faibussowitsch if (classid < PETSC_SMALLEST_CLASSID) SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Classid (current: %d) must be equal to or greater than PETSC_SMALLEST_CLASSID", classid); 62e94e781bSJacob Faibussowitsch #endif 63e94e781bSJacob Faibussowitsch *enabled = (PetscBool) (PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]); 64e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 65e94e781bSJacob Faibussowitsch } 66e94e781bSJacob Faibussowitsch 67e94e781bSJacob Faibussowitsch /*@ 68fe9b927eSVaclav Hapla PetscInfoAllow - Enables/disables PetscInfo() messages 695c6c1daeSBarry Smith 70fe9b927eSVaclav Hapla Not Collective 715c6c1daeSBarry Smith 725c6c1daeSBarry Smith Input Parameter: 73e94e781bSJacob Faibussowitsch . flag - PETSC_TRUE or PETSC_FALSE 745c6c1daeSBarry Smith 755c6c1daeSBarry Smith Level: advanced 765c6c1daeSBarry Smith 77e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoEnabled(), PetscInfoGetInfo(), PetscInfoSetFromOptions() 785c6c1daeSBarry Smith @*/ 79e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag) 80e94e781bSJacob Faibussowitsch { 81e94e781bSJacob Faibussowitsch PetscFunctionBegin; 82e94e781bSJacob Faibussowitsch PetscLogPrintInfo = flag; 83e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 84e94e781bSJacob Faibussowitsch } 85e94e781bSJacob Faibussowitsch 86e94e781bSJacob Faibussowitsch /*@C 87fe9b927eSVaclav Hapla PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls 88e94e781bSJacob Faibussowitsch 89fe9b927eSVaclav Hapla Not Collective 90e94e781bSJacob Faibussowitsch 91e94e781bSJacob Faibussowitsch Input Parameter: 92e94e781bSJacob Faibussowitsch + filename - Name of the file where PetscInfo() will print to 93e94e781bSJacob Faibussowitsch - mode - Write mode passed to PetscFOpen() 94e94e781bSJacob Faibussowitsch 95e94e781bSJacob Faibussowitsch Notes: 96fe9b927eSVaclav Hapla Use filename=NULL to set PetscInfo() to write to PETSC_STDOUT. 97e94e781bSJacob Faibussowitsch 98e94e781bSJacob Faibussowitsch Level: advanced 99e94e781bSJacob Faibussowitsch 100e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscFOpen() 101e94e781bSJacob Faibussowitsch @*/ 102e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[]) 1035c6c1daeSBarry Smith { 104fa2bb9feSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN], tname[11]; 1055c6c1daeSBarry Smith PetscMPIInt rank; 1065c6c1daeSBarry Smith PetscErrorCode ierr; 1075c6c1daeSBarry Smith 1085c6c1daeSBarry Smith PetscFunctionBegin; 109e94e781bSJacob Faibussowitsch if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT; 110e94e781bSJacob Faibussowitsch ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr); 111e94e781bSJacob Faibussowitsch if (filename) { 112e94e781bSJacob Faibussowitsch PetscBool oldflag; 113e94e781bSJacob Faibussowitsch PetscValidCharPointer(filename, 1); 1145c6c1daeSBarry Smith ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr); 115e94e781bSJacob Faibussowitsch ierr = PetscStrallocpy(fname, &PetscInfoFilename);CHKERRQ(ierr); 116e94e781bSJacob Faibussowitsch ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);CHKERRQ(ierr); 1175c6c1daeSBarry Smith sprintf(tname, ".%d", rank); 1185c6c1daeSBarry Smith ierr = PetscStrcat(fname, tname);CHKERRQ(ierr); 119e94e781bSJacob Faibussowitsch oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE; 120e94e781bSJacob Faibussowitsch ierr = PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile);CHKERRQ(ierr); 121e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 122e94e781bSJacob Faibussowitsch /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and 123e94e781bSJacob Faibussowitsch call it afterwards so that it actually writes to file */ 124e94e781bSJacob Faibussowitsch ierr = PetscInfo1(NULL, "Opened PetscInfo file %s\n", fname);CHKERRQ(ierr); 125e94e781bSJacob Faibussowitsch } 126e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 127e94e781bSJacob Faibussowitsch } 128a297a907SKarl Rupp 129e94e781bSJacob Faibussowitsch /*@C 130e94e781bSJacob Faibussowitsch PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to 131e94e781bSJacob Faibussowitsch 132e94e781bSJacob Faibussowitsch Not Collective 133e94e781bSJacob Faibussowitsch 134e94e781bSJacob Faibussowitsch Output Parameters: 135e94e781bSJacob Faibussowitsch + filename - The name of the output file 136e94e781bSJacob Faibussowitsch - InfoFile - The FILE pointer for the output file 137e94e781bSJacob Faibussowitsch 138e94e781bSJacob Faibussowitsch Level: advanced 139e94e781bSJacob Faibussowitsch 140e94e781bSJacob Faibussowitsch Note: 141e94e781bSJacob Faibussowitsch This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is 142e94e781bSJacob Faibussowitsch therefore responsible for freeing the allocated filename pointer afterwards. 143e94e781bSJacob Faibussowitsch 144e94e781bSJacob Faibussowitsch Fortran Note: 145e94e781bSJacob Faibussowitsch This routine is not supported in Fortran. 146e94e781bSJacob Faibussowitsch 147e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy() 148e94e781bSJacob Faibussowitsch @*/ 149e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) 150e94e781bSJacob Faibussowitsch { 151e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 152e94e781bSJacob Faibussowitsch 153e94e781bSJacob Faibussowitsch PetscFunctionBegin; 154e94e781bSJacob Faibussowitsch PetscValidPointer(filename, 1); 155e94e781bSJacob Faibussowitsch PetscValidPointer(InfoFile, 2); 156e94e781bSJacob Faibussowitsch ierr = PetscStrallocpy(PetscInfoFilename, filename);CHKERRQ(ierr); 157e94e781bSJacob Faibussowitsch *InfoFile = PetscInfoFile; 158e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 159e94e781bSJacob Faibussowitsch } 160e94e781bSJacob Faibussowitsch 161e94e781bSJacob Faibussowitsch /*@C 162e94e781bSJacob Faibussowitsch PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against 163e94e781bSJacob Faibussowitsch 164e94e781bSJacob Faibussowitsch Not Collective 165e94e781bSJacob Faibussowitsch 166e94e781bSJacob Faibussowitsch Input Parameters: 167e94e781bSJacob Faibussowitsch + exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that 168e94e781bSJacob Faibussowitsch is NOT one of the classes specified 169e94e781bSJacob Faibussowitsch . N - Number of classes to filter for (size of classnames) 170e94e781bSJacob Faibussowitsch - classnames - String array containing the names of classes to filter for, e.g. "vec" 171e94e781bSJacob Faibussowitsch 172e94e781bSJacob Faibussowitsch Notes: 173e94e781bSJacob Faibussowitsch Not for use in Fortran 174e94e781bSJacob Faibussowitsch 175e94e781bSJacob Faibussowitsch This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called. 176e94e781bSJacob Faibussowitsch 177e94e781bSJacob Faibussowitsch Names in the classnames list should correspond to the names returned by PetscObjectGetClassName(). 178e94e781bSJacob Faibussowitsch 179e94e781bSJacob Faibussowitsch This function only sets the list of class names. 180e94e781bSJacob Faibussowitsch The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away. 181e94e781bSJacob Faibussowitsch The reason for this is that we need to set the list of included/excluded classes before their classids are known. 182e94e781bSJacob Faibussowitsch Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()). 183e94e781bSJacob Faibussowitsch 184e94e781bSJacob Faibussowitsch Level: developer 185e94e781bSJacob Faibussowitsch 186e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName() 187e94e781bSJacob Faibussowitsch @*/ 188e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames) 189e94e781bSJacob Faibussowitsch { 190e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 191e94e781bSJacob Faibussowitsch 192e94e781bSJacob Faibussowitsch PetscFunctionBegin; 193*5f115e29SVaclav Hapla if (PetscInfoClassesLocked) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()"); 194e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr); 195e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames);CHKERRQ(ierr); 196e94e781bSJacob Faibussowitsch PetscInfoNumClasses = N; 197e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = exclude; 198e94e781bSJacob Faibussowitsch { 199e94e781bSJacob Faibussowitsch /* Process sys class right away */ 200e94e781bSJacob Faibussowitsch PetscClassId sysclassid = PETSC_SMALLEST_CLASSID; 201e94e781bSJacob Faibussowitsch ierr = PetscInfoProcessClass("sys", 1, &sysclassid);CHKERRQ(ierr); 202e94e781bSJacob Faibussowitsch } 203*5f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE; 204e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 205e94e781bSJacob Faibussowitsch } 206e94e781bSJacob Faibussowitsch 207e94e781bSJacob Faibussowitsch /*@C 208e94e781bSJacob Faibussowitsch PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses() 209e94e781bSJacob Faibussowitsch 210e94e781bSJacob Faibussowitsch Not Collective 211e94e781bSJacob Faibussowitsch 212e94e781bSJacob Faibussowitsch Input Paramater: 213e94e781bSJacob Faibussowitsch . classname - Name of the class to search for 214e94e781bSJacob Faibussowitsch 215e94e781bSJacob Faibussowitsch Output Parameter: 216e94e781bSJacob Faibussowitsch . found - PetscBool indicating whether the classname was found 217e94e781bSJacob Faibussowitsch 218e94e781bSJacob Faibussowitsch Notes: 219e94e781bSJacob Faibussowitsch Use PetscObjectGetName() to retrieve an appropriate classname 220e94e781bSJacob Faibussowitsch 221e94e781bSJacob Faibussowitsch Level: developer 222e94e781bSJacob Faibussowitsch 223e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName() 224e94e781bSJacob Faibussowitsch @*/ 225e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) 226e94e781bSJacob Faibussowitsch { 227e94e781bSJacob Faibussowitsch PetscInt idx; 228e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 229e94e781bSJacob Faibussowitsch 230e94e781bSJacob Faibussowitsch PetscFunctionBegin; 231e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname,1); 232e94e781bSJacob Faibussowitsch ierr = PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found);CHKERRQ(ierr); 233*5f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_TRUE; 234e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 235e94e781bSJacob Faibussowitsch } 236e94e781bSJacob Faibussowitsch 237e94e781bSJacob Faibussowitsch /*@ 238e94e781bSJacob Faibussowitsch PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo() 239e94e781bSJacob Faibussowitsch 240e94e781bSJacob Faibussowitsch Not Collective 241e94e781bSJacob Faibussowitsch 242e94e781bSJacob Faibussowitsch Output Parameters: 243e94e781bSJacob Faibussowitsch + infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called 244ebd100edSVaclav Hapla . classesSet - PETSC_TRUE if the list of classes to filter for has been set 245e94e781bSJacob Faibussowitsch . exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted 246e94e781bSJacob Faibussowitsch . locked - PETSC_TRUE if the list of classes to filter for has been locked 247e94e781bSJacob Faibussowitsch - commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all 248e94e781bSJacob Faibussowitsch communicators 249e94e781bSJacob Faibussowitsch 250e94e781bSJacob Faibussowitsch Notes: 251e94e781bSJacob Faibussowitsch Initially commSelfFlag = PETSC_INFO_COMM_ALL 252e94e781bSJacob Faibussowitsch 253fe9b927eSVaclav Hapla Level: developer 254e94e781bSJacob Faibussowitsch 255e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions() 256e94e781bSJacob Faibussowitsch @*/ 257ebd100edSVaclav Hapla PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *classesSet, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) 258e94e781bSJacob Faibussowitsch { 259e94e781bSJacob Faibussowitsch PetscFunctionBegin; 260e94e781bSJacob Faibussowitsch if (infoEnabled) *infoEnabled = PetscLogPrintInfo; 261*5f115e29SVaclav Hapla if (classesSet) *classesSet = PetscInfoClassesSet; 262e94e781bSJacob Faibussowitsch if (exclude) *exclude = PetscInfoInvertClasses; 263*5f115e29SVaclav Hapla if (locked) *locked = PetscInfoClassesLocked; 264e94e781bSJacob Faibussowitsch if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter; 265e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 266e94e781bSJacob Faibussowitsch } 267e94e781bSJacob Faibussowitsch 268e94e781bSJacob Faibussowitsch /*@C 269e94e781bSJacob Faibussowitsch PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo() 270e94e781bSJacob Faibussowitsch 271e94e781bSJacob Faibussowitsch Not Collective 272e94e781bSJacob Faibussowitsch 273e94e781bSJacob Faibussowitsch Input Parameters: 274e94e781bSJacob Faibussowitsch + classname - Name of the class to activate/deactivate PetscInfo() for 275e94e781bSJacob Faibussowitsch . numClassID - Number of entries in classIDs 276e94e781bSJacob Faibussowitsch - classIDs - Array containing all of the PetscClassids associated with classname 277e94e781bSJacob Faibussowitsch 278e94e781bSJacob Faibussowitsch Level: developer 279e94e781bSJacob Faibussowitsch 280e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions() 281e94e781bSJacob Faibussowitsch @*/ 282e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[]) 283e94e781bSJacob Faibussowitsch { 284e94e781bSJacob Faibussowitsch PetscInt i; 285e94e781bSJacob Faibussowitsch PetscBool enabled, exclude, found, opt, pkg; 286e94e781bSJacob Faibussowitsch char logList[256]; 287e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 288e94e781bSJacob Faibussowitsch 289e94e781bSJacob Faibussowitsch PetscFunctionBegin; 290e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 291e94e781bSJacob Faibussowitsch ierr = PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL);CHKERRQ(ierr); 292e94e781bSJacob Faibussowitsch /* -info_exclude is DEPRECATED */ 293e94e781bSJacob Faibussowitsch ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 294e94e781bSJacob Faibussowitsch if (opt) { 295e94e781bSJacob Faibussowitsch ierr = PetscStrInList(classname,logList,',',&pkg);CHKERRQ(ierr); 296e94e781bSJacob Faibussowitsch if (pkg) { 297e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 298e94e781bSJacob Faibussowitsch ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr); 299e94e781bSJacob Faibussowitsch } 300e94e781bSJacob Faibussowitsch } 301e94e781bSJacob Faibussowitsch } 302e94e781bSJacob Faibussowitsch ierr = PetscInfoGetClass(classname, &found);CHKERRQ(ierr); 303e94e781bSJacob Faibussowitsch if ((found && exclude) || (!found && !exclude)) { 304e94e781bSJacob Faibussowitsch if (PetscInfoNumClasses > 0) { 305e94e781bSJacob Faibussowitsch /* Check if -info was called empty */ 306e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 307e94e781bSJacob Faibussowitsch ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr); 308e94e781bSJacob Faibussowitsch } 309e94e781bSJacob Faibussowitsch } 310e94e781bSJacob Faibussowitsch } else { 311e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 312e94e781bSJacob Faibussowitsch ierr = PetscInfoActivateClass(classIDs[i]);CHKERRQ(ierr); 313e94e781bSJacob Faibussowitsch } 314e94e781bSJacob Faibussowitsch } 315e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 316e94e781bSJacob Faibussowitsch } 317e94e781bSJacob Faibussowitsch 318e94e781bSJacob Faibussowitsch /*@ 319e94e781bSJacob Faibussowitsch PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo() 320e94e781bSJacob Faibussowitsch 321e94e781bSJacob Faibussowitsch Not Collective 322e94e781bSJacob Faibussowitsch 323e94e781bSJacob Faibussowitsch Input Parameter: 324fe9b927eSVaclav Hapla . 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 328e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo() 329e94e781bSJacob Faibussowitsch @*/ 330e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) 331e94e781bSJacob Faibussowitsch { 332e94e781bSJacob Faibussowitsch PetscFunctionBegin; 333e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag; 334e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 335e94e781bSJacob Faibussowitsch } 336e94e781bSJacob Faibussowitsch 337e94e781bSJacob Faibussowitsch /*@ 338fe9b927eSVaclav Hapla 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 348e94e781bSJacob Faibussowitsch Notes: 349fe9b927eSVaclav Hapla 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 353e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy() 354e94e781bSJacob Faibussowitsch @*/ 355e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) 356e94e781bSJacob Faibussowitsch { 357e94e781bSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL; 358e94e781bSJacob Faibussowitsch char **loc1_array = NULL; 359e94e781bSJacob Faibussowitsch PetscBool set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE; 360e94e781bSJacob Faibussowitsch size_t size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0; 361e94e781bSJacob Faibussowitsch int nLoc1_ = 0; 362e94e781bSJacob Faibussowitsch PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL; 363e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 364e94e781bSJacob Faibussowitsch 365e94e781bSJacob Faibussowitsch PetscFunctionBegin; 366e94e781bSJacob Faibussowitsch ierr = PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead");CHKERRQ(ierr); 367e94e781bSJacob Faibussowitsch ierr = PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_MAX_PATH_LEN, &set);CHKERRQ(ierr); 368e94e781bSJacob Faibussowitsch if (set) { 369*5f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_TRUE; 370e94e781bSJacob Faibussowitsch ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr); 371ebd100edSVaclav Hapla ierr = PetscStrallocpy(optstring,&loc0_);CHKERRQ(ierr); 372ebd100edSVaclav Hapla ierr = PetscStrchr(loc0_,':',&loc1_);CHKERRQ(ierr); 373e94e781bSJacob Faibussowitsch if (loc1_) { 374ebd100edSVaclav Hapla *loc1_++ = 0; 375e94e781bSJacob Faibussowitsch if (*loc1_ == '~') { 376e94e781bSJacob Faibussowitsch loc1_invert = PETSC_TRUE; 377e94e781bSJacob Faibussowitsch ++loc1_; 378e94e781bSJacob Faibussowitsch } 379ebd100edSVaclav Hapla ierr = PetscStrchr(loc1_,':',&loc2_);CHKERRQ(ierr); 380e94e781bSJacob Faibussowitsch } 381e94e781bSJacob Faibussowitsch if (loc2_) { 382ebd100edSVaclav Hapla *loc2_++ = 0; 383e94e781bSJacob Faibussowitsch if (*loc2_ == '~') { 384e94e781bSJacob Faibussowitsch loc2_invert = PETSC_TRUE; 385e94e781bSJacob Faibussowitsch ++loc2_; 386e94e781bSJacob Faibussowitsch } 387e94e781bSJacob Faibussowitsch } 388e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc0_, &size_loc0_);CHKERRQ(ierr); 389e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc1_, &size_loc1_);CHKERRQ(ierr); 390e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc2_, &size_loc2_);CHKERRQ(ierr); 391e94e781bSJacob Faibussowitsch if (size_loc1_) { 392e94e781bSJacob Faibussowitsch ierr = PetscStrtolower(loc1_);CHKERRQ(ierr); 393*5f115e29SVaclav Hapla ierr = PetscStrToArray(loc1_, ',', &nLoc1_, &loc1_array);CHKERRQ(ierr); 394e94e781bSJacob Faibussowitsch } 395e94e781bSJacob Faibussowitsch if (size_loc2_) { 396e94e781bSJacob Faibussowitsch ierr = PetscStrtolower(loc2_);CHKERRQ(ierr); 397*5f115e29SVaclav Hapla ierr = PetscStrcmp("self", loc2_, &foundSelf);CHKERRQ(ierr); 398e94e781bSJacob Faibussowitsch if (foundSelf) { 399e94e781bSJacob Faibussowitsch if (loc2_invert) { 400e94e781bSJacob Faibussowitsch commSelfFlag = PETSC_INFO_COMM_NO_SELF; 401e94e781bSJacob Faibussowitsch } else { 402e94e781bSJacob Faibussowitsch commSelfFlag = PETSC_INFO_COMM_ONLY_SELF; 403e94e781bSJacob Faibussowitsch } 404e94e781bSJacob Faibussowitsch } 405e94e781bSJacob Faibussowitsch } 406*5f115e29SVaclav Hapla ierr = PetscInfoSetFile(size_loc0_ ? loc0_ : NULL, "w");CHKERRQ(ierr); 407e94e781bSJacob Faibussowitsch ierr = PetscInfoSetClasses(loc1_invert, (PetscInt) nLoc1_, (const char *const *) loc1_array);CHKERRQ(ierr); 408e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFilterCommSelf(commSelfFlag);CHKERRQ(ierr); 409e94e781bSJacob Faibussowitsch ierr = PetscStrToArrayDestroy(nLoc1_, loc1_array);CHKERRQ(ierr); 410ebd100edSVaclav Hapla ierr = PetscFree(loc0_);CHKERRQ(ierr); 411e94e781bSJacob Faibussowitsch } 412e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 413e94e781bSJacob Faibussowitsch } 414e94e781bSJacob Faibussowitsch 415e94e781bSJacob Faibussowitsch /*@ 416e94e781bSJacob Faibussowitsch PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures. 417e94e781bSJacob Faibussowitsch 418e94e781bSJacob Faibussowitsch Not Collective 419e94e781bSJacob Faibussowitsch 420e94e781bSJacob Faibussowitsch Notes: 421e94e781bSJacob Faibussowitsch This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent 422e94e781bSJacob Faibussowitsch PetscInfo() calls down the line. 423e94e781bSJacob Faibussowitsch 424fe9b927eSVaclav Hapla Level: developer 4256c877ef6SSatish Balay 426e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions() 427e94e781bSJacob Faibussowitsch @*/ 428e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void) 429e94e781bSJacob Faibussowitsch { 430e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 431*5f115e29SVaclav Hapla int err; 432*5f115e29SVaclav Hapla size_t i; 433e94e781bSJacob Faibussowitsch 434e94e781bSJacob Faibussowitsch PetscFunctionBegin; 435e94e781bSJacob Faibussowitsch ierr = PetscInfoAllow(PETSC_FALSE);CHKERRQ(ierr); 436e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr); 437e94e781bSJacob Faibussowitsch err = fflush(PetscInfoFile); 438e94e781bSJacob Faibussowitsch if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 439e94e781bSJacob Faibussowitsch if (PetscInfoFilename) { 440e94e781bSJacob Faibussowitsch ierr = PetscFClose(MPI_COMM_SELF, PetscInfoFile);CHKERRQ(ierr); 441e94e781bSJacob Faibussowitsch } 442e94e781bSJacob Faibussowitsch ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr); 443*5f115e29SVaclav Hapla for (i=0; i<sizeof(PetscInfoFlags)/sizeof(PetscInfoFlags[0]); i++) PetscInfoFlags[i] = 1; 444*5f115e29SVaclav Hapla PetscInfoClassesLocked = PETSC_FALSE; 445e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE; 446*5f115e29SVaclav Hapla PetscInfoClassesSet = PETSC_FALSE; 447e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1; 448e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 4495c6c1daeSBarry Smith PetscFunctionReturn(0); 4505c6c1daeSBarry Smith } 4515c6c1daeSBarry Smith 4525c6c1daeSBarry Smith /*@ 453fa2bb9feSLisandro Dalcin PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class. 4545c6c1daeSBarry Smith 4555c6c1daeSBarry Smith Not Collective 4565c6c1daeSBarry Smith 4575c6c1daeSBarry Smith Input Parameter: 458fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 4595c6c1daeSBarry Smith 4605c6c1daeSBarry Smith Notes: 4615c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 4625c6c1daeSBarry Smith 4635c6c1daeSBarry Smith Level: developer 4645c6c1daeSBarry Smith 465e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions() 4665c6c1daeSBarry Smith @*/ 467fa2bb9feSLisandro Dalcin PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) 4685c6c1daeSBarry Smith { 4695c6c1daeSBarry Smith PetscFunctionBegin; 470fa2bb9feSLisandro Dalcin if (!classid) classid = PETSC_SMALLEST_CLASSID; 471fa2bb9feSLisandro Dalcin PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0; 4725c6c1daeSBarry Smith PetscFunctionReturn(0); 4735c6c1daeSBarry Smith } 4745c6c1daeSBarry Smith 4755c6c1daeSBarry Smith /*@ 476fa2bb9feSLisandro Dalcin PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class. 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith Not Collective 4795c6c1daeSBarry Smith 4805c6c1daeSBarry Smith Input Parameter: 481fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 4825c6c1daeSBarry Smith 4835c6c1daeSBarry Smith Notes: 4845c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 4855c6c1daeSBarry Smith 4865c6c1daeSBarry Smith Level: developer 4875c6c1daeSBarry Smith 488e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions() 4895c6c1daeSBarry Smith @*/ 490fa2bb9feSLisandro Dalcin PetscErrorCode PetscInfoActivateClass(PetscClassId classid) 4915c6c1daeSBarry Smith { 4925c6c1daeSBarry Smith PetscFunctionBegin; 493fa2bb9feSLisandro Dalcin if (!classid) classid = PETSC_SMALLEST_CLASSID; 494fa2bb9feSLisandro Dalcin PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1; 4955c6c1daeSBarry Smith PetscFunctionReturn(0); 4965c6c1daeSBarry Smith } 4975c6c1daeSBarry Smith 4985c6c1daeSBarry Smith /* 4995c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 5005c6c1daeSBarry Smith messages are also printed to the history file, called by default 5015c6c1daeSBarry Smith .petschistory in ones home directory. 5025c6c1daeSBarry Smith */ 50395c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 5045c6c1daeSBarry Smith 5055c6c1daeSBarry Smith /*MC 506e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data 5075c6c1daeSBarry Smith 5085c6c1daeSBarry Smith Synopsis: 509aaa7dc30SBarry Smith #include <petscsys.h> 510fe9b927eSVaclav Hapla PetscErrorCode PetscInfo(PetscObject obj, const char message[]) 511fe9b927eSVaclav Hapla PetscErrorCode PetscInfo1(PetscObject obj, const char formatmessage[],arg1) 512fe9b927eSVaclav Hapla PetscErrorCode PetscInfo2(PetscObject obj, const char formatmessage[],arg1,arg2) 513fe9b927eSVaclav Hapla ... 5145c6c1daeSBarry Smith 515fe9b927eSVaclav Hapla Collective on obj 5165c6c1daeSBarry Smith 5175c6c1daeSBarry Smith Input Parameter: 518fe9b927eSVaclav Hapla + obj - object most closely associated with the logging statement or NULL 5195c6c1daeSBarry Smith . message - logging message 520fe9b927eSVaclav Hapla . formatmessage - logging message using standard "printf" format 521fe9b927eSVaclav Hapla - arg1, arg2, ... - arguments of the format 522e94e781bSJacob Faibussowitsch 523e94e781bSJacob Faibussowitsch Notes: 524fe9b927eSVaclav Hapla PetscInfo() prints only from the first processor in the communicator of obj. 525fe9b927eSVaclav Hapla If obj is NULL, the PETSC_COMM_SELF communicator is used, i.e. every rank of PETSC_COMM_WORLD prints the message. 526fe9b927eSVaclav Hapla 527fe9b927eSVaclav Hapla Extent of the printed messages can be controlled using the option database key -info as follows. 528fe9b927eSVaclav Hapla 529fe9b927eSVaclav Hapla $ -info [filename][:[~]<list,of,classnames>[:[~]self]] 530fe9b927eSVaclav Hapla 531fe9b927eSVaclav Hapla No filename means standard output PETSC_STDOUT is used. 532fe9b927eSVaclav Hapla 533fe9b927eSVaclav Hapla The optional <list,of,classnames> is a comma separated list of enabled classes, e.g. vec,mat,ksp. 534fe9b927eSVaclav Hapla If this list is not specified, all classes are enabled. 535fe9b927eSVaclav Hapla Prepending the list with ~ means inverted selection, i.e. all classes except the listed are enabled. 536fe9b927eSVaclav Hapla A special classname sys relates to PetscInfo() with obj being NULL. 537fe9b927eSVaclav Hapla 538fe9b927eSVaclav Hapla 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. 539fe9b927eSVaclav Hapla 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. 540fe9b927eSVaclav Hapla 541fe9b927eSVaclav Hapla All classname/self matching is case insensitive. Filename is case sensitive. 542fe9b927eSVaclav Hapla 543fe9b927eSVaclav Hapla Example of Usage: 544fe9b927eSVaclav Hapla $ Mat A; 545fe9b927eSVaclav Hapla $ PetscInt alpha; 546fe9b927eSVaclav Hapla $ ... 547fe9b927eSVaclav Hapla $ PetscInfo1(A,"Matrix uses parameter alpha=%D\n",alpha); 548fe9b927eSVaclav Hapla 549fe9b927eSVaclav Hapla Options Examples: 550fe9b927eSVaclav Hapla Each call of the form 551fe9b927eSVaclav Hapla $ PetscInfo(obj, msg); 552fe9b927eSVaclav Hapla $ PetscInfo1(obj, msg, arg1); 553fe9b927eSVaclav Hapla $ PetscInfo2(obj, msg, arg1, arg2); 554fe9b927eSVaclav Hapla is evaluated as follows. 555fe9b927eSVaclav Hapla $ -info or -info :: prints msg to PETSC_STDOUT, for any obj regardless class or communicator 556fe9b927eSVaclav Hapla $ -info :mat:self prints msg to PETSC_STDOUT only if class of obj is Mat, and its communicator has size = 1 557fe9b927eSVaclav 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 558fe9b927eSVaclav Hapla $ -info :sys prints to PETSC_STDOUT only if obj is NULL 559fe9b927eSVaclav Hapla Note that 560fe9b927eSVaclav Hapla $ -info :sys:~self 561fe9b927eSVaclav Hapla deactivates all info messages because sys means obj = NULL which implies PETSC_COMM_SELF but ~self filters out everything on PETSC_COMM_SELF. 562fe9b927eSVaclav Hapla 563fe9b927eSVaclav Hapla Fortran Note: 564fe9b927eSVaclav Hapla This function does not take the obj argument, there is only the PetscInfo() 565fe9b927eSVaclav Hapla version, not PetscInfo1() etc. 5665c6c1daeSBarry Smith 5675c6c1daeSBarry Smith Level: intermediate 5685c6c1daeSBarry Smith 569e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions() 5705c6c1daeSBarry Smith M*/ 571fe9b927eSVaclav Hapla PetscErrorCode PetscInfo_Private(const char func[],PetscObject obj, const char message[], ...) 5725c6c1daeSBarry Smith { 5735c6c1daeSBarry Smith va_list Argp; 574e94e781bSJacob Faibussowitsch PetscMPIInt rank = 0,urank,size = 1; 575fa2bb9feSLisandro Dalcin PetscClassId classid; 576e94e781bSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE, oldflag; 5775c6c1daeSBarry Smith char string[8*1024]; 5785c6c1daeSBarry Smith PetscErrorCode ierr; 579e94e781bSJacob Faibussowitsch size_t fullLength,len; 5805c6c1daeSBarry Smith int err; 5815c6c1daeSBarry Smith 5825c6c1daeSBarry Smith PetscFunctionBegin; 583940d77c0SToby Isaac if (obj) PetscValidHeader(obj,2); 584fa2bb9feSLisandro Dalcin classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID; 585e94e781bSJacob Faibussowitsch ierr = PetscInfoEnabled(classid, &enabled);CHKERRQ(ierr); 586e94e781bSJacob Faibussowitsch if (!enabled) PetscFunctionReturn(0); 587e94e781bSJacob Faibussowitsch PetscValidCharPointer(message,3); 588e94e781bSJacob Faibussowitsch if (obj) { 589e94e781bSJacob Faibussowitsch ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr); 590e94e781bSJacob Faibussowitsch ierr = MPI_Comm_size(obj->comm, &size);CHKERRQ(ierr); 591e94e781bSJacob Faibussowitsch } 592e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */ 5935c6c1daeSBarry Smith if (rank) PetscFunctionReturn(0); 594e94e781bSJacob Faibussowitsch if (!PetscInfoCommFilter && (size < 2)) { 595e94e781bSJacob Faibussowitsch /* If no self printing is allowed, and size too small get out */ 596e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 597e94e781bSJacob Faibussowitsch } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) { 598e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */ 599e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 600e94e781bSJacob Faibussowitsch } 601e94e781bSJacob Faibussowitsch /* Mute info messages within this function */ 602e94e781bSJacob Faibussowitsch oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE; 6035c6c1daeSBarry Smith ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr); 6045c6c1daeSBarry Smith va_start(Argp, message); 6055c6c1daeSBarry Smith sprintf(string, "[%d] %s(): ",urank,func); 6065c6c1daeSBarry Smith ierr = PetscStrlen(string, &len);CHKERRQ(ierr); 607a2ea699eSBarry Smith ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);CHKERRQ(ierr); 6085c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr); 6095c6c1daeSBarry Smith err = fflush(PetscInfoFile); 6105c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6115c6c1daeSBarry Smith if (petsc_history) { 6125c6c1daeSBarry Smith va_start(Argp, message); 613a2ea699eSBarry Smith ierr = (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr); 6145c6c1daeSBarry Smith } 6155c6c1daeSBarry Smith va_end(Argp); 616e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 6175c6c1daeSBarry Smith PetscFunctionReturn(0); 6185c6c1daeSBarry Smith } 619