1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith /* 3*5c6c1daeSBarry Smith PetscInfo() is contained in a different file from the other profiling to 4*5c6c1daeSBarry Smith allow it to be replaced at link time by an alternative routine. 5*5c6c1daeSBarry Smith */ 6*5c6c1daeSBarry Smith #include <petscsys.h> /*I "petscsys.h" I*/ 7*5c6c1daeSBarry Smith #include <stdarg.h> 8*5c6c1daeSBarry Smith #include <sys/types.h> 9*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_STDLIB_H) 10*5c6c1daeSBarry Smith #include <stdlib.h> 11*5c6c1daeSBarry Smith #endif 12*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_MALLOC_H) 13*5c6c1daeSBarry Smith #include <malloc.h> 14*5c6c1daeSBarry Smith #endif 15*5c6c1daeSBarry Smith 16*5c6c1daeSBarry Smith /* 17*5c6c1daeSBarry Smith The next three variables determine which, if any, PetscInfo() calls are used. 18*5c6c1daeSBarry Smith If PetscLogPrintInfo is zero, no info messages are printed. 19*5c6c1daeSBarry Smith If PetscLogPrintInfoNull is zero, no info messages associated with a null object are printed. 20*5c6c1daeSBarry Smith 21*5c6c1daeSBarry Smith If PetscInfoFlags[OBJECT_CLASSID - PETSC_SMALLEST_CLASSID] is zero, no messages related 22*5c6c1daeSBarry Smith to that object are printed. OBJECT_CLASSID is, for example, MAT_CLASSID. 23*5c6c1daeSBarry Smith */ 24*5c6c1daeSBarry Smith PetscBool PetscLogPrintInfo = PETSC_FALSE; 25*5c6c1daeSBarry Smith PetscBool PetscLogPrintInfoNull = PETSC_FALSE; 26*5c6c1daeSBarry Smith int PetscInfoFlags[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 27*5c6c1daeSBarry Smith 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 28*5c6c1daeSBarry Smith 1,1,1,1,1,1,1,1,1,1,1,1}; 29*5c6c1daeSBarry Smith FILE *PetscInfoFile = PETSC_NULL; 30*5c6c1daeSBarry Smith 31*5c6c1daeSBarry Smith #undef __FUNCT__ 32*5c6c1daeSBarry Smith #define __FUNCT__ "PetscInfoAllow" 33*5c6c1daeSBarry Smith /*@C 34*5c6c1daeSBarry Smith PetscInfoAllow - Causes PetscInfo() messages to be printed to standard output. 35*5c6c1daeSBarry Smith 36*5c6c1daeSBarry Smith Not Collective, each processor may call this separately, but printing is only 37*5c6c1daeSBarry Smith turned on if the lowest processor number associated with the PetscObject associated 38*5c6c1daeSBarry Smith with the call to PetscInfo() has called this routine. 39*5c6c1daeSBarry Smith 40*5c6c1daeSBarry Smith Input Parameter: 41*5c6c1daeSBarry Smith + flag - PETSC_TRUE or PETSC_FALSE 42*5c6c1daeSBarry Smith - filename - optional name of file to write output to (defaults to stdout) 43*5c6c1daeSBarry Smith 44*5c6c1daeSBarry Smith Options Database Key: 45*5c6c1daeSBarry Smith . -info [optional filename] - Activates PetscInfoAllow() 46*5c6c1daeSBarry Smith 47*5c6c1daeSBarry Smith Level: advanced 48*5c6c1daeSBarry Smith 49*5c6c1daeSBarry Smith Concepts: debugging^detailed runtime information 50*5c6c1daeSBarry Smith Concepts: dumping detailed runtime information 51*5c6c1daeSBarry Smith 52*5c6c1daeSBarry Smith .seealso: PetscInfo() 53*5c6c1daeSBarry Smith @*/ 54*5c6c1daeSBarry Smith PetscErrorCode PetscInfoAllow(PetscBool flag, const char filename[]) 55*5c6c1daeSBarry Smith { 56*5c6c1daeSBarry Smith char fname[PETSC_MAX_PATH_LEN], tname[5]; 57*5c6c1daeSBarry Smith PetscMPIInt rank; 58*5c6c1daeSBarry Smith PetscErrorCode ierr; 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith PetscFunctionBegin; 61*5c6c1daeSBarry Smith if (flag && filename) { 62*5c6c1daeSBarry Smith ierr = PetscFixFilename(filename, fname);CHKERRQ(ierr); 63*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr); 64*5c6c1daeSBarry Smith sprintf(tname, ".%d", rank); 65*5c6c1daeSBarry Smith ierr = PetscStrcat(fname, tname);CHKERRQ(ierr); 66*5c6c1daeSBarry Smith ierr = PetscFOpen(MPI_COMM_SELF, fname, "w", &PetscInfoFile);CHKERRQ(ierr); 67*5c6c1daeSBarry Smith if (!PetscInfoFile) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN, "Cannot open requested file for writing: %s",fname); 68*5c6c1daeSBarry Smith } else if (flag) { 69*5c6c1daeSBarry Smith PetscInfoFile = PETSC_STDOUT; 70*5c6c1daeSBarry Smith } 71*5c6c1daeSBarry Smith PetscLogPrintInfo = flag; 72*5c6c1daeSBarry Smith PetscLogPrintInfoNull = flag; 73*5c6c1daeSBarry Smith PetscFunctionReturn(0); 74*5c6c1daeSBarry Smith } 75*5c6c1daeSBarry Smith 76*5c6c1daeSBarry Smith #undef __FUNCT__ 77*5c6c1daeSBarry Smith #define __FUNCT__ "PetscInfoDeactivateClass" 78*5c6c1daeSBarry Smith /*@ 79*5c6c1daeSBarry Smith PetscInfoDeactivateClass - Deactivates PlogInfo() messages for a PETSc object class. 80*5c6c1daeSBarry Smith 81*5c6c1daeSBarry Smith Not Collective 82*5c6c1daeSBarry Smith 83*5c6c1daeSBarry Smith Input Parameter: 84*5c6c1daeSBarry Smith . objclass - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 85*5c6c1daeSBarry Smith 86*5c6c1daeSBarry Smith Notes: 87*5c6c1daeSBarry Smith One can pass 0 to deactivate all messages that are not associated with an object. 88*5c6c1daeSBarry Smith 89*5c6c1daeSBarry Smith Level: developer 90*5c6c1daeSBarry Smith 91*5c6c1daeSBarry Smith .keywords: allow, information, printing, monitoring 92*5c6c1daeSBarry Smith .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow() 93*5c6c1daeSBarry Smith @*/ 94*5c6c1daeSBarry Smith PetscErrorCode PetscInfoDeactivateClass(int objclass) 95*5c6c1daeSBarry Smith { 96*5c6c1daeSBarry Smith PetscFunctionBegin; 97*5c6c1daeSBarry Smith if (!objclass) { 98*5c6c1daeSBarry Smith PetscLogPrintInfoNull = PETSC_FALSE; 99*5c6c1daeSBarry Smith PetscFunctionReturn(0); 100*5c6c1daeSBarry Smith } 101*5c6c1daeSBarry Smith PetscInfoFlags[objclass - PETSC_SMALLEST_CLASSID - 1] = 0; 102*5c6c1daeSBarry Smith PetscFunctionReturn(0); 103*5c6c1daeSBarry Smith } 104*5c6c1daeSBarry Smith 105*5c6c1daeSBarry Smith #undef __FUNCT__ 106*5c6c1daeSBarry Smith #define __FUNCT__ "PetscInfoActivateClass" 107*5c6c1daeSBarry Smith /*@ 108*5c6c1daeSBarry Smith PetscInfoActivateClass - Activates PlogInfo() messages for a PETSc object class. 109*5c6c1daeSBarry Smith 110*5c6c1daeSBarry Smith Not Collective 111*5c6c1daeSBarry Smith 112*5c6c1daeSBarry Smith Input Parameter: 113*5c6c1daeSBarry Smith . objclass - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 114*5c6c1daeSBarry Smith 115*5c6c1daeSBarry Smith Notes: 116*5c6c1daeSBarry Smith One can pass 0 to activate all messages that are not associated with an object. 117*5c6c1daeSBarry Smith 118*5c6c1daeSBarry Smith Level: developer 119*5c6c1daeSBarry Smith 120*5c6c1daeSBarry Smith .keywords: allow, information, printing, monitoring 121*5c6c1daeSBarry Smith .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow() 122*5c6c1daeSBarry Smith @*/ 123*5c6c1daeSBarry Smith PetscErrorCode PetscInfoActivateClass(int objclass) 124*5c6c1daeSBarry Smith { 125*5c6c1daeSBarry Smith PetscFunctionBegin; 126*5c6c1daeSBarry Smith if (!objclass) { 127*5c6c1daeSBarry Smith PetscLogPrintInfoNull = PETSC_TRUE; 128*5c6c1daeSBarry Smith } else { 129*5c6c1daeSBarry Smith PetscInfoFlags[objclass - PETSC_SMALLEST_CLASSID - 1] = 1; 130*5c6c1daeSBarry Smith } 131*5c6c1daeSBarry Smith PetscFunctionReturn(0); 132*5c6c1daeSBarry Smith } 133*5c6c1daeSBarry Smith 134*5c6c1daeSBarry Smith /* 135*5c6c1daeSBarry Smith If the option -history was used, then all printed PetscInfo() 136*5c6c1daeSBarry Smith messages are also printed to the history file, called by default 137*5c6c1daeSBarry Smith .petschistory in ones home directory. 138*5c6c1daeSBarry Smith */ 139*5c6c1daeSBarry Smith extern FILE *petsc_history; 140*5c6c1daeSBarry Smith 141*5c6c1daeSBarry Smith #undef __FUNCT__ 142*5c6c1daeSBarry Smith #define __FUNCT__ "PetscInfo_Private" 143*5c6c1daeSBarry Smith /*MC 144*5c6c1daeSBarry Smith PetscInfo - Logs informative data, which is printed to standard output 145*5c6c1daeSBarry Smith or a file when the option -info <file> is specified. 146*5c6c1daeSBarry Smith 147*5c6c1daeSBarry Smith Synopsis: 148*5c6c1daeSBarry Smith PetscErrorCode PetscInfo(void *vobj, const char message[]) 149*5c6c1daeSBarry Smith PetscErrorCode PetscInfo1(void *vobj, const char formatmessage[],arg1) 150*5c6c1daeSBarry Smith PetscErrorCode PetscInfo2(void *vobj, const char formatmessage[],arg1,arg2) 151*5c6c1daeSBarry Smith etc 152*5c6c1daeSBarry Smith 153*5c6c1daeSBarry Smith Collective over PetscObject argument 154*5c6c1daeSBarry Smith 155*5c6c1daeSBarry Smith Input Parameter: 156*5c6c1daeSBarry Smith + vobj - object most closely associated with the logging statement or PETSC_NULL 157*5c6c1daeSBarry Smith . message - logging message 158*5c6c1daeSBarry Smith - formatmessage - logging message using standard "printf" format 159*5c6c1daeSBarry Smith 160*5c6c1daeSBarry Smith Options Database Key: 161*5c6c1daeSBarry Smith $ -info : activates printing of PetscInfo() messages 162*5c6c1daeSBarry Smith 163*5c6c1daeSBarry Smith Level: intermediate 164*5c6c1daeSBarry Smith 165*5c6c1daeSBarry Smith Fortran Note: This function does not take the vobj argument, there is only the PetscInfo() 166*5c6c1daeSBarry Smith version, not PetscInfo1() etc. 167*5c6c1daeSBarry Smith 168*5c6c1daeSBarry Smith Example of Usage: 169*5c6c1daeSBarry Smith $ 170*5c6c1daeSBarry Smith $ Mat A 171*5c6c1daeSBarry Smith $ double alpha 172*5c6c1daeSBarry Smith $ PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha); 173*5c6c1daeSBarry Smith $ 174*5c6c1daeSBarry Smith 175*5c6c1daeSBarry Smith Concepts: runtime information 176*5c6c1daeSBarry Smith 177*5c6c1daeSBarry Smith .seealso: PetscInfoAllow() 178*5c6c1daeSBarry Smith M*/ 179*5c6c1daeSBarry Smith PetscErrorCode PetscInfo_Private(const char func[],void *vobj, const char message[], ...) 180*5c6c1daeSBarry Smith { 181*5c6c1daeSBarry Smith va_list Argp; 182*5c6c1daeSBarry Smith PetscMPIInt rank,urank; 183*5c6c1daeSBarry Smith size_t len; 184*5c6c1daeSBarry Smith PetscObject obj = (PetscObject)vobj; 185*5c6c1daeSBarry Smith char string[8*1024]; 186*5c6c1daeSBarry Smith PetscErrorCode ierr; 187*5c6c1daeSBarry Smith size_t fullLength; 188*5c6c1daeSBarry Smith int err; 189*5c6c1daeSBarry Smith 190*5c6c1daeSBarry Smith PetscFunctionBegin; 191*5c6c1daeSBarry Smith if (obj) PetscValidHeader(obj,1); 192*5c6c1daeSBarry Smith PetscValidCharPointer(message,2); 193*5c6c1daeSBarry Smith if (!PetscLogPrintInfo) PetscFunctionReturn(0); 194*5c6c1daeSBarry Smith if ((!PetscLogPrintInfoNull) && !vobj) PetscFunctionReturn(0); 195*5c6c1daeSBarry Smith if (obj && !PetscInfoFlags[obj->classid - PETSC_SMALLEST_CLASSID - 1]) PetscFunctionReturn(0); 196*5c6c1daeSBarry Smith if (!obj) { 197*5c6c1daeSBarry Smith rank = 0; 198*5c6c1daeSBarry Smith } else { 199*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr); 200*5c6c1daeSBarry Smith } 201*5c6c1daeSBarry Smith if (rank) PetscFunctionReturn(0); 202*5c6c1daeSBarry Smith 203*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr); 204*5c6c1daeSBarry Smith va_start(Argp, message); 205*5c6c1daeSBarry Smith sprintf(string, "[%d] %s(): ", urank,func); 206*5c6c1daeSBarry Smith ierr = PetscStrlen(string, &len);CHKERRQ(ierr); 207*5c6c1daeSBarry Smith ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp); 208*5c6c1daeSBarry Smith ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr); 209*5c6c1daeSBarry Smith err = fflush(PetscInfoFile); 210*5c6c1daeSBarry Smith if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 211*5c6c1daeSBarry Smith if (petsc_history) { 212*5c6c1daeSBarry Smith va_start(Argp, message); 213*5c6c1daeSBarry Smith (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr); 214*5c6c1daeSBarry Smith } 215*5c6c1daeSBarry Smith va_end(Argp); 216*5c6c1daeSBarry Smith PetscFunctionReturn(0); 217*5c6c1daeSBarry Smith } 218