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}; 20e94e781bSJacob Faibussowitsch static PetscBool PetscInfoClassnamesLocked = PETSC_FALSE, PetscInfoInvertClasses = 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}; 35e94e781bSJacob Faibussowitsch PetscBool PetscLogPrintInfo = PETSC_FALSE, PetscInfoSetUp = 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 53e94e781bSJacob Faibussowitsch Level: beginner 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 /*@ 68e94e781bSJacob Faibussowitsch PetscInfoAllow - Causes PetscInfo() messages to be printed to PetscInfoFile 695c6c1daeSBarry Smith 705c6c1daeSBarry Smith Not Collective, each processor may call this separately, but printing is only 715c6c1daeSBarry Smith turned on if the lowest processor number associated with the PetscObject associated 725c6c1daeSBarry Smith with the call to PetscInfo() has called this routine. 735c6c1daeSBarry Smith 745c6c1daeSBarry Smith Input Parameter: 75e94e781bSJacob Faibussowitsch . flag - PETSC_TRUE or PETSC_FALSE 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith Level: advanced 785c6c1daeSBarry Smith 79e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoEnabled(), PetscInfoGetInfo(), PetscInfoSetFromOptions() 805c6c1daeSBarry Smith @*/ 81e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag) 82e94e781bSJacob Faibussowitsch { 83e94e781bSJacob Faibussowitsch PetscFunctionBegin; 84e94e781bSJacob Faibussowitsch PetscLogPrintInfo = flag; 85e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 86e94e781bSJacob Faibussowitsch } 87e94e781bSJacob Faibussowitsch 88e94e781bSJacob Faibussowitsch /*@C 89e94e781bSJacob Faibussowitsch PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls (i.e. set PetscInfoFile) 90e94e781bSJacob Faibussowitsch 91e94e781bSJacob Faibussowitsch Not Collective, any processor which has not called this routine will print to PETSC_SDOUT. 92e94e781bSJacob Faibussowitsch 93e94e781bSJacob Faibussowitsch Input Parameter: 94e94e781bSJacob Faibussowitsch + filename - Name of the file where PetscInfo() will print to 95e94e781bSJacob Faibussowitsch - mode - Write mode passed to PetscFOpen() 96e94e781bSJacob Faibussowitsch 97e94e781bSJacob Faibussowitsch Notes: 98e94e781bSJacob Faibussowitsch By default PetscInfo() writes to PETSC_STDOUT. Use "stdout" or NULL to set PetscInfo() to write to stdout 99e94e781bSJacob Faibussowitsch 100e94e781bSJacob Faibussowitsch Level: advanced 101e94e781bSJacob Faibussowitsch 102e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscFOpen() 103e94e781bSJacob Faibussowitsch @*/ 104e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFile(const char filename[], const char mode[]) 1055c6c1daeSBarry Smith { 106fa2bb9feSLisandro Dalcin char fname[PETSC_MAX_PATH_LEN], tname[11]; 1075c6c1daeSBarry Smith PetscMPIInt rank; 1085c6c1daeSBarry Smith PetscErrorCode ierr; 1095c6c1daeSBarry Smith 1105c6c1daeSBarry Smith PetscFunctionBegin; 111e94e781bSJacob Faibussowitsch if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT; 112e94e781bSJacob Faibussowitsch ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr); 113e94e781bSJacob Faibussowitsch if (filename) { 114e94e781bSJacob Faibussowitsch PetscBool oldflag; 115e94e781bSJacob Faibussowitsch PetscValidCharPointer(filename, 1); 1165c6c1daeSBarry Smith ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr); 117e94e781bSJacob Faibussowitsch ierr = PetscStrallocpy(fname, &PetscInfoFilename);CHKERRQ(ierr); 118e94e781bSJacob Faibussowitsch ierr = MPI_Comm_rank(MPI_COMM_WORLD, &rank);CHKERRQ(ierr); 1195c6c1daeSBarry Smith sprintf(tname, ".%d", rank); 1205c6c1daeSBarry Smith ierr = PetscStrcat(fname, tname);CHKERRQ(ierr); 121e94e781bSJacob Faibussowitsch oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE; 122e94e781bSJacob Faibussowitsch ierr = PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile);CHKERRQ(ierr); 123e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 124e94e781bSJacob Faibussowitsch /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and 125e94e781bSJacob Faibussowitsch call it afterwards so that it actually writes to file */ 126e94e781bSJacob Faibussowitsch ierr = PetscInfo1(NULL, "Opened PetscInfo file %s\n", fname);CHKERRQ(ierr); 127e94e781bSJacob Faibussowitsch } 128e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 129e94e781bSJacob Faibussowitsch } 130a297a907SKarl Rupp 131e94e781bSJacob Faibussowitsch /*@C 132e94e781bSJacob Faibussowitsch PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to 133e94e781bSJacob Faibussowitsch 134e94e781bSJacob Faibussowitsch Not Collective 135e94e781bSJacob Faibussowitsch 136e94e781bSJacob Faibussowitsch Output Parameters: 137e94e781bSJacob Faibussowitsch + filename - The name of the output file 138e94e781bSJacob Faibussowitsch - InfoFile - The FILE pointer for the output file 139e94e781bSJacob Faibussowitsch 140e94e781bSJacob Faibussowitsch Level: advanced 141e94e781bSJacob Faibussowitsch 142e94e781bSJacob Faibussowitsch Note: 143e94e781bSJacob Faibussowitsch This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is 144e94e781bSJacob Faibussowitsch therefore responsible for freeing the allocated filename pointer afterwards. 145e94e781bSJacob Faibussowitsch 146e94e781bSJacob Faibussowitsch Fortran Note: 147e94e781bSJacob Faibussowitsch This routine is not supported in Fortran. 148e94e781bSJacob Faibussowitsch 149e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy() 150e94e781bSJacob Faibussowitsch @*/ 151e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) 152e94e781bSJacob Faibussowitsch { 153e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 154e94e781bSJacob Faibussowitsch 155e94e781bSJacob Faibussowitsch PetscFunctionBegin; 156e94e781bSJacob Faibussowitsch PetscValidPointer(filename, 1); 157e94e781bSJacob Faibussowitsch PetscValidPointer(InfoFile, 2); 158e94e781bSJacob Faibussowitsch ierr = PetscStrallocpy(PetscInfoFilename, filename);CHKERRQ(ierr); 159e94e781bSJacob Faibussowitsch *InfoFile = PetscInfoFile; 160e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 161e94e781bSJacob Faibussowitsch } 162e94e781bSJacob Faibussowitsch 163e94e781bSJacob Faibussowitsch /*@C 164e94e781bSJacob Faibussowitsch PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against 165e94e781bSJacob Faibussowitsch 166e94e781bSJacob Faibussowitsch Not Collective 167e94e781bSJacob Faibussowitsch 168e94e781bSJacob Faibussowitsch Input Parameters: 169e94e781bSJacob Faibussowitsch + exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that 170e94e781bSJacob Faibussowitsch is NOT one of the classes specified 171e94e781bSJacob Faibussowitsch . N - Number of classes to filter for (size of classnames) 172e94e781bSJacob Faibussowitsch - classnames - String array containing the names of classes to filter for, e.g. "vec" 173e94e781bSJacob Faibussowitsch 174e94e781bSJacob Faibussowitsch Notes: 175e94e781bSJacob Faibussowitsch Not for use in Fortran 176e94e781bSJacob Faibussowitsch 177e94e781bSJacob Faibussowitsch This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called. 178e94e781bSJacob Faibussowitsch 179e94e781bSJacob Faibussowitsch Names in the classnames list should correspond to the names returned by PetscObjectGetClassName(). 180e94e781bSJacob Faibussowitsch 181e94e781bSJacob Faibussowitsch This function only sets the list of class names. 182e94e781bSJacob Faibussowitsch The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away. 183e94e781bSJacob Faibussowitsch The reason for this is that we need to set the list of included/excluded classes before their classids are known. 184e94e781bSJacob Faibussowitsch Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()). 185e94e781bSJacob Faibussowitsch 186e94e781bSJacob Faibussowitsch Level: developer 187e94e781bSJacob Faibussowitsch 188e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName() 189e94e781bSJacob Faibussowitsch @*/ 190e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames) 191e94e781bSJacob Faibussowitsch { 192e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 193e94e781bSJacob Faibussowitsch 194e94e781bSJacob Faibussowitsch PetscFunctionBegin; 195e94e781bSJacob Faibussowitsch if (PetscInfoClassnamesLocked) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()"); 196e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr); 197e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames);CHKERRQ(ierr); 198e94e781bSJacob Faibussowitsch PetscInfoNumClasses = N; 199e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = exclude; 200e94e781bSJacob Faibussowitsch { 201e94e781bSJacob Faibussowitsch /* Process sys class right away */ 202e94e781bSJacob Faibussowitsch PetscClassId sysclassid = PETSC_SMALLEST_CLASSID; 203e94e781bSJacob Faibussowitsch ierr = PetscInfoProcessClass("sys", 1, &sysclassid);CHKERRQ(ierr); 204e94e781bSJacob Faibussowitsch } 205e94e781bSJacob Faibussowitsch PetscInfoSetUp = PETSC_TRUE; 206e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 207e94e781bSJacob Faibussowitsch } 208e94e781bSJacob Faibussowitsch 209e94e781bSJacob Faibussowitsch /*@C 210e94e781bSJacob Faibussowitsch PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses() 211e94e781bSJacob Faibussowitsch 212e94e781bSJacob Faibussowitsch Not Collective 213e94e781bSJacob Faibussowitsch 214e94e781bSJacob Faibussowitsch Input Paramater: 215e94e781bSJacob Faibussowitsch . classname - Name of the class to search for 216e94e781bSJacob Faibussowitsch 217e94e781bSJacob Faibussowitsch Output Parameter: 218e94e781bSJacob Faibussowitsch . found - PetscBool indicating whether the classname was found 219e94e781bSJacob Faibussowitsch 220e94e781bSJacob Faibussowitsch Notes: 221e94e781bSJacob Faibussowitsch Use PetscObjectGetName() to retrieve an appropriate classname 222e94e781bSJacob Faibussowitsch 223e94e781bSJacob Faibussowitsch Level: developer 224e94e781bSJacob Faibussowitsch 225e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName() 226e94e781bSJacob Faibussowitsch @*/ 227e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) 228e94e781bSJacob Faibussowitsch { 229e94e781bSJacob Faibussowitsch PetscInt idx; 230e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 231e94e781bSJacob Faibussowitsch 232e94e781bSJacob Faibussowitsch PetscFunctionBegin; 233e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname,1); 234e94e781bSJacob Faibussowitsch ierr = PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found);CHKERRQ(ierr); 235e94e781bSJacob Faibussowitsch PetscInfoClassnamesLocked = PETSC_TRUE; 236e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 237e94e781bSJacob Faibussowitsch } 238e94e781bSJacob Faibussowitsch 239e94e781bSJacob Faibussowitsch /*@ 240e94e781bSJacob Faibussowitsch PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo() 241e94e781bSJacob Faibussowitsch 242e94e781bSJacob Faibussowitsch Not Collective 243e94e781bSJacob Faibussowitsch 244e94e781bSJacob Faibussowitsch Output Parameters: 245e94e781bSJacob Faibussowitsch + infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called 246e94e781bSJacob Faibussowitsch . exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted 247e94e781bSJacob Faibussowitsch . locked - PETSC_TRUE if the list of classes to filter for has been locked 248e94e781bSJacob Faibussowitsch - commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all 249e94e781bSJacob Faibussowitsch communicators 250e94e781bSJacob Faibussowitsch 251e94e781bSJacob Faibussowitsch Notes: 252e94e781bSJacob Faibussowitsch Initially commSelfFlag = PETSC_INFO_COMM_ALL 253e94e781bSJacob Faibussowitsch 254e94e781bSJacob Faibussowitsch Level: beginner 255e94e781bSJacob Faibussowitsch 256e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions() 257e94e781bSJacob Faibussowitsch @*/ 258e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *setup, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) 259e94e781bSJacob Faibussowitsch { 260e94e781bSJacob Faibussowitsch PetscFunctionBegin; 261e94e781bSJacob Faibussowitsch if (infoEnabled) *infoEnabled = PetscLogPrintInfo; 262e94e781bSJacob Faibussowitsch if (setup) *setup = PetscInfoSetUp; 263e94e781bSJacob Faibussowitsch if (exclude) *exclude = PetscInfoInvertClasses; 264e94e781bSJacob Faibussowitsch if (locked) *locked = PetscInfoClassnamesLocked; 265e94e781bSJacob Faibussowitsch if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter; 266e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 267e94e781bSJacob Faibussowitsch } 268e94e781bSJacob Faibussowitsch 269e94e781bSJacob Faibussowitsch /*@C 270e94e781bSJacob Faibussowitsch PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo() 271e94e781bSJacob Faibussowitsch 272e94e781bSJacob Faibussowitsch Not Collective 273e94e781bSJacob Faibussowitsch 274e94e781bSJacob Faibussowitsch Input Parameters: 275e94e781bSJacob Faibussowitsch + classname - Name of the class to activate/deactivate PetscInfo() for 276e94e781bSJacob Faibussowitsch . numClassID - Number of entries in classIDs 277e94e781bSJacob Faibussowitsch - classIDs - Array containing all of the PetscClassids associated with classname 278e94e781bSJacob Faibussowitsch 279e94e781bSJacob Faibussowitsch Note: This function contains the deprecation warning for -info_exclude 280e94e781bSJacob Faibussowitsch 281e94e781bSJacob Faibussowitsch Level: developer 282e94e781bSJacob Faibussowitsch 283e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions() 284e94e781bSJacob Faibussowitsch @*/ 285e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[]) 286e94e781bSJacob Faibussowitsch { 287e94e781bSJacob Faibussowitsch PetscInt i; 288e94e781bSJacob Faibussowitsch PetscBool enabled, exclude, found, opt, pkg; 289e94e781bSJacob Faibussowitsch char logList[256]; 290e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 291e94e781bSJacob Faibussowitsch 292e94e781bSJacob Faibussowitsch PetscFunctionBegin; 293e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 294e94e781bSJacob Faibussowitsch ierr = PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL);CHKERRQ(ierr); 295e94e781bSJacob Faibussowitsch /* -info_exclude is DEPRECATED */ 296e94e781bSJacob Faibussowitsch ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 297e94e781bSJacob Faibussowitsch if (opt) { 298e94e781bSJacob Faibussowitsch ierr = PetscStrInList(classname,logList,',',&pkg);CHKERRQ(ierr); 299e94e781bSJacob Faibussowitsch if (pkg) { 300e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 301e94e781bSJacob Faibussowitsch ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr); 302e94e781bSJacob Faibussowitsch } 303e94e781bSJacob Faibussowitsch } 304e94e781bSJacob Faibussowitsch } 305e94e781bSJacob Faibussowitsch ierr = PetscInfoGetClass(classname, &found);CHKERRQ(ierr); 306e94e781bSJacob Faibussowitsch if ((found && exclude) || (!found && !exclude)) { 307e94e781bSJacob Faibussowitsch if (PetscInfoNumClasses > 0) { 308e94e781bSJacob Faibussowitsch /* Check if -info was called empty */ 309e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 310e94e781bSJacob Faibussowitsch ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr); 311e94e781bSJacob Faibussowitsch } 312e94e781bSJacob Faibussowitsch } 313e94e781bSJacob Faibussowitsch } else { 314e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 315e94e781bSJacob Faibussowitsch ierr = PetscInfoActivateClass(classIDs[i]);CHKERRQ(ierr); 316e94e781bSJacob Faibussowitsch } 317e94e781bSJacob Faibussowitsch } 318e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 319e94e781bSJacob Faibussowitsch } 320e94e781bSJacob Faibussowitsch 321e94e781bSJacob Faibussowitsch /*@ 322e94e781bSJacob Faibussowitsch PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo() 323e94e781bSJacob Faibussowitsch 324e94e781bSJacob Faibussowitsch Not Collective 325e94e781bSJacob Faibussowitsch 326e94e781bSJacob Faibussowitsch Input Parameter: 327e94e781bSJacob Faibussowitsch . commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator 328e94e781bSJacob Faibussowitsch of the object calling PetscInfo() 329e94e781bSJacob Faibussowitsch 330e94e781bSJacob Faibussowitsch Level: developer 331e94e781bSJacob Faibussowitsch 332e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo() 333e94e781bSJacob Faibussowitsch @*/ 334e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) 335e94e781bSJacob Faibussowitsch { 336e94e781bSJacob Faibussowitsch PetscFunctionBegin; 337e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag; 338e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 339e94e781bSJacob Faibussowitsch } 340e94e781bSJacob Faibussowitsch 341e94e781bSJacob Faibussowitsch /*@ 342e94e781bSJacob Faibussowitsch PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to 343e94e781bSJacob Faibussowitsch PetscInfo() 344e94e781bSJacob Faibussowitsch 345e94e781bSJacob Faibussowitsch Not Collective 346e94e781bSJacob Faibussowitsch 347e94e781bSJacob Faibussowitsch Input Parameter: 348e94e781bSJacob Faibussowitsch . options - Options database, use NULL for default global database 349e94e781bSJacob Faibussowitsch 350e94e781bSJacob Faibussowitsch Options Database Key: 351e94e781bSJacob Faibussowitsch $ -info [optional filename][:[~]optional list,of,classnames][:[~]optional "self"] 352e94e781bSJacob Faibussowitsch 353e94e781bSJacob Faibussowitsch Notes: 354e94e781bSJacob Faibussowitsch PetscInfo() defaults: 355e94e781bSJacob Faibussowitsch $ [optional filename] defaults to write output to PETSC_STDOUT 356e94e781bSJacob Faibussowitsch $ [optional list,of,classnames] defaults to enabling all classes 357e94e781bSJacob Faibussowitsch $ [optional "self"] default is that any communicator is allowed to print (albeit with the caveat that only the first rank on that communicator will print). 358e94e781bSJacob Faibussowitsch 359e94e781bSJacob Faibussowitsch Prepend `~` to first classname or "self" to invert either selection, i.e. -info :~ts,snes:~self will activate 360e94e781bSJacob Faibussowitsch every PetscInfo() call on a communicator with size > 1, associated with TS or SNES objects. Note that command line options 361e94e781bSJacob Faibussowitsch will also silence any user-written calls to PetscInfo() if an object which is filtered for is passed as the PetscObject 362e94e781bSJacob Faibussowitsch argument to PetscInfo(). To filter for PetscInfo() calls not directly associated with an object (i.e. where *vobj == 363e94e781bSJacob Faibussowitsch NULL), use "sys". 364e94e781bSJacob Faibussowitsch 365e94e781bSJacob Faibussowitsch All classname/self matching is case insensitive. Filename IS case sensitive. 366e94e781bSJacob Faibussowitsch 367e94e781bSJacob Faibussowitsch Example: 368e94e781bSJacob Faibussowitsch $ -info :: OR -info will print to PETSC_STDOUT, print for ALL classes, and print for ALL communicator sizes 369e94e781bSJacob Faibussowitsch $ -info :mat:self will print to PETSC_STDOUT, print ONLY PetscInfo() calls associated to Mat objects, whose communicators are of 370e94e781bSJacob Faibussowitsch size = 1 371e94e781bSJacob Faibussowitsch $ -info myInfoFileName:~vec:~self will create and print to ./myInfoFileName, print all PetscInfo() calls NOT associated 372e94e781bSJacob Faibussowitsch with Vec Objects, whose communicators are of size > 1 373e94e781bSJacob Faibussowitsch 374e94e781bSJacob Faibussowitsch Level: beginner 375e94e781bSJacob Faibussowitsch 376e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy() 377e94e781bSJacob Faibussowitsch @*/ 378e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) 379e94e781bSJacob Faibussowitsch { 380e94e781bSJacob Faibussowitsch PetscToken tok; 381e94e781bSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL; 382e94e781bSJacob Faibussowitsch char **loc1_array = NULL; 383e94e781bSJacob Faibussowitsch PetscBool set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE; 384e94e781bSJacob Faibussowitsch size_t size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0; 385e94e781bSJacob Faibussowitsch int nLoc1_ = 0; 386e94e781bSJacob Faibussowitsch PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL; 387e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 388e94e781bSJacob Faibussowitsch 389e94e781bSJacob Faibussowitsch PetscFunctionBegin; 390e94e781bSJacob Faibussowitsch ierr = PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead");CHKERRQ(ierr); 391e94e781bSJacob Faibussowitsch ierr = PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_MAX_PATH_LEN, &set);CHKERRQ(ierr); 392e94e781bSJacob Faibussowitsch if (set) { 393e94e781bSJacob Faibussowitsch /* Allow sys class to be processed as part of setup */ 394e94e781bSJacob Faibussowitsch PetscInfoSetUp = PETSC_TRUE; 395e94e781bSJacob Faibussowitsch ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr); 396e94e781bSJacob Faibussowitsch ierr = PetscTokenCreate(optstring, ':', &tok);CHKERRQ(ierr); 397e94e781bSJacob Faibussowitsch ierr = PetscTokenFind(tok, &loc0_);CHKERRQ(ierr); 398e94e781bSJacob Faibussowitsch ierr = PetscTokenFind(tok, &loc1_);CHKERRQ(ierr); 399e94e781bSJacob Faibussowitsch ierr = PetscTokenFind(tok, &loc2_);CHKERRQ(ierr); 400e94e781bSJacob Faibussowitsch if (loc1_) { 401e94e781bSJacob Faibussowitsch ierr = PetscStrcmp("self", (const char *) loc1_, &foundSelf);CHKERRQ(ierr); 402e94e781bSJacob Faibussowitsch if (foundSelf) { 403e94e781bSJacob Faibussowitsch /* side effect of PetscTokenFind() if tokens are next to each other, i.e. str="foo::bar", instead of "foo" "" "bar", returns "foo" "bar" "NULL" */ 404e94e781bSJacob Faibussowitsch loc2_ = loc1_; 405e94e781bSJacob Faibussowitsch loc1_ = NULL; 406e94e781bSJacob Faibussowitsch } else { 407e94e781bSJacob Faibussowitsch if (*loc1_ == '~') { 408e94e781bSJacob Faibussowitsch loc1_invert = PETSC_TRUE; 409e94e781bSJacob Faibussowitsch ++loc1_; 410e94e781bSJacob Faibussowitsch } 411e94e781bSJacob Faibussowitsch } 412e94e781bSJacob Faibussowitsch } 413e94e781bSJacob Faibussowitsch if (loc2_) { 414e94e781bSJacob Faibussowitsch if (*loc2_ == '~') { 415e94e781bSJacob Faibussowitsch loc2_invert = PETSC_TRUE; 416e94e781bSJacob Faibussowitsch ++loc2_; 417e94e781bSJacob Faibussowitsch } 418e94e781bSJacob Faibussowitsch } 419e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc0_, &size_loc0_);CHKERRQ(ierr); 420e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc1_, &size_loc1_);CHKERRQ(ierr); 421e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc2_, &size_loc2_);CHKERRQ(ierr); 422e94e781bSJacob Faibussowitsch if (size_loc1_) { 423e94e781bSJacob Faibussowitsch ierr = PetscStrtolower(loc1_);CHKERRQ(ierr); 424e94e781bSJacob Faibussowitsch ierr = PetscStrToArray((const char *) loc1_, ',',(int *) &nLoc1_, &loc1_array);CHKERRQ(ierr); 425e94e781bSJacob Faibussowitsch } 426e94e781bSJacob Faibussowitsch if (size_loc2_) { 427e94e781bSJacob Faibussowitsch ierr = PetscStrtolower(loc2_);CHKERRQ(ierr); 428e94e781bSJacob Faibussowitsch ierr = PetscStrcmp("self", (const char *) loc2_, &foundSelf);CHKERRQ(ierr); 429e94e781bSJacob Faibussowitsch if (foundSelf) { 430e94e781bSJacob Faibussowitsch if (loc2_invert) { 431e94e781bSJacob Faibussowitsch commSelfFlag = PETSC_INFO_COMM_NO_SELF; 432e94e781bSJacob Faibussowitsch } else { 433e94e781bSJacob Faibussowitsch commSelfFlag = PETSC_INFO_COMM_ONLY_SELF; 434e94e781bSJacob Faibussowitsch } 435e94e781bSJacob Faibussowitsch } 436e94e781bSJacob Faibussowitsch } 437e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFile((const char *) size_loc0_ ? loc0_ : NULL, "w");CHKERRQ(ierr); 438e94e781bSJacob Faibussowitsch ierr = PetscInfoSetClasses(loc1_invert,(PetscInt) nLoc1_, (const char *const *) loc1_array);CHKERRQ(ierr); 439e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFilterCommSelf(commSelfFlag);CHKERRQ(ierr); 440e94e781bSJacob Faibussowitsch ierr = PetscStrToArrayDestroy(nLoc1_, loc1_array);CHKERRQ(ierr); 441e94e781bSJacob Faibussowitsch ierr = PetscTokenDestroy(&tok);CHKERRQ(ierr); 442e94e781bSJacob Faibussowitsch } 443e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 444e94e781bSJacob Faibussowitsch } 445e94e781bSJacob Faibussowitsch 446e94e781bSJacob Faibussowitsch /*@ 447e94e781bSJacob Faibussowitsch PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures. 448e94e781bSJacob Faibussowitsch 449e94e781bSJacob Faibussowitsch Not Collective 450e94e781bSJacob Faibussowitsch 451e94e781bSJacob Faibussowitsch Notes: 452e94e781bSJacob Faibussowitsch This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent 453e94e781bSJacob Faibussowitsch PetscInfo() calls down the line. 454e94e781bSJacob Faibussowitsch 455*6c877ef6SSatish Balay Level: intermediate 456*6c877ef6SSatish Balay 457e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions() 458e94e781bSJacob Faibussowitsch @*/ 459e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void) 460e94e781bSJacob Faibussowitsch { 461e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 462e94e781bSJacob Faibussowitsch int err; 463e94e781bSJacob Faibussowitsch 464e94e781bSJacob Faibussowitsch PetscFunctionBegin; 465e94e781bSJacob Faibussowitsch ierr = PetscInfoAllow(PETSC_FALSE);CHKERRQ(ierr); 466e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr); 467e94e781bSJacob Faibussowitsch err = fflush(PetscInfoFile); 468e94e781bSJacob Faibussowitsch if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 469e94e781bSJacob Faibussowitsch if (PetscInfoFilename) { 470e94e781bSJacob Faibussowitsch ierr = PetscFClose(MPI_COMM_SELF, PetscInfoFile);CHKERRQ(ierr); 471e94e781bSJacob Faibussowitsch } 472e94e781bSJacob Faibussowitsch ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr); 473e94e781bSJacob Faibussowitsch memset(PetscInfoFlags, 1, (size_t) 160*sizeof(PetscInfoFlags[0])); 474e94e781bSJacob Faibussowitsch PetscInfoClassnamesLocked = PETSC_FALSE; 475e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE; 476e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1; 477e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 478e94e781bSJacob Faibussowitsch PetscInfoSetUp = PETSC_FALSE; 4795c6c1daeSBarry Smith PetscFunctionReturn(0); 4805c6c1daeSBarry Smith } 4815c6c1daeSBarry Smith 4825c6c1daeSBarry Smith /*@ 483fa2bb9feSLisandro Dalcin PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class. 4845c6c1daeSBarry Smith 4855c6c1daeSBarry Smith Not Collective 4865c6c1daeSBarry Smith 4875c6c1daeSBarry Smith Input Parameter: 488fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 4895c6c1daeSBarry Smith 4905c6c1daeSBarry Smith Notes: 4915c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 4925c6c1daeSBarry Smith 4935c6c1daeSBarry Smith Level: developer 4945c6c1daeSBarry Smith 495e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions() 4965c6c1daeSBarry Smith @*/ 497fa2bb9feSLisandro Dalcin PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) 4985c6c1daeSBarry Smith { 4995c6c1daeSBarry Smith PetscFunctionBegin; 500fa2bb9feSLisandro Dalcin if (!classid) classid = PETSC_SMALLEST_CLASSID; 501fa2bb9feSLisandro Dalcin PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0; 5025c6c1daeSBarry Smith PetscFunctionReturn(0); 5035c6c1daeSBarry Smith } 5045c6c1daeSBarry Smith 5055c6c1daeSBarry Smith /*@ 506fa2bb9feSLisandro Dalcin PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class. 5075c6c1daeSBarry Smith 5085c6c1daeSBarry Smith Not Collective 5095c6c1daeSBarry Smith 5105c6c1daeSBarry Smith Input Parameter: 511fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 5125c6c1daeSBarry Smith 5135c6c1daeSBarry Smith Notes: 5145c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 5155c6c1daeSBarry Smith 5165c6c1daeSBarry Smith Level: developer 5175c6c1daeSBarry Smith 518e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions() 5195c6c1daeSBarry Smith @*/ 520fa2bb9feSLisandro Dalcin PetscErrorCode PetscInfoActivateClass(PetscClassId classid) 5215c6c1daeSBarry Smith { 5225c6c1daeSBarry Smith PetscFunctionBegin; 523fa2bb9feSLisandro Dalcin if (!classid) classid = PETSC_SMALLEST_CLASSID; 524fa2bb9feSLisandro Dalcin PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1; 5255c6c1daeSBarry Smith PetscFunctionReturn(0); 5265c6c1daeSBarry Smith } 5275c6c1daeSBarry Smith 5285c6c1daeSBarry Smith /* 5295c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 5305c6c1daeSBarry Smith messages are also printed to the history file, called by default 5315c6c1daeSBarry Smith .petschistory in ones home directory. 5325c6c1daeSBarry Smith */ 53395c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 5345c6c1daeSBarry Smith 5355c6c1daeSBarry Smith /*MC 536e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data 5375c6c1daeSBarry Smith 5385c6c1daeSBarry Smith Synopsis: 539aaa7dc30SBarry Smith #include <petscsys.h> 5405c6c1daeSBarry Smith PetscErrorCode PetscInfo(void *vobj, const char message[]) 5415c6c1daeSBarry Smith PetscErrorCode PetscInfo1(void *vobj, const char formatmessage[],arg1) 5425c6c1daeSBarry Smith PetscErrorCode PetscInfo2(void *vobj, const char formatmessage[],arg1,arg2) 5435c6c1daeSBarry Smith etc 5445c6c1daeSBarry Smith 5455c6c1daeSBarry Smith Collective over PetscObject argument 5465c6c1daeSBarry Smith 5475c6c1daeSBarry Smith Input Parameter: 5480298fd71SBarry Smith + vobj - object most closely associated with the logging statement or NULL 5495c6c1daeSBarry Smith . message - logging message 5505c6c1daeSBarry Smith - formatmessage - logging message using standard "printf" format 5515c6c1daeSBarry Smith 5525c6c1daeSBarry Smith Options Database Key: 553e94e781bSJacob Faibussowitsch $ -info [optional filename][:[~]optional list,of,classnames][:[~]optional "self"] 554e94e781bSJacob Faibussowitsch 555e94e781bSJacob Faibussowitsch Notes: 556e94e781bSJacob Faibussowitsch For complete explanation of options database keys see PetscInfoSetFromOptions(). 5575c6c1daeSBarry Smith 5585c6c1daeSBarry Smith Level: intermediate 5595c6c1daeSBarry Smith 5605c6c1daeSBarry Smith Fortran Note: This function does not take the vobj argument, there is only the PetscInfo() 5615c6c1daeSBarry Smith version, not PetscInfo1() etc. 5625c6c1daeSBarry Smith 5635c6c1daeSBarry Smith Example of Usage: 5645c6c1daeSBarry Smith $ 5655c6c1daeSBarry Smith $ Mat A 5665c6c1daeSBarry Smith $ double alpha 5675c6c1daeSBarry Smith $ PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha); 5685c6c1daeSBarry Smith $ 5695c6c1daeSBarry Smith 570e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions() 5715c6c1daeSBarry Smith M*/ 5725c6c1daeSBarry Smith PetscErrorCode PetscInfo_Private(const char func[],void *vobj, const char message[], ...) 5735c6c1daeSBarry Smith { 5745c6c1daeSBarry Smith va_list Argp; 575e94e781bSJacob Faibussowitsch PetscMPIInt rank = 0,urank,size = 1; 5765c6c1daeSBarry Smith PetscObject obj = (PetscObject)vobj; 577fa2bb9feSLisandro Dalcin PetscClassId classid; 578e94e781bSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE, oldflag; 5795c6c1daeSBarry Smith char string[8*1024]; 5805c6c1daeSBarry Smith PetscErrorCode ierr; 581e94e781bSJacob Faibussowitsch size_t fullLength,len; 5825c6c1daeSBarry Smith int err; 5835c6c1daeSBarry Smith 5845c6c1daeSBarry Smith PetscFunctionBegin; 585940d77c0SToby Isaac if (obj) PetscValidHeader(obj,2); 586fa2bb9feSLisandro Dalcin classid = obj ? obj->classid : PETSC_SMALLEST_CLASSID; 587e94e781bSJacob Faibussowitsch ierr = PetscInfoEnabled(classid, &enabled);CHKERRQ(ierr); 588e94e781bSJacob Faibussowitsch if (!enabled) PetscFunctionReturn(0); 589e94e781bSJacob Faibussowitsch PetscValidCharPointer(message,3); 590e94e781bSJacob Faibussowitsch if (obj) { 591e94e781bSJacob Faibussowitsch ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr); 592e94e781bSJacob Faibussowitsch ierr = MPI_Comm_size(obj->comm, &size);CHKERRQ(ierr); 593e94e781bSJacob Faibussowitsch } 594e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */ 5955c6c1daeSBarry Smith if (rank) PetscFunctionReturn(0); 596e94e781bSJacob Faibussowitsch if (!PetscInfoCommFilter && (size < 2)) { 597e94e781bSJacob Faibussowitsch /* If no self printing is allowed, and size too small get out */ 598e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 599e94e781bSJacob Faibussowitsch } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) { 600e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */ 601e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 602e94e781bSJacob Faibussowitsch } 603e94e781bSJacob Faibussowitsch /* Mute info messages within this function */ 604e94e781bSJacob Faibussowitsch oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE; 6055c6c1daeSBarry Smith ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr); 6065c6c1daeSBarry Smith va_start(Argp, message); 6075c6c1daeSBarry Smith sprintf(string, "[%d] %s(): ",urank,func); 6085c6c1daeSBarry Smith ierr = PetscStrlen(string, &len);CHKERRQ(ierr); 609a2ea699eSBarry Smith ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);CHKERRQ(ierr); 6105c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr); 6115c6c1daeSBarry Smith err = fflush(PetscInfoFile); 6125c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 6135c6c1daeSBarry Smith if (petsc_history) { 6145c6c1daeSBarry Smith va_start(Argp, message); 615a2ea699eSBarry Smith ierr = (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr); 6165c6c1daeSBarry Smith } 6175c6c1daeSBarry Smith va_end(Argp); 618e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 6195c6c1daeSBarry Smith PetscFunctionReturn(0); 6205c6c1daeSBarry Smith } 621