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) PetscInfoFile = PETSC_STDOUT; 69 70 PetscLogPrintInfo = flag; 71 PetscLogPrintInfoNull = flag; 72 PetscFunctionReturn(0); 73 } 74 75 #undef __FUNCT__ 76 #define __FUNCT__ "PetscInfoDeactivateClass" 77 /*@ 78 PetscInfoDeactivateClass - Deactivates PlogInfo() messages for a PETSc object class. 79 80 Not Collective 81 82 Input Parameter: 83 . objclass - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 84 85 Notes: 86 One can pass 0 to deactivate all messages that are not associated with an object. 87 88 Level: developer 89 90 .keywords: allow, information, printing, monitoring 91 .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow() 92 @*/ 93 PetscErrorCode PetscInfoDeactivateClass(int objclass) 94 { 95 PetscFunctionBegin; 96 if (!objclass) { 97 PetscLogPrintInfoNull = PETSC_FALSE; 98 PetscFunctionReturn(0); 99 } 100 PetscInfoFlags[objclass - PETSC_SMALLEST_CLASSID - 1] = 0; 101 PetscFunctionReturn(0); 102 } 103 104 #undef __FUNCT__ 105 #define __FUNCT__ "PetscInfoActivateClass" 106 /*@ 107 PetscInfoActivateClass - Activates PlogInfo() messages for a PETSc object class. 108 109 Not Collective 110 111 Input Parameter: 112 . objclass - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc. 113 114 Notes: 115 One can pass 0 to activate all messages that are not associated with an object. 116 117 Level: developer 118 119 .keywords: allow, information, printing, monitoring 120 .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow() 121 @*/ 122 PetscErrorCode PetscInfoActivateClass(int objclass) 123 { 124 PetscFunctionBegin; 125 if (!objclass) PetscLogPrintInfoNull = PETSC_TRUE; 126 else PetscInfoFlags[objclass - PETSC_SMALLEST_CLASSID - 1] = 1; 127 PetscFunctionReturn(0); 128 } 129 130 /* 131 If the option -history was used, then all printed PetscInfo() 132 messages are also printed to the history file, called by default 133 .petschistory in ones home directory. 134 */ 135 extern FILE *petsc_history; 136 137 #undef __FUNCT__ 138 #define __FUNCT__ "PetscInfo_Private" 139 /*MC 140 PetscInfo - Logs informative data, which is printed to standard output 141 or a file when the option -info <file> is specified. 142 143 Synopsis: 144 #include "petscsys.h" 145 PetscErrorCode PetscInfo(void *vobj, const char message[]) 146 PetscErrorCode PetscInfo1(void *vobj, const char formatmessage[],arg1) 147 PetscErrorCode PetscInfo2(void *vobj, const char formatmessage[],arg1,arg2) 148 etc 149 150 Collective over PetscObject argument 151 152 Input Parameter: 153 + vobj - object most closely associated with the logging statement or PETSC_NULL 154 . message - logging message 155 - formatmessage - logging message using standard "printf" format 156 157 Options Database Key: 158 $ -info : activates printing of PetscInfo() messages 159 160 Level: intermediate 161 162 Fortran Note: This function does not take the vobj argument, there is only the PetscInfo() 163 version, not PetscInfo1() etc. 164 165 Example of Usage: 166 $ 167 $ Mat A 168 $ double alpha 169 $ PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha); 170 $ 171 172 Concepts: runtime information 173 174 .seealso: PetscInfoAllow() 175 M*/ 176 PetscErrorCode PetscInfo_Private(const char func[],void *vobj, const char message[], ...) 177 { 178 va_list Argp; 179 PetscMPIInt rank,urank; 180 size_t len; 181 PetscObject obj = (PetscObject)vobj; 182 char string[8*1024]; 183 PetscErrorCode ierr; 184 size_t fullLength; 185 int err; 186 187 PetscFunctionBegin; 188 if (obj) PetscValidHeader(obj,1); 189 PetscValidCharPointer(message,2); 190 if (!PetscLogPrintInfo) PetscFunctionReturn(0); 191 if ((!PetscLogPrintInfoNull) && !vobj) PetscFunctionReturn(0); 192 if (obj && !PetscInfoFlags[obj->classid - PETSC_SMALLEST_CLASSID - 1]) PetscFunctionReturn(0); 193 if (!obj) rank = 0; 194 else { 195 ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr); 196 } 197 if (rank) PetscFunctionReturn(0); 198 199 ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr); 200 va_start(Argp, message); 201 sprintf(string, "[%d] %s(): ", urank,func); 202 ierr = PetscStrlen(string, &len);CHKERRQ(ierr); 203 ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);CHKERRQ(ierr); 204 ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr); 205 err = fflush(PetscInfoFile); 206 if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file"); 207 if (petsc_history) { 208 va_start(Argp, message); 209 ierr = (*PetscVFPrintf)(petsc_history, message, Argp);CHKERRQ(ierr); 210 } 211 va_end(Argp); 212 PetscFunctionReturn(0); 213 } 214