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