Actual source code: verboseinfo.c
petsc-3.3-p7 2013-05-11
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
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.
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;
33: /*@C
34: PetscInfoAllow - Causes PetscInfo() messages to be printed to standard output.
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.
40: Input Parameter:
41: + flag - PETSC_TRUE or PETSC_FALSE
42: - filename - optional name of file to write output to (defaults to stdout)
44: Options Database Key:
45: . -info [optional filename] - Activates PetscInfoAllow()
47: Level: advanced
49: Concepts: debugging^detailed runtime information
50: Concepts: dumping detailed runtime information
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;
61: if (flag && filename) {
62: PetscFixFilename(filename, fname);
63: MPI_Comm_rank(PETSC_COMM_WORLD, &rank);
64: sprintf(tname, ".%d", rank);
65: PetscStrcat(fname, tname);
66: PetscFOpen(MPI_COMM_SELF, fname, "w", &PetscInfoFile);
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: return(0);
74: }
78: /*@
79: PetscInfoDeactivateClass - Deactivates PlogInfo() messages for a PETSc object class.
81: Not Collective
83: Input Parameter:
84: . objclass - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
86: Notes:
87: One can pass 0 to deactivate all messages that are not associated with an object.
89: Level: developer
91: .keywords: allow, information, printing, monitoring
92: .seealso: PetscInfoActivateClass(), PetscInfo(), PetscInfoAllow()
93: @*/
94: PetscErrorCode PetscInfoDeactivateClass(int objclass)
95: {
97: if (!objclass) {
98: PetscLogPrintInfoNull = PETSC_FALSE;
99: return(0);
100: }
101: PetscInfoFlags[objclass - PETSC_SMALLEST_CLASSID - 1] = 0;
102: return(0);
103: }
107: /*@
108: PetscInfoActivateClass - Activates PlogInfo() messages for a PETSc object class.
110: Not Collective
112: Input Parameter:
113: . objclass - The object class, e.g., MAT_CLASSID, SNES_CLASSID, etc.
115: Notes:
116: One can pass 0 to activate all messages that are not associated with an object.
118: Level: developer
120: .keywords: allow, information, printing, monitoring
121: .seealso: PetscInfoDeactivateClass(), PetscInfo(), PetscInfoAllow()
122: @*/
123: PetscErrorCode PetscInfoActivateClass(int objclass)
124: {
126: if (!objclass) {
127: PetscLogPrintInfoNull = PETSC_TRUE;
128: } else {
129: PetscInfoFlags[objclass - PETSC_SMALLEST_CLASSID - 1] = 1;
130: }
131: return(0);
132: }
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;
143: /*MC
144: PetscInfo - Logs informative data, which is printed to standard output
145: or a file when the option -info <file> is specified.
147: Synopsis:
148: PetscErrorCode PetscInfo(void *vobj, const char message[])
149: PetscErrorCode PetscInfo1(void *vobj, const char formatmessage[],arg1)
150: PetscErrorCode PetscInfo2(void *vobj, const char formatmessage[],arg1,arg2)
151: etc
153: Collective over PetscObject argument
155: Input Parameter:
156: + vobj - object most closely associated with the logging statement or PETSC_NULL
157: . message - logging message
158: - formatmessage - logging message using standard "printf" format
160: Options Database Key:
161: $ -info : activates printing of PetscInfo() messages
163: Level: intermediate
165: Fortran Note: This function does not take the vobj argument, there is only the PetscInfo()
166: version, not PetscInfo1() etc.
168: Example of Usage:
169: $
170: $ Mat A
171: $ double alpha
172: $ PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha);
173: $
175: Concepts: runtime information
177: .seealso: PetscInfoAllow()
178: M*/
179: PetscErrorCode PetscInfo_Private(const char func[],void *vobj, const char message[], ...)
180: {
181: va_list Argp;
182: PetscMPIInt rank,urank;
183: size_t len;
184: PetscObject obj = (PetscObject)vobj;
185: char string[8*1024];
187: size_t fullLength;
188: int err;
193: if (!PetscLogPrintInfo) return(0);
194: if ((!PetscLogPrintInfoNull) && !vobj) return(0);
195: if (obj && !PetscInfoFlags[obj->classid - PETSC_SMALLEST_CLASSID - 1]) return(0);
196: if (!obj) {
197: rank = 0;
198: } else {
199: MPI_Comm_rank(obj->comm, &rank);
200: }
201: if (rank) return(0);
203: MPI_Comm_rank(MPI_COMM_WORLD, &urank);
204: va_start(Argp, message);
205: sprintf(string, "[%d] %s(): ", urank,func);
206: PetscStrlen(string, &len);
207: PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);
208: PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);
209: err = fflush(PetscInfoFile);
210: if (err) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SYS,"fflush() failed on file");
211: if (petsc_history) {
212: va_start(Argp, message);
213: (*PetscVFPrintf)(petsc_history, message, Argp);
214: }
215: va_end(Argp);
216: return(0);
217: }