xref: /petsc/src/sys/info/verboseinfo.c (revision 009bbdc485cd9ad46be9940d3549e2dde9cdc322)
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