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