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 /* 8*e94e781bSJacob Faibussowitsch The next set of variables determine which, if any, PetscInfo() calls are used. 9*e94e781bSJacob 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. 13*e94e781bSJacob Faibussowitsch Note for developers: the PetscInfoFlags array is currently 160 entries large, to ensure headroom. Perhaps it is worth 14*e94e781bSJacob Faibussowitsch dynamically allocating this array intelligently rather than just some big number. 15*e94e781bSJacob Faibussowitsch 16*e94e781bSJacob Faibussowitsch PetscInfoFilename determines where PetscInfo() output is piped. 17*e94e781bSJacob Faibussowitsch PetscInfoClassnames holds a char array of classes which are filtered out/for in PetscInfo() calls. 185c6c1daeSBarry Smith */ 19*e94e781bSJacob Faibussowitsch const char * const PetscInfoCommFlags[] = {"all", "no_self", "only_self", "PetscInfoCommFlag", "PETSC_INFO_COMM_", 0}; 20*e94e781bSJacob Faibussowitsch static PetscBool PetscInfoClassnamesLocked = PETSC_FALSE, PetscInfoInvertClasses = PETSC_FALSE; 21*e94e781bSJacob Faibussowitsch static char **PetscInfoClassnames = NULL; 22*e94e781bSJacob Faibussowitsch static char *PetscInfoFilename = NULL; 23*e94e781bSJacob Faibussowitsch static PetscInt PetscInfoNumClasses = -1; 24*e94e781bSJacob Faibussowitsch static PetscInfoCommFlag PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 25*e94e781bSJacob Faibussowitsch static int PetscInfoFlags[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 26*e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 27*e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 28*e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 29*e94e781bSJacob Faibussowitsch 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 30*e94e781bSJacob 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*e94e781bSJacob Faibussowitsch PetscBool PetscLogPrintInfo = PETSC_FALSE, PetscInfoSetUp = PETSC_FALSE; 36*e94e781bSJacob Faibussowitsch FILE *PetscInfoFile = NULL; 375c6c1daeSBarry Smith 38*e94e781bSJacob Faibussowitsch /*@ 39*e94e781bSJacob Faibussowitsch PetscInfoEnabled - Checks whether a given OBJECT_CLASSID is allowed to print using PetscInfo() 40*e94e781bSJacob Faibussowitsch 41*e94e781bSJacob Faibussowitsch Not Collective 42*e94e781bSJacob Faibussowitsch 43*e94e781bSJacob Faibussowitsch Input Parameters: 44*e94e781bSJacob Faibussowitsch . classid - PetscClassid retrieved from a PetscObject e.g. VEC_CLASSID 45*e94e781bSJacob Faibussowitsch 46*e94e781bSJacob Faibussowitsch Output Parameter: 47*e94e781bSJacob Faibussowitsch . enabled - PetscBool indicating whether this classid is allowed to print 48*e94e781bSJacob Faibussowitsch 49*e94e781bSJacob Faibussowitsch Notes: 50*e94e781bSJacob Faibussowitsch Use PETSC_SMALLEST_CLASSID to check if "sys" PetscInfo() calls are enabled. When PETSc is configured with debugging 51*e94e781bSJacob Faibussowitsch support this function checks if classid >= PETSC_SMALLEST_CLASSID, otherwise it assumes valid classid. 52*e94e781bSJacob Faibussowitsch 53*e94e781bSJacob Faibussowitsch Level: beginner 54*e94e781bSJacob Faibussowitsch 55*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoGetInfo(), PetscObjectGetClassid() 56*e94e781bSJacob Faibussowitsch @*/ 57*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoEnabled(PetscClassId classid, PetscBool *enabled) 58*e94e781bSJacob Faibussowitsch { 59*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 60*e94e781bSJacob Faibussowitsch #if defined(PETSC_USE_DEBUG) 61*e94e781bSJacob 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); 62*e94e781bSJacob Faibussowitsch #endif 63*e94e781bSJacob Faibussowitsch *enabled = (PetscBool) (PetscLogPrintInfo && PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID]); 64*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 65*e94e781bSJacob Faibussowitsch } 66*e94e781bSJacob Faibussowitsch 67*e94e781bSJacob Faibussowitsch /*@ 68*e94e781bSJacob 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: 75*e94e781bSJacob Faibussowitsch . flag - PETSC_TRUE or PETSC_FALSE 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith Level: advanced 785c6c1daeSBarry Smith 79*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoEnabled(), PetscInfoGetInfo(), PetscInfoSetFromOptions() 805c6c1daeSBarry Smith @*/ 81*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoAllow(PetscBool flag) 82*e94e781bSJacob Faibussowitsch { 83*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 84*e94e781bSJacob Faibussowitsch PetscLogPrintInfo = flag; 85*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 86*e94e781bSJacob Faibussowitsch } 87*e94e781bSJacob Faibussowitsch 88*e94e781bSJacob Faibussowitsch /*@C 89*e94e781bSJacob Faibussowitsch PetscInfoSetFile - Sets the printing destination for all PetscInfo() calls (i.e. set PetscInfoFile) 90*e94e781bSJacob Faibussowitsch 91*e94e781bSJacob Faibussowitsch Not Collective, any processor which has not called this routine will print to PETSC_SDOUT. 92*e94e781bSJacob Faibussowitsch 93*e94e781bSJacob Faibussowitsch Input Parameter: 94*e94e781bSJacob Faibussowitsch + filename - Name of the file where PetscInfo() will print to 95*e94e781bSJacob Faibussowitsch - mode - Write mode passed to PetscFOpen() 96*e94e781bSJacob Faibussowitsch 97*e94e781bSJacob Faibussowitsch Notes: 98*e94e781bSJacob Faibussowitsch By default PetscInfo() writes to PETSC_STDOUT. Use "stdout" or NULL to set PetscInfo() to write to stdout 99*e94e781bSJacob Faibussowitsch 100*e94e781bSJacob Faibussowitsch Level: advanced 101*e94e781bSJacob Faibussowitsch 102*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscFOpen() 103*e94e781bSJacob Faibussowitsch @*/ 104*e94e781bSJacob 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; 111*e94e781bSJacob Faibussowitsch if (!PetscInfoFile) PetscInfoFile = PETSC_STDOUT; 112*e94e781bSJacob Faibussowitsch ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr); 113*e94e781bSJacob Faibussowitsch if (filename) { 114*e94e781bSJacob Faibussowitsch PetscBool oldflag; 115*e94e781bSJacob Faibussowitsch PetscValidCharPointer(filename, 1); 1165c6c1daeSBarry Smith ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr); 117*e94e781bSJacob Faibussowitsch ierr = PetscStrallocpy(fname, &PetscInfoFilename);CHKERRQ(ierr); 118*e94e781bSJacob 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); 121*e94e781bSJacob Faibussowitsch oldflag = PetscLogPrintInfo; PetscLogPrintInfo = PETSC_FALSE; 122*e94e781bSJacob Faibussowitsch ierr = PetscFOpen(MPI_COMM_SELF, fname, mode, &PetscInfoFile);CHKERRQ(ierr); 123*e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 124*e94e781bSJacob Faibussowitsch /* PetscFOpen will write to PETSC_STDOUT and not PetscInfoFile here, so we disable the PetscInfo call inside it, and 125*e94e781bSJacob Faibussowitsch call it afterwards so that it actually writes to file */ 126*e94e781bSJacob Faibussowitsch ierr = PetscInfo1(NULL, "Opened PetscInfo file %s\n", fname);CHKERRQ(ierr); 127*e94e781bSJacob Faibussowitsch } 128*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 129*e94e781bSJacob Faibussowitsch } 130a297a907SKarl Rupp 131*e94e781bSJacob Faibussowitsch /*@C 132*e94e781bSJacob Faibussowitsch PetscInfoGetFile - Gets the name and FILE pointer of the file where PetscInfo() prints to 133*e94e781bSJacob Faibussowitsch 134*e94e781bSJacob Faibussowitsch Not Collective 135*e94e781bSJacob Faibussowitsch 136*e94e781bSJacob Faibussowitsch Output Parameters: 137*e94e781bSJacob Faibussowitsch + filename - The name of the output file 138*e94e781bSJacob Faibussowitsch - InfoFile - The FILE pointer for the output file 139*e94e781bSJacob Faibussowitsch 140*e94e781bSJacob Faibussowitsch Level: advanced 141*e94e781bSJacob Faibussowitsch 142*e94e781bSJacob Faibussowitsch Note: 143*e94e781bSJacob Faibussowitsch This routine allocates and copies the filename so that the filename survives PetscInfoDestroy(). The user is 144*e94e781bSJacob Faibussowitsch therefore responsible for freeing the allocated filename pointer afterwards. 145*e94e781bSJacob Faibussowitsch 146*e94e781bSJacob Faibussowitsch Fortran Note: 147*e94e781bSJacob Faibussowitsch This routine is not supported in Fortran. 148*e94e781bSJacob Faibussowitsch 149*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFile(), PetscInfoSetFromOptions(), PetscInfoDestroy() 150*e94e781bSJacob Faibussowitsch @*/ 151*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetFile(char **filename, FILE **InfoFile) 152*e94e781bSJacob Faibussowitsch { 153*e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 154*e94e781bSJacob Faibussowitsch 155*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 156*e94e781bSJacob Faibussowitsch PetscValidPointer(filename, 1); 157*e94e781bSJacob Faibussowitsch PetscValidPointer(InfoFile, 2); 158*e94e781bSJacob Faibussowitsch ierr = PetscStrallocpy(PetscInfoFilename, filename);CHKERRQ(ierr); 159*e94e781bSJacob Faibussowitsch *InfoFile = PetscInfoFile; 160*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 161*e94e781bSJacob Faibussowitsch } 162*e94e781bSJacob Faibussowitsch 163*e94e781bSJacob Faibussowitsch /*@C 164*e94e781bSJacob Faibussowitsch PetscInfoSetClasses - Sets the classes which PetscInfo() is filtered for/against 165*e94e781bSJacob Faibussowitsch 166*e94e781bSJacob Faibussowitsch Not Collective 167*e94e781bSJacob Faibussowitsch 168*e94e781bSJacob Faibussowitsch Input Parameters: 169*e94e781bSJacob Faibussowitsch + exclude - Whether or not to invert the filter, i.e. if exclude is true, PetscInfo() will print from every class that 170*e94e781bSJacob Faibussowitsch is NOT one of the classes specified 171*e94e781bSJacob Faibussowitsch . N - Number of classes to filter for (size of classnames) 172*e94e781bSJacob Faibussowitsch - classnames - String array containing the names of classes to filter for, e.g. "vec" 173*e94e781bSJacob Faibussowitsch 174*e94e781bSJacob Faibussowitsch Notes: 175*e94e781bSJacob Faibussowitsch Not for use in Fortran 176*e94e781bSJacob Faibussowitsch 177*e94e781bSJacob Faibussowitsch This function CANNOT be called after PetscInfoGetClass() or PetscInfoProcessClass() has been called. 178*e94e781bSJacob Faibussowitsch 179*e94e781bSJacob Faibussowitsch Names in the classnames list should correspond to the names returned by PetscObjectGetClassName(). 180*e94e781bSJacob Faibussowitsch 181*e94e781bSJacob Faibussowitsch This function only sets the list of class names. 182*e94e781bSJacob Faibussowitsch The actual filtering is deferred to PetscInfoProcessClass(), except of sys which is processed right away. 183*e94e781bSJacob Faibussowitsch The reason for this is that we need to set the list of included/excluded classes before their classids are known. 184*e94e781bSJacob Faibussowitsch Typically the classid is assigned and PetscInfoProcessClass() called in <Class>InitializePackage() (e.g. VecInitializePackage()). 185*e94e781bSJacob Faibussowitsch 186*e94e781bSJacob Faibussowitsch Level: developer 187*e94e781bSJacob Faibussowitsch 188*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetClass(), PetscInfoProcessClass(), PetscInfoSetFromOptions(), PetscStrToArray(), PetscObjectGetName() 189*e94e781bSJacob Faibussowitsch @*/ 190*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetClasses(PetscBool exclude, PetscInt N, const char *const *classnames) 191*e94e781bSJacob Faibussowitsch { 192*e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 193*e94e781bSJacob Faibussowitsch 194*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 195*e94e781bSJacob Faibussowitsch if (PetscInfoClassnamesLocked) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "PetscInfoSetClasses() cannot be called after PetscInfoGetClass() or PetscInfoProcessClass()"); 196*e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr); 197*e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayallocpy(N, classnames, &PetscInfoClassnames);CHKERRQ(ierr); 198*e94e781bSJacob Faibussowitsch PetscInfoNumClasses = N; 199*e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = exclude; 200*e94e781bSJacob Faibussowitsch { 201*e94e781bSJacob Faibussowitsch /* Process sys class right away */ 202*e94e781bSJacob Faibussowitsch PetscClassId sysclassid = PETSC_SMALLEST_CLASSID; 203*e94e781bSJacob Faibussowitsch ierr = PetscInfoProcessClass("sys", 1, &sysclassid);CHKERRQ(ierr); 204*e94e781bSJacob Faibussowitsch } 205*e94e781bSJacob Faibussowitsch PetscInfoSetUp = PETSC_TRUE; 206*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 207*e94e781bSJacob Faibussowitsch } 208*e94e781bSJacob Faibussowitsch 209*e94e781bSJacob Faibussowitsch /*@C 210*e94e781bSJacob Faibussowitsch PetscInfoGetClass - Indicates whether the provided classname is marked as a filter in PetscInfo() as set by PetscInfoSetClasses() 211*e94e781bSJacob Faibussowitsch 212*e94e781bSJacob Faibussowitsch Not Collective 213*e94e781bSJacob Faibussowitsch 214*e94e781bSJacob Faibussowitsch Input Paramater: 215*e94e781bSJacob Faibussowitsch . classname - Name of the class to search for 216*e94e781bSJacob Faibussowitsch 217*e94e781bSJacob Faibussowitsch Output Parameter: 218*e94e781bSJacob Faibussowitsch . found - PetscBool indicating whether the classname was found 219*e94e781bSJacob Faibussowitsch 220*e94e781bSJacob Faibussowitsch Notes: 221*e94e781bSJacob Faibussowitsch Use PetscObjectGetName() to retrieve an appropriate classname 222*e94e781bSJacob Faibussowitsch 223*e94e781bSJacob Faibussowitsch Level: developer 224*e94e781bSJacob Faibussowitsch 225*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetClasses(), PetscInfoSetFromOptions(), PetscObjectGetName() 226*e94e781bSJacob Faibussowitsch @*/ 227*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetClass(const char *classname, PetscBool *found) 228*e94e781bSJacob Faibussowitsch { 229*e94e781bSJacob Faibussowitsch PetscInt idx; 230*e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 231*e94e781bSJacob Faibussowitsch 232*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 233*e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname,1); 234*e94e781bSJacob Faibussowitsch ierr = PetscEListFind(PetscInfoNumClasses, (const char *const *) PetscInfoClassnames, classname ? classname : "sys", &idx, found);CHKERRQ(ierr); 235*e94e781bSJacob Faibussowitsch PetscInfoClassnamesLocked = PETSC_TRUE; 236*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 237*e94e781bSJacob Faibussowitsch } 238*e94e781bSJacob Faibussowitsch 239*e94e781bSJacob Faibussowitsch /*@ 240*e94e781bSJacob Faibussowitsch PetscInfoGetInfo - Returns the current state of several important flags for PetscInfo() 241*e94e781bSJacob Faibussowitsch 242*e94e781bSJacob Faibussowitsch Not Collective 243*e94e781bSJacob Faibussowitsch 244*e94e781bSJacob Faibussowitsch Output Parameters: 245*e94e781bSJacob Faibussowitsch + infoEnabled - PETSC_TRUE if PetscInfoAllow(PETSC_TRUE) has been called 246*e94e781bSJacob Faibussowitsch . exclude - PETSC_TRUE if the class filtering for PetscInfo() is inverted 247*e94e781bSJacob Faibussowitsch . locked - PETSC_TRUE if the list of classes to filter for has been locked 248*e94e781bSJacob Faibussowitsch - commSelfFlag - Enum indicating whether PetscInfo() will print for communicators of size 1, any size != 1, or all 249*e94e781bSJacob Faibussowitsch communicators 250*e94e781bSJacob Faibussowitsch 251*e94e781bSJacob Faibussowitsch Notes: 252*e94e781bSJacob Faibussowitsch Initially commSelfFlag = PETSC_INFO_COMM_ALL 253*e94e781bSJacob Faibussowitsch 254*e94e781bSJacob Faibussowitsch Level: beginner 255*e94e781bSJacob Faibussowitsch 256*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFilterCommSelf, PetscInfoSetFromOptions() 257*e94e781bSJacob Faibussowitsch @*/ 258*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoGetInfo(PetscBool *infoEnabled, PetscBool *setup, PetscBool *exclude, PetscBool *locked, PetscInfoCommFlag *commSelfFlag) 259*e94e781bSJacob Faibussowitsch { 260*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 261*e94e781bSJacob Faibussowitsch if (infoEnabled) *infoEnabled = PetscLogPrintInfo; 262*e94e781bSJacob Faibussowitsch if (setup) *setup = PetscInfoSetUp; 263*e94e781bSJacob Faibussowitsch if (exclude) *exclude = PetscInfoInvertClasses; 264*e94e781bSJacob Faibussowitsch if (locked) *locked = PetscInfoClassnamesLocked; 265*e94e781bSJacob Faibussowitsch if (commSelfFlag) *commSelfFlag = PetscInfoCommFilter; 266*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 267*e94e781bSJacob Faibussowitsch } 268*e94e781bSJacob Faibussowitsch 269*e94e781bSJacob Faibussowitsch /*@C 270*e94e781bSJacob Faibussowitsch PetscInfoProcessClass - Activates or deactivates a class based on the filtering status of PetscInfo() 271*e94e781bSJacob Faibussowitsch 272*e94e781bSJacob Faibussowitsch Not Collective 273*e94e781bSJacob Faibussowitsch 274*e94e781bSJacob Faibussowitsch Input Parameters: 275*e94e781bSJacob Faibussowitsch + classname - Name of the class to activate/deactivate PetscInfo() for 276*e94e781bSJacob Faibussowitsch . numClassID - Number of entries in classIDs 277*e94e781bSJacob Faibussowitsch - classIDs - Array containing all of the PetscClassids associated with classname 278*e94e781bSJacob Faibussowitsch 279*e94e781bSJacob Faibussowitsch Note: This function contains the deprecation warning for -info_exclude 280*e94e781bSJacob Faibussowitsch 281*e94e781bSJacob Faibussowitsch Level: developer 282*e94e781bSJacob Faibussowitsch 283*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoActivateClass(), PetscInfoDeactivateClass(), PetscInfoSetFromOptions() 284*e94e781bSJacob Faibussowitsch @*/ 285*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoProcessClass(const char classname[], PetscInt numClassID, PetscClassId classIDs[]) 286*e94e781bSJacob Faibussowitsch { 287*e94e781bSJacob Faibussowitsch PetscInt i; 288*e94e781bSJacob Faibussowitsch PetscBool enabled, exclude, found, opt, pkg; 289*e94e781bSJacob Faibussowitsch char logList[256]; 290*e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 291*e94e781bSJacob Faibussowitsch 292*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 293*e94e781bSJacob Faibussowitsch PetscValidCharPointer(classname, 1); 294*e94e781bSJacob Faibussowitsch ierr = PetscInfoGetInfo(&enabled, NULL, &exclude, NULL, NULL);CHKERRQ(ierr); 295*e94e781bSJacob Faibussowitsch /* -info_exclude is DEPRECATED */ 296*e94e781bSJacob Faibussowitsch ierr = PetscOptionsGetString(NULL,NULL,"-info_exclude",logList,sizeof(logList),&opt);CHKERRQ(ierr); 297*e94e781bSJacob Faibussowitsch if (opt) { 298*e94e781bSJacob Faibussowitsch ierr = PetscStrInList(classname,logList,',',&pkg);CHKERRQ(ierr); 299*e94e781bSJacob Faibussowitsch if (pkg) { 300*e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 301*e94e781bSJacob Faibussowitsch ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr); 302*e94e781bSJacob Faibussowitsch } 303*e94e781bSJacob Faibussowitsch } 304*e94e781bSJacob Faibussowitsch } 305*e94e781bSJacob Faibussowitsch ierr = PetscInfoGetClass(classname, &found);CHKERRQ(ierr); 306*e94e781bSJacob Faibussowitsch if ((found && exclude) || (!found && !exclude)) { 307*e94e781bSJacob Faibussowitsch if (PetscInfoNumClasses > 0) { 308*e94e781bSJacob Faibussowitsch /* Check if -info was called empty */ 309*e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 310*e94e781bSJacob Faibussowitsch ierr = PetscInfoDeactivateClass(classIDs[i]);CHKERRQ(ierr); 311*e94e781bSJacob Faibussowitsch } 312*e94e781bSJacob Faibussowitsch } 313*e94e781bSJacob Faibussowitsch } else { 314*e94e781bSJacob Faibussowitsch for (i = 0; i < numClassID; ++i) { 315*e94e781bSJacob Faibussowitsch ierr = PetscInfoActivateClass(classIDs[i]);CHKERRQ(ierr); 316*e94e781bSJacob Faibussowitsch } 317*e94e781bSJacob Faibussowitsch } 318*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 319*e94e781bSJacob Faibussowitsch } 320*e94e781bSJacob Faibussowitsch 321*e94e781bSJacob Faibussowitsch /*@ 322*e94e781bSJacob Faibussowitsch PetscInfoSetFilterCommSelf - Sets PetscInfoCommFlag enum to determine communicator filtering for PetscInfo() 323*e94e781bSJacob Faibussowitsch 324*e94e781bSJacob Faibussowitsch Not Collective 325*e94e781bSJacob Faibussowitsch 326*e94e781bSJacob Faibussowitsch Input Parameter: 327*e94e781bSJacob Faibussowitsch . commSelfFlag - Enum value indicating method with which to filter PetscInfo() based on the size of the communicator 328*e94e781bSJacob Faibussowitsch of the object calling PetscInfo() 329*e94e781bSJacob Faibussowitsch 330*e94e781bSJacob Faibussowitsch Level: developer 331*e94e781bSJacob Faibussowitsch 332*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoGetInfo() 333*e94e781bSJacob Faibussowitsch @*/ 334*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag commSelfFlag) 335*e94e781bSJacob Faibussowitsch { 336*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 337*e94e781bSJacob Faibussowitsch PetscInfoCommFilter = commSelfFlag; 338*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 339*e94e781bSJacob Faibussowitsch } 340*e94e781bSJacob Faibussowitsch 341*e94e781bSJacob Faibussowitsch /*@ 342*e94e781bSJacob Faibussowitsch PetscInfoSetFromOptions - Configure PetscInfo() using command line options, enabling or disabling various calls to 343*e94e781bSJacob Faibussowitsch PetscInfo() 344*e94e781bSJacob Faibussowitsch 345*e94e781bSJacob Faibussowitsch Not Collective 346*e94e781bSJacob Faibussowitsch 347*e94e781bSJacob Faibussowitsch Input Parameter: 348*e94e781bSJacob Faibussowitsch . options - Options database, use NULL for default global database 349*e94e781bSJacob Faibussowitsch 350*e94e781bSJacob Faibussowitsch Options Database Key: 351*e94e781bSJacob Faibussowitsch $ -info [optional filename][:[~]optional list,of,classnames][:[~]optional "self"] 352*e94e781bSJacob Faibussowitsch 353*e94e781bSJacob Faibussowitsch Notes: 354*e94e781bSJacob Faibussowitsch PetscInfo() defaults: 355*e94e781bSJacob Faibussowitsch $ [optional filename] defaults to write output to PETSC_STDOUT 356*e94e781bSJacob Faibussowitsch $ [optional list,of,classnames] defaults to enabling all classes 357*e94e781bSJacob 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). 358*e94e781bSJacob Faibussowitsch 359*e94e781bSJacob Faibussowitsch Prepend `~` to first classname or "self" to invert either selection, i.e. -info :~ts,snes:~self will activate 360*e94e781bSJacob Faibussowitsch every PetscInfo() call on a communicator with size > 1, associated with TS or SNES objects. Note that command line options 361*e94e781bSJacob Faibussowitsch will also silence any user-written calls to PetscInfo() if an object which is filtered for is passed as the PetscObject 362*e94e781bSJacob Faibussowitsch argument to PetscInfo(). To filter for PetscInfo() calls not directly associated with an object (i.e. where *vobj == 363*e94e781bSJacob Faibussowitsch NULL), use "sys". 364*e94e781bSJacob Faibussowitsch 365*e94e781bSJacob Faibussowitsch All classname/self matching is case insensitive. Filename IS case sensitive. 366*e94e781bSJacob Faibussowitsch 367*e94e781bSJacob Faibussowitsch Example: 368*e94e781bSJacob Faibussowitsch $ -info :: OR -info will print to PETSC_STDOUT, print for ALL classes, and print for ALL communicator sizes 369*e94e781bSJacob Faibussowitsch $ -info :mat:self will print to PETSC_STDOUT, print ONLY PetscInfo() calls associated to Mat objects, whose communicators are of 370*e94e781bSJacob Faibussowitsch size = 1 371*e94e781bSJacob Faibussowitsch $ -info myInfoFileName:~vec:~self will create and print to ./myInfoFileName, print all PetscInfo() calls NOT associated 372*e94e781bSJacob Faibussowitsch with Vec Objects, whose communicators are of size > 1 373*e94e781bSJacob Faibussowitsch 374*e94e781bSJacob Faibussowitsch Level: beginner 375*e94e781bSJacob Faibussowitsch 376*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoAllow(), PetscInfoSetFile(), PetscInfoSetClasses(), PetscInfoSetFilterCommSelf(), PetscInfoDestroy() 377*e94e781bSJacob Faibussowitsch @*/ 378*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoSetFromOptions(PetscOptions options) 379*e94e781bSJacob Faibussowitsch { 380*e94e781bSJacob Faibussowitsch PetscToken tok; 381*e94e781bSJacob Faibussowitsch char optstring[PETSC_MAX_PATH_LEN], *loc0_ = NULL, *loc1_ = NULL, *loc2_ = NULL; 382*e94e781bSJacob Faibussowitsch char **loc1_array = NULL; 383*e94e781bSJacob Faibussowitsch PetscBool set, loc1_invert = PETSC_FALSE, loc2_invert = PETSC_FALSE, foundSelf = PETSC_FALSE; 384*e94e781bSJacob Faibussowitsch size_t size_loc0_ = 0, size_loc1_ = 0, size_loc2_ = 0; 385*e94e781bSJacob Faibussowitsch int nLoc1_ = 0; 386*e94e781bSJacob Faibussowitsch PetscInfoCommFlag commSelfFlag = PETSC_INFO_COMM_ALL; 387*e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 388*e94e781bSJacob Faibussowitsch 389*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 390*e94e781bSJacob Faibussowitsch ierr = PetscOptionsDeprecated_Private(NULL,"-info_exclude", NULL, "3.13", "Use -info instead");CHKERRQ(ierr); 391*e94e781bSJacob Faibussowitsch ierr = PetscOptionsGetString(options, NULL, "-info", optstring, PETSC_MAX_PATH_LEN, &set);CHKERRQ(ierr); 392*e94e781bSJacob Faibussowitsch if (set) { 393*e94e781bSJacob Faibussowitsch /* Allow sys class to be processed as part of setup */ 394*e94e781bSJacob Faibussowitsch PetscInfoSetUp = PETSC_TRUE; 395*e94e781bSJacob Faibussowitsch ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr); 396*e94e781bSJacob Faibussowitsch ierr = PetscTokenCreate(optstring, ':', &tok);CHKERRQ(ierr); 397*e94e781bSJacob Faibussowitsch ierr = PetscTokenFind(tok, &loc0_);CHKERRQ(ierr); 398*e94e781bSJacob Faibussowitsch ierr = PetscTokenFind(tok, &loc1_);CHKERRQ(ierr); 399*e94e781bSJacob Faibussowitsch ierr = PetscTokenFind(tok, &loc2_);CHKERRQ(ierr); 400*e94e781bSJacob Faibussowitsch if (loc1_) { 401*e94e781bSJacob Faibussowitsch ierr = PetscStrcmp("self", (const char *) loc1_, &foundSelf);CHKERRQ(ierr); 402*e94e781bSJacob Faibussowitsch if (foundSelf) { 403*e94e781bSJacob 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" */ 404*e94e781bSJacob Faibussowitsch loc2_ = loc1_; 405*e94e781bSJacob Faibussowitsch loc1_ = NULL; 406*e94e781bSJacob Faibussowitsch } else { 407*e94e781bSJacob Faibussowitsch if (*loc1_ == '~') { 408*e94e781bSJacob Faibussowitsch loc1_invert = PETSC_TRUE; 409*e94e781bSJacob Faibussowitsch ++loc1_; 410*e94e781bSJacob Faibussowitsch } 411*e94e781bSJacob Faibussowitsch } 412*e94e781bSJacob Faibussowitsch } 413*e94e781bSJacob Faibussowitsch if (loc2_) { 414*e94e781bSJacob Faibussowitsch if (*loc2_ == '~') { 415*e94e781bSJacob Faibussowitsch loc2_invert = PETSC_TRUE; 416*e94e781bSJacob Faibussowitsch ++loc2_; 417*e94e781bSJacob Faibussowitsch } 418*e94e781bSJacob Faibussowitsch } 419*e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc0_, &size_loc0_);CHKERRQ(ierr); 420*e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc1_, &size_loc1_);CHKERRQ(ierr); 421*e94e781bSJacob Faibussowitsch ierr = PetscStrlen(loc2_, &size_loc2_);CHKERRQ(ierr); 422*e94e781bSJacob Faibussowitsch if (size_loc1_) { 423*e94e781bSJacob Faibussowitsch ierr = PetscStrtolower(loc1_);CHKERRQ(ierr); 424*e94e781bSJacob Faibussowitsch ierr = PetscStrToArray((const char *) loc1_, ',',(int *) &nLoc1_, &loc1_array);CHKERRQ(ierr); 425*e94e781bSJacob Faibussowitsch } 426*e94e781bSJacob Faibussowitsch if (size_loc2_) { 427*e94e781bSJacob Faibussowitsch ierr = PetscStrtolower(loc2_);CHKERRQ(ierr); 428*e94e781bSJacob Faibussowitsch ierr = PetscStrcmp("self", (const char *) loc2_, &foundSelf);CHKERRQ(ierr); 429*e94e781bSJacob Faibussowitsch if (foundSelf) { 430*e94e781bSJacob Faibussowitsch if (loc2_invert) { 431*e94e781bSJacob Faibussowitsch commSelfFlag = PETSC_INFO_COMM_NO_SELF; 432*e94e781bSJacob Faibussowitsch } else { 433*e94e781bSJacob Faibussowitsch commSelfFlag = PETSC_INFO_COMM_ONLY_SELF; 434*e94e781bSJacob Faibussowitsch } 435*e94e781bSJacob Faibussowitsch } 436*e94e781bSJacob Faibussowitsch } 437*e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFile((const char *) size_loc0_ ? loc0_ : NULL, "w");CHKERRQ(ierr); 438*e94e781bSJacob Faibussowitsch ierr = PetscInfoSetClasses(loc1_invert,(PetscInt) nLoc1_, (const char *const *) loc1_array);CHKERRQ(ierr); 439*e94e781bSJacob Faibussowitsch ierr = PetscInfoSetFilterCommSelf(commSelfFlag);CHKERRQ(ierr); 440*e94e781bSJacob Faibussowitsch ierr = PetscStrToArrayDestroy(nLoc1_, loc1_array);CHKERRQ(ierr); 441*e94e781bSJacob Faibussowitsch ierr = PetscTokenDestroy(&tok);CHKERRQ(ierr); 442*e94e781bSJacob Faibussowitsch } 443*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 444*e94e781bSJacob Faibussowitsch } 445*e94e781bSJacob Faibussowitsch 446*e94e781bSJacob Faibussowitsch /*@ 447*e94e781bSJacob Faibussowitsch PetscInfoDestroy - Destroys and resets internal PetscInfo() data structures. 448*e94e781bSJacob Faibussowitsch 449*e94e781bSJacob Faibussowitsch Not Collective 450*e94e781bSJacob Faibussowitsch 451*e94e781bSJacob Faibussowitsch Notes: 452*e94e781bSJacob Faibussowitsch This is automatically called in PetscFinalize(). Useful for changing filters mid-program, or culling subsequent 453*e94e781bSJacob Faibussowitsch PetscInfo() calls down the line. 454*e94e781bSJacob Faibussowitsch 455*e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions() 456*e94e781bSJacob Faibussowitsch @*/ 457*e94e781bSJacob Faibussowitsch PetscErrorCode PetscInfoDestroy(void) 458*e94e781bSJacob Faibussowitsch { 459*e94e781bSJacob Faibussowitsch PetscErrorCode ierr; 460*e94e781bSJacob Faibussowitsch int err; 461*e94e781bSJacob Faibussowitsch 462*e94e781bSJacob Faibussowitsch PetscFunctionBegin; 463*e94e781bSJacob Faibussowitsch ierr = PetscInfoAllow(PETSC_FALSE);CHKERRQ(ierr); 464*e94e781bSJacob Faibussowitsch ierr = PetscStrNArrayDestroy(PetscInfoNumClasses, &PetscInfoClassnames);CHKERRQ(ierr); 465*e94e781bSJacob Faibussowitsch err = fflush(PetscInfoFile); 466*e94e781bSJacob Faibussowitsch if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 467*e94e781bSJacob Faibussowitsch if (PetscInfoFilename) { 468*e94e781bSJacob Faibussowitsch ierr = PetscFClose(MPI_COMM_SELF, PetscInfoFile);CHKERRQ(ierr); 469*e94e781bSJacob Faibussowitsch } 470*e94e781bSJacob Faibussowitsch ierr = PetscFree(PetscInfoFilename);CHKERRQ(ierr); 471*e94e781bSJacob Faibussowitsch memset(PetscInfoFlags, 1, (size_t) 160*sizeof(PetscInfoFlags[0])); 472*e94e781bSJacob Faibussowitsch PetscInfoClassnamesLocked = PETSC_FALSE; 473*e94e781bSJacob Faibussowitsch PetscInfoInvertClasses = PETSC_FALSE; 474*e94e781bSJacob Faibussowitsch PetscInfoNumClasses = -1; 475*e94e781bSJacob Faibussowitsch PetscInfoCommFilter = PETSC_INFO_COMM_ALL; 476*e94e781bSJacob Faibussowitsch PetscInfoSetUp = PETSC_FALSE; 4775c6c1daeSBarry Smith PetscFunctionReturn(0); 4785c6c1daeSBarry Smith } 4795c6c1daeSBarry Smith 4805c6c1daeSBarry Smith /*@ 481fa2bb9feSLisandro Dalcin PetscInfoDeactivateClass - Deactivates PetscInfo() messages for a PETSc object class. 4825c6c1daeSBarry Smith 4835c6c1daeSBarry Smith Not Collective 4845c6c1daeSBarry Smith 4855c6c1daeSBarry Smith Input Parameter: 486fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 4875c6c1daeSBarry Smith 4885c6c1daeSBarry Smith Notes: 4895c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 4905c6c1daeSBarry Smith 4915c6c1daeSBarry Smith Level: developer 4925c6c1daeSBarry Smith 493*e94e781bSJacob Faibussowitsch .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions() 4945c6c1daeSBarry Smith @*/ 495fa2bb9feSLisandro Dalcin PetscErrorCode PetscInfoDeactivateClass(PetscClassId classid) 4965c6c1daeSBarry Smith { 4975c6c1daeSBarry Smith PetscFunctionBegin; 498fa2bb9feSLisandro Dalcin if (!classid) classid = PETSC_SMALLEST_CLASSID; 499fa2bb9feSLisandro Dalcin PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 0; 5005c6c1daeSBarry Smith PetscFunctionReturn(0); 5015c6c1daeSBarry Smith } 5025c6c1daeSBarry Smith 5035c6c1daeSBarry Smith /*@ 504fa2bb9feSLisandro Dalcin PetscInfoActivateClass - Activates PetscInfo() messages for a PETSc object class. 5055c6c1daeSBarry Smith 5065c6c1daeSBarry Smith Not Collective 5075c6c1daeSBarry Smith 5085c6c1daeSBarry Smith Input Parameter: 509fa2bb9feSLisandro Dalcin . classid - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 5105c6c1daeSBarry Smith 5115c6c1daeSBarry Smith Notes: 5125c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 5135c6c1daeSBarry Smith 5145c6c1daeSBarry Smith Level: developer 5155c6c1daeSBarry Smith 516*e94e781bSJacob Faibussowitsch .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow(), PetscInfoSetFromOptions() 5175c6c1daeSBarry Smith @*/ 518fa2bb9feSLisandro Dalcin PetscErrorCode PetscInfoActivateClass(PetscClassId classid) 5195c6c1daeSBarry Smith { 5205c6c1daeSBarry Smith PetscFunctionBegin; 521fa2bb9feSLisandro Dalcin if (!classid) classid = PETSC_SMALLEST_CLASSID; 522fa2bb9feSLisandro Dalcin PetscInfoFlags[classid - PETSC_SMALLEST_CLASSID] = 1; 5235c6c1daeSBarry Smith PetscFunctionReturn(0); 5245c6c1daeSBarry Smith } 5255c6c1daeSBarry Smith 5265c6c1daeSBarry Smith /* 5275c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 5285c6c1daeSBarry Smith messages are also printed to the history file, called by default 5295c6c1daeSBarry Smith .petschistory in ones home directory. 5305c6c1daeSBarry Smith */ 53195c0884eSLisandro Dalcin PETSC_INTERN FILE *petsc_history; 5325c6c1daeSBarry Smith 5335c6c1daeSBarry Smith /*MC 534*e94e781bSJacob Faibussowitsch PetscInfo - Logs informative data 5355c6c1daeSBarry Smith 5365c6c1daeSBarry Smith Synopsis: 537aaa7dc30SBarry Smith #include <petscsys.h> 5385c6c1daeSBarry Smith PetscErrorCode PetscInfo(void *vobj, const char message[]) 5395c6c1daeSBarry Smith PetscErrorCode PetscInfo1(void *vobj, const char formatmessage[],arg1) 5405c6c1daeSBarry Smith PetscErrorCode PetscInfo2(void *vobj, const char formatmessage[],arg1,arg2) 5415c6c1daeSBarry Smith etc 5425c6c1daeSBarry Smith 5435c6c1daeSBarry Smith Collective over PetscObject argument 5445c6c1daeSBarry Smith 5455c6c1daeSBarry Smith Input Parameter: 5460298fd71SBarry Smith + vobj - object most closely associated with the logging statement or NULL 5475c6c1daeSBarry Smith . message - logging message 5485c6c1daeSBarry Smith - formatmessage - logging message using standard "printf" format 5495c6c1daeSBarry Smith 5505c6c1daeSBarry Smith Options Database Key: 551*e94e781bSJacob Faibussowitsch $ -info [optional filename][:[~]optional list,of,classnames][:[~]optional "self"] 552*e94e781bSJacob Faibussowitsch 553*e94e781bSJacob Faibussowitsch Notes: 554*e94e781bSJacob Faibussowitsch For complete explanation of options database keys see PetscInfoSetFromOptions(). 5555c6c1daeSBarry Smith 5565c6c1daeSBarry Smith Level: intermediate 5575c6c1daeSBarry Smith 5585c6c1daeSBarry Smith Fortran Note: This function does not take the vobj argument, there is only the PetscInfo() 5595c6c1daeSBarry Smith version, not PetscInfo1() etc. 5605c6c1daeSBarry Smith 5615c6c1daeSBarry Smith Example of Usage: 5625c6c1daeSBarry Smith $ 5635c6c1daeSBarry Smith $ Mat A 5645c6c1daeSBarry Smith $ double alpha 5655c6c1daeSBarry Smith $ PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha); 5665c6c1daeSBarry Smith $ 5675c6c1daeSBarry Smith 568*e94e781bSJacob Faibussowitsch .seealso: PetscInfoAllow(), PetscInfoSetFromOptions() 5695c6c1daeSBarry Smith M*/ 5705c6c1daeSBarry Smith PetscErrorCode PetscInfo_Private(const char func[],void *vobj, const char message[], ...) 5715c6c1daeSBarry Smith { 5725c6c1daeSBarry Smith va_list Argp; 573*e94e781bSJacob Faibussowitsch PetscMPIInt rank = 0,urank,size = 1; 5745c6c1daeSBarry Smith PetscObject obj = (PetscObject)vobj; 575fa2bb9feSLisandro Dalcin PetscClassId classid; 576*e94e781bSJacob Faibussowitsch PetscBool enabled = PETSC_FALSE, oldflag; 5775c6c1daeSBarry Smith char string[8*1024]; 5785c6c1daeSBarry Smith PetscErrorCode ierr; 579*e94e781bSJacob 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; 585*e94e781bSJacob Faibussowitsch ierr = PetscInfoEnabled(classid, &enabled);CHKERRQ(ierr); 586*e94e781bSJacob Faibussowitsch if (!enabled) PetscFunctionReturn(0); 587*e94e781bSJacob Faibussowitsch PetscValidCharPointer(message,3); 588*e94e781bSJacob Faibussowitsch if (obj) { 589*e94e781bSJacob Faibussowitsch ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr); 590*e94e781bSJacob Faibussowitsch ierr = MPI_Comm_size(obj->comm, &size);CHKERRQ(ierr); 591*e94e781bSJacob Faibussowitsch } 592*e94e781bSJacob Faibussowitsch /* rank > 0 always jumps out */ 5935c6c1daeSBarry Smith if (rank) PetscFunctionReturn(0); 594*e94e781bSJacob Faibussowitsch if (!PetscInfoCommFilter && (size < 2)) { 595*e94e781bSJacob Faibussowitsch /* If no self printing is allowed, and size too small get out */ 596*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 597*e94e781bSJacob Faibussowitsch } else if ((PetscInfoCommFilter == PETSC_INFO_COMM_ONLY_SELF) && (size > 1)) { 598*e94e781bSJacob Faibussowitsch /* If ONLY self printing, and size too big, get out */ 599*e94e781bSJacob Faibussowitsch PetscFunctionReturn(0); 600*e94e781bSJacob Faibussowitsch } 601*e94e781bSJacob Faibussowitsch /* Mute info messages within this function */ 602*e94e781bSJacob 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); 616*e94e781bSJacob Faibussowitsch PetscLogPrintInfo = oldflag; 6175c6c1daeSBarry Smith PetscFunctionReturn(0); 6185c6c1daeSBarry Smith } 619