xref: /petsc/src/sys/logging/plog.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith /*
3*5c6c1daeSBarry Smith       PETSc code to log object creation and destruction and PETSc events.
4*5c6c1daeSBarry Smith 
5*5c6c1daeSBarry Smith       This provides the public API used by the rest of PETSc and by users.
6*5c6c1daeSBarry Smith 
7*5c6c1daeSBarry Smith       These routines use a private API that is not used elsewhere in PETSc and is not
8*5c6c1daeSBarry Smith       accessible to users. The private API is defined in logimpl.h and the utils directory.
9*5c6c1daeSBarry Smith 
10*5c6c1daeSBarry Smith */
11*5c6c1daeSBarry Smith #include <petscsys.h>        /*I    "petscsys.h"   I*/
12*5c6c1daeSBarry Smith #include <petsctime.h>
13*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_MPE)
14*5c6c1daeSBarry Smith #include <mpe.h>
15*5c6c1daeSBarry Smith #endif
16*5c6c1daeSBarry Smith #include <stdarg.h>
17*5c6c1daeSBarry Smith #include <sys/types.h>
18*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_STDLIB_H)
19*5c6c1daeSBarry Smith #include <stdlib.h>
20*5c6c1daeSBarry Smith #endif
21*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_MALLOC_H)
22*5c6c1daeSBarry Smith #include <malloc.h>
23*5c6c1daeSBarry Smith #endif
24*5c6c1daeSBarry Smith #include <petsc-private/logimpl.h>
25*5c6c1daeSBarry Smith #include <petscthreadcomm.h>
26*5c6c1daeSBarry Smith 
27*5c6c1daeSBarry Smith PetscLogEvent  PETSC_LARGEST_EVENT  = PETSC_EVENT;
28*5c6c1daeSBarry Smith 
29*5c6c1daeSBarry Smith #if defined(PETSC_CLANGUAGE_CXX) && !defined(PETSC_USE_EXTERN_CXX)
30*5c6c1daeSBarry Smith std::map<std::string,PETSc::LogEvent> PETSc::Log::event_registry;
31*5c6c1daeSBarry Smith std::map<std::string,PETSc::LogStage> PETSc::Log::stage_registry;
32*5c6c1daeSBarry Smith #endif
33*5c6c1daeSBarry Smith 
34*5c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
35*5c6c1daeSBarry Smith #include <petscmachineinfo.h>
36*5c6c1daeSBarry Smith #include <petscconfiginfo.h>
37*5c6c1daeSBarry Smith 
38*5c6c1daeSBarry Smith /* used in the MPI_XXX() count macros in petsclog.h */
39*5c6c1daeSBarry Smith 
40*5c6c1daeSBarry Smith /* Action and object logging variables */
41*5c6c1daeSBarry Smith Action    *petsc_actions    = PETSC_NULL;
42*5c6c1daeSBarry Smith Object    *petsc_objects    = PETSC_NULL;
43*5c6c1daeSBarry Smith PetscBool  petsc_logActions = PETSC_FALSE;
44*5c6c1daeSBarry Smith PetscBool  petsc_logObjects = PETSC_FALSE;
45*5c6c1daeSBarry Smith int        petsc_numActions = 0, petsc_maxActions = 100;
46*5c6c1daeSBarry Smith int        petsc_numObjects = 0, petsc_maxObjects = 100;
47*5c6c1daeSBarry Smith int        petsc_numObjectsDestroyed = 0;
48*5c6c1daeSBarry Smith 
49*5c6c1daeSBarry Smith /* Global counters */
50*5c6c1daeSBarry Smith PetscLogDouble  petsc_BaseTime        = 0.0;
51*5c6c1daeSBarry Smith PetscLogDouble  petsc_TotalFlops     = 0.0; /* The number of flops */
52*5c6c1daeSBarry Smith PetscLogDouble  petsc_tmp_flops = 0.0; /* The incremental number of flops */
53*5c6c1daeSBarry Smith PetscLogDouble  petsc_send_ct         = 0.0; /* The number of sends */
54*5c6c1daeSBarry Smith PetscLogDouble  petsc_recv_ct         = 0.0; /* The number of receives */
55*5c6c1daeSBarry Smith PetscLogDouble  petsc_send_len        = 0.0; /* The total length of all sent messages */
56*5c6c1daeSBarry Smith PetscLogDouble  petsc_recv_len        = 0.0; /* The total length of all received messages */
57*5c6c1daeSBarry Smith PetscLogDouble  petsc_isend_ct        = 0.0; /* The number of immediate sends */
58*5c6c1daeSBarry Smith PetscLogDouble  petsc_irecv_ct        = 0.0; /* The number of immediate receives */
59*5c6c1daeSBarry Smith PetscLogDouble  petsc_isend_len       = 0.0; /* The total length of all immediate send messages */
60*5c6c1daeSBarry Smith PetscLogDouble  petsc_irecv_len       = 0.0; /* The total length of all immediate receive messages */
61*5c6c1daeSBarry Smith PetscLogDouble  petsc_wait_ct         = 0.0; /* The number of waits */
62*5c6c1daeSBarry Smith PetscLogDouble  petsc_wait_any_ct     = 0.0; /* The number of anywaits */
63*5c6c1daeSBarry Smith PetscLogDouble  petsc_wait_all_ct     = 0.0; /* The number of waitalls */
64*5c6c1daeSBarry Smith PetscLogDouble  petsc_sum_of_waits_ct = 0.0; /* The total number of waits */
65*5c6c1daeSBarry Smith PetscLogDouble  petsc_allreduce_ct    = 0.0; /* The number of reductions */
66*5c6c1daeSBarry Smith PetscLogDouble  petsc_gather_ct       = 0.0; /* The number of gathers and gathervs */
67*5c6c1daeSBarry Smith PetscLogDouble  petsc_scatter_ct      = 0.0; /* The number of scatters and scattervs */
68*5c6c1daeSBarry Smith 
69*5c6c1daeSBarry Smith /* Logging functions */
70*5c6c1daeSBarry Smith PetscErrorCode  (*PetscLogPHC)(PetscObject) = PETSC_NULL;
71*5c6c1daeSBarry Smith PetscErrorCode  (*PetscLogPHD)(PetscObject) = PETSC_NULL;
72*5c6c1daeSBarry Smith PetscErrorCode  (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = PETSC_NULL;
73*5c6c1daeSBarry Smith PetscErrorCode  (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = PETSC_NULL;
74*5c6c1daeSBarry Smith 
75*5c6c1daeSBarry Smith /* Tracing event logging variables */
76*5c6c1daeSBarry Smith FILE          *petsc_tracefile       = PETSC_NULL;
77*5c6c1daeSBarry Smith int            petsc_tracelevel      = 0;
78*5c6c1daeSBarry Smith const char    *petsc_traceblanks     = "                                                                                                    ";
79*5c6c1daeSBarry Smith char           petsc_tracespace[128] = " ";
80*5c6c1daeSBarry Smith PetscLogDouble petsc_tracetime       = 0.0;
81*5c6c1daeSBarry Smith static PetscBool  PetscLogBegin_PrivateCalled = PETSC_FALSE;
82*5c6c1daeSBarry Smith 
83*5c6c1daeSBarry Smith /*---------------------------------------------- General Functions --------------------------------------------------*/
84*5c6c1daeSBarry Smith #undef __FUNCT__
85*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogDestroy"
86*5c6c1daeSBarry Smith /*@C
87*5c6c1daeSBarry Smith   PetscLogDestroy - Destroys the object and event logging data and resets the global counters.
88*5c6c1daeSBarry Smith 
89*5c6c1daeSBarry Smith   Not Collective
90*5c6c1daeSBarry Smith 
91*5c6c1daeSBarry Smith   Notes:
92*5c6c1daeSBarry Smith   This routine should not usually be used by programmers. Instead employ
93*5c6c1daeSBarry Smith   PetscLogStagePush() and PetscLogStagePop().
94*5c6c1daeSBarry Smith 
95*5c6c1daeSBarry Smith   Level: developer
96*5c6c1daeSBarry Smith 
97*5c6c1daeSBarry Smith .keywords: log, destroy
98*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogStagePush(), PlogStagePop()
99*5c6c1daeSBarry Smith @*/
100*5c6c1daeSBarry Smith PetscErrorCode  PetscLogDestroy(void)
101*5c6c1daeSBarry Smith {
102*5c6c1daeSBarry Smith   PetscStageLog       stageLog;
103*5c6c1daeSBarry Smith   PetscErrorCode ierr;
104*5c6c1daeSBarry Smith 
105*5c6c1daeSBarry Smith   PetscFunctionBegin;
106*5c6c1daeSBarry Smith   ierr = PetscFree(petsc_actions);CHKERRQ(ierr);
107*5c6c1daeSBarry Smith   ierr = PetscFree(petsc_objects);CHKERRQ(ierr);
108*5c6c1daeSBarry Smith   ierr = PetscLogSet(PETSC_NULL, PETSC_NULL);CHKERRQ(ierr);
109*5c6c1daeSBarry Smith 
110*5c6c1daeSBarry Smith   /* Resetting phase */
111*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
112*5c6c1daeSBarry Smith   ierr = PetscStageLogDestroy(stageLog);CHKERRQ(ierr);
113*5c6c1daeSBarry Smith   petsc_TotalFlops         = 0.0;
114*5c6c1daeSBarry Smith   petsc_numActions          = 0;
115*5c6c1daeSBarry Smith   petsc_numObjects          = 0;
116*5c6c1daeSBarry Smith   petsc_numObjectsDestroyed = 0;
117*5c6c1daeSBarry Smith   petsc_maxActions          = 100;
118*5c6c1daeSBarry Smith   petsc_maxObjects          = 100;
119*5c6c1daeSBarry Smith   petsc_actions    = PETSC_NULL;
120*5c6c1daeSBarry Smith   petsc_objects    = PETSC_NULL;
121*5c6c1daeSBarry Smith   petsc_logActions = PETSC_FALSE;
122*5c6c1daeSBarry Smith   petsc_logObjects = PETSC_FALSE;
123*5c6c1daeSBarry Smith   petsc_BaseTime        = 0.0;
124*5c6c1daeSBarry Smith   petsc_TotalFlops     = 0.0;
125*5c6c1daeSBarry Smith   petsc_tmp_flops = 0.0;
126*5c6c1daeSBarry Smith   petsc_send_ct         = 0.0;
127*5c6c1daeSBarry Smith   petsc_recv_ct         = 0.0;
128*5c6c1daeSBarry Smith   petsc_send_len        = 0.0;
129*5c6c1daeSBarry Smith   petsc_recv_len        = 0.0;
130*5c6c1daeSBarry Smith   petsc_isend_ct        = 0.0;
131*5c6c1daeSBarry Smith   petsc_irecv_ct        = 0.0;
132*5c6c1daeSBarry Smith   petsc_isend_len       = 0.0;
133*5c6c1daeSBarry Smith   petsc_irecv_len       = 0.0;
134*5c6c1daeSBarry Smith   petsc_wait_ct         = 0.0;
135*5c6c1daeSBarry Smith   petsc_wait_any_ct     = 0.0;
136*5c6c1daeSBarry Smith   petsc_wait_all_ct     = 0.0;
137*5c6c1daeSBarry Smith   petsc_sum_of_waits_ct = 0.0;
138*5c6c1daeSBarry Smith   petsc_allreduce_ct    = 0.0;
139*5c6c1daeSBarry Smith   petsc_gather_ct       = 0.0;
140*5c6c1daeSBarry Smith   petsc_scatter_ct      = 0.0;
141*5c6c1daeSBarry Smith   PETSC_LARGEST_EVENT  = PETSC_EVENT;
142*5c6c1daeSBarry Smith   PetscLogPHC = PETSC_NULL;
143*5c6c1daeSBarry Smith   PetscLogPHD = PETSC_NULL;
144*5c6c1daeSBarry Smith   petsc_tracefile       = PETSC_NULL;
145*5c6c1daeSBarry Smith   petsc_tracelevel      = 0;
146*5c6c1daeSBarry Smith   petsc_traceblanks     = "                                                                                                    ";
147*5c6c1daeSBarry Smith   petsc_tracespace[0] = ' '; petsc_tracespace[1] = 0;
148*5c6c1daeSBarry Smith   petsc_tracetime       = 0.0;
149*5c6c1daeSBarry Smith   PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
150*5c6c1daeSBarry Smith   PETSC_OBJECT_CLASSID  = 0;
151*5c6c1daeSBarry Smith   petsc_stageLog = 0;
152*5c6c1daeSBarry Smith   PetscLogBegin_PrivateCalled = PETSC_FALSE;
153*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
154*5c6c1daeSBarry Smith }
155*5c6c1daeSBarry Smith 
156*5c6c1daeSBarry Smith #undef __FUNCT__
157*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogSet"
158*5c6c1daeSBarry Smith /*@C
159*5c6c1daeSBarry Smith   PetscLogSet - Sets the logging functions called at the beginning and ending of every event.
160*5c6c1daeSBarry Smith 
161*5c6c1daeSBarry Smith   Not Collective
162*5c6c1daeSBarry Smith 
163*5c6c1daeSBarry Smith   Input Parameters:
164*5c6c1daeSBarry Smith + b - The function called at beginning of event
165*5c6c1daeSBarry Smith - e - The function called at end of event
166*5c6c1daeSBarry Smith 
167*5c6c1daeSBarry Smith   Level: developer
168*5c6c1daeSBarry Smith 
169*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogBegin(), PetscLogAllBegin(), PetscLogTraceBegin()
170*5c6c1daeSBarry Smith @*/
171*5c6c1daeSBarry Smith PetscErrorCode  PetscLogSet(PetscErrorCode (*b)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject),
172*5c6c1daeSBarry Smith             PetscErrorCode (*e)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject))
173*5c6c1daeSBarry Smith {
174*5c6c1daeSBarry Smith   PetscFunctionBegin;
175*5c6c1daeSBarry Smith   PetscLogPLB = b;
176*5c6c1daeSBarry Smith   PetscLogPLE = e;
177*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
178*5c6c1daeSBarry Smith }
179*5c6c1daeSBarry Smith 
180*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_CHUD)
181*5c6c1daeSBarry Smith #include <CHUD/CHUD.h>
182*5c6c1daeSBarry Smith #endif
183*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_PAPI)
184*5c6c1daeSBarry Smith #include <papi.h>
185*5c6c1daeSBarry Smith int PAPIEventSet = PAPI_NULL;
186*5c6c1daeSBarry Smith #endif
187*5c6c1daeSBarry Smith 
188*5c6c1daeSBarry Smith /*------------------------------------------- Initialization Functions ----------------------------------------------*/
189*5c6c1daeSBarry Smith #undef __FUNCT__
190*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogBegin_Private"
191*5c6c1daeSBarry Smith PetscErrorCode  PetscLogBegin_Private(void)
192*5c6c1daeSBarry Smith {
193*5c6c1daeSBarry Smith   int               stage;
194*5c6c1daeSBarry Smith   PetscBool         opt;
195*5c6c1daeSBarry Smith   PetscErrorCode    ierr;
196*5c6c1daeSBarry Smith 
197*5c6c1daeSBarry Smith   PetscFunctionBegin;
198*5c6c1daeSBarry Smith   if (PetscLogBegin_PrivateCalled) PetscFunctionReturn(0);
199*5c6c1daeSBarry Smith   PetscLogBegin_PrivateCalled = PETSC_TRUE;
200*5c6c1daeSBarry Smith 
201*5c6c1daeSBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL, "-log_exclude_actions", &opt);CHKERRQ(ierr);
202*5c6c1daeSBarry Smith   if (opt) {
203*5c6c1daeSBarry Smith     petsc_logActions = PETSC_FALSE;
204*5c6c1daeSBarry Smith   }
205*5c6c1daeSBarry Smith   ierr = PetscOptionsHasName(PETSC_NULL, "-log_exclude_objects", &opt);CHKERRQ(ierr);
206*5c6c1daeSBarry Smith   if (opt) {
207*5c6c1daeSBarry Smith     petsc_logObjects = PETSC_FALSE;
208*5c6c1daeSBarry Smith   }
209*5c6c1daeSBarry Smith   if (petsc_logActions) {
210*5c6c1daeSBarry Smith     ierr = PetscMalloc(petsc_maxActions * sizeof(Action), &petsc_actions);CHKERRQ(ierr);
211*5c6c1daeSBarry Smith   }
212*5c6c1daeSBarry Smith   if (petsc_logObjects) {
213*5c6c1daeSBarry Smith     ierr = PetscMalloc(petsc_maxObjects * sizeof(Object), &petsc_objects);CHKERRQ(ierr);
214*5c6c1daeSBarry Smith   }
215*5c6c1daeSBarry Smith   PetscLogPHC = PetscLogObjCreateDefault;
216*5c6c1daeSBarry Smith   PetscLogPHD = PetscLogObjDestroyDefault;
217*5c6c1daeSBarry Smith   /* Setup default logging structures */
218*5c6c1daeSBarry Smith   ierr = PetscStageLogCreate(&petsc_stageLog);CHKERRQ(ierr);
219*5c6c1daeSBarry Smith   ierr = PetscStageLogRegister(petsc_stageLog, "Main Stage", &stage);CHKERRQ(ierr);
220*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_CHUD)
221*5c6c1daeSBarry Smith   ierr = chudInitialize();CHKERRQ(ierr);
222*5c6c1daeSBarry Smith   ierr = chudAcquireSamplingFacility(CHUD_BLOCKING);CHKERRQ(ierr);
223*5c6c1daeSBarry Smith   ierr = chudSetSamplingDevice(chudCPU1Dev);CHKERRQ(ierr);
224*5c6c1daeSBarry Smith   ierr = chudSetStartDelay(0,chudNanoSeconds);CHKERRQ(ierr);
225*5c6c1daeSBarry Smith   ierr = chudClearPMCMode(chudCPU1Dev,chudUnused);CHKERRQ(ierr);
226*5c6c1daeSBarry Smith   ierr = chudClearPMCs();CHKERRQ(ierr);
227*5c6c1daeSBarry Smith   /* ierr = chudSetPMCMuxPosition(chudCPU1Dev,0,0);CHKERRQ(ierr); */
228*5c6c1daeSBarry Smith   printf("%s\n",chudGetEventName(chudCPU1Dev,PMC_1,193));
229*5c6c1daeSBarry Smith   printf("%s\n",chudGetEventDescription(chudCPU1Dev,PMC_1,193));
230*5c6c1daeSBarry Smith   printf("%s\n",chudGetEventNotes(chudCPU1Dev,PMC_1,193));
231*5c6c1daeSBarry Smith   ierr = chudSetPMCEvent(chudCPU1Dev,PMC_1,193);CHKERRQ(ierr);
232*5c6c1daeSBarry Smith   ierr = chudSetPMCMode(chudCPU1Dev,PMC_1,chudCounter);CHKERRQ(ierr);
233*5c6c1daeSBarry Smith   ierr = chudSetPrivilegeFilter(chudCPU1Dev,PMC_1,chudCountUserEvents);CHKERRQ(ierr);
234*5c6c1daeSBarry Smith   ierr = chudSetPMCEventMask(chudCPU1Dev,PMC_1,0xFE);CHKERRQ(ierr);
235*5c6c1daeSBarry Smith   if (!chudIsEventValid(chudCPU1Dev,PMC_1,193)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Event is not valid %d",193);
236*5c6c1daeSBarry Smith   ierr = chudStartPMCs();CHKERRQ(ierr);
237*5c6c1daeSBarry Smith #endif
238*5c6c1daeSBarry Smith #if defined(PETSC_HAVE_PAPI)
239*5c6c1daeSBarry Smith   ierr = PAPI_library_init(PAPI_VER_CURRENT);
240*5c6c1daeSBarry Smith   if (ierr != PAPI_VER_CURRENT) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Cannot initialize PAPI");
241*5c6c1daeSBarry Smith   ierr = PAPI_query_event(PAPI_FP_INS);CHKERRQ(ierr);
242*5c6c1daeSBarry Smith   ierr = PAPI_create_eventset(&PAPIEventSet);CHKERRQ(ierr);
243*5c6c1daeSBarry Smith   ierr = PAPI_add_event(PAPIEventSet,PAPI_FP_INS);CHKERRQ(ierr);
244*5c6c1daeSBarry Smith   ierr = PAPI_start(PAPIEventSet);CHKERRQ(ierr);
245*5c6c1daeSBarry Smith #endif
246*5c6c1daeSBarry Smith 
247*5c6c1daeSBarry Smith   /* All processors sync here for more consistent logging */
248*5c6c1daeSBarry Smith   ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRQ(ierr);
249*5c6c1daeSBarry Smith   PetscTime(petsc_BaseTime);
250*5c6c1daeSBarry Smith   ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
251*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
252*5c6c1daeSBarry Smith }
253*5c6c1daeSBarry Smith 
254*5c6c1daeSBarry Smith #undef __FUNCT__
255*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogBegin"
256*5c6c1daeSBarry Smith /*@C
257*5c6c1daeSBarry Smith   PetscLogBegin - Turns on logging of objects and events. This logs flop
258*5c6c1daeSBarry Smith   rates and object creation and should not slow programs down too much.
259*5c6c1daeSBarry Smith   This routine may be called more than once.
260*5c6c1daeSBarry Smith 
261*5c6c1daeSBarry Smith   Logically Collective over PETSC_COMM_WORLD
262*5c6c1daeSBarry Smith 
263*5c6c1daeSBarry Smith   Options Database Keys:
264*5c6c1daeSBarry Smith + -log_summary - Prints summary of flop and timing information to the
265*5c6c1daeSBarry Smith                   screen (for code compiled with PETSC_USE_LOG)
266*5c6c1daeSBarry Smith - -log - Prints detailed log information (for code compiled with PETSC_USE_LOG)
267*5c6c1daeSBarry Smith 
268*5c6c1daeSBarry Smith   Usage:
269*5c6c1daeSBarry Smith .vb
270*5c6c1daeSBarry Smith       PetscInitialize(...);
271*5c6c1daeSBarry Smith       PetscLogBegin();
272*5c6c1daeSBarry Smith        ... code ...
273*5c6c1daeSBarry Smith       PetscLogView(viewer); or PetscLogDump();
274*5c6c1daeSBarry Smith       PetscFinalize();
275*5c6c1daeSBarry Smith .ve
276*5c6c1daeSBarry Smith 
277*5c6c1daeSBarry Smith   Notes:
278*5c6c1daeSBarry Smith   PetscLogView(viewer) or PetscLogDump() actually cause the printing of
279*5c6c1daeSBarry Smith   the logging information.
280*5c6c1daeSBarry Smith 
281*5c6c1daeSBarry Smith   Level: advanced
282*5c6c1daeSBarry Smith 
283*5c6c1daeSBarry Smith .keywords: log, begin
284*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogTraceBegin()
285*5c6c1daeSBarry Smith @*/
286*5c6c1daeSBarry Smith PetscErrorCode  PetscLogBegin(void)
287*5c6c1daeSBarry Smith {
288*5c6c1daeSBarry Smith   PetscErrorCode ierr;
289*5c6c1daeSBarry Smith 
290*5c6c1daeSBarry Smith   PetscFunctionBegin;
291*5c6c1daeSBarry Smith   ierr = PetscLogSet(PetscLogEventBeginDefault, PetscLogEventEndDefault);CHKERRQ(ierr);
292*5c6c1daeSBarry Smith   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
293*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
294*5c6c1daeSBarry Smith }
295*5c6c1daeSBarry Smith 
296*5c6c1daeSBarry Smith #undef __FUNCT__
297*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogAllBegin"
298*5c6c1daeSBarry Smith /*@C
299*5c6c1daeSBarry Smith   PetscLogAllBegin - Turns on extensive logging of objects and events. Logs
300*5c6c1daeSBarry Smith   all events. This creates large log files and slows the program down.
301*5c6c1daeSBarry Smith 
302*5c6c1daeSBarry Smith   Logically Collective on PETSC_COMM_WORLD
303*5c6c1daeSBarry Smith 
304*5c6c1daeSBarry Smith   Options Database Keys:
305*5c6c1daeSBarry Smith . -log_all - Prints extensive log information (for code compiled with PETSC_USE_LOG)
306*5c6c1daeSBarry Smith 
307*5c6c1daeSBarry Smith   Usage:
308*5c6c1daeSBarry Smith .vb
309*5c6c1daeSBarry Smith      PetscInitialize(...);
310*5c6c1daeSBarry Smith      PetscLogAllBegin();
311*5c6c1daeSBarry Smith      ... code ...
312*5c6c1daeSBarry Smith      PetscLogDump(filename);
313*5c6c1daeSBarry Smith      PetscFinalize();
314*5c6c1daeSBarry Smith .ve
315*5c6c1daeSBarry Smith 
316*5c6c1daeSBarry Smith   Notes:
317*5c6c1daeSBarry Smith   A related routine is PetscLogBegin (with the options key -log), which is
318*5c6c1daeSBarry Smith   intended for production runs since it logs only flop rates and object
319*5c6c1daeSBarry Smith   creation (and shouldn't significantly slow the programs).
320*5c6c1daeSBarry Smith 
321*5c6c1daeSBarry Smith   Level: advanced
322*5c6c1daeSBarry Smith 
323*5c6c1daeSBarry Smith .keywords: log, all, begin
324*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogBegin(), PetscLogTraceBegin()
325*5c6c1daeSBarry Smith @*/
326*5c6c1daeSBarry Smith PetscErrorCode  PetscLogAllBegin(void)
327*5c6c1daeSBarry Smith {
328*5c6c1daeSBarry Smith   PetscErrorCode ierr;
329*5c6c1daeSBarry Smith 
330*5c6c1daeSBarry Smith   PetscFunctionBegin;
331*5c6c1daeSBarry Smith   ierr = PetscLogSet(PetscLogEventBeginComplete, PetscLogEventEndComplete);CHKERRQ(ierr);
332*5c6c1daeSBarry Smith   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
333*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
334*5c6c1daeSBarry Smith }
335*5c6c1daeSBarry Smith 
336*5c6c1daeSBarry Smith #undef __FUNCT__
337*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogTraceBegin"
338*5c6c1daeSBarry Smith /*@
339*5c6c1daeSBarry Smith   PetscLogTraceBegin - Activates trace logging.  Every time a PETSc event
340*5c6c1daeSBarry Smith   begins or ends, the event name is printed.
341*5c6c1daeSBarry Smith 
342*5c6c1daeSBarry Smith   Logically Collective on PETSC_COMM_WORLD
343*5c6c1daeSBarry Smith 
344*5c6c1daeSBarry Smith   Input Parameter:
345*5c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout)
346*5c6c1daeSBarry Smith 
347*5c6c1daeSBarry Smith   Options Database Key:
348*5c6c1daeSBarry Smith . -log_trace [filename] - Activates PetscLogTraceBegin()
349*5c6c1daeSBarry Smith 
350*5c6c1daeSBarry Smith   Notes:
351*5c6c1daeSBarry Smith   PetscLogTraceBegin() prints the processor number, the execution time (sec),
352*5c6c1daeSBarry Smith   then "Event begin:" or "Event end:" followed by the event name.
353*5c6c1daeSBarry Smith 
354*5c6c1daeSBarry Smith   PetscLogTraceBegin() allows tracing of all PETSc calls, which is useful
355*5c6c1daeSBarry Smith   to determine where a program is hanging without running in the
356*5c6c1daeSBarry Smith   debugger.  Can be used in conjunction with the -info option.
357*5c6c1daeSBarry Smith 
358*5c6c1daeSBarry Smith   Level: intermediate
359*5c6c1daeSBarry Smith 
360*5c6c1daeSBarry Smith .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogBegin()
361*5c6c1daeSBarry Smith @*/
362*5c6c1daeSBarry Smith PetscErrorCode  PetscLogTraceBegin(FILE *file)
363*5c6c1daeSBarry Smith {
364*5c6c1daeSBarry Smith   PetscErrorCode ierr;
365*5c6c1daeSBarry Smith 
366*5c6c1daeSBarry Smith   PetscFunctionBegin;
367*5c6c1daeSBarry Smith   petsc_tracefile = file;
368*5c6c1daeSBarry Smith   ierr = PetscLogSet(PetscLogEventBeginTrace, PetscLogEventEndTrace);CHKERRQ(ierr);
369*5c6c1daeSBarry Smith   ierr = PetscLogBegin_Private();CHKERRQ(ierr);
370*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
371*5c6c1daeSBarry Smith }
372*5c6c1daeSBarry Smith 
373*5c6c1daeSBarry Smith #undef __FUNCT__
374*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogActions"
375*5c6c1daeSBarry Smith /*@
376*5c6c1daeSBarry Smith   PetscLogActions - Determines whether actions are logged for the graphical viewer.
377*5c6c1daeSBarry Smith 
378*5c6c1daeSBarry Smith   Not Collective
379*5c6c1daeSBarry Smith 
380*5c6c1daeSBarry Smith   Input Parameter:
381*5c6c1daeSBarry Smith . flag - PETSC_TRUE if actions are to be logged
382*5c6c1daeSBarry Smith 
383*5c6c1daeSBarry Smith   Level: intermediate
384*5c6c1daeSBarry Smith 
385*5c6c1daeSBarry Smith   Note: Logging of actions continues to consume more memory as the program
386*5c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
387*5c6c1daeSBarry Smith 
388*5c6c1daeSBarry Smith   Options Database Keys:
389*5c6c1daeSBarry Smith . -log_exclude_actions - Turns off actions logging
390*5c6c1daeSBarry Smith 
391*5c6c1daeSBarry Smith .keywords: log, stage, register
392*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop()
393*5c6c1daeSBarry Smith @*/
394*5c6c1daeSBarry Smith PetscErrorCode  PetscLogActions(PetscBool  flag)
395*5c6c1daeSBarry Smith {
396*5c6c1daeSBarry Smith   PetscFunctionBegin;
397*5c6c1daeSBarry Smith   petsc_logActions = flag;
398*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
399*5c6c1daeSBarry Smith }
400*5c6c1daeSBarry Smith 
401*5c6c1daeSBarry Smith #undef __FUNCT__
402*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogObjects"
403*5c6c1daeSBarry Smith /*@
404*5c6c1daeSBarry Smith   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
405*5c6c1daeSBarry Smith 
406*5c6c1daeSBarry Smith   Not Collective
407*5c6c1daeSBarry Smith 
408*5c6c1daeSBarry Smith   Input Parameter:
409*5c6c1daeSBarry Smith . flag - PETSC_TRUE if objects are to be logged
410*5c6c1daeSBarry Smith 
411*5c6c1daeSBarry Smith   Level: intermediate
412*5c6c1daeSBarry Smith 
413*5c6c1daeSBarry Smith   Note: Logging of objects continues to consume more memory as the program
414*5c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
415*5c6c1daeSBarry Smith 
416*5c6c1daeSBarry Smith   Options Database Keys:
417*5c6c1daeSBarry Smith . -log_exclude_objects - Turns off objects logging
418*5c6c1daeSBarry Smith 
419*5c6c1daeSBarry Smith .keywords: log, stage, register
420*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop()
421*5c6c1daeSBarry Smith @*/
422*5c6c1daeSBarry Smith PetscErrorCode  PetscLogObjects(PetscBool  flag)
423*5c6c1daeSBarry Smith {
424*5c6c1daeSBarry Smith   PetscFunctionBegin;
425*5c6c1daeSBarry Smith   petsc_logObjects = flag;
426*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
427*5c6c1daeSBarry Smith }
428*5c6c1daeSBarry Smith 
429*5c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/
430*5c6c1daeSBarry Smith #undef __FUNCT__
431*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageRegister"
432*5c6c1daeSBarry Smith /*@C
433*5c6c1daeSBarry Smith   PetscLogStageRegister - Attaches a charactor string name to a logging stage.
434*5c6c1daeSBarry Smith 
435*5c6c1daeSBarry Smith   Not Collective
436*5c6c1daeSBarry Smith 
437*5c6c1daeSBarry Smith   Input Parameter:
438*5c6c1daeSBarry Smith . sname - The name to associate with that stage
439*5c6c1daeSBarry Smith 
440*5c6c1daeSBarry Smith   Output Parameter:
441*5c6c1daeSBarry Smith . stage - The stage number
442*5c6c1daeSBarry Smith 
443*5c6c1daeSBarry Smith   Level: intermediate
444*5c6c1daeSBarry Smith 
445*5c6c1daeSBarry Smith .keywords: log, stage, register
446*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop()
447*5c6c1daeSBarry Smith @*/
448*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStageRegister(const char sname[],PetscLogStage *stage)
449*5c6c1daeSBarry Smith {
450*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
451*5c6c1daeSBarry Smith   PetscLogEvent  event;
452*5c6c1daeSBarry Smith   PetscErrorCode ierr;
453*5c6c1daeSBarry Smith 
454*5c6c1daeSBarry Smith   PetscFunctionBegin;
455*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
456*5c6c1daeSBarry Smith   ierr = PetscStageLogRegister(stageLog, sname, stage);CHKERRQ(ierr);
457*5c6c1daeSBarry Smith   /* Copy events already changed in the main stage, this sucks */
458*5c6c1daeSBarry Smith   ierr = EventPerfLogEnsureSize(stageLog->stageInfo[*stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr);
459*5c6c1daeSBarry Smith   for (event = 0; event < stageLog->eventLog->numEvents; event++) {
460*5c6c1daeSBarry Smith     ierr = EventPerfInfoCopy(&stageLog->stageInfo[0].eventLog->eventInfo[event],&stageLog->stageInfo[*stage].eventLog->eventInfo[event]);CHKERRQ(ierr);
461*5c6c1daeSBarry Smith   }
462*5c6c1daeSBarry Smith   ierr = ClassPerfLogEnsureSize(stageLog->stageInfo[*stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr);
463*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
464*5c6c1daeSBarry Smith }
465*5c6c1daeSBarry Smith 
466*5c6c1daeSBarry Smith #undef __FUNCT__
467*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStagePush"
468*5c6c1daeSBarry Smith /*@C
469*5c6c1daeSBarry Smith   PetscLogStagePush - This function pushes a stage on the stack.
470*5c6c1daeSBarry Smith 
471*5c6c1daeSBarry Smith   Not Collective
472*5c6c1daeSBarry Smith 
473*5c6c1daeSBarry Smith   Input Parameter:
474*5c6c1daeSBarry Smith . stage - The stage on which to log
475*5c6c1daeSBarry Smith 
476*5c6c1daeSBarry Smith   Usage:
477*5c6c1daeSBarry Smith   If the option -log_sumary is used to run the program containing the
478*5c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
479*5c6c1daeSBarry Smith   PetscFinalize().
480*5c6c1daeSBarry Smith .vb
481*5c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
482*5c6c1daeSBarry Smith       [stage 0 of code]
483*5c6c1daeSBarry Smith       PetscLogStagePush(1);
484*5c6c1daeSBarry Smith       [stage 1 of code]
485*5c6c1daeSBarry Smith       PetscLogStagePop();
486*5c6c1daeSBarry Smith       PetscBarrier(...);
487*5c6c1daeSBarry Smith       [more stage 0 of code]
488*5c6c1daeSBarry Smith       PetscFinalize();
489*5c6c1daeSBarry Smith .ve
490*5c6c1daeSBarry Smith 
491*5c6c1daeSBarry Smith   Notes:
492*5c6c1daeSBarry Smith   Use PetscLogStageRegister() to register a stage.
493*5c6c1daeSBarry Smith 
494*5c6c1daeSBarry Smith   Level: intermediate
495*5c6c1daeSBarry Smith 
496*5c6c1daeSBarry Smith .keywords: log, push, stage
497*5c6c1daeSBarry Smith .seealso: PetscLogStagePop(), PetscLogStageRegister(), PetscBarrier()
498*5c6c1daeSBarry Smith @*/
499*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStagePush(PetscLogStage stage)
500*5c6c1daeSBarry Smith {
501*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
502*5c6c1daeSBarry Smith   PetscErrorCode ierr;
503*5c6c1daeSBarry Smith 
504*5c6c1daeSBarry Smith   PetscFunctionBegin;
505*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
506*5c6c1daeSBarry Smith   ierr = PetscStageLogPush(stageLog, stage);CHKERRQ(ierr);
507*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
508*5c6c1daeSBarry Smith }
509*5c6c1daeSBarry Smith 
510*5c6c1daeSBarry Smith #undef __FUNCT__
511*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStagePop"
512*5c6c1daeSBarry Smith /*@C
513*5c6c1daeSBarry Smith   PetscLogStagePop - This function pops a stage from the stack.
514*5c6c1daeSBarry Smith 
515*5c6c1daeSBarry Smith   Not Collective
516*5c6c1daeSBarry Smith 
517*5c6c1daeSBarry Smith   Usage:
518*5c6c1daeSBarry Smith   If the option -log_sumary is used to run the program containing the
519*5c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
520*5c6c1daeSBarry Smith   PetscFinalize().
521*5c6c1daeSBarry Smith .vb
522*5c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
523*5c6c1daeSBarry Smith       [stage 0 of code]
524*5c6c1daeSBarry Smith       PetscLogStagePush(1);
525*5c6c1daeSBarry Smith       [stage 1 of code]
526*5c6c1daeSBarry Smith       PetscLogStagePop();
527*5c6c1daeSBarry Smith       PetscBarrier(...);
528*5c6c1daeSBarry Smith       [more stage 0 of code]
529*5c6c1daeSBarry Smith       PetscFinalize();
530*5c6c1daeSBarry Smith .ve
531*5c6c1daeSBarry Smith 
532*5c6c1daeSBarry Smith   Notes:
533*5c6c1daeSBarry Smith   Use PetscLogStageRegister() to register a stage.
534*5c6c1daeSBarry Smith 
535*5c6c1daeSBarry Smith   Level: intermediate
536*5c6c1daeSBarry Smith 
537*5c6c1daeSBarry Smith .keywords: log, pop, stage
538*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStageRegister(), PetscBarrier()
539*5c6c1daeSBarry Smith @*/
540*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStagePop(void)
541*5c6c1daeSBarry Smith {
542*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
543*5c6c1daeSBarry Smith   PetscErrorCode ierr;
544*5c6c1daeSBarry Smith 
545*5c6c1daeSBarry Smith   PetscFunctionBegin;
546*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
547*5c6c1daeSBarry Smith   ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr);
548*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
549*5c6c1daeSBarry Smith }
550*5c6c1daeSBarry Smith 
551*5c6c1daeSBarry Smith #undef __FUNCT__
552*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageSetActive"
553*5c6c1daeSBarry Smith /*@
554*5c6c1daeSBarry Smith   PetscLogStageSetActive - Determines stage activity for PetscLogEventBegin() and PetscLogEventEnd().
555*5c6c1daeSBarry Smith 
556*5c6c1daeSBarry Smith   Not Collective
557*5c6c1daeSBarry Smith 
558*5c6c1daeSBarry Smith   Input Parameters:
559*5c6c1daeSBarry Smith + stage    - The stage
560*5c6c1daeSBarry Smith - isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE)
561*5c6c1daeSBarry Smith 
562*5c6c1daeSBarry Smith   Level: intermediate
563*5c6c1daeSBarry Smith 
564*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage()
565*5c6c1daeSBarry Smith @*/
566*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStageSetActive(PetscLogStage stage, PetscBool  isActive)
567*5c6c1daeSBarry Smith {
568*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
569*5c6c1daeSBarry Smith   PetscErrorCode ierr;
570*5c6c1daeSBarry Smith 
571*5c6c1daeSBarry Smith   PetscFunctionBegin;
572*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
573*5c6c1daeSBarry Smith   ierr = PetscStageLogSetActive(stageLog, stage, isActive);CHKERRQ(ierr);
574*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
575*5c6c1daeSBarry Smith }
576*5c6c1daeSBarry Smith 
577*5c6c1daeSBarry Smith #undef __FUNCT__
578*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageGetActive"
579*5c6c1daeSBarry Smith /*@
580*5c6c1daeSBarry Smith   PetscLogStageGetActive - Returns stage activity for PetscLogEventBegin() and PetscLogEventEnd().
581*5c6c1daeSBarry Smith 
582*5c6c1daeSBarry Smith   Not Collective
583*5c6c1daeSBarry Smith 
584*5c6c1daeSBarry Smith   Input Parameter:
585*5c6c1daeSBarry Smith . stage    - The stage
586*5c6c1daeSBarry Smith 
587*5c6c1daeSBarry Smith   Output Parameter:
588*5c6c1daeSBarry Smith . isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE)
589*5c6c1daeSBarry Smith 
590*5c6c1daeSBarry Smith   Level: intermediate
591*5c6c1daeSBarry Smith 
592*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage()
593*5c6c1daeSBarry Smith @*/
594*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStageGetActive(PetscLogStage stage, PetscBool  *isActive)
595*5c6c1daeSBarry Smith {
596*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
597*5c6c1daeSBarry Smith   PetscErrorCode ierr;
598*5c6c1daeSBarry Smith 
599*5c6c1daeSBarry Smith   PetscFunctionBegin;
600*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
601*5c6c1daeSBarry Smith   ierr = PetscStageLogGetActive(stageLog, stage, isActive);CHKERRQ(ierr);
602*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
603*5c6c1daeSBarry Smith }
604*5c6c1daeSBarry Smith 
605*5c6c1daeSBarry Smith #undef __FUNCT__
606*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageSetVisible"
607*5c6c1daeSBarry Smith /*@
608*5c6c1daeSBarry Smith   PetscLogStageSetVisible - Determines stage visibility in PetscLogView()
609*5c6c1daeSBarry Smith 
610*5c6c1daeSBarry Smith   Not Collective
611*5c6c1daeSBarry Smith 
612*5c6c1daeSBarry Smith   Input Parameters:
613*5c6c1daeSBarry Smith + stage     - The stage
614*5c6c1daeSBarry Smith - isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE)
615*5c6c1daeSBarry Smith 
616*5c6c1daeSBarry Smith   Level: intermediate
617*5c6c1daeSBarry Smith 
618*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView()
619*5c6c1daeSBarry Smith @*/
620*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStageSetVisible(PetscLogStage stage, PetscBool  isVisible)
621*5c6c1daeSBarry Smith {
622*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
623*5c6c1daeSBarry Smith   PetscErrorCode ierr;
624*5c6c1daeSBarry Smith 
625*5c6c1daeSBarry Smith   PetscFunctionBegin;
626*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
627*5c6c1daeSBarry Smith   ierr = PetscStageLogSetVisible(stageLog, stage, isVisible);CHKERRQ(ierr);
628*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
629*5c6c1daeSBarry Smith }
630*5c6c1daeSBarry Smith 
631*5c6c1daeSBarry Smith #undef __FUNCT__
632*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageGetVisible"
633*5c6c1daeSBarry Smith /*@
634*5c6c1daeSBarry Smith   PetscLogStageGetVisible - Returns stage visibility in PetscLogView()
635*5c6c1daeSBarry Smith 
636*5c6c1daeSBarry Smith   Not Collective
637*5c6c1daeSBarry Smith 
638*5c6c1daeSBarry Smith   Input Parameter:
639*5c6c1daeSBarry Smith . stage     - The stage
640*5c6c1daeSBarry Smith 
641*5c6c1daeSBarry Smith   Output Parameter:
642*5c6c1daeSBarry Smith . isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE)
643*5c6c1daeSBarry Smith 
644*5c6c1daeSBarry Smith   Level: intermediate
645*5c6c1daeSBarry Smith 
646*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView()
647*5c6c1daeSBarry Smith @*/
648*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStageGetVisible(PetscLogStage stage, PetscBool  *isVisible)
649*5c6c1daeSBarry Smith {
650*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
651*5c6c1daeSBarry Smith   PetscErrorCode ierr;
652*5c6c1daeSBarry Smith 
653*5c6c1daeSBarry Smith   PetscFunctionBegin;
654*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
655*5c6c1daeSBarry Smith   ierr = PetscStageLogGetVisible(stageLog, stage, isVisible);CHKERRQ(ierr);
656*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
657*5c6c1daeSBarry Smith }
658*5c6c1daeSBarry Smith 
659*5c6c1daeSBarry Smith #undef __FUNCT__
660*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogStageGetId"
661*5c6c1daeSBarry Smith /*@C
662*5c6c1daeSBarry Smith   PetscLogStageGetId - Returns the stage id when given the stage name.
663*5c6c1daeSBarry Smith 
664*5c6c1daeSBarry Smith   Not Collective
665*5c6c1daeSBarry Smith 
666*5c6c1daeSBarry Smith   Input Parameter:
667*5c6c1daeSBarry Smith . name  - The stage name
668*5c6c1daeSBarry Smith 
669*5c6c1daeSBarry Smith   Output Parameter:
670*5c6c1daeSBarry Smith . stage - The stage
671*5c6c1daeSBarry Smith 
672*5c6c1daeSBarry Smith   Level: intermediate
673*5c6c1daeSBarry Smith 
674*5c6c1daeSBarry Smith .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage()
675*5c6c1daeSBarry Smith @*/
676*5c6c1daeSBarry Smith PetscErrorCode  PetscLogStageGetId(const char name[], PetscLogStage *stage)
677*5c6c1daeSBarry Smith {
678*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
679*5c6c1daeSBarry Smith   PetscErrorCode ierr;
680*5c6c1daeSBarry Smith 
681*5c6c1daeSBarry Smith   PetscFunctionBegin;
682*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
683*5c6c1daeSBarry Smith   ierr = PetscStageLogGetStage(stageLog, name, stage);CHKERRQ(ierr);
684*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
685*5c6c1daeSBarry Smith }
686*5c6c1daeSBarry Smith 
687*5c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/
688*5c6c1daeSBarry Smith #undef __FUNCT__
689*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventRegister"
690*5c6c1daeSBarry Smith /*@C
691*5c6c1daeSBarry Smith   PetscLogEventRegister - Registers an event name for logging operations in an application code.
692*5c6c1daeSBarry Smith 
693*5c6c1daeSBarry Smith   Not Collective
694*5c6c1daeSBarry Smith 
695*5c6c1daeSBarry Smith   Input Parameter:
696*5c6c1daeSBarry Smith + name   - The name associated with the event
697*5c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with
698*5c6c1daeSBarry Smith            PetscClassIdRegister() or use a predefined one such as KSP_CLASSID, SNES_CLASSID, the predefined ones
699*5c6c1daeSBarry Smith            are only available in C code
700*5c6c1daeSBarry Smith 
701*5c6c1daeSBarry Smith   Output Parameter:
702*5c6c1daeSBarry Smith . event - The event id for use with PetscLogEventBegin() and PetscLogEventEnd().
703*5c6c1daeSBarry Smith 
704*5c6c1daeSBarry Smith   Example of Usage:
705*5c6c1daeSBarry Smith .vb
706*5c6c1daeSBarry Smith       PetscLogEvent USER_EVENT;
707*5c6c1daeSBarry Smith       PetscClassId classid;
708*5c6c1daeSBarry Smith       PetscLogDouble user_event_flops;
709*5c6c1daeSBarry Smith       PetscClassIdRegister("class name",&classid);
710*5c6c1daeSBarry Smith       PetscLogEventRegister("User event name",classid,&USER_EVENT);
711*5c6c1daeSBarry Smith       PetscLogEventBegin(USER_EVENT,0,0,0,0);
712*5c6c1daeSBarry Smith          [code segment to monitor]
713*5c6c1daeSBarry Smith          PetscLogFlops(user_event_flops);
714*5c6c1daeSBarry Smith       PetscLogEventEnd(USER_EVENT,0,0,0,0);
715*5c6c1daeSBarry Smith .ve
716*5c6c1daeSBarry Smith 
717*5c6c1daeSBarry Smith   Notes:
718*5c6c1daeSBarry Smith   PETSc automatically logs library events if the code has been
719*5c6c1daeSBarry Smith   compiled with -DPETSC_USE_LOG (which is the default) and -log,
720*5c6c1daeSBarry Smith   -log_summary, or -log_all are specified.  PetscLogEventRegister() is
721*5c6c1daeSBarry Smith   intended for logging user events to supplement this PETSc
722*5c6c1daeSBarry Smith   information.
723*5c6c1daeSBarry Smith 
724*5c6c1daeSBarry Smith   PETSc can gather data for use with the utilities Upshot/Nupshot
725*5c6c1daeSBarry Smith   (part of the MPICH distribution).  If PETSc has been compiled
726*5c6c1daeSBarry Smith   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
727*5c6c1daeSBarry Smith   MPICH), the user can employ another command line option, -log_mpe,
728*5c6c1daeSBarry Smith   to create a logfile, "mpe.log", which can be visualized
729*5c6c1daeSBarry Smith   Upshot/Nupshot.
730*5c6c1daeSBarry Smith 
731*5c6c1daeSBarry Smith   The classid is associated with each event so that classes of events
732*5c6c1daeSBarry Smith   can be disabled simultaneously, such as all matrix events. The user
733*5c6c1daeSBarry Smith   can either use an existing classid, such as MAT_CLASSID, or create
734*5c6c1daeSBarry Smith   their own as shown in the example.
735*5c6c1daeSBarry Smith 
736*5c6c1daeSBarry Smith   Level: intermediate
737*5c6c1daeSBarry Smith 
738*5c6c1daeSBarry Smith .keywords: log, event, register
739*5c6c1daeSBarry Smith .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogFlops(),
740*5c6c1daeSBarry Smith           PetscLogEventMPEActivate(), PetscLogEventMPEDeactivate(),
741*5c6c1daeSBarry Smith           PetscLogEventActivate(), PetscLogEventDeactivate(), PetscClassIdRegister()
742*5c6c1daeSBarry Smith @*/
743*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventRegister(const char name[],PetscClassId classid,PetscLogEvent *event)
744*5c6c1daeSBarry Smith {
745*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
746*5c6c1daeSBarry Smith   int            stage;
747*5c6c1daeSBarry Smith   PetscErrorCode ierr;
748*5c6c1daeSBarry Smith 
749*5c6c1daeSBarry Smith   PetscFunctionBegin;
750*5c6c1daeSBarry Smith   *event = PETSC_DECIDE;
751*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
752*5c6c1daeSBarry Smith   ierr = EventRegLogRegister(stageLog->eventLog, name, classid, event);CHKERRQ(ierr);
753*5c6c1daeSBarry Smith   for (stage = 0; stage < stageLog->numStages; stage++) {
754*5c6c1daeSBarry Smith     ierr = EventPerfLogEnsureSize(stageLog->stageInfo[stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr);
755*5c6c1daeSBarry Smith     ierr = ClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr);
756*5c6c1daeSBarry Smith   }
757*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
758*5c6c1daeSBarry Smith }
759*5c6c1daeSBarry Smith 
760*5c6c1daeSBarry Smith #undef __FUNCT__
761*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventActivate"
762*5c6c1daeSBarry Smith /*@
763*5c6c1daeSBarry Smith   PetscLogEventActivate - Indicates that a particular event should be logged.
764*5c6c1daeSBarry Smith 
765*5c6c1daeSBarry Smith   Not Collective
766*5c6c1daeSBarry Smith 
767*5c6c1daeSBarry Smith   Input Parameter:
768*5c6c1daeSBarry Smith . event - The event id
769*5c6c1daeSBarry Smith 
770*5c6c1daeSBarry Smith   Usage:
771*5c6c1daeSBarry Smith .vb
772*5c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
773*5c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
774*5c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
775*5c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
776*5c6c1daeSBarry Smith .ve
777*5c6c1daeSBarry Smith 
778*5c6c1daeSBarry Smith   Note:
779*5c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
780*5c6c1daeSBarry Smith   or an event number obtained with PetscLogEventRegister().
781*5c6c1daeSBarry Smith 
782*5c6c1daeSBarry Smith   Level: advanced
783*5c6c1daeSBarry Smith 
784*5c6c1daeSBarry Smith .keywords: log, event, activate
785*5c6c1daeSBarry Smith .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventDeactivate()
786*5c6c1daeSBarry Smith @*/
787*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventActivate(PetscLogEvent event)
788*5c6c1daeSBarry Smith {
789*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
790*5c6c1daeSBarry Smith   int            stage;
791*5c6c1daeSBarry Smith   PetscErrorCode ierr;
792*5c6c1daeSBarry Smith 
793*5c6c1daeSBarry Smith   PetscFunctionBegin;
794*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
795*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
796*5c6c1daeSBarry Smith   ierr = EventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
797*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
798*5c6c1daeSBarry Smith }
799*5c6c1daeSBarry Smith 
800*5c6c1daeSBarry Smith #undef __FUNCT__
801*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventDeactivate"
802*5c6c1daeSBarry Smith /*@
803*5c6c1daeSBarry Smith   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
804*5c6c1daeSBarry Smith 
805*5c6c1daeSBarry Smith   Not Collective
806*5c6c1daeSBarry Smith 
807*5c6c1daeSBarry Smith   Input Parameter:
808*5c6c1daeSBarry Smith . event - The event id
809*5c6c1daeSBarry Smith 
810*5c6c1daeSBarry Smith   Usage:
811*5c6c1daeSBarry Smith .vb
812*5c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
813*5c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
814*5c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
815*5c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
816*5c6c1daeSBarry Smith .ve
817*5c6c1daeSBarry Smith 
818*5c6c1daeSBarry Smith   Note:
819*5c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in
820*5c6c1daeSBarry Smith   include/petsclog.h) or an event number obtained with PetscLogEventRegister()).
821*5c6c1daeSBarry Smith 
822*5c6c1daeSBarry Smith   Level: advanced
823*5c6c1daeSBarry Smith 
824*5c6c1daeSBarry Smith .keywords: log, event, deactivate
825*5c6c1daeSBarry Smith .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate()
826*5c6c1daeSBarry Smith @*/
827*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventDeactivate(PetscLogEvent event)
828*5c6c1daeSBarry Smith {
829*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
830*5c6c1daeSBarry Smith   int            stage;
831*5c6c1daeSBarry Smith   PetscErrorCode ierr;
832*5c6c1daeSBarry Smith 
833*5c6c1daeSBarry Smith   PetscFunctionBegin;
834*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
835*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
836*5c6c1daeSBarry Smith   ierr = EventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
837*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
838*5c6c1daeSBarry Smith }
839*5c6c1daeSBarry Smith 
840*5c6c1daeSBarry Smith #undef __FUNCT__
841*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventSetActiveAll"
842*5c6c1daeSBarry Smith /*@
843*5c6c1daeSBarry Smith   PetscLogEventSetActiveAll - Sets the event activity in every stage.
844*5c6c1daeSBarry Smith 
845*5c6c1daeSBarry Smith   Not Collective
846*5c6c1daeSBarry Smith 
847*5c6c1daeSBarry Smith   Input Parameters:
848*5c6c1daeSBarry Smith + event    - The event id
849*5c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged
850*5c6c1daeSBarry Smith 
851*5c6c1daeSBarry Smith   Level: advanced
852*5c6c1daeSBarry Smith 
853*5c6c1daeSBarry Smith .keywords: log, event, activate
854*5c6c1daeSBarry Smith .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate(),PlogEventDeactivate()
855*5c6c1daeSBarry Smith @*/
856*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool  isActive)
857*5c6c1daeSBarry Smith {
858*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
859*5c6c1daeSBarry Smith   int            stage;
860*5c6c1daeSBarry Smith   PetscErrorCode ierr;
861*5c6c1daeSBarry Smith 
862*5c6c1daeSBarry Smith   PetscFunctionBegin;
863*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
864*5c6c1daeSBarry Smith   for (stage = 0; stage < stageLog->numStages; stage++) {
865*5c6c1daeSBarry Smith     if (isActive) {
866*5c6c1daeSBarry Smith       ierr = EventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
867*5c6c1daeSBarry Smith     } else {
868*5c6c1daeSBarry Smith       ierr = EventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
869*5c6c1daeSBarry Smith     }
870*5c6c1daeSBarry Smith   }
871*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
872*5c6c1daeSBarry Smith }
873*5c6c1daeSBarry Smith 
874*5c6c1daeSBarry Smith #undef __FUNCT__
875*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventActivateClass"
876*5c6c1daeSBarry Smith /*@
877*5c6c1daeSBarry Smith   PetscLogEventActivateClass - Activates event logging for a PETSc object class.
878*5c6c1daeSBarry Smith 
879*5c6c1daeSBarry Smith   Not Collective
880*5c6c1daeSBarry Smith 
881*5c6c1daeSBarry Smith   Input Parameter:
882*5c6c1daeSBarry Smith . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc.
883*5c6c1daeSBarry Smith 
884*5c6c1daeSBarry Smith   Level: developer
885*5c6c1daeSBarry Smith 
886*5c6c1daeSBarry Smith .keywords: log, event, activate, class
887*5c6c1daeSBarry Smith .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventDeactivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate()
888*5c6c1daeSBarry Smith @*/
889*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventActivateClass(PetscClassId classid)
890*5c6c1daeSBarry Smith {
891*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
892*5c6c1daeSBarry Smith   int            stage;
893*5c6c1daeSBarry Smith   PetscErrorCode ierr;
894*5c6c1daeSBarry Smith 
895*5c6c1daeSBarry Smith   PetscFunctionBegin;
896*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
897*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
898*5c6c1daeSBarry Smith   ierr = EventPerfLogActivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr);
899*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
900*5c6c1daeSBarry Smith }
901*5c6c1daeSBarry Smith 
902*5c6c1daeSBarry Smith #undef __FUNCT__
903*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventDeactivateClass"
904*5c6c1daeSBarry Smith /*@
905*5c6c1daeSBarry Smith   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class.
906*5c6c1daeSBarry Smith 
907*5c6c1daeSBarry Smith   Not Collective
908*5c6c1daeSBarry Smith 
909*5c6c1daeSBarry Smith   Input Parameter:
910*5c6c1daeSBarry Smith . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc.
911*5c6c1daeSBarry Smith 
912*5c6c1daeSBarry Smith   Level: developer
913*5c6c1daeSBarry Smith 
914*5c6c1daeSBarry Smith .keywords: log, event, deactivate, class
915*5c6c1daeSBarry Smith .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventActivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate()
916*5c6c1daeSBarry Smith @*/
917*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventDeactivateClass(PetscClassId classid)
918*5c6c1daeSBarry Smith {
919*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
920*5c6c1daeSBarry Smith   int            stage;
921*5c6c1daeSBarry Smith   PetscErrorCode ierr;
922*5c6c1daeSBarry Smith 
923*5c6c1daeSBarry Smith   PetscFunctionBegin;
924*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
925*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
926*5c6c1daeSBarry Smith   ierr = EventPerfLogDeactivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr);
927*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
928*5c6c1daeSBarry Smith }
929*5c6c1daeSBarry Smith 
930*5c6c1daeSBarry Smith /*MC
931*5c6c1daeSBarry Smith    PetscLogEventBegin - Logs the beginning of a user event.
932*5c6c1daeSBarry Smith 
933*5c6c1daeSBarry Smith    Synopsis:
934*5c6c1daeSBarry Smith    PetscErrorCode PetscLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3,
935*5c6c1daeSBarry Smith                        PetscObject o4)
936*5c6c1daeSBarry Smith 
937*5c6c1daeSBarry Smith    Not Collective
938*5c6c1daeSBarry Smith 
939*5c6c1daeSBarry Smith    Input Parameters:
940*5c6c1daeSBarry Smith +  e - integer associated with the event obtained from PetscLogEventRegister()
941*5c6c1daeSBarry Smith -  o1,o2,o3,o4 - objects associated with the event, or 0
942*5c6c1daeSBarry Smith 
943*5c6c1daeSBarry Smith 
944*5c6c1daeSBarry Smith    Fortran Synopsis:
945*5c6c1daeSBarry Smith    void PetscLogEventBegin(int e,PetscErrorCode ierr)
946*5c6c1daeSBarry Smith 
947*5c6c1daeSBarry Smith    Usage:
948*5c6c1daeSBarry Smith .vb
949*5c6c1daeSBarry Smith      PetscLogEvent USER_EVENT;
950*5c6c1daeSBarry Smith      PetscLogDouble user_event_flops;
951*5c6c1daeSBarry Smith      PetscLogEventRegister("User event",0,&USER_EVENT);
952*5c6c1daeSBarry Smith      PetscLogEventBegin(USER_EVENT,0,0,0,0);
953*5c6c1daeSBarry Smith         [code segment to monitor]
954*5c6c1daeSBarry Smith         PetscLogFlops(user_event_flops);
955*5c6c1daeSBarry Smith      PetscLogEventEnd(USER_EVENT,0,0,0,0);
956*5c6c1daeSBarry Smith .ve
957*5c6c1daeSBarry Smith 
958*5c6c1daeSBarry Smith    Notes:
959*5c6c1daeSBarry Smith    You need to register each integer event with the command
960*5c6c1daeSBarry Smith    PetscLogEventRegister().  The source code must be compiled with
961*5c6c1daeSBarry Smith    -DPETSC_USE_LOG, which is the default.
962*5c6c1daeSBarry Smith 
963*5c6c1daeSBarry Smith    PETSc automatically logs library events if the code has been
964*5c6c1daeSBarry Smith    compiled with -DPETSC_USE_LOG, and -log, -log_summary, or -log_all are
965*5c6c1daeSBarry Smith    specified.  PetscLogEventBegin() is intended for logging user events
966*5c6c1daeSBarry Smith    to supplement this PETSc information.
967*5c6c1daeSBarry Smith 
968*5c6c1daeSBarry Smith    Level: intermediate
969*5c6c1daeSBarry Smith 
970*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops()
971*5c6c1daeSBarry Smith 
972*5c6c1daeSBarry Smith .keywords: log, event, begin
973*5c6c1daeSBarry Smith M*/
974*5c6c1daeSBarry Smith 
975*5c6c1daeSBarry Smith /*MC
976*5c6c1daeSBarry Smith    PetscLogEventEnd - Log the end of a user event.
977*5c6c1daeSBarry Smith 
978*5c6c1daeSBarry Smith    Synopsis:
979*5c6c1daeSBarry Smith    PetscErrorCode PetscLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3,
980*5c6c1daeSBarry Smith                      PetscObject o4)
981*5c6c1daeSBarry Smith 
982*5c6c1daeSBarry Smith    Not Collective
983*5c6c1daeSBarry Smith 
984*5c6c1daeSBarry Smith    Input Parameters:
985*5c6c1daeSBarry Smith +  e - integer associated with the event obtained with PetscLogEventRegister()
986*5c6c1daeSBarry Smith -  o1,o2,o3,o4 - objects associated with the event, or 0
987*5c6c1daeSBarry Smith 
988*5c6c1daeSBarry Smith 
989*5c6c1daeSBarry Smith    Fortran Synopsis:
990*5c6c1daeSBarry Smith    void PetscLogEventEnd(int e,PetscErrorCode ierr)
991*5c6c1daeSBarry Smith 
992*5c6c1daeSBarry Smith    Usage:
993*5c6c1daeSBarry Smith .vb
994*5c6c1daeSBarry Smith      PetscLogEvent USER_EVENT;
995*5c6c1daeSBarry Smith      PetscLogDouble user_event_flops;
996*5c6c1daeSBarry Smith      PetscLogEventRegister("User event",0,&USER_EVENT,);
997*5c6c1daeSBarry Smith      PetscLogEventBegin(USER_EVENT,0,0,0,0);
998*5c6c1daeSBarry Smith         [code segment to monitor]
999*5c6c1daeSBarry Smith         PetscLogFlops(user_event_flops);
1000*5c6c1daeSBarry Smith      PetscLogEventEnd(USER_EVENT,0,0,0,0);
1001*5c6c1daeSBarry Smith .ve
1002*5c6c1daeSBarry Smith 
1003*5c6c1daeSBarry Smith    Notes:
1004*5c6c1daeSBarry Smith    You should also register each additional integer event with the command
1005*5c6c1daeSBarry Smith    PetscLogEventRegister(). Source code must be compiled with
1006*5c6c1daeSBarry Smith    -DPETSC_USE_LOG, which is the default.
1007*5c6c1daeSBarry Smith 
1008*5c6c1daeSBarry Smith    PETSc automatically logs library events if the code has been
1009*5c6c1daeSBarry Smith    compiled with -DPETSC_USE_LOG, and -log, -log_summary, or -log_all are
1010*5c6c1daeSBarry Smith    specified.  PetscLogEventEnd() is intended for logging user events
1011*5c6c1daeSBarry Smith    to supplement this PETSc information.
1012*5c6c1daeSBarry Smith 
1013*5c6c1daeSBarry Smith    Level: intermediate
1014*5c6c1daeSBarry Smith 
1015*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogFlops()
1016*5c6c1daeSBarry Smith 
1017*5c6c1daeSBarry Smith .keywords: log, event, end
1018*5c6c1daeSBarry Smith M*/
1019*5c6c1daeSBarry Smith 
1020*5c6c1daeSBarry Smith /*MC
1021*5c6c1daeSBarry Smith    PetscLogEventBarrierBegin - Logs the time in a barrier before an event.
1022*5c6c1daeSBarry Smith 
1023*5c6c1daeSBarry Smith    Synopsis:
1024*5c6c1daeSBarry Smith    PetscErrorCode PetscLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3,
1025*5c6c1daeSBarry Smith                   PetscObject o4,MPI_Comm comm)
1026*5c6c1daeSBarry Smith 
1027*5c6c1daeSBarry Smith    Not Collective
1028*5c6c1daeSBarry Smith 
1029*5c6c1daeSBarry Smith    Input Parameters:
1030*5c6c1daeSBarry Smith .  e - integer associated with the event obtained from PetscLogEventRegister()
1031*5c6c1daeSBarry Smith .  o1,o2,o3,o4 - objects associated with the event, or 0
1032*5c6c1daeSBarry Smith .  comm - communicator the barrier takes place over
1033*5c6c1daeSBarry Smith 
1034*5c6c1daeSBarry Smith 
1035*5c6c1daeSBarry Smith    Usage:
1036*5c6c1daeSBarry Smith .vb
1037*5c6c1daeSBarry Smith      PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm);
1038*5c6c1daeSBarry Smith        MPI_Allreduce()
1039*5c6c1daeSBarry Smith      PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm);
1040*5c6c1daeSBarry Smith .ve
1041*5c6c1daeSBarry Smith 
1042*5c6c1daeSBarry Smith    Notes:
1043*5c6c1daeSBarry Smith    This is for logging the amount of time spent in a barrier for an event
1044*5c6c1daeSBarry Smith    that requires synchronization.
1045*5c6c1daeSBarry Smith 
1046*5c6c1daeSBarry Smith    Additional Notes:
1047*5c6c1daeSBarry Smith    Synchronization events always come in pairs; for example, VEC_NormBarrier and
1048*5c6c1daeSBarry Smith    VEC_NormComm = VEC_NormBarrier + 1
1049*5c6c1daeSBarry Smith 
1050*5c6c1daeSBarry Smith    Level: advanced
1051*5c6c1daeSBarry Smith 
1052*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(),
1053*5c6c1daeSBarry Smith           PetscLogEventBarrierEnd()
1054*5c6c1daeSBarry Smith 
1055*5c6c1daeSBarry Smith .keywords: log, event, begin, barrier
1056*5c6c1daeSBarry Smith M*/
1057*5c6c1daeSBarry Smith 
1058*5c6c1daeSBarry Smith /*MC
1059*5c6c1daeSBarry Smith    PetscLogEventBarrierEnd - Logs the time in a barrier before an event.
1060*5c6c1daeSBarry Smith 
1061*5c6c1daeSBarry Smith    Synopsis:
1062*5c6c1daeSBarry Smith    PetscErrorCode PetscLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3,
1063*5c6c1daeSBarry Smith                   PetscObject o4,MPI_Comm comm)
1064*5c6c1daeSBarry Smith 
1065*5c6c1daeSBarry Smith    Logically Collective on MPI_Comm
1066*5c6c1daeSBarry Smith 
1067*5c6c1daeSBarry Smith    Input Parameters:
1068*5c6c1daeSBarry Smith .  e - integer associated with the event obtained from PetscLogEventRegister()
1069*5c6c1daeSBarry Smith .  o1,o2,o3,o4 - objects associated with the event, or 0
1070*5c6c1daeSBarry Smith .  comm - communicator the barrier takes place over
1071*5c6c1daeSBarry Smith 
1072*5c6c1daeSBarry Smith 
1073*5c6c1daeSBarry Smith     Usage:
1074*5c6c1daeSBarry Smith .vb
1075*5c6c1daeSBarry Smith      PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm);
1076*5c6c1daeSBarry Smith        MPI_Allreduce()
1077*5c6c1daeSBarry Smith      PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm);
1078*5c6c1daeSBarry Smith .ve
1079*5c6c1daeSBarry Smith 
1080*5c6c1daeSBarry Smith    Notes:
1081*5c6c1daeSBarry Smith    This is for logging the amount of time spent in a barrier for an event
1082*5c6c1daeSBarry Smith    that requires synchronization.
1083*5c6c1daeSBarry Smith 
1084*5c6c1daeSBarry Smith    Additional Notes:
1085*5c6c1daeSBarry Smith    Synchronization events always come in pairs; for example, VEC_NormBarrier and
1086*5c6c1daeSBarry Smith    VEC_NormComm = VEC_NormBarrier + 1
1087*5c6c1daeSBarry Smith 
1088*5c6c1daeSBarry Smith    Level: advanced
1089*5c6c1daeSBarry Smith 
1090*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(),
1091*5c6c1daeSBarry Smith           PetscLogEventBarrierBegin()
1092*5c6c1daeSBarry Smith 
1093*5c6c1daeSBarry Smith .keywords: log, event, begin, barrier
1094*5c6c1daeSBarry Smith M*/
1095*5c6c1daeSBarry Smith 
1096*5c6c1daeSBarry Smith #undef __FUNCT__
1097*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogEventGetId"
1098*5c6c1daeSBarry Smith /*@C
1099*5c6c1daeSBarry Smith   PetscLogEventGetId - Returns the event id when given the event name.
1100*5c6c1daeSBarry Smith 
1101*5c6c1daeSBarry Smith   Not Collective
1102*5c6c1daeSBarry Smith 
1103*5c6c1daeSBarry Smith   Input Parameter:
1104*5c6c1daeSBarry Smith . name  - The event name
1105*5c6c1daeSBarry Smith 
1106*5c6c1daeSBarry Smith   Output Parameter:
1107*5c6c1daeSBarry Smith . event - The event
1108*5c6c1daeSBarry Smith 
1109*5c6c1daeSBarry Smith   Level: intermediate
1110*5c6c1daeSBarry Smith 
1111*5c6c1daeSBarry Smith .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStageGetId()
1112*5c6c1daeSBarry Smith @*/
1113*5c6c1daeSBarry Smith PetscErrorCode  PetscLogEventGetId(const char name[], PetscLogEvent *event)
1114*5c6c1daeSBarry Smith {
1115*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
1116*5c6c1daeSBarry Smith   PetscErrorCode ierr;
1117*5c6c1daeSBarry Smith 
1118*5c6c1daeSBarry Smith   PetscFunctionBegin;
1119*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1120*5c6c1daeSBarry Smith   ierr = EventRegLogGetEvent(stageLog->eventLog, name, event);CHKERRQ(ierr);
1121*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
1122*5c6c1daeSBarry Smith }
1123*5c6c1daeSBarry Smith 
1124*5c6c1daeSBarry Smith 
1125*5c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/
1126*5c6c1daeSBarry Smith #undef __FUNCT__
1127*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogDump"
1128*5c6c1daeSBarry Smith /*@C
1129*5c6c1daeSBarry Smith   PetscLogDump - Dumps logs of objects to a file. This file is intended to
1130*5c6c1daeSBarry Smith   be read by bin/petscview. This program no longer exists.
1131*5c6c1daeSBarry Smith 
1132*5c6c1daeSBarry Smith   Collective on PETSC_COMM_WORLD
1133*5c6c1daeSBarry Smith 
1134*5c6c1daeSBarry Smith   Input Parameter:
1135*5c6c1daeSBarry Smith . name - an optional file name
1136*5c6c1daeSBarry Smith 
1137*5c6c1daeSBarry Smith   Options Database Keys:
1138*5c6c1daeSBarry Smith + -log     - Prints basic log information (for code compiled with PETSC_USE_LOG)
1139*5c6c1daeSBarry Smith - -log_all - Prints extensive log information (for code compiled with PETSC_USE_LOG)
1140*5c6c1daeSBarry Smith 
1141*5c6c1daeSBarry Smith   Usage:
1142*5c6c1daeSBarry Smith .vb
1143*5c6c1daeSBarry Smith      PetscInitialize(...);
1144*5c6c1daeSBarry Smith      PetscLogBegin(); or PetscLogAllBegin();
1145*5c6c1daeSBarry Smith      ... code ...
1146*5c6c1daeSBarry Smith      PetscLogDump(filename);
1147*5c6c1daeSBarry Smith      PetscFinalize();
1148*5c6c1daeSBarry Smith .ve
1149*5c6c1daeSBarry Smith 
1150*5c6c1daeSBarry Smith   Notes:
1151*5c6c1daeSBarry Smith   The default file name is
1152*5c6c1daeSBarry Smith $    Log.<rank>
1153*5c6c1daeSBarry Smith   where <rank> is the processor number. If no name is specified,
1154*5c6c1daeSBarry Smith   this file will be used.
1155*5c6c1daeSBarry Smith 
1156*5c6c1daeSBarry Smith   Level: advanced
1157*5c6c1daeSBarry Smith 
1158*5c6c1daeSBarry Smith .keywords: log, dump
1159*5c6c1daeSBarry Smith .seealso: PetscLogBegin(), PetscLogAllBegin(), PetscLogView()
1160*5c6c1daeSBarry Smith @*/
1161*5c6c1daeSBarry Smith PetscErrorCode  PetscLogDump(const char sname[])
1162*5c6c1daeSBarry Smith {
1163*5c6c1daeSBarry Smith   PetscStageLog      stageLog;
1164*5c6c1daeSBarry Smith   PetscEventPerfInfo *eventInfo;
1165*5c6c1daeSBarry Smith   FILE               *fd;
1166*5c6c1daeSBarry Smith   char               file[PETSC_MAX_PATH_LEN], fname[PETSC_MAX_PATH_LEN];
1167*5c6c1daeSBarry Smith   PetscLogDouble     flops, _TotalTime;
1168*5c6c1daeSBarry Smith   PetscMPIInt        rank;
1169*5c6c1daeSBarry Smith   int                action, object, curStage;
1170*5c6c1daeSBarry Smith   PetscLogEvent      event;
1171*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
1172*5c6c1daeSBarry Smith 
1173*5c6c1daeSBarry Smith   PetscFunctionBegin;
1174*5c6c1daeSBarry Smith   /* Calculate the total elapsed time */
1175*5c6c1daeSBarry Smith   PetscTime(_TotalTime);
1176*5c6c1daeSBarry Smith   _TotalTime -= petsc_BaseTime;
1177*5c6c1daeSBarry Smith   /* Open log file */
1178*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr);
1179*5c6c1daeSBarry Smith   if (sname) {
1180*5c6c1daeSBarry Smith     sprintf(file, "%s.%d", sname, rank);
1181*5c6c1daeSBarry Smith   } else {
1182*5c6c1daeSBarry Smith     sprintf(file, "Log.%d", rank);
1183*5c6c1daeSBarry Smith   }
1184*5c6c1daeSBarry Smith   ierr = PetscFixFilename(file, fname);CHKERRQ(ierr);
1185*5c6c1daeSBarry Smith   ierr = PetscFOpen(PETSC_COMM_WORLD, fname, "w", &fd);CHKERRQ(ierr);
1186*5c6c1daeSBarry Smith   if ((!rank) && (!fd)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN, "Cannot open file: %s", fname);
1187*5c6c1daeSBarry Smith   /* Output totals */
1188*5c6c1daeSBarry Smith   ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Total Flops %14e %16.8e\n", petsc_TotalFlops, _TotalTime);
1189*5c6c1daeSBarry Smith   ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Clock Resolution %g\n", 0.0);
1190*5c6c1daeSBarry Smith   /* Output actions */
1191*5c6c1daeSBarry Smith   if (petsc_logActions) {
1192*5c6c1daeSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Actions accomplished %d\n", petsc_numActions);
1193*5c6c1daeSBarry Smith     for (action = 0; action < petsc_numActions; action++) {
1194*5c6c1daeSBarry Smith       ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%g %d %d %d %d %d %d %g %g %g\n",
1195*5c6c1daeSBarry Smith                           petsc_actions[action].time, petsc_actions[action].action, (int)petsc_actions[action].event, (int)petsc_actions[action].classid, petsc_actions[action].id1,
1196*5c6c1daeSBarry Smith                           petsc_actions[action].id2, petsc_actions[action].id3, petsc_actions[action].flops, petsc_actions[action].mem, petsc_actions[action].maxmem);
1197*5c6c1daeSBarry Smith     }
1198*5c6c1daeSBarry Smith   }
1199*5c6c1daeSBarry Smith   /* Output objects */
1200*5c6c1daeSBarry Smith   if (petsc_logObjects) {
1201*5c6c1daeSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Objects created %d destroyed %d\n", petsc_numObjects, petsc_numObjectsDestroyed);
1202*5c6c1daeSBarry Smith     for (object = 0; object < petsc_numObjects; object++) {
1203*5c6c1daeSBarry Smith       ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Parent ID: %d Memory: %d\n", petsc_objects[object].parent, (int) petsc_objects[object].mem);
1204*5c6c1daeSBarry Smith       if (!petsc_objects[object].name[0]) {
1205*5c6c1daeSBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd,"No Name\n");
1206*5c6c1daeSBarry Smith       } else {
1207*5c6c1daeSBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Name: %s\n", petsc_objects[object].name);
1208*5c6c1daeSBarry Smith       }
1209*5c6c1daeSBarry Smith       if (petsc_objects[object].info[0] != 0) {
1210*5c6c1daeSBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "No Info\n");
1211*5c6c1daeSBarry Smith       } else {
1212*5c6c1daeSBarry Smith         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Info: %s\n", petsc_objects[object].info);
1213*5c6c1daeSBarry Smith       }
1214*5c6c1daeSBarry Smith     }
1215*5c6c1daeSBarry Smith   }
1216*5c6c1daeSBarry Smith   /* Output events */
1217*5c6c1daeSBarry Smith   ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Event log:\n");
1218*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1219*5c6c1daeSBarry Smith   ierr = PetscIntStackTop(stageLog->stack, &curStage);CHKERRQ(ierr);
1220*5c6c1daeSBarry Smith   eventInfo = stageLog->stageInfo[curStage].eventLog->eventInfo;
1221*5c6c1daeSBarry Smith   for (event = 0; event < stageLog->stageInfo[curStage].eventLog->numEvents; event++) {
1222*5c6c1daeSBarry Smith     if (eventInfo[event].time != 0.0) {
1223*5c6c1daeSBarry Smith       flops = eventInfo[event].flops/eventInfo[event].time;
1224*5c6c1daeSBarry Smith     } else {
1225*5c6c1daeSBarry Smith       flops = 0.0;
1226*5c6c1daeSBarry Smith     }
1227*5c6c1daeSBarry Smith     ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%d %16d %16g %16g %16g\n", event, eventInfo[event].count,
1228*5c6c1daeSBarry Smith                         eventInfo[event].flops, eventInfo[event].time, flops);
1229*5c6c1daeSBarry Smith   }
1230*5c6c1daeSBarry Smith   ierr = PetscFClose(PETSC_COMM_WORLD, fd);CHKERRQ(ierr);
1231*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
1232*5c6c1daeSBarry Smith }
1233*5c6c1daeSBarry Smith 
1234*5c6c1daeSBarry Smith #undef __FUNCT__
1235*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogView"
1236*5c6c1daeSBarry Smith /*@C
1237*5c6c1daeSBarry Smith   PetscLogViewer - Prints a summary of the logging.
1238*5c6c1daeSBarry Smith 
1239*5c6c1daeSBarry Smith   Collective over MPI_Comm
1240*5c6c1daeSBarry Smith 
1241*5c6c1daeSBarry Smith   Input Parameter:
1242*5c6c1daeSBarry Smith .  viewer - an ASCII viewer
1243*5c6c1daeSBarry Smith 
1244*5c6c1daeSBarry Smith   Options Database Keys:
1245*5c6c1daeSBarry Smith . -log_summary - Prints summary of log information (for code compiled with PETSC_USE_LOG)
1246*5c6c1daeSBarry Smith 
1247*5c6c1daeSBarry Smith   Usage:
1248*5c6c1daeSBarry Smith .vb
1249*5c6c1daeSBarry Smith      PetscInitialize(...);
1250*5c6c1daeSBarry Smith      PetscLogBegin();
1251*5c6c1daeSBarry Smith      ... code ...
1252*5c6c1daeSBarry Smith      PetscLogView(PetscViewer);
1253*5c6c1daeSBarry Smith      PetscFinalize(...);
1254*5c6c1daeSBarry Smith .ve
1255*5c6c1daeSBarry Smith 
1256*5c6c1daeSBarry Smith   Notes:
1257*5c6c1daeSBarry Smith   By default the summary is printed to stdout.
1258*5c6c1daeSBarry Smith 
1259*5c6c1daeSBarry Smith   Level: beginner
1260*5c6c1daeSBarry Smith 
1261*5c6c1daeSBarry Smith .keywords: log, dump, print
1262*5c6c1daeSBarry Smith .seealso: PetscLogBegin(), PetscLogDump()
1263*5c6c1daeSBarry Smith @*/
1264*5c6c1daeSBarry Smith PetscErrorCode  PetscLogView(PetscViewer viewer)
1265*5c6c1daeSBarry Smith {
1266*5c6c1daeSBarry Smith   FILE               *fd;
1267*5c6c1daeSBarry Smith   PetscLogDouble     zero       = 0.0;
1268*5c6c1daeSBarry Smith   PetscStageLog      stageLog;
1269*5c6c1daeSBarry Smith   PetscStageInfo     *stageInfo = PETSC_NULL;
1270*5c6c1daeSBarry Smith   PetscEventPerfInfo *eventInfo = PETSC_NULL;
1271*5c6c1daeSBarry Smith   PetscClassPerfInfo *classInfo;
1272*5c6c1daeSBarry Smith   char               arch[128],hostname[128],username[128],pname[PETSC_MAX_PATH_LEN],date[128];
1273*5c6c1daeSBarry Smith   const char         *name;
1274*5c6c1daeSBarry Smith   PetscLogDouble     locTotalTime, TotalTime, TotalFlops;
1275*5c6c1daeSBarry Smith   PetscLogDouble     numMessages, messageLength, avgMessLen, numReductions;
1276*5c6c1daeSBarry Smith   PetscLogDouble     stageTime, flops, flopr, mem, mess, messLen, red;
1277*5c6c1daeSBarry Smith   PetscLogDouble     fracTime, fracFlops, fracMessages, fracLength, fracReductions, fracMess, fracMessLen, fracRed;
1278*5c6c1daeSBarry Smith   PetscLogDouble     fracStageTime, fracStageFlops, fracStageMess, fracStageMessLen, fracStageRed;
1279*5c6c1daeSBarry Smith   PetscLogDouble     min, max, tot, ratio, avg, x, y;
1280*5c6c1daeSBarry Smith   PetscLogDouble     minf, maxf, totf, ratf, mint, maxt, tott, ratt, ratCt, totm, totml, totr;
1281*5c6c1daeSBarry Smith   PetscMPIInt        minCt, maxCt;
1282*5c6c1daeSBarry Smith   PetscMPIInt        size, rank;
1283*5c6c1daeSBarry Smith   PetscBool          *localStageUsed,    *stageUsed;
1284*5c6c1daeSBarry Smith   PetscBool          *localStageVisible, *stageVisible;
1285*5c6c1daeSBarry Smith   int                numStages, localNumEvents, numEvents;
1286*5c6c1daeSBarry Smith   int                stage, lastStage, oclass;
1287*5c6c1daeSBarry Smith   PetscLogEvent      event;
1288*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
1289*5c6c1daeSBarry Smith   char               version[256];
1290*5c6c1daeSBarry Smith   MPI_Comm           comm;
1291*5c6c1daeSBarry Smith   PetscInt           nthreads;
1292*5c6c1daeSBarry Smith 
1293*5c6c1daeSBarry Smith   PetscFunctionBegin;
1294*5c6c1daeSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
1295*5c6c1daeSBarry Smith   ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr);
1296*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1297*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
1298*5c6c1daeSBarry Smith   /* Pop off any stages the user forgot to remove */
1299*5c6c1daeSBarry Smith   lastStage = 0;
1300*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1301*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
1302*5c6c1daeSBarry Smith   while (stage >= 0) {
1303*5c6c1daeSBarry Smith     lastStage = stage;
1304*5c6c1daeSBarry Smith     ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr);
1305*5c6c1daeSBarry Smith     ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
1306*5c6c1daeSBarry Smith   }
1307*5c6c1daeSBarry Smith   /* Get the total elapsed time */
1308*5c6c1daeSBarry Smith   PetscTime(locTotalTime);  locTotalTime -= petsc_BaseTime;
1309*5c6c1daeSBarry Smith 
1310*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr);
1311*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "***             WIDEN YOUR WINDOW TO 120 CHARACTERS.  Use 'enscript -r -fCourier9' to print this document            ***\n");CHKERRQ(ierr);
1312*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr);
1313*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n---------------------------------------------- PETSc Performance Summary: ----------------------------------------------\n\n");CHKERRQ(ierr);
1314*5c6c1daeSBarry Smith   ierr = PetscGetArchType(arch,sizeof(arch));CHKERRQ(ierr);
1315*5c6c1daeSBarry Smith   ierr = PetscGetHostName(hostname,sizeof(hostname));CHKERRQ(ierr);
1316*5c6c1daeSBarry Smith   ierr = PetscGetUserName(username,sizeof(username));CHKERRQ(ierr);
1317*5c6c1daeSBarry Smith   ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
1318*5c6c1daeSBarry Smith   ierr = PetscGetDate(date,sizeof(date));CHKERRQ(ierr);
1319*5c6c1daeSBarry Smith   ierr = PetscGetVersion(version,sizeof(version));CHKERRQ(ierr);
1320*5c6c1daeSBarry Smith   if (size == 1) {
1321*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm,fd,"%s on a %s named %s with %d processor, by %s %s\n", pname, arch, hostname, size, username, date);CHKERRQ(ierr);
1322*5c6c1daeSBarry Smith   } else {
1323*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm,fd,"%s on a %s named %s with %d processors, by %s %s\n", pname, arch, hostname, size, username, date);CHKERRQ(ierr);
1324*5c6c1daeSBarry Smith   }
1325*5c6c1daeSBarry Smith   ierr = PetscThreadCommGetNThreads(PETSC_COMM_WORLD,&nthreads);CHKERRQ(ierr);
1326*5c6c1daeSBarry Smith   if (nthreads > 1) {
1327*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm,fd,"With %d threads per MPI_Comm\n", (int)nthreads);CHKERRQ(ierr);
1328*5c6c1daeSBarry Smith   }
1329*5c6c1daeSBarry Smith 
1330*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Using %s\n", version);CHKERRQ(ierr);
1331*5c6c1daeSBarry Smith 
1332*5c6c1daeSBarry Smith   /* Must preserve reduction count before we go on */
1333*5c6c1daeSBarry Smith   red  = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct;
1334*5c6c1daeSBarry Smith 
1335*5c6c1daeSBarry Smith   /* Calculate summary information */
1336*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n                         Max       Max/Min        Avg      Total \n");CHKERRQ(ierr);
1337*5c6c1daeSBarry Smith   /*   Time */
1338*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&locTotalTime, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1339*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&locTotalTime, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1340*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&locTotalTime, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1341*5c6c1daeSBarry Smith   avg  = (tot)/((PetscLogDouble) size);
1342*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1343*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Time (sec):           %5.3e   %10.5f   %5.3e\n", max, ratio, avg);CHKERRQ(ierr);
1344*5c6c1daeSBarry Smith   TotalTime = tot;
1345*5c6c1daeSBarry Smith   /*   Objects */
1346*5c6c1daeSBarry Smith   avg  = (PetscLogDouble) petsc_numObjects;
1347*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&avg,          &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1348*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&avg,          &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1349*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&avg,          &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1350*5c6c1daeSBarry Smith   avg  = (tot)/((PetscLogDouble) size);
1351*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1352*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Objects:              %5.3e   %10.5f   %5.3e\n", max, ratio, avg);CHKERRQ(ierr);
1353*5c6c1daeSBarry Smith   /*   Flops */
1354*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&petsc_TotalFlops,  &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1355*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&petsc_TotalFlops,  &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1356*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&petsc_TotalFlops,  &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1357*5c6c1daeSBarry Smith   avg  = (tot)/((PetscLogDouble) size);
1358*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1359*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Flops:                %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1360*5c6c1daeSBarry Smith   TotalFlops = tot;
1361*5c6c1daeSBarry Smith   /*   Flops/sec -- Must talk to Barry here */
1362*5c6c1daeSBarry Smith   if (locTotalTime != 0.0) flops = petsc_TotalFlops/locTotalTime; else flops = 0.0;
1363*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&flops,        &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1364*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&flops,        &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1365*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&flops,        &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1366*5c6c1daeSBarry Smith   avg  = (tot)/((PetscLogDouble) size);
1367*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1368*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Flops/sec:            %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1369*5c6c1daeSBarry Smith   /*   Memory */
1370*5c6c1daeSBarry Smith   ierr = PetscMallocGetMaximumUsage(&mem);CHKERRQ(ierr);
1371*5c6c1daeSBarry Smith   if (mem > 0.0) {
1372*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(&mem,          &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1373*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(&mem,          &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1374*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(&mem,          &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1375*5c6c1daeSBarry Smith     avg  = (tot)/((PetscLogDouble) size);
1376*5c6c1daeSBarry Smith     if (min != 0.0) ratio = max/min; else ratio = 0.0;
1377*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "Memory:               %5.3e   %10.5f              %5.3e\n", max, ratio, tot);CHKERRQ(ierr);
1378*5c6c1daeSBarry Smith   }
1379*5c6c1daeSBarry Smith   /*   Messages */
1380*5c6c1daeSBarry Smith   mess = 0.5*(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct);
1381*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&mess,         &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1382*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&mess,         &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1383*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&mess,         &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1384*5c6c1daeSBarry Smith   avg  = (tot)/((PetscLogDouble) size);
1385*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1386*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "MPI Messages:         %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1387*5c6c1daeSBarry Smith   numMessages = tot;
1388*5c6c1daeSBarry Smith   /*   Message Lengths */
1389*5c6c1daeSBarry Smith   mess = 0.5*(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len);
1390*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&mess,         &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1391*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&mess,         &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1392*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&mess,         &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1393*5c6c1daeSBarry Smith   if (numMessages != 0) avg = (tot)/(numMessages); else avg = 0.0;
1394*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1395*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "MPI Message Lengths:  %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1396*5c6c1daeSBarry Smith   messageLength = tot;
1397*5c6c1daeSBarry Smith   /*   Reductions */
1398*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&red,          &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1399*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&red,          &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1400*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&red,          &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1401*5c6c1daeSBarry Smith   if (min != 0.0) ratio = max/min; else ratio = 0.0;
1402*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "MPI Reductions:       %5.3e   %10.5f\n", max, ratio);CHKERRQ(ierr);
1403*5c6c1daeSBarry Smith   numReductions = red; /* wrong because uses count from process zero */
1404*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\nFlop counting convention: 1 flop = 1 real number operation of type (multiply/divide/add/subtract)\n");CHKERRQ(ierr);
1405*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "                            e.g., VecAXPY() for real vectors of length N --> 2N flops\n");CHKERRQ(ierr);
1406*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "                            and VecAXPY() for complex vectors of length N --> 8N flops\n");CHKERRQ(ierr);
1407*5c6c1daeSBarry Smith 
1408*5c6c1daeSBarry Smith   /* Get total number of stages --
1409*5c6c1daeSBarry Smith        Currently, a single processor can register more stages than another, but stages must all be registered in order.
1410*5c6c1daeSBarry Smith        We can removed this requirement if necessary by having a global stage numbering and indirection on the stage ID.
1411*5c6c1daeSBarry Smith        This seems best accomplished by assoicating a communicator with each stage.
1412*5c6c1daeSBarry Smith   */
1413*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1414*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageUsed);CHKERRQ(ierr);
1415*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageUsed);CHKERRQ(ierr);
1416*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageVisible);CHKERRQ(ierr);
1417*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageVisible);CHKERRQ(ierr);
1418*5c6c1daeSBarry Smith   if (numStages > 0) {
1419*5c6c1daeSBarry Smith     stageInfo = stageLog->stageInfo;
1420*5c6c1daeSBarry Smith     for (stage = 0; stage < numStages; stage++) {
1421*5c6c1daeSBarry Smith       if (stage < stageLog->numStages) {
1422*5c6c1daeSBarry Smith         localStageUsed[stage]    = stageInfo[stage].used;
1423*5c6c1daeSBarry Smith         localStageVisible[stage] = stageInfo[stage].perfInfo.visible;
1424*5c6c1daeSBarry Smith       } else {
1425*5c6c1daeSBarry Smith         localStageUsed[stage]    = PETSC_FALSE;
1426*5c6c1daeSBarry Smith         localStageVisible[stage] = PETSC_TRUE;
1427*5c6c1daeSBarry Smith       }
1428*5c6c1daeSBarry Smith     }
1429*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(localStageUsed,    stageUsed,    numStages, MPI_INT, MPI_LOR,  comm);CHKERRQ(ierr);
1430*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(localStageVisible, stageVisible, numStages, MPI_INT, MPI_LAND, comm);CHKERRQ(ierr);
1431*5c6c1daeSBarry Smith     for (stage = 0; stage < numStages; stage++) {
1432*5c6c1daeSBarry Smith       if (stageUsed[stage]) {
1433*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "\nSummary of Stages:   ----- Time ------  ----- Flops -----  --- Messages ---  -- Message Lengths --  -- Reductions --\n");CHKERRQ(ierr);
1434*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "                        Avg     %%Total     Avg     %%Total   counts   %%Total     Avg         %%Total   counts   %%Total \n");CHKERRQ(ierr);
1435*5c6c1daeSBarry Smith         break;
1436*5c6c1daeSBarry Smith       }
1437*5c6c1daeSBarry Smith     }
1438*5c6c1daeSBarry Smith     for (stage = 0; stage < numStages; stage++) {
1439*5c6c1daeSBarry Smith       if (!stageUsed[stage]) continue;
1440*5c6c1daeSBarry Smith       if (localStageUsed[stage]) {
1441*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1442*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1443*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1444*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1445*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1446*5c6c1daeSBarry Smith         name = stageInfo[stage].name;
1447*5c6c1daeSBarry Smith       } else {
1448*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1449*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1450*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1451*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1452*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1453*5c6c1daeSBarry Smith         name = "";
1454*5c6c1daeSBarry Smith       }
1455*5c6c1daeSBarry Smith       mess *= 0.5; messLen *= 0.5; red /= size;
1456*5c6c1daeSBarry Smith       if (TotalTime     != 0.0) fracTime       = stageTime/TotalTime;    else fracTime       = 0.0;
1457*5c6c1daeSBarry Smith       if (TotalFlops    != 0.0) fracFlops      = flops/TotalFlops;       else fracFlops      = 0.0;
1458*5c6c1daeSBarry Smith       /* Talk to Barry if (stageTime     != 0.0) flops          = (size*flops)/stageTime; else flops          = 0.0; */
1459*5c6c1daeSBarry Smith       if (numMessages   != 0.0) fracMessages   = mess/numMessages;       else fracMessages   = 0.0;
1460*5c6c1daeSBarry Smith       if (numMessages   != 0.0) avgMessLen     = messLen/numMessages;    else avgMessLen     = 0.0;
1461*5c6c1daeSBarry Smith       if (messageLength != 0.0) fracLength     = messLen/messageLength;  else fracLength     = 0.0;
1462*5c6c1daeSBarry Smith       if (numReductions != 0.0) fracReductions = red/numReductions;      else fracReductions = 0.0;
1463*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "%2d: %15s: %6.4e %5.1f%%  %6.4e %5.1f%%  %5.3e %5.1f%%  %5.3e      %5.1f%%  %5.3e %5.1f%% \n",
1464*5c6c1daeSBarry Smith                           stage, name, stageTime/size, 100.0*fracTime, flops, 100.0*fracFlops,
1465*5c6c1daeSBarry Smith                           mess, 100.0*fracMessages, avgMessLen, 100.0*fracLength, red, 100.0*fracReductions);CHKERRQ(ierr);
1466*5c6c1daeSBarry Smith     }
1467*5c6c1daeSBarry Smith   }
1468*5c6c1daeSBarry Smith 
1469*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
1470*5c6c1daeSBarry Smith     "\n------------------------------------------------------------------------------------------------------------------------\n");
1471*5c6c1daeSBarry Smith                                                                                                           CHKERRQ(ierr);
1472*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "See the 'Profiling' chapter of the users' manual for details on interpreting output.\n");CHKERRQ(ierr);
1473*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Phase summary info:\n");CHKERRQ(ierr);
1474*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Count: number of times phase was executed\n");CHKERRQ(ierr);
1475*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Time and Flops: Max - maximum over all processors\n");CHKERRQ(ierr);
1476*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "                   Ratio - ratio of maximum to minimum over all processors\n");CHKERRQ(ierr);
1477*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Mess: number of messages sent\n");CHKERRQ(ierr);
1478*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Avg. len: average message length\n");CHKERRQ(ierr);
1479*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Reduct: number of global reductions\n");CHKERRQ(ierr);
1480*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Global: entire computation\n");CHKERRQ(ierr);
1481*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Stage: stages of a computation. Set stages with PetscLogStagePush() and PetscLogStagePop().\n");CHKERRQ(ierr);
1482*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      %%T - percent time in this phase         %%F - percent flops in this phase\n");CHKERRQ(ierr);
1483*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      %%M - percent messages in this phase     %%L - percent message lengths in this phase\n");CHKERRQ(ierr);
1484*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      %%R - percent reductions in this phase\n");CHKERRQ(ierr);
1485*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "   Total Mflop/s: 10e-6 * (sum of flops over all processors)/(max time over all processors)\n");CHKERRQ(ierr);
1486*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
1487*5c6c1daeSBarry Smith     "------------------------------------------------------------------------------------------------------------------------\n");
1488*5c6c1daeSBarry Smith                                                                                                           CHKERRQ(ierr);
1489*5c6c1daeSBarry Smith 
1490*5c6c1daeSBarry Smith #if defined(PETSC_USE_DEBUG)
1491*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n\n");CHKERRQ(ierr);
1492*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      ##########################################################\n");CHKERRQ(ierr);
1493*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1494*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                          WARNING!!!                    #\n");CHKERRQ(ierr);
1495*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1496*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   This code was compiled with a debugging option,      #\n");CHKERRQ(ierr);
1497*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   To get timing results run ./configure                #\n");CHKERRQ(ierr);
1498*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   using --with-debugging=no, the performance will      #\n");CHKERRQ(ierr);
1499*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   be generally two or three times faster.              #\n");CHKERRQ(ierr);
1500*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1501*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      ##########################################################\n\n\n");CHKERRQ(ierr);
1502*5c6c1daeSBarry Smith #endif
1503*5c6c1daeSBarry Smith #if defined(PETSC_USE_COMPLEX) && !defined(PETSC_USE_FORTRAN_KERNELS)
1504*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n\n");CHKERRQ(ierr);
1505*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      ##########################################################\n");CHKERRQ(ierr);
1506*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1507*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                          WARNING!!!                    #\n");CHKERRQ(ierr);
1508*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1509*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   The code for various complex numbers numerical       #\n");CHKERRQ(ierr);
1510*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   kernels uses C++, which generally is not well        #\n");CHKERRQ(ierr);
1511*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   optimized.  For performance that is about 4-5 times  #\n");CHKERRQ(ierr);
1512*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   faster, specify --with-fortran-kernels=1             #\n");CHKERRQ(ierr);
1513*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #   when running ./configure.py.                         #\n");CHKERRQ(ierr);
1514*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1515*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "      ##########################################################\n\n\n");CHKERRQ(ierr);
1516*5c6c1daeSBarry Smith #endif
1517*5c6c1daeSBarry Smith 
1518*5c6c1daeSBarry Smith   /* Report events */
1519*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
1520*5c6c1daeSBarry Smith     "Event                Count      Time (sec)     Flops                             --- Global ---  --- Stage ---   Total\n");
1521*5c6c1daeSBarry Smith                                                                                                           CHKERRQ(ierr);
1522*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
1523*5c6c1daeSBarry Smith     "                   Max Ratio  Max     Ratio   Max  Ratio  Mess   Avg len Reduct  %%T %%F %%M %%L %%R  %%T %%F %%M %%L %%R Mflop/s\n");
1524*5c6c1daeSBarry Smith                                                                                                           CHKERRQ(ierr);
1525*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,
1526*5c6c1daeSBarry Smith     "------------------------------------------------------------------------------------------------------------------------\n");
1527*5c6c1daeSBarry Smith 
1528*5c6c1daeSBarry Smith                                                                                                           CHKERRQ(ierr);
1529*5c6c1daeSBarry Smith   /* Problem: The stage name will not show up unless the stage executed on proc 1 */
1530*5c6c1daeSBarry Smith   for (stage = 0; stage < numStages; stage++) {
1531*5c6c1daeSBarry Smith     if (!stageVisible[stage]) continue;
1532*5c6c1daeSBarry Smith     if (localStageUsed[stage]) {
1533*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr);
1534*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1535*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1536*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1537*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1538*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1539*5c6c1daeSBarry Smith     } else {
1540*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr);
1541*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1542*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1543*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1544*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1545*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1546*5c6c1daeSBarry Smith     }
1547*5c6c1daeSBarry Smith     mess *= 0.5; messLen *= 0.5; red /= size;
1548*5c6c1daeSBarry Smith 
1549*5c6c1daeSBarry Smith     /* Get total number of events in this stage --
1550*5c6c1daeSBarry Smith        Currently, a single processor can register more events than another, but events must all be registered in order,
1551*5c6c1daeSBarry Smith        just like stages. We can removed this requirement if necessary by having a global event numbering and indirection
1552*5c6c1daeSBarry Smith        on the event ID. This seems best accomplished by assoicating a communicator with each stage.
1553*5c6c1daeSBarry Smith 
1554*5c6c1daeSBarry Smith        Problem: If the event did not happen on proc 1, its name will not be available.
1555*5c6c1daeSBarry Smith        Problem: Event visibility is not implemented
1556*5c6c1daeSBarry Smith     */
1557*5c6c1daeSBarry Smith     if (localStageUsed[stage]) {
1558*5c6c1daeSBarry Smith       eventInfo      = stageLog->stageInfo[stage].eventLog->eventInfo;
1559*5c6c1daeSBarry Smith       localNumEvents = stageLog->stageInfo[stage].eventLog->numEvents;
1560*5c6c1daeSBarry Smith     } else {
1561*5c6c1daeSBarry Smith       localNumEvents = 0;
1562*5c6c1daeSBarry Smith     }
1563*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(&localNumEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1564*5c6c1daeSBarry Smith     for (event = 0; event < numEvents; event++) {
1565*5c6c1daeSBarry Smith       if (localStageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents) && (eventInfo[event].depth == 0)) {
1566*5c6c1daeSBarry Smith         if ((eventInfo[event].count > 0) && (eventInfo[event].time > 0.0)) {
1567*5c6c1daeSBarry Smith           flopr = eventInfo[event].flops;
1568*5c6c1daeSBarry Smith         } else {
1569*5c6c1daeSBarry Smith           flopr = 0.0;
1570*5c6c1daeSBarry Smith         }
1571*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&flopr,                          &minf,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1572*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&flopr,                          &maxf,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1573*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].flops,         &totf,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1574*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].time,          &mint,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1575*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].time,          &maxt,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1576*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].time,          &tott,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1577*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].numMessages,   &totm,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1578*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1579*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].numReductions, &totr,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1580*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].count,         &minCt, 1, MPI_INT,             MPI_MIN, comm);CHKERRQ(ierr);
1581*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].count,         &maxCt, 1, MPI_INT,             MPI_MAX, comm);CHKERRQ(ierr);
1582*5c6c1daeSBarry Smith         name = stageLog->eventLog->eventInfo[event].name;
1583*5c6c1daeSBarry Smith       } else {
1584*5c6c1daeSBarry Smith         flopr = 0.0;
1585*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&flopr,                          &minf,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1586*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&flopr,                          &maxf,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1587*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &totf,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1588*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &mint,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1589*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &maxt,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1590*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &tott,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1591*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &totm,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1592*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1593*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &totr,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1594*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&ierr,                           &minCt, 1, MPI_INT,             MPI_MIN, comm);CHKERRQ(ierr);
1595*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&ierr,                           &maxCt, 1, MPI_INT,             MPI_MAX, comm);CHKERRQ(ierr);
1596*5c6c1daeSBarry Smith         name = "";
1597*5c6c1daeSBarry Smith       }
1598*5c6c1daeSBarry Smith       if (mint < 0.0) {
1599*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "WARNING!!! Minimum time %g over all processors for %s is negative! This happens\n on some machines whose times cannot handle too rapid calls.!\n artificially changing minimum to zero.\n",mint,name);
1600*5c6c1daeSBarry Smith         mint = 0;
1601*5c6c1daeSBarry Smith       }
1602*5c6c1daeSBarry Smith       if (minf < 0.0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Minimum flops %g over all processors for %s is negative! Not possible!",minf,name);
1603*5c6c1daeSBarry Smith       totm *= 0.5; totml *= 0.5; totr /= size;
1604*5c6c1daeSBarry Smith 
1605*5c6c1daeSBarry Smith       if (maxCt != 0) {
1606*5c6c1daeSBarry Smith         if (minCt         != 0)   ratCt            = ((PetscLogDouble) maxCt)/minCt; else ratCt            = 0.0;
1607*5c6c1daeSBarry Smith         if (mint          != 0.0) ratt             = maxt/mint;                  else ratt             = 0.0;
1608*5c6c1daeSBarry Smith         if (minf          != 0.0) ratf             = maxf/minf;                  else ratf             = 0.0;
1609*5c6c1daeSBarry Smith         if (TotalTime     != 0.0) fracTime         = tott/TotalTime;             else fracTime         = 0.0;
1610*5c6c1daeSBarry Smith         if (TotalFlops    != 0.0) fracFlops        = totf/TotalFlops;            else fracFlops        = 0.0;
1611*5c6c1daeSBarry Smith         if (stageTime     != 0.0) fracStageTime    = tott/stageTime;             else fracStageTime    = 0.0;
1612*5c6c1daeSBarry Smith         if (flops         != 0.0) fracStageFlops   = totf/flops;                 else fracStageFlops   = 0.0;
1613*5c6c1daeSBarry Smith         if (numMessages   != 0.0) fracMess         = totm/numMessages;           else fracMess         = 0.0;
1614*5c6c1daeSBarry Smith         if (messageLength != 0.0) fracMessLen      = totml/messageLength;        else fracMessLen      = 0.0;
1615*5c6c1daeSBarry Smith         if (numReductions != 0.0) fracRed          = totr/numReductions;         else fracRed          = 0.0;
1616*5c6c1daeSBarry Smith         if (mess          != 0.0) fracStageMess    = totm/mess;                  else fracStageMess    = 0.0;
1617*5c6c1daeSBarry Smith         if (messLen       != 0.0) fracStageMessLen = totml/messLen;              else fracStageMessLen = 0.0;
1618*5c6c1daeSBarry Smith         if (red           != 0.0) fracStageRed     = totr/red;                   else fracStageRed     = 0.0;
1619*5c6c1daeSBarry Smith         if (totm          != 0.0) totml           /= totm;                       else totml            = 0.0;
1620*5c6c1daeSBarry Smith         if (maxt          != 0.0) flopr            = totf/maxt;                  else flopr            = 0.0;
1621*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd,
1622*5c6c1daeSBarry Smith           "%-16s %7d%4.1f %5.4e%4.1f %3.2e%4.1f %2.1e %2.1e %2.1e%3.0f%3.0f%3.0f%3.0f%3.0f %3.0f%3.0f%3.0f%3.0f%3.0f %5.0f\n",
1623*5c6c1daeSBarry Smith                             name, maxCt, ratCt, maxt, ratt, maxf, ratf, totm, totml, totr,
1624*5c6c1daeSBarry Smith                             100.0*fracTime, 100.0*fracFlops, 100.0*fracMess, 100.0*fracMessLen, 100.0*fracRed,
1625*5c6c1daeSBarry Smith                             100.0*fracStageTime, 100.0*fracStageFlops, 100.0*fracStageMess, 100.0*fracStageMessLen, 100.0*fracStageRed,
1626*5c6c1daeSBarry Smith                             PetscAbsReal(flopr/1.0e6));CHKERRQ(ierr);
1627*5c6c1daeSBarry Smith       }
1628*5c6c1daeSBarry Smith     }
1629*5c6c1daeSBarry Smith   }
1630*5c6c1daeSBarry Smith 
1631*5c6c1daeSBarry Smith   /* Memory usage and object creation */
1632*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
1633*5c6c1daeSBarry Smith     "------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr);
1634*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr);
1635*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Memory usage is given in bytes:\n\n");CHKERRQ(ierr);
1636*5c6c1daeSBarry Smith 
1637*5c6c1daeSBarry Smith   /* Right now, only stages on the first processor are reported here, meaning only objects associated with
1638*5c6c1daeSBarry Smith      the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then
1639*5c6c1daeSBarry Smith      stats for stages local to processor sets.
1640*5c6c1daeSBarry Smith   */
1641*5c6c1daeSBarry Smith   /* We should figure out the longest object name here (now 20 characters) */
1642*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Object Type          Creations   Destructions     Memory  Descendants' Mem.\n");CHKERRQ(ierr);
1643*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Reports information only for process 0.\n");CHKERRQ(ierr);
1644*5c6c1daeSBarry Smith   for (stage = 0; stage < numStages; stage++) {
1645*5c6c1daeSBarry Smith     if (localStageUsed[stage]) {
1646*5c6c1daeSBarry Smith       classInfo = stageLog->stageInfo[stage].classLog->classInfo;
1647*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr);
1648*5c6c1daeSBarry Smith       for (oclass = 0; oclass < stageLog->stageInfo[stage].classLog->numClasses; oclass++) {
1649*5c6c1daeSBarry Smith         if ((classInfo[oclass].creations > 0) || (classInfo[oclass].destructions > 0)) {
1650*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%20s %5d          %5d  %11.0f     %g\n", stageLog->classLog->classInfo[oclass].name,
1651*5c6c1daeSBarry Smith                               classInfo[oclass].creations, classInfo[oclass].destructions, classInfo[oclass].mem,
1652*5c6c1daeSBarry Smith                               classInfo[oclass].descMem);CHKERRQ(ierr);
1653*5c6c1daeSBarry Smith         }
1654*5c6c1daeSBarry Smith       }
1655*5c6c1daeSBarry Smith     } else {
1656*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr);
1657*5c6c1daeSBarry Smith     }
1658*5c6c1daeSBarry Smith   }
1659*5c6c1daeSBarry Smith 
1660*5c6c1daeSBarry Smith   ierr = PetscFree(localStageUsed);CHKERRQ(ierr);
1661*5c6c1daeSBarry Smith   ierr = PetscFree(stageUsed);CHKERRQ(ierr);
1662*5c6c1daeSBarry Smith   ierr = PetscFree(localStageVisible);CHKERRQ(ierr);
1663*5c6c1daeSBarry Smith   ierr = PetscFree(stageVisible);CHKERRQ(ierr);
1664*5c6c1daeSBarry Smith 
1665*5c6c1daeSBarry Smith   /* Information unrelated to this particular run */
1666*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
1667*5c6c1daeSBarry Smith     "========================================================================================================================\n");CHKERRQ(ierr);
1668*5c6c1daeSBarry Smith   PetscTime(y);
1669*5c6c1daeSBarry Smith   PetscTime(x);
1670*5c6c1daeSBarry Smith   PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y);
1671*5c6c1daeSBarry Smith   PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y);
1672*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"Average time to get PetscTime(): %g\n", (y-x)/10.0);CHKERRQ(ierr);
1673*5c6c1daeSBarry Smith   /* MPI information */
1674*5c6c1daeSBarry Smith   if (size > 1) {
1675*5c6c1daeSBarry Smith     MPI_Status  status;
1676*5c6c1daeSBarry Smith     PetscMPIInt tag;
1677*5c6c1daeSBarry Smith     MPI_Comm    newcomm;
1678*5c6c1daeSBarry Smith 
1679*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1680*5c6c1daeSBarry Smith     PetscTime(x);
1681*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1682*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1683*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1684*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1685*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1686*5c6c1daeSBarry Smith     PetscTime(y);
1687*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "Average time for MPI_Barrier(): %g\n", (y-x)/5.0);CHKERRQ(ierr);
1688*5c6c1daeSBarry Smith     ierr = PetscCommDuplicate(comm,&newcomm, &tag);CHKERRQ(ierr);
1689*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1690*5c6c1daeSBarry Smith     if (rank) {
1691*5c6c1daeSBarry Smith       ierr = MPI_Recv(0, 0, MPI_INT, rank-1,            tag, newcomm, &status);CHKERRQ(ierr);
1692*5c6c1daeSBarry Smith       ierr = MPI_Send(0, 0, MPI_INT, (rank+1)%size, tag, newcomm);CHKERRQ(ierr);
1693*5c6c1daeSBarry Smith     } else {
1694*5c6c1daeSBarry Smith       PetscTime(x);
1695*5c6c1daeSBarry Smith       ierr = MPI_Send(0, 0, MPI_INT, 1,          tag, newcomm);CHKERRQ(ierr);
1696*5c6c1daeSBarry Smith       ierr = MPI_Recv(0, 0, MPI_INT, size-1, tag, newcomm, &status);CHKERRQ(ierr);
1697*5c6c1daeSBarry Smith       PetscTime(y);
1698*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm,fd,"Average time for zero size MPI_Send(): %g\n", (y-x)/size);CHKERRQ(ierr);
1699*5c6c1daeSBarry Smith     }
1700*5c6c1daeSBarry Smith     ierr = PetscCommDestroy(&newcomm);CHKERRQ(ierr);
1701*5c6c1daeSBarry Smith   }
1702*5c6c1daeSBarry Smith   ierr = PetscOptionsView(viewer);CHKERRQ(ierr);
1703*5c6c1daeSBarry Smith 
1704*5c6c1daeSBarry Smith   /* Machine and compile information */
1705*5c6c1daeSBarry Smith #if defined(PETSC_USE_FORTRAN_KERNELS)
1706*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Compiled with FORTRAN kernels\n");CHKERRQ(ierr);
1707*5c6c1daeSBarry Smith #else
1708*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Compiled without FORTRAN kernels\n");CHKERRQ(ierr);
1709*5c6c1daeSBarry Smith #endif
1710*5c6c1daeSBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
1711*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Compiled with single precision PetscScalar and PetscReal\n");CHKERRQ(ierr);
1712*5c6c1daeSBarry Smith #elif defined(PETSC_USE_LONGDOUBLE)
1713*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Compiled with long double precision PetscScalar and PetscReal\n");CHKERRQ(ierr);
1714*5c6c1daeSBarry Smith #endif
1715*5c6c1daeSBarry Smith 
1716*5c6c1daeSBarry Smith #if defined(PETSC_USE_REAL_MAT_SINGLE)
1717*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Compiled with single precision matrices\n");CHKERRQ(ierr);
1718*5c6c1daeSBarry Smith #else
1719*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Compiled with full precision matrices (default)\n");CHKERRQ(ierr);
1720*5c6c1daeSBarry Smith #endif
1721*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "sizeof(short) %d sizeof(int) %d sizeof(long) %d sizeof(void*) %d sizeof(PetscScalar) %d sizeof(PetscInt) %d\n",
1722*5c6c1daeSBarry Smith                       (int) sizeof(short), (int) sizeof(int), (int) sizeof(long), (int) sizeof(void*),(int) sizeof(PetscScalar),(int) sizeof(PetscInt));CHKERRQ(ierr);
1723*5c6c1daeSBarry Smith 
1724*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Configure run at: %s\n",petscconfigureruntime);CHKERRQ(ierr);
1725*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Configure options: %s",petscconfigureoptions);CHKERRQ(ierr);
1726*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "%s", petscmachineinfo);CHKERRQ(ierr);
1727*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "%s", petsccompilerinfo);CHKERRQ(ierr);
1728*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "%s", petsccompilerflagsinfo);CHKERRQ(ierr);
1729*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "%s", petsclinkerinfo);CHKERRQ(ierr);
1730*5c6c1daeSBarry Smith 
1731*5c6c1daeSBarry Smith   /* Cleanup */
1732*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr);
1733*5c6c1daeSBarry Smith   ierr = PetscStageLogPush(stageLog, lastStage);CHKERRQ(ierr);
1734*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
1735*5c6c1daeSBarry Smith }
1736*5c6c1daeSBarry Smith 
1737*5c6c1daeSBarry Smith #undef __FUNCT__
1738*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogPrintDetailed"
1739*5c6c1daeSBarry Smith /*@C
1740*5c6c1daeSBarry Smith   PetscLogPrintDetailed - Each process prints the times for its own events
1741*5c6c1daeSBarry Smith 
1742*5c6c1daeSBarry Smith   Collective over MPI_Comm
1743*5c6c1daeSBarry Smith 
1744*5c6c1daeSBarry Smith   Input Parameter:
1745*5c6c1daeSBarry Smith + comm - The MPI communicator (only one processor prints output)
1746*5c6c1daeSBarry Smith - file - [Optional] The output file name
1747*5c6c1daeSBarry Smith 
1748*5c6c1daeSBarry Smith   Options Database Keys:
1749*5c6c1daeSBarry Smith . -log_summary_detailed - Prints summary of log information (for code compiled with PETSC_USE_LOG)
1750*5c6c1daeSBarry Smith 
1751*5c6c1daeSBarry Smith   Usage:
1752*5c6c1daeSBarry Smith .vb
1753*5c6c1daeSBarry Smith      PetscInitialize(...);
1754*5c6c1daeSBarry Smith      PetscLogBegin();
1755*5c6c1daeSBarry Smith      ... code ...
1756*5c6c1daeSBarry Smith      PetscLogPrintDetailed(MPI_Comm,filename);
1757*5c6c1daeSBarry Smith      PetscFinalize(...);
1758*5c6c1daeSBarry Smith .ve
1759*5c6c1daeSBarry Smith 
1760*5c6c1daeSBarry Smith   Notes:
1761*5c6c1daeSBarry Smith   By default the summary is printed to stdout.
1762*5c6c1daeSBarry Smith 
1763*5c6c1daeSBarry Smith   Level: beginner
1764*5c6c1daeSBarry Smith 
1765*5c6c1daeSBarry Smith .keywords: log, dump, print
1766*5c6c1daeSBarry Smith .seealso: PetscLogBegin(), PetscLogDump(), PetscLogView()
1767*5c6c1daeSBarry Smith @*/
1768*5c6c1daeSBarry Smith PetscErrorCode  PetscLogPrintDetailed(MPI_Comm comm, const char filename[])
1769*5c6c1daeSBarry Smith {
1770*5c6c1daeSBarry Smith   FILE               *fd                                       = PETSC_STDOUT;
1771*5c6c1daeSBarry Smith   PetscStageLog      stageLog;
1772*5c6c1daeSBarry Smith   PetscStageInfo     *stageInfo                                = PETSC_NULL;
1773*5c6c1daeSBarry Smith   PetscEventPerfInfo *eventInfo                                = PETSC_NULL;
1774*5c6c1daeSBarry Smith   const char         *name                                     = PETSC_NULL;
1775*5c6c1daeSBarry Smith   PetscLogDouble     TotalTime;
1776*5c6c1daeSBarry Smith   PetscLogDouble     stageTime, flops, flopr, mess, messLen, red;
1777*5c6c1daeSBarry Smith   PetscLogDouble     maxf, totf, maxt, tott, totm, totml, totr = 0.0;
1778*5c6c1daeSBarry Smith   PetscMPIInt        maxCt;
1779*5c6c1daeSBarry Smith   PetscBool          *stageUsed;
1780*5c6c1daeSBarry Smith   PetscBool          *stageVisible;
1781*5c6c1daeSBarry Smith   int                numStages, numEvents;
1782*5c6c1daeSBarry Smith   int                stage;
1783*5c6c1daeSBarry Smith   PetscLogEvent      event;
1784*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
1785*5c6c1daeSBarry Smith 
1786*5c6c1daeSBarry Smith   PetscFunctionBegin;
1787*5c6c1daeSBarry Smith   /* Pop off any stages the user forgot to remove */
1788*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1789*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
1790*5c6c1daeSBarry Smith   while (stage >= 0) {
1791*5c6c1daeSBarry Smith     ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr);
1792*5c6c1daeSBarry Smith     ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
1793*5c6c1daeSBarry Smith   }
1794*5c6c1daeSBarry Smith   /* Get the total elapsed time */
1795*5c6c1daeSBarry Smith   PetscTime(TotalTime);  TotalTime -= petsc_BaseTime;
1796*5c6c1daeSBarry Smith   /* Open the summary file */
1797*5c6c1daeSBarry Smith   if (filename) {
1798*5c6c1daeSBarry Smith     ierr = PetscFOpen(comm, filename, "w", &fd);CHKERRQ(ierr);
1799*5c6c1daeSBarry Smith   }
1800*5c6c1daeSBarry Smith 
1801*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr);
1802*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "***             WIDEN YOUR WINDOW TO 120 CHARACTERS.  Use 'enscript -r -fCourier9' to print this document            ***\n");CHKERRQ(ierr);
1803*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr);
1804*5c6c1daeSBarry Smith 
1805*5c6c1daeSBarry Smith 
1806*5c6c1daeSBarry Smith   numStages = stageLog->numStages;
1807*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageUsed);CHKERRQ(ierr);
1808*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageVisible);CHKERRQ(ierr);
1809*5c6c1daeSBarry Smith   if (numStages > 0) {
1810*5c6c1daeSBarry Smith     stageInfo = stageLog->stageInfo;
1811*5c6c1daeSBarry Smith     for (stage = 0; stage < numStages; stage++) {
1812*5c6c1daeSBarry Smith       if (stage < stageLog->numStages) {
1813*5c6c1daeSBarry Smith         stageUsed[stage]    = stageInfo[stage].used;
1814*5c6c1daeSBarry Smith         stageVisible[stage] = stageInfo[stage].perfInfo.visible;
1815*5c6c1daeSBarry Smith       } else {
1816*5c6c1daeSBarry Smith         stageUsed[stage]    = PETSC_FALSE;
1817*5c6c1daeSBarry Smith         stageVisible[stage] = PETSC_TRUE;
1818*5c6c1daeSBarry Smith       }
1819*5c6c1daeSBarry Smith     }
1820*5c6c1daeSBarry Smith   }
1821*5c6c1daeSBarry Smith 
1822*5c6c1daeSBarry Smith   /* Report events */
1823*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,"Event                Count      Time (sec)     Flops/sec                          \n");CHKERRQ(ierr);
1824*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,"                                                            Mess   Avg len Reduct \n");CHKERRQ(ierr);
1825*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"-----------------------------------------------------------------------------------\n");CHKERRQ(ierr);
1826*5c6c1daeSBarry Smith   /* Problem: The stage name will not show up unless the stage executed on proc 1 */
1827*5c6c1daeSBarry Smith   for (stage = 0; stage < numStages; stage++) {
1828*5c6c1daeSBarry Smith     if (!stageVisible[stage]) continue;
1829*5c6c1daeSBarry Smith     if (stageUsed[stage]) {
1830*5c6c1daeSBarry Smith       ierr = PetscSynchronizedFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr);
1831*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1832*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1833*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1834*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1835*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1836*5c6c1daeSBarry Smith     }
1837*5c6c1daeSBarry Smith     mess *= 0.5; messLen *= 0.5;
1838*5c6c1daeSBarry Smith 
1839*5c6c1daeSBarry Smith     /* Get total number of events in this stage --
1840*5c6c1daeSBarry Smith     */
1841*5c6c1daeSBarry Smith     if (stageUsed[stage]) {
1842*5c6c1daeSBarry Smith       eventInfo      = stageLog->stageInfo[stage].eventLog->eventInfo;
1843*5c6c1daeSBarry Smith       numEvents = stageLog->stageInfo[stage].eventLog->numEvents;
1844*5c6c1daeSBarry Smith     } else {
1845*5c6c1daeSBarry Smith       numEvents = 0;
1846*5c6c1daeSBarry Smith     }
1847*5c6c1daeSBarry Smith     for (event = 0; event < numEvents; event++) {
1848*5c6c1daeSBarry Smith       if (stageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents)) {
1849*5c6c1daeSBarry Smith         if ((eventInfo[event].count > 0) && (eventInfo[event].time > 0.0)) {
1850*5c6c1daeSBarry Smith           flopr = eventInfo[event].flops/eventInfo[event].time;
1851*5c6c1daeSBarry Smith         } else {
1852*5c6c1daeSBarry Smith           flopr = 0.0;
1853*5c6c1daeSBarry Smith         }
1854*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&flopr,                          &maxf,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, PETSC_COMM_SELF);CHKERRQ(ierr);
1855*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].flops,         &totf,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1856*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].time,          &maxt,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, PETSC_COMM_SELF);CHKERRQ(ierr);
1857*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].time,          &tott,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1858*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].numMessages,   &totm,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1859*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, PETSC_COMM_SELF);CHKERRQ(ierr);
1860*5c6c1daeSBarry Smith         totr = eventInfo[event].numReductions;
1861*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].count,         &maxCt, 1, MPI_INT,             MPI_MAX, PETSC_COMM_SELF);CHKERRQ(ierr);
1862*5c6c1daeSBarry Smith         name = stageLog->eventLog->eventInfo[event].name;
1863*5c6c1daeSBarry Smith         totm *= 0.5; totml *= 0.5;
1864*5c6c1daeSBarry Smith       }
1865*5c6c1daeSBarry Smith 
1866*5c6c1daeSBarry Smith       if (maxCt != 0) {
1867*5c6c1daeSBarry Smith         if (totm          != 0.0) totml           /= totm;                       else totml            = 0.0;
1868*5c6c1daeSBarry Smith         ierr = PetscSynchronizedFPrintf(comm, fd,"%-16s %7d      %5.4e      %3.2e      %2.1e %2.1e %2.1e\n",name, maxCt,  maxt,  maxf, totm, totml, totr);CHKERRQ(ierr);
1869*5c6c1daeSBarry Smith       }
1870*5c6c1daeSBarry Smith     }
1871*5c6c1daeSBarry Smith   }
1872*5c6c1daeSBarry Smith   ierr = PetscSynchronizedFlush(comm);CHKERRQ(ierr);
1873*5c6c1daeSBarry Smith 
1874*5c6c1daeSBarry Smith   ierr = PetscFree(stageUsed);CHKERRQ(ierr);
1875*5c6c1daeSBarry Smith   ierr = PetscFree(stageVisible);CHKERRQ(ierr);
1876*5c6c1daeSBarry Smith 
1877*5c6c1daeSBarry Smith   ierr = PetscFClose(comm, fd);CHKERRQ(ierr);
1878*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
1879*5c6c1daeSBarry Smith }
1880*5c6c1daeSBarry Smith 
1881*5c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/
1882*5c6c1daeSBarry Smith #undef __FUNCT__
1883*5c6c1daeSBarry Smith #define __FUNCT__ "PetscGetFlops"
1884*5c6c1daeSBarry Smith /*@C
1885*5c6c1daeSBarry Smith    PetscGetFlops - Returns the number of flops used on this processor
1886*5c6c1daeSBarry Smith    since the program began.
1887*5c6c1daeSBarry Smith 
1888*5c6c1daeSBarry Smith    Not Collective
1889*5c6c1daeSBarry Smith 
1890*5c6c1daeSBarry Smith    Output Parameter:
1891*5c6c1daeSBarry Smith    flops - number of floating point operations
1892*5c6c1daeSBarry Smith 
1893*5c6c1daeSBarry Smith    Notes:
1894*5c6c1daeSBarry Smith    A global counter logs all PETSc flop counts.  The user can use
1895*5c6c1daeSBarry Smith    PetscLogFlops() to increment this counter to include flops for the
1896*5c6c1daeSBarry Smith    application code.
1897*5c6c1daeSBarry Smith 
1898*5c6c1daeSBarry Smith    PETSc automatically logs library events if the code has been
1899*5c6c1daeSBarry Smith    compiled with -DPETSC_USE_LOG (which is the default), and -log,
1900*5c6c1daeSBarry Smith    -log_summary, or -log_all are specified.  PetscLogFlops() is
1901*5c6c1daeSBarry Smith    intended for logging user flops to supplement this PETSc
1902*5c6c1daeSBarry Smith    information.
1903*5c6c1daeSBarry Smith 
1904*5c6c1daeSBarry Smith    Level: intermediate
1905*5c6c1daeSBarry Smith 
1906*5c6c1daeSBarry Smith .keywords: log, flops, floating point operations
1907*5c6c1daeSBarry Smith 
1908*5c6c1daeSBarry Smith .seealso: PetscGetTime(), PetscLogFlops()
1909*5c6c1daeSBarry Smith @*/
1910*5c6c1daeSBarry Smith PetscErrorCode  PetscGetFlops(PetscLogDouble *flops)
1911*5c6c1daeSBarry Smith {
1912*5c6c1daeSBarry Smith   PetscFunctionBegin;
1913*5c6c1daeSBarry Smith   *flops = petsc_TotalFlops;
1914*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
1915*5c6c1daeSBarry Smith }
1916*5c6c1daeSBarry Smith 
1917*5c6c1daeSBarry Smith #undef __FUNCT__
1918*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogObjectState"
1919*5c6c1daeSBarry Smith PetscErrorCode  PetscLogObjectState(PetscObject obj, const char format[], ...)
1920*5c6c1daeSBarry Smith {
1921*5c6c1daeSBarry Smith   PetscErrorCode ierr;
1922*5c6c1daeSBarry Smith   size_t         fullLength;
1923*5c6c1daeSBarry Smith   va_list        Argp;
1924*5c6c1daeSBarry Smith 
1925*5c6c1daeSBarry Smith   PetscFunctionBegin;
1926*5c6c1daeSBarry Smith   if (!petsc_logObjects) PetscFunctionReturn(0);
1927*5c6c1daeSBarry Smith   va_start(Argp, format);
1928*5c6c1daeSBarry Smith   ierr = PetscVSNPrintf(petsc_objects[obj->id].info, 64,format,&fullLength, Argp);CHKERRQ(ierr);
1929*5c6c1daeSBarry Smith   va_end(Argp);
1930*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
1931*5c6c1daeSBarry Smith }
1932*5c6c1daeSBarry Smith 
1933*5c6c1daeSBarry Smith 
1934*5c6c1daeSBarry Smith /*MC
1935*5c6c1daeSBarry Smith    PetscLogFlops - Adds floating point operations to the global counter.
1936*5c6c1daeSBarry Smith 
1937*5c6c1daeSBarry Smith    Synopsis:
1938*5c6c1daeSBarry Smith    PetscErrorCode PetscLogFlops(PetscLogDouble f)
1939*5c6c1daeSBarry Smith 
1940*5c6c1daeSBarry Smith    Not Collective
1941*5c6c1daeSBarry Smith 
1942*5c6c1daeSBarry Smith    Input Parameter:
1943*5c6c1daeSBarry Smith .  f - flop counter
1944*5c6c1daeSBarry Smith 
1945*5c6c1daeSBarry Smith 
1946*5c6c1daeSBarry Smith    Usage:
1947*5c6c1daeSBarry Smith .vb
1948*5c6c1daeSBarry Smith      PetscLogEvent USER_EVENT;
1949*5c6c1daeSBarry Smith      PetscLogEventRegister("User event",0,&USER_EVENT);
1950*5c6c1daeSBarry Smith      PetscLogEventBegin(USER_EVENT,0,0,0,0);
1951*5c6c1daeSBarry Smith         [code segment to monitor]
1952*5c6c1daeSBarry Smith         PetscLogFlops(user_flops)
1953*5c6c1daeSBarry Smith      PetscLogEventEnd(USER_EVENT,0,0,0,0);
1954*5c6c1daeSBarry Smith .ve
1955*5c6c1daeSBarry Smith 
1956*5c6c1daeSBarry Smith    Notes:
1957*5c6c1daeSBarry Smith    A global counter logs all PETSc flop counts.  The user can use
1958*5c6c1daeSBarry Smith    PetscLogFlops() to increment this counter to include flops for the
1959*5c6c1daeSBarry Smith    application code.
1960*5c6c1daeSBarry Smith 
1961*5c6c1daeSBarry Smith    PETSc automatically logs library events if the code has been
1962*5c6c1daeSBarry Smith    compiled with -DPETSC_USE_LOG (which is the default), and -log,
1963*5c6c1daeSBarry Smith    -log_summary, or -log_all are specified.  PetscLogFlops() is
1964*5c6c1daeSBarry Smith    intended for logging user flops to supplement this PETSc
1965*5c6c1daeSBarry Smith    information.
1966*5c6c1daeSBarry Smith 
1967*5c6c1daeSBarry Smith    Level: intermediate
1968*5c6c1daeSBarry Smith 
1969*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscGetFlops()
1970*5c6c1daeSBarry Smith 
1971*5c6c1daeSBarry Smith .keywords: log, flops, floating point operations
1972*5c6c1daeSBarry Smith M*/
1973*5c6c1daeSBarry Smith 
1974*5c6c1daeSBarry Smith /*MC
1975*5c6c1daeSBarry Smith    PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice)
1976*5c6c1daeSBarry Smith     to get accurate timings
1977*5c6c1daeSBarry Smith 
1978*5c6c1daeSBarry Smith    Synopsis:
1979*5c6c1daeSBarry Smith    void PetscPreLoadBegin(PetscBool  flag,char *name);
1980*5c6c1daeSBarry Smith 
1981*5c6c1daeSBarry Smith    Not Collective
1982*5c6c1daeSBarry Smith 
1983*5c6c1daeSBarry Smith    Input Parameter:
1984*5c6c1daeSBarry Smith +   flag - PETSC_TRUE to run twice, PETSC_FALSE to run once, may be overridden
1985*5c6c1daeSBarry Smith            with command line option -preload true or -preload false
1986*5c6c1daeSBarry Smith -   name - name of first stage (lines of code timed separately with -log_summary) to
1987*5c6c1daeSBarry Smith            be preloaded
1988*5c6c1daeSBarry Smith 
1989*5c6c1daeSBarry Smith    Usage:
1990*5c6c1daeSBarry Smith .vb
1991*5c6c1daeSBarry Smith      PetscPreLoadBegin(PETSC_TRUE,"first stage);
1992*5c6c1daeSBarry Smith        lines of code
1993*5c6c1daeSBarry Smith        PetscPreLoadStage("second stage");
1994*5c6c1daeSBarry Smith        lines of code
1995*5c6c1daeSBarry Smith      PetscPreLoadEnd();
1996*5c6c1daeSBarry Smith .ve
1997*5c6c1daeSBarry Smith 
1998*5c6c1daeSBarry Smith    Notes: Only works in C/C++, not Fortran
1999*5c6c1daeSBarry Smith 
2000*5c6c1daeSBarry Smith      Flags available within the macro.
2001*5c6c1daeSBarry Smith +    PetscPreLoadingUsed - true if we are or have done preloading
2002*5c6c1daeSBarry Smith .    PetscPreLoadingOn - true if it is CURRENTLY doing preload
2003*5c6c1daeSBarry Smith .    PetscPreLoadIt - 0 for the first computation (with preloading turned off it is only 0) 1 for the second
2004*5c6c1daeSBarry Smith -    PetscPreLoadMax - number of times it will do the computation, only one when preloading is turned on
2005*5c6c1daeSBarry Smith      The first two variables are available throughout the program, the second two only between the PetscPreLoadBegin()
2006*5c6c1daeSBarry Smith      and PetscPreLoadEnd()
2007*5c6c1daeSBarry Smith 
2008*5c6c1daeSBarry Smith    Level: intermediate
2009*5c6c1daeSBarry Smith 
2010*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadEnd(), PetscPreLoadStage()
2011*5c6c1daeSBarry Smith 
2012*5c6c1daeSBarry Smith    Concepts: preloading
2013*5c6c1daeSBarry Smith    Concepts: timing^accurate
2014*5c6c1daeSBarry Smith    Concepts: paging^eliminating effects of
2015*5c6c1daeSBarry Smith 
2016*5c6c1daeSBarry Smith 
2017*5c6c1daeSBarry Smith M*/
2018*5c6c1daeSBarry Smith 
2019*5c6c1daeSBarry Smith /*MC
2020*5c6c1daeSBarry Smith    PetscPreLoadEnd - End a segment of code that may be preloaded (run twice)
2021*5c6c1daeSBarry Smith     to get accurate timings
2022*5c6c1daeSBarry Smith 
2023*5c6c1daeSBarry Smith    Synopsis:
2024*5c6c1daeSBarry Smith    void PetscPreLoadEnd(void);
2025*5c6c1daeSBarry Smith 
2026*5c6c1daeSBarry Smith    Not Collective
2027*5c6c1daeSBarry Smith 
2028*5c6c1daeSBarry Smith    Usage:
2029*5c6c1daeSBarry Smith .vb
2030*5c6c1daeSBarry Smith      PetscPreLoadBegin(PETSC_TRUE,"first stage);
2031*5c6c1daeSBarry Smith        lines of code
2032*5c6c1daeSBarry Smith        PetscPreLoadStage("second stage");
2033*5c6c1daeSBarry Smith        lines of code
2034*5c6c1daeSBarry Smith      PetscPreLoadEnd();
2035*5c6c1daeSBarry Smith .ve
2036*5c6c1daeSBarry Smith 
2037*5c6c1daeSBarry Smith    Notes: only works in C/C++ not fortran
2038*5c6c1daeSBarry Smith 
2039*5c6c1daeSBarry Smith    Level: intermediate
2040*5c6c1daeSBarry Smith 
2041*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadStage()
2042*5c6c1daeSBarry Smith 
2043*5c6c1daeSBarry Smith M*/
2044*5c6c1daeSBarry Smith 
2045*5c6c1daeSBarry Smith /*MC
2046*5c6c1daeSBarry Smith    PetscPreLoadStage - Start a new segment of code to be timed separately.
2047*5c6c1daeSBarry Smith     to get accurate timings
2048*5c6c1daeSBarry Smith 
2049*5c6c1daeSBarry Smith    Synopsis:
2050*5c6c1daeSBarry Smith    void PetscPreLoadStage(char *name);
2051*5c6c1daeSBarry Smith 
2052*5c6c1daeSBarry Smith    Not Collective
2053*5c6c1daeSBarry Smith 
2054*5c6c1daeSBarry Smith    Usage:
2055*5c6c1daeSBarry Smith .vb
2056*5c6c1daeSBarry Smith      PetscPreLoadBegin(PETSC_TRUE,"first stage);
2057*5c6c1daeSBarry Smith        lines of code
2058*5c6c1daeSBarry Smith        PetscPreLoadStage("second stage");
2059*5c6c1daeSBarry Smith        lines of code
2060*5c6c1daeSBarry Smith      PetscPreLoadEnd();
2061*5c6c1daeSBarry Smith .ve
2062*5c6c1daeSBarry Smith 
2063*5c6c1daeSBarry Smith    Notes: only works in C/C++ not fortran
2064*5c6c1daeSBarry Smith 
2065*5c6c1daeSBarry Smith    Level: intermediate
2066*5c6c1daeSBarry Smith 
2067*5c6c1daeSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd()
2068*5c6c1daeSBarry Smith 
2069*5c6c1daeSBarry Smith M*/
2070*5c6c1daeSBarry Smith 
2071*5c6c1daeSBarry Smith #undef __FUNCT__
2072*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogViewPython"
2073*5c6c1daeSBarry Smith /*@
2074*5c6c1daeSBarry Smith    PetscLogViewPython - Saves logging information in a Python format.
2075*5c6c1daeSBarry Smith 
2076*5c6c1daeSBarry Smith    Collective on PetscViewer
2077*5c6c1daeSBarry Smith 
2078*5c6c1daeSBarry Smith    Input Paramter:
2079*5c6c1daeSBarry Smith .   viewer - viewer to save Python data
2080*5c6c1daeSBarry Smith 
2081*5c6c1daeSBarry Smith   Level: intermediate
2082*5c6c1daeSBarry Smith 
2083*5c6c1daeSBarry Smith @*/
2084*5c6c1daeSBarry Smith PetscErrorCode  PetscLogViewPython(PetscViewer viewer)
2085*5c6c1daeSBarry Smith {
2086*5c6c1daeSBarry Smith   FILE               *fd;
2087*5c6c1daeSBarry Smith   PetscLogDouble     zero                    = 0.0;
2088*5c6c1daeSBarry Smith   PetscStageLog      stageLog;
2089*5c6c1daeSBarry Smith   PetscStageInfo     *stageInfo              = PETSC_NULL;
2090*5c6c1daeSBarry Smith   PetscEventPerfInfo *eventInfo              = PETSC_NULL;
2091*5c6c1daeSBarry Smith   const char         *name;
2092*5c6c1daeSBarry Smith   char               stageName[2048];
2093*5c6c1daeSBarry Smith   char               eventName[2048];
2094*5c6c1daeSBarry Smith   PetscLogDouble     locTotalTime, TotalTime = 0, TotalFlops = 0;
2095*5c6c1daeSBarry Smith   PetscLogDouble     numMessages             = 0, messageLength = 0, avgMessLen, numReductions = 0;
2096*5c6c1daeSBarry Smith   PetscLogDouble     stageTime, flops, mem, mess, messLen, red;
2097*5c6c1daeSBarry Smith   PetscLogDouble     fracTime, fracFlops, fracMessages, fracLength;
2098*5c6c1daeSBarry Smith   PetscLogDouble     fracReductions;
2099*5c6c1daeSBarry Smith   PetscLogDouble     tot,avg,x,y,*mydata;
2100*5c6c1daeSBarry Smith   PetscMPIInt        maxCt;
2101*5c6c1daeSBarry Smith   PetscMPIInt        size, rank, *mycount;
2102*5c6c1daeSBarry Smith   PetscBool          *localStageUsed,    *stageUsed;
2103*5c6c1daeSBarry Smith   PetscBool          *localStageVisible, *stageVisible;
2104*5c6c1daeSBarry Smith   int                numStages, localNumEvents, numEvents;
2105*5c6c1daeSBarry Smith   int                stage, lastStage;
2106*5c6c1daeSBarry Smith   PetscLogEvent      event;
2107*5c6c1daeSBarry Smith   PetscErrorCode     ierr;
2108*5c6c1daeSBarry Smith   PetscInt           i;
2109*5c6c1daeSBarry Smith   MPI_Comm           comm;
2110*5c6c1daeSBarry Smith 
2111*5c6c1daeSBarry Smith   PetscFunctionBegin;
2112*5c6c1daeSBarry Smith   ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr);
2113*5c6c1daeSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
2114*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
2115*5c6c1daeSBarry Smith   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
2116*5c6c1daeSBarry Smith   ierr = PetscMalloc(size*sizeof(PetscLogDouble), &mydata);CHKERRQ(ierr);
2117*5c6c1daeSBarry Smith   ierr = PetscMalloc(size*sizeof(PetscMPIInt), &mycount);CHKERRQ(ierr);
2118*5c6c1daeSBarry Smith 
2119*5c6c1daeSBarry Smith   /* Pop off any stages the user forgot to remove */
2120*5c6c1daeSBarry Smith   lastStage = 0;
2121*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
2122*5c6c1daeSBarry Smith   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
2123*5c6c1daeSBarry Smith   while (stage >= 0) {
2124*5c6c1daeSBarry Smith     lastStage = stage;
2125*5c6c1daeSBarry Smith     ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr);
2126*5c6c1daeSBarry Smith     ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
2127*5c6c1daeSBarry Smith   }
2128*5c6c1daeSBarry Smith   /* Get the total elapsed time */
2129*5c6c1daeSBarry Smith   PetscTime(locTotalTime);  locTotalTime -= petsc_BaseTime;
2130*5c6c1daeSBarry Smith 
2131*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n#------ PETSc Performance Summary ----------\n\n");CHKERRQ(ierr);
2132*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "Nproc = %d\n",size);CHKERRQ(ierr);
2133*5c6c1daeSBarry Smith 
2134*5c6c1daeSBarry Smith   /* Must preserve reduction count before we go on */
2135*5c6c1daeSBarry Smith   red  = (petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct)/((PetscLogDouble) size);
2136*5c6c1daeSBarry Smith 
2137*5c6c1daeSBarry Smith   /* Calculate summary information */
2138*5c6c1daeSBarry Smith 
2139*5c6c1daeSBarry Smith   /*   Time */
2140*5c6c1daeSBarry Smith   ierr = MPI_Gather(&locTotalTime,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2141*5c6c1daeSBarry Smith   if (!rank){
2142*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "Time = [ " );CHKERRQ(ierr);
2143*5c6c1daeSBarry Smith     tot  = 0.0;
2144*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2145*5c6c1daeSBarry Smith       tot += mydata[i];
2146*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2147*5c6c1daeSBarry Smith     }
2148*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2149*5c6c1daeSBarry Smith     avg  = (tot)/((PetscLogDouble) size);
2150*5c6c1daeSBarry Smith     TotalTime = tot;
2151*5c6c1daeSBarry Smith   }
2152*5c6c1daeSBarry Smith 
2153*5c6c1daeSBarry Smith   /*   Objects */
2154*5c6c1daeSBarry Smith   avg  = (PetscLogDouble) petsc_numObjects;
2155*5c6c1daeSBarry Smith   ierr = MPI_Gather(&avg,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2156*5c6c1daeSBarry Smith   if (!rank){
2157*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "Objects = [ " );CHKERRQ(ierr);
2158*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2159*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2160*5c6c1daeSBarry Smith     }
2161*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2162*5c6c1daeSBarry Smith   }
2163*5c6c1daeSBarry Smith 
2164*5c6c1daeSBarry Smith   /*   Flops */
2165*5c6c1daeSBarry Smith   ierr = MPI_Gather(&petsc_TotalFlops,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2166*5c6c1daeSBarry Smith   if (!rank){
2167*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "Flops = [ " );CHKERRQ(ierr);
2168*5c6c1daeSBarry Smith     tot  = 0.0;
2169*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2170*5c6c1daeSBarry Smith       tot += mydata[i];
2171*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2172*5c6c1daeSBarry Smith     }
2173*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n");CHKERRQ(ierr);
2174*5c6c1daeSBarry Smith     TotalFlops = tot;
2175*5c6c1daeSBarry Smith   }
2176*5c6c1daeSBarry Smith 
2177*5c6c1daeSBarry Smith   /*   Memory */
2178*5c6c1daeSBarry Smith   ierr = PetscMallocGetMaximumUsage(&mem);CHKERRQ(ierr);
2179*5c6c1daeSBarry Smith   ierr = MPI_Gather(&mem,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2180*5c6c1daeSBarry Smith   if (!rank){
2181*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "Memory = [ " );CHKERRQ(ierr);
2182*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2183*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2184*5c6c1daeSBarry Smith     }
2185*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2186*5c6c1daeSBarry Smith   }
2187*5c6c1daeSBarry Smith 
2188*5c6c1daeSBarry Smith   /*   Messages */
2189*5c6c1daeSBarry Smith   mess = 0.5*(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct);
2190*5c6c1daeSBarry Smith   ierr = MPI_Gather(&mess,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2191*5c6c1daeSBarry Smith   if (!rank){
2192*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "MPIMessages = [ " );CHKERRQ(ierr);
2193*5c6c1daeSBarry Smith     tot  = 0.0;
2194*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2195*5c6c1daeSBarry Smith       tot += mydata[i];
2196*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2197*5c6c1daeSBarry Smith     }
2198*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2199*5c6c1daeSBarry Smith     numMessages = tot;
2200*5c6c1daeSBarry Smith   }
2201*5c6c1daeSBarry Smith 
2202*5c6c1daeSBarry Smith   /*   Message Lengths */
2203*5c6c1daeSBarry Smith   mess = 0.5*(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len);
2204*5c6c1daeSBarry Smith   ierr = MPI_Gather(&mess,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2205*5c6c1daeSBarry Smith   if (!rank){
2206*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "MPIMessageLengths = [ " );CHKERRQ(ierr);
2207*5c6c1daeSBarry Smith     tot  = 0.0;
2208*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2209*5c6c1daeSBarry Smith       tot += mydata[i];
2210*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2211*5c6c1daeSBarry Smith     }
2212*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2213*5c6c1daeSBarry Smith     messageLength = tot;
2214*5c6c1daeSBarry Smith   }
2215*5c6c1daeSBarry Smith 
2216*5c6c1daeSBarry Smith   /*   Reductions */
2217*5c6c1daeSBarry Smith   ierr = MPI_Gather(&red,1,MPIU_PETSCLOGDOUBLE,mydata,1,MPIU_PETSCLOGDOUBLE,0,comm);CHKERRQ(ierr);
2218*5c6c1daeSBarry Smith   if (!rank){
2219*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "MPIReductions = [ " );CHKERRQ(ierr);
2220*5c6c1daeSBarry Smith     tot  = 0.0;
2221*5c6c1daeSBarry Smith     for (i=0; i<size; i++){
2222*5c6c1daeSBarry Smith       tot += mydata[i];
2223*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2224*5c6c1daeSBarry Smith     }
2225*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2226*5c6c1daeSBarry Smith     numReductions = tot;
2227*5c6c1daeSBarry Smith   }
2228*5c6c1daeSBarry Smith 
2229*5c6c1daeSBarry Smith   /* Get total number of stages --
2230*5c6c1daeSBarry Smith        Currently, a single processor can register more stages than another, but stages must all be registered in order.
2231*5c6c1daeSBarry Smith        We can removed this requirement if necessary by having a global stage numbering and indirection on the stage ID.
2232*5c6c1daeSBarry Smith        This seems best accomplished by assoicating a communicator with each stage.
2233*5c6c1daeSBarry Smith   */
2234*5c6c1daeSBarry Smith   ierr = MPI_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
2235*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageUsed);CHKERRQ(ierr);
2236*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageUsed);CHKERRQ(ierr);
2237*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &localStageVisible);CHKERRQ(ierr);
2238*5c6c1daeSBarry Smith   ierr = PetscMalloc(numStages * sizeof(PetscBool), &stageVisible);CHKERRQ(ierr);
2239*5c6c1daeSBarry Smith   if (numStages > 0) {
2240*5c6c1daeSBarry Smith     stageInfo = stageLog->stageInfo;
2241*5c6c1daeSBarry Smith     for (stage = 0; stage < numStages; stage++) {
2242*5c6c1daeSBarry Smith       if (stage < stageLog->numStages) {
2243*5c6c1daeSBarry Smith         localStageUsed[stage]    = stageInfo[stage].used;
2244*5c6c1daeSBarry Smith         localStageVisible[stage] = stageInfo[stage].perfInfo.visible;
2245*5c6c1daeSBarry Smith       } else {
2246*5c6c1daeSBarry Smith         localStageUsed[stage]    = PETSC_FALSE;
2247*5c6c1daeSBarry Smith         localStageVisible[stage] = PETSC_TRUE;
2248*5c6c1daeSBarry Smith       }
2249*5c6c1daeSBarry Smith     }
2250*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(localStageUsed,    stageUsed,    numStages, MPI_INT, MPI_LOR,  comm);CHKERRQ(ierr);
2251*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(localStageVisible, stageVisible, numStages, MPI_INT, MPI_LAND, comm);CHKERRQ(ierr);
2252*5c6c1daeSBarry Smith for (stage = 0; stage < numStages; stage++) {
2253*5c6c1daeSBarry Smith       if (stageUsed[stage]) {
2254*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "\n#Summary of Stages:   ----- Time ------  ----- Flops -----  --- Messages ---  -- Message Lengths --  -- Reductions --\n");CHKERRQ(ierr);
2255*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "#                       Avg     %%Total     Avg     %%Total   counts   %%Total     Avg         %%Total   counts   %%Total \n");CHKERRQ(ierr);
2256*5c6c1daeSBarry Smith         break;
2257*5c6c1daeSBarry Smith       }
2258*5c6c1daeSBarry Smith     }
2259*5c6c1daeSBarry Smith     for (stage = 0; stage < numStages; stage++) {
2260*5c6c1daeSBarry Smith       if (!stageUsed[stage]) continue;
2261*5c6c1daeSBarry Smith       if (localStageUsed[stage]) {
2262*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2263*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2264*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2265*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2266*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2267*5c6c1daeSBarry Smith         name = stageInfo[stage].name;
2268*5c6c1daeSBarry Smith       } else {
2269*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2270*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2271*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2272*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2273*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&zero,                           &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2274*5c6c1daeSBarry Smith         name = "";
2275*5c6c1daeSBarry Smith       }
2276*5c6c1daeSBarry Smith       mess *= 0.5; messLen *= 0.5; red /= size;
2277*5c6c1daeSBarry Smith       if (TotalTime     != 0.0) fracTime       = stageTime/TotalTime;    else fracTime       = 0.0;
2278*5c6c1daeSBarry Smith       if (TotalFlops    != 0.0) fracFlops      = flops/TotalFlops;       else fracFlops      = 0.0;
2279*5c6c1daeSBarry Smith       /* Talk to Barry if (stageTime     != 0.0) flops          = (size*flops)/stageTime; else flops          = 0.0; */
2280*5c6c1daeSBarry Smith       if (numMessages   != 0.0) fracMessages   = mess/numMessages;       else fracMessages   = 0.0;
2281*5c6c1daeSBarry Smith       if (numMessages   != 0.0) avgMessLen     = messLen/numMessages;    else avgMessLen     = 0.0;
2282*5c6c1daeSBarry Smith       if (messageLength != 0.0) fracLength     = messLen/messageLength;  else fracLength     = 0.0;
2283*5c6c1daeSBarry Smith       if (numReductions != 0.0) fracReductions = red/numReductions;      else fracReductions = 0.0;
2284*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "# ");
2285*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "%2d: %15s: %6.4e %5.1f%%  %6.4e %5.1f%%  %5.3e %5.1f%%  %5.3e      %5.1f%%  %5.3e %5.1f%% \n",
2286*5c6c1daeSBarry Smith                           stage, name, stageTime/size, 100.0*fracTime, flops, 100.0*fracFlops,
2287*5c6c1daeSBarry Smith                           mess, 100.0*fracMessages, avgMessLen, 100.0*fracLength, red, 100.0*fracReductions);CHKERRQ(ierr);
2288*5c6c1daeSBarry Smith     }
2289*5c6c1daeSBarry Smith   }
2290*5c6c1daeSBarry Smith 
2291*5c6c1daeSBarry Smith   /* Report events */
2292*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"\n# Event\n");CHKERRQ(ierr);
2293*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"# ------------------------------------------------------\n");CHKERRQ(ierr);
2294*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"class Stage(object):\n");CHKERRQ(ierr);
2295*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"    def __init__(self, name, time, flops, numMessages, messageLength, numReductions):\n");CHKERRQ(ierr);
2296*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        # The time and flops represent totals across processes, whereas reductions are only counted once\n");CHKERRQ(ierr);
2297*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.name          = name\n");CHKERRQ(ierr);
2298*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.time          = time\n");CHKERRQ(ierr);
2299*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.flops         = flops\n");CHKERRQ(ierr);
2300*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.numMessages   = numMessages\n");CHKERRQ(ierr);
2301*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.messageLength = messageLength\n");CHKERRQ(ierr);
2302*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.numReductions = numReductions\n");CHKERRQ(ierr);
2303*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"        self.event         = {}\n");CHKERRQ(ierr);
2304*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd, "class Dummy(object):\n");CHKERRQ(ierr);
2305*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd, "    pass\n");CHKERRQ(ierr);
2306*5c6c1daeSBarry Smith   /* Problem: The stage name will not show up unless the stage executed on proc 1 */
2307*5c6c1daeSBarry Smith   for (stage = 0; stage < numStages; stage++) {
2308*5c6c1daeSBarry Smith     if (!stageVisible[stage]) continue;
2309*5c6c1daeSBarry Smith     if (localStageUsed[stage]) {
2310*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2311*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2312*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2313*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2314*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2315*5c6c1daeSBarry Smith     } else {
2316*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr);
2317*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2318*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2319*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2320*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2321*5c6c1daeSBarry Smith       ierr = MPI_Allreduce(&zero,                           &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
2322*5c6c1daeSBarry Smith     }
2323*5c6c1daeSBarry Smith     mess *= 0.5; messLen *= 0.5; red /= size;
2324*5c6c1daeSBarry Smith 
2325*5c6c1daeSBarry Smith     /* Get total number of events in this stage --
2326*5c6c1daeSBarry Smith        Currently, a single processor can register more events than another, but events must all be registered in order,
2327*5c6c1daeSBarry Smith        just like stages. We can removed this requirement if necessary by having a global event numbering and indirection
2328*5c6c1daeSBarry Smith        on the event ID. This seems best accomplished by assoicating a communicator with each stage.
2329*5c6c1daeSBarry Smith 
2330*5c6c1daeSBarry Smith        Problem: If the event did not happen on proc 1, its name will not be available.
2331*5c6c1daeSBarry Smith        Problem: Event visibility is not implemented
2332*5c6c1daeSBarry Smith     */
2333*5c6c1daeSBarry Smith 
2334*5c6c1daeSBarry Smith     {
2335*5c6c1daeSBarry Smith       size_t len, c;
2336*5c6c1daeSBarry Smith 
2337*5c6c1daeSBarry Smith       ierr = PetscStrcpy(stageName, stageInfo[stage].name);CHKERRQ(ierr);
2338*5c6c1daeSBarry Smith       ierr = PetscStrlen(stageName, &len);CHKERRQ(ierr);
2339*5c6c1daeSBarry Smith       for (c = 0; c < len; ++c) {
2340*5c6c1daeSBarry Smith         if (stageName[c] == ' ') stageName[c] = '_';
2341*5c6c1daeSBarry Smith       }
2342*5c6c1daeSBarry Smith     }
2343*5c6c1daeSBarry Smith     if (!rank){
2344*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "%s = Stage('%s', %g, %g, %g, %g, %g)\n", stageName, stageName, stageTime, flops, mess, messLen, red);CHKERRQ(ierr);
2345*5c6c1daeSBarry Smith     }
2346*5c6c1daeSBarry Smith 
2347*5c6c1daeSBarry Smith     if (localStageUsed[stage]) {
2348*5c6c1daeSBarry Smith       eventInfo      = stageLog->stageInfo[stage].eventLog->eventInfo;
2349*5c6c1daeSBarry Smith       localNumEvents = stageLog->stageInfo[stage].eventLog->numEvents;
2350*5c6c1daeSBarry Smith     } else {
2351*5c6c1daeSBarry Smith       localNumEvents = 0;
2352*5c6c1daeSBarry Smith     }
2353*5c6c1daeSBarry Smith     ierr = MPI_Allreduce(&localNumEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
2354*5c6c1daeSBarry Smith     for (event = 0; event < numEvents; event++) {
2355*5c6c1daeSBarry Smith       PetscBool      hasEvent = PETSC_TRUE;
2356*5c6c1daeSBarry Smith       PetscMPIInt    tmpI;
2357*5c6c1daeSBarry Smith       PetscLogDouble tmpR;
2358*5c6c1daeSBarry Smith 
2359*5c6c1daeSBarry Smith       if (localStageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents) && (eventInfo[event].depth == 0)) {
2360*5c6c1daeSBarry Smith         size_t len, c;
2361*5c6c1daeSBarry Smith 
2362*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&eventInfo[event].count, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
2363*5c6c1daeSBarry Smith         ierr = PetscStrcpy(eventName, stageLog->eventLog->eventInfo[event].name);CHKERRQ(ierr);
2364*5c6c1daeSBarry Smith         ierr = PetscStrlen(eventName, &len);CHKERRQ(ierr);
2365*5c6c1daeSBarry Smith         for (c = 0; c < len; ++c) {
2366*5c6c1daeSBarry Smith           if (eventName[c] == ' ') eventName[c] = '_';
2367*5c6c1daeSBarry Smith         }
2368*5c6c1daeSBarry Smith       } else {
2369*5c6c1daeSBarry Smith         ierr = MPI_Allreduce(&ierr, &maxCt, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
2370*5c6c1daeSBarry Smith         eventName[0] = 0;
2371*5c6c1daeSBarry Smith         hasEvent     = PETSC_FALSE;
2372*5c6c1daeSBarry Smith       }
2373*5c6c1daeSBarry Smith 
2374*5c6c1daeSBarry Smith       if (maxCt != 0) {
2375*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd,"#\n");CHKERRQ(ierr);
2376*5c6c1daeSBarry Smith         if (!rank){
2377*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s = Dummy()\n",eventName);CHKERRQ(ierr);
2378*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s.event['%s'] = %s\n",stageName,eventName,eventName);CHKERRQ(ierr);
2379*5c6c1daeSBarry Smith         }
2380*5c6c1daeSBarry Smith         /* Count */
2381*5c6c1daeSBarry Smith         if (hasEvent) {tmpI = eventInfo[event].count;}
2382*5c6c1daeSBarry Smith         else          {tmpI = 0;}
2383*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpI,1, MPI_INT, mycount, 1, MPI_INT, 0, comm);CHKERRQ(ierr);
2384*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "%s.Count = [ ", eventName);CHKERRQ(ierr);
2385*5c6c1daeSBarry Smith         if (!rank){
2386*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2387*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %7d,",mycount[i] );CHKERRQ(ierr);
2388*5c6c1daeSBarry Smith           }
2389*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2390*5c6c1daeSBarry Smith         }
2391*5c6c1daeSBarry Smith         /* Time */
2392*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].time;}
2393*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2394*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2395*5c6c1daeSBarry Smith         if (!rank){
2396*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s.Time  = [ ", eventName);CHKERRQ(ierr);
2397*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2398*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2399*5c6c1daeSBarry Smith           }
2400*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2401*5c6c1daeSBarry Smith         }
2402*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].time2;}
2403*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2404*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2405*5c6c1daeSBarry Smith         if (!rank){
2406*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s.Time2 = [ ", eventName);CHKERRQ(ierr);
2407*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2408*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %5.3e,", mydata[i]);CHKERRQ(ierr);
2409*5c6c1daeSBarry Smith           }
2410*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2411*5c6c1daeSBarry Smith         }
2412*5c6c1daeSBarry Smith         /* Flops */
2413*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].flops;}
2414*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2415*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2416*5c6c1daeSBarry Smith         if (!rank){
2417*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s.Flops = [ ", eventName);CHKERRQ(ierr);
2418*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2419*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2420*5c6c1daeSBarry Smith           }
2421*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n");CHKERRQ(ierr);
2422*5c6c1daeSBarry Smith         }
2423*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].flops2;}
2424*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2425*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2426*5c6c1daeSBarry Smith         if (!rank){
2427*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s.Flops2 = [ ", eventName);CHKERRQ(ierr);
2428*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2429*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %5.3e,", mydata[i]);CHKERRQ(ierr);
2430*5c6c1daeSBarry Smith           }
2431*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n");CHKERRQ(ierr);
2432*5c6c1daeSBarry Smith         }
2433*5c6c1daeSBarry Smith         /* Num Messages */
2434*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].numMessages;}
2435*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2436*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2437*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "%s.NumMessages = [ ", eventName);CHKERRQ(ierr);
2438*5c6c1daeSBarry Smith         if (!rank){
2439*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2440*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %7.1e,",mydata[i] );CHKERRQ(ierr);
2441*5c6c1daeSBarry Smith           }
2442*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2443*5c6c1daeSBarry Smith         }
2444*5c6c1daeSBarry Smith         /* Message Length */
2445*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].messageLength;}
2446*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2447*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2448*5c6c1daeSBarry Smith         if (!rank){
2449*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "%s.MessageLength = [ ", eventName);CHKERRQ(ierr);
2450*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2451*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %5.3e,",mydata[i] );CHKERRQ(ierr);
2452*5c6c1daeSBarry Smith           }
2453*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2454*5c6c1daeSBarry Smith         }
2455*5c6c1daeSBarry Smith         /* Num Reductions */
2456*5c6c1daeSBarry Smith         if (hasEvent) {tmpR = eventInfo[event].numReductions;}
2457*5c6c1daeSBarry Smith         else          {tmpR = 0.0;}
2458*5c6c1daeSBarry Smith         ierr = MPI_Gather(&tmpR, 1, MPIU_PETSCLOGDOUBLE, mydata, 1, MPIU_PETSCLOGDOUBLE, 0, comm);CHKERRQ(ierr);
2459*5c6c1daeSBarry Smith         ierr = PetscFPrintf(comm, fd, "%s.NumReductions = [ ", eventName);CHKERRQ(ierr);
2460*5c6c1daeSBarry Smith         if (!rank){
2461*5c6c1daeSBarry Smith           for (i=0; i<size; i++){
2462*5c6c1daeSBarry Smith             ierr = PetscFPrintf(comm, fd, "  %7.1e,",mydata[i] );CHKERRQ(ierr);
2463*5c6c1daeSBarry Smith           }
2464*5c6c1daeSBarry Smith           ierr = PetscFPrintf(comm, fd, "]\n" );CHKERRQ(ierr);
2465*5c6c1daeSBarry Smith         }
2466*5c6c1daeSBarry Smith       }
2467*5c6c1daeSBarry Smith     }
2468*5c6c1daeSBarry Smith   }
2469*5c6c1daeSBarry Smith 
2470*5c6c1daeSBarry Smith   /* Right now, only stages on the first processor are reported here, meaning only objects associated with
2471*5c6c1daeSBarry Smith      the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then
2472*5c6c1daeSBarry Smith      stats for stages local to processor sets.
2473*5c6c1daeSBarry Smith   */
2474*5c6c1daeSBarry Smith   for (stage = 0; stage < numStages; stage++) {
2475*5c6c1daeSBarry Smith     if (!localStageUsed[stage]) {
2476*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr);
2477*5c6c1daeSBarry Smith     }
2478*5c6c1daeSBarry Smith   }
2479*5c6c1daeSBarry Smith 
2480*5c6c1daeSBarry Smith   ierr = PetscFree(localStageUsed);CHKERRQ(ierr);
2481*5c6c1daeSBarry Smith   ierr = PetscFree(stageUsed);CHKERRQ(ierr);
2482*5c6c1daeSBarry Smith   ierr = PetscFree(localStageVisible);CHKERRQ(ierr);
2483*5c6c1daeSBarry Smith   ierr = PetscFree(stageVisible);CHKERRQ(ierr);
2484*5c6c1daeSBarry Smith   ierr = PetscFree(mydata);CHKERRQ(ierr);
2485*5c6c1daeSBarry Smith   ierr = PetscFree(mycount);CHKERRQ(ierr);
2486*5c6c1daeSBarry Smith 
2487*5c6c1daeSBarry Smith   /* Information unrelated to this particular run */
2488*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd,
2489*5c6c1daeSBarry Smith     "# ========================================================================================================================\n");CHKERRQ(ierr);
2490*5c6c1daeSBarry Smith   PetscTime(y);
2491*5c6c1daeSBarry Smith   PetscTime(x);
2492*5c6c1daeSBarry Smith   PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y);
2493*5c6c1daeSBarry Smith   PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y); PetscTime(y);
2494*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm,fd,"AveragetimetogetPetscTime = %g\n", (y-x)/10.0);CHKERRQ(ierr);
2495*5c6c1daeSBarry Smith   /* MPI information */
2496*5c6c1daeSBarry Smith   if (size > 1) {
2497*5c6c1daeSBarry Smith     MPI_Status  status;
2498*5c6c1daeSBarry Smith     PetscMPIInt tag;
2499*5c6c1daeSBarry Smith     MPI_Comm    newcomm;
2500*5c6c1daeSBarry Smith 
2501*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2502*5c6c1daeSBarry Smith     PetscTime(x);
2503*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2504*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2505*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2506*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2507*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2508*5c6c1daeSBarry Smith     PetscTime(y);
2509*5c6c1daeSBarry Smith     ierr = PetscFPrintf(comm, fd, "AveragetimeforMPI_Barrier = %g\n", (y-x)/5.0);CHKERRQ(ierr);
2510*5c6c1daeSBarry Smith     ierr = PetscCommDuplicate(comm,&newcomm, &tag);CHKERRQ(ierr);
2511*5c6c1daeSBarry Smith     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
2512*5c6c1daeSBarry Smith     if (rank) {
2513*5c6c1daeSBarry Smith       ierr = MPI_Recv(0, 0, MPI_INT, rank-1,            tag, newcomm, &status);CHKERRQ(ierr);
2514*5c6c1daeSBarry Smith       ierr = MPI_Send(0, 0, MPI_INT, (rank+1)%size, tag, newcomm);CHKERRQ(ierr);
2515*5c6c1daeSBarry Smith     } else {
2516*5c6c1daeSBarry Smith       PetscTime(x);
2517*5c6c1daeSBarry Smith       ierr = MPI_Send(0, 0, MPI_INT, 1,          tag, newcomm);CHKERRQ(ierr);
2518*5c6c1daeSBarry Smith       ierr = MPI_Recv(0, 0, MPI_INT, size-1, tag, newcomm, &status);CHKERRQ(ierr);
2519*5c6c1daeSBarry Smith       PetscTime(y);
2520*5c6c1daeSBarry Smith       ierr = PetscFPrintf(comm,fd,"AveragetimforzerosizeMPI_Send = %g\n", (y-x)/size);CHKERRQ(ierr);
2521*5c6c1daeSBarry Smith     }
2522*5c6c1daeSBarry Smith     ierr = PetscCommDestroy(&newcomm);CHKERRQ(ierr);
2523*5c6c1daeSBarry Smith   }
2524*5c6c1daeSBarry Smith 
2525*5c6c1daeSBarry Smith   /* Cleanup */
2526*5c6c1daeSBarry Smith   ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr);
2527*5c6c1daeSBarry Smith   ierr = PetscStageLogPush(stageLog, lastStage);CHKERRQ(ierr);
2528*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
2529*5c6c1daeSBarry Smith }
2530*5c6c1daeSBarry Smith 
2531*5c6c1daeSBarry Smith #else /* end of -DPETSC_USE_LOG section */
2532*5c6c1daeSBarry Smith 
2533*5c6c1daeSBarry Smith #undef __FUNCT__
2534*5c6c1daeSBarry Smith #define __FUNCT__ "PetscLogObjectState"
2535*5c6c1daeSBarry Smith PetscErrorCode  PetscLogObjectState(PetscObject obj, const char format[], ...)
2536*5c6c1daeSBarry Smith {
2537*5c6c1daeSBarry Smith   PetscFunctionBegin;
2538*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
2539*5c6c1daeSBarry Smith }
2540*5c6c1daeSBarry Smith 
2541*5c6c1daeSBarry Smith #endif /* PETSC_USE_LOG*/
2542*5c6c1daeSBarry Smith 
2543*5c6c1daeSBarry Smith 
2544*5c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
2545*5c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID  = 0;
2546*5c6c1daeSBarry Smith 
2547*5c6c1daeSBarry Smith #undef __FUNCT__
2548*5c6c1daeSBarry Smith #define __FUNCT__ "PetscClassIdRegister"
2549*5c6c1daeSBarry Smith /*@C
2550*5c6c1daeSBarry Smith   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
2551*5c6c1daeSBarry Smith 
2552*5c6c1daeSBarry Smith   Not Collective
2553*5c6c1daeSBarry Smith 
2554*5c6c1daeSBarry Smith   Input Parameter:
2555*5c6c1daeSBarry Smith . name   - The class name
2556*5c6c1daeSBarry Smith 
2557*5c6c1daeSBarry Smith   Output Parameter:
2558*5c6c1daeSBarry Smith . oclass - The class id or classid
2559*5c6c1daeSBarry Smith 
2560*5c6c1daeSBarry Smith   Level: developer
2561*5c6c1daeSBarry Smith 
2562*5c6c1daeSBarry Smith .keywords: log, class, register
2563*5c6c1daeSBarry Smith 
2564*5c6c1daeSBarry Smith @*/
2565*5c6c1daeSBarry Smith PetscErrorCode  PetscClassIdRegister(const char name[],PetscClassId *oclass )
2566*5c6c1daeSBarry Smith {
2567*5c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2568*5c6c1daeSBarry Smith   PetscStageLog  stageLog;
2569*5c6c1daeSBarry Smith   PetscInt       stage;
2570*5c6c1daeSBarry Smith   PetscErrorCode ierr;
2571*5c6c1daeSBarry Smith #endif
2572*5c6c1daeSBarry Smith 
2573*5c6c1daeSBarry Smith   PetscFunctionBegin;
2574*5c6c1daeSBarry Smith   *oclass = ++PETSC_LARGEST_CLASSID;
2575*5c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2576*5c6c1daeSBarry Smith   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
2577*5c6c1daeSBarry Smith   ierr = PetscClassRegLogRegister(stageLog->classLog, name, *oclass);CHKERRQ(ierr);
2578*5c6c1daeSBarry Smith   for (stage = 0; stage < stageLog->numStages; stage++) {
2579*5c6c1daeSBarry Smith     ierr = ClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr);
2580*5c6c1daeSBarry Smith   }
2581*5c6c1daeSBarry Smith #endif
2582*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
2583*5c6c1daeSBarry Smith }
2584