xref: /petsc/src/sys/info/verboseinfo.c (revision d724dfffc20f5834ebb4b97bb1e8ef89c8c2f0ed)
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        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
152 
153     Collective over PetscObject argument
154 
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
159 
160     Options Database Key:
161 $    -info : activates printing of PetscInfo() messages
162 
163     Level: intermediate
164 
165     Fortran Note: This function does not take the vobj argument, there is only the PetscInfo()
166      version, not PetscInfo1() etc.
167 
168     Example of Usage:
169 $
170 $     Mat A
171 $     double alpha
172 $     PetscInfo1(A,"Matrix uses parameter alpha=%g\n",alpha);
173 $
174 
175    Concepts: runtime information
176 
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];
186   PetscErrorCode ierr;
187   size_t         fullLength;
188   int            err;
189 
190   PetscFunctionBegin;
191   if (obj) PetscValidHeader(obj,1);
192   PetscValidCharPointer(message,2);
193   if (!PetscLogPrintInfo) PetscFunctionReturn(0);
194   if ((!PetscLogPrintInfoNull) && !vobj) PetscFunctionReturn(0);
195   if (obj && !PetscInfoFlags[obj->classid - PETSC_SMALLEST_CLASSID - 1]) PetscFunctionReturn(0);
196   if (!obj) {
197     rank = 0;
198   } else {
199     ierr = MPI_Comm_rank(obj->comm, &rank);CHKERRQ(ierr);
200   }
201   if (rank) PetscFunctionReturn(0);
202 
203   ierr = MPI_Comm_rank(MPI_COMM_WORLD, &urank);CHKERRQ(ierr);
204   va_start(Argp, message);
205   sprintf(string, "[%d] %s(): ", urank,func);
206   ierr = PetscStrlen(string, &len);CHKERRQ(ierr);
207   ierr = PetscVSNPrintf(string+len, 8*1024-len,message,&fullLength, Argp);
208   ierr = PetscFPrintf(PETSC_COMM_SELF,PetscInfoFile, "%s", string);CHKERRQ(ierr);
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);CHKERRQ(ierr);
214   }
215   va_end(Argp);
216   PetscFunctionReturn(0);
217 }
218