xref: /petsc/src/sys/logging/plog.c (revision 390e1bf27627d887df99a9f4d0d0ad68037f55ec)
1 
2 /*
3       PETSc code to log object creation and destruction and PETSc events.
4 
5       This provides the public API used by the rest of PETSc and by users.
6 
7       These routines use a private API that is not used elsewhere in PETSc and is not
8       accessible to users. The private API is defined in logimpl.h and the utils directory.
9 
10 */
11 #include <petsc/private/logimpl.h>        /*I    "petscsys.h"   I*/
12 #include <petsctime.h>
13 #include <petscviewer.h>
14 
15 PetscErrorCode PetscLogObjectParent(PetscObject p,PetscObject c)
16 {
17   if (!c || !p) return 0;
18   c->parent   = p;
19   c->parentid = p->id;
20   return 0;
21 }
22 
23 /*@C
24    PetscLogObjectMemory - Adds to an object a count of additional amount of memory that is used by the object.
25 
26    Not collective.
27 
28    Input Parameters:
29 +  obj  - the PETSc object
30 -  mem  - the amount of memory that is being added to the object
31 
32    Level: developer
33 
34    Developer Notes: Currently we do not always do a good job of associating all memory allocations with an object.
35 
36 .seealso: PetscFinalize(), PetscInitializeFortran(), PetscGetArgs(), PetscInitializeNoArguments()
37 
38 @*/
39 PetscErrorCode PetscLogObjectMemory(PetscObject p,PetscLogDouble m)
40 {
41   if (!p) return 0;
42   p->mem += m;
43   return 0;
44 }
45 
46 PetscLogEvent PETSC_LARGEST_EVENT = PETSC_EVENT;
47 
48 #if defined(PETSC_USE_LOG)
49 #include <petscmachineinfo.h>
50 #include <petscconfiginfo.h>
51 
52 /* used in the MPI_XXX() count macros in petsclog.h */
53 
54 /* Action and object logging variables */
55 Action    *petsc_actions            = NULL;
56 Object    *petsc_objects            = NULL;
57 PetscBool petsc_logActions          = PETSC_FALSE;
58 PetscBool petsc_logObjects          = PETSC_FALSE;
59 int       petsc_numActions          = 0, petsc_maxActions = 100;
60 int       petsc_numObjects          = 0, petsc_maxObjects = 100;
61 int       petsc_numObjectsDestroyed = 0;
62 
63 /* Global counters */
64 PetscLogDouble petsc_BaseTime        = 0.0;
65 PetscLogDouble petsc_TotalFlops      = 0.0;  /* The number of flops */
66 PetscLogDouble petsc_tmp_flops       = 0.0;  /* The incremental number of flops */
67 PetscLogDouble petsc_send_ct         = 0.0;  /* The number of sends */
68 PetscLogDouble petsc_recv_ct         = 0.0;  /* The number of receives */
69 PetscLogDouble petsc_send_len        = 0.0;  /* The total length of all sent messages */
70 PetscLogDouble petsc_recv_len        = 0.0;  /* The total length of all received messages */
71 PetscLogDouble petsc_isend_ct        = 0.0;  /* The number of immediate sends */
72 PetscLogDouble petsc_irecv_ct        = 0.0;  /* The number of immediate receives */
73 PetscLogDouble petsc_isend_len       = 0.0;  /* The total length of all immediate send messages */
74 PetscLogDouble petsc_irecv_len       = 0.0;  /* The total length of all immediate receive messages */
75 PetscLogDouble petsc_wait_ct         = 0.0;  /* The number of waits */
76 PetscLogDouble petsc_wait_any_ct     = 0.0;  /* The number of anywaits */
77 PetscLogDouble petsc_wait_all_ct     = 0.0;  /* The number of waitalls */
78 PetscLogDouble petsc_sum_of_waits_ct = 0.0;  /* The total number of waits */
79 PetscLogDouble petsc_allreduce_ct    = 0.0;  /* The number of reductions */
80 PetscLogDouble petsc_gather_ct       = 0.0;  /* The number of gathers and gathervs */
81 PetscLogDouble petsc_scatter_ct      = 0.0;  /* The number of scatters and scattervs */
82 
83 /* Logging functions */
84 PetscErrorCode (*PetscLogPHC)(PetscObject) = NULL;
85 PetscErrorCode (*PetscLogPHD)(PetscObject) = NULL;
86 PetscErrorCode (*PetscLogPLB)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = NULL;
87 PetscErrorCode (*PetscLogPLE)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject) = NULL;
88 
89 /* Tracing event logging variables */
90 FILE             *petsc_tracefile            = NULL;
91 int              petsc_tracelevel            = 0;
92 const char       *petsc_traceblanks          = "                                                                                                    ";
93 char             petsc_tracespace[128]       = " ";
94 PetscLogDouble   petsc_tracetime             = 0.0;
95 static PetscBool PetscLogInitializeCalled = PETSC_FALSE;
96 
97 /*---------------------------------------------- General Functions --------------------------------------------------*/
98 /*@C
99   PetscLogDestroy - Destroys the object and event logging data and resets the global counters.
100 
101   Not Collective
102 
103   Notes:
104   This routine should not usually be used by programmers. Instead employ
105   PetscLogStagePush() and PetscLogStagePop().
106 
107   Level: developer
108 
109 .keywords: log, destroy
110 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogStagePush(), PlogStagePop()
111 @*/
112 PetscErrorCode  PetscLogDestroy(void)
113 {
114   PetscStageLog  stageLog;
115   PetscErrorCode ierr;
116 
117   PetscFunctionBegin;
118   ierr = PetscFree(petsc_actions);CHKERRQ(ierr);
119   ierr = PetscFree(petsc_objects);CHKERRQ(ierr);
120   ierr = PetscLogSet(NULL, NULL);CHKERRQ(ierr);
121 
122   /* Resetting phase */
123   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
124   ierr = PetscStageLogDestroy(stageLog);CHKERRQ(ierr);
125 
126   petsc_TotalFlops            = 0.0;
127   petsc_numActions            = 0;
128   petsc_numObjects            = 0;
129   petsc_numObjectsDestroyed   = 0;
130   petsc_maxActions            = 100;
131   petsc_maxObjects            = 100;
132   petsc_actions               = NULL;
133   petsc_objects               = NULL;
134   petsc_logActions            = PETSC_FALSE;
135   petsc_logObjects            = PETSC_FALSE;
136   petsc_BaseTime              = 0.0;
137   petsc_TotalFlops            = 0.0;
138   petsc_tmp_flops             = 0.0;
139   petsc_send_ct               = 0.0;
140   petsc_recv_ct               = 0.0;
141   petsc_send_len              = 0.0;
142   petsc_recv_len              = 0.0;
143   petsc_isend_ct              = 0.0;
144   petsc_irecv_ct              = 0.0;
145   petsc_isend_len             = 0.0;
146   petsc_irecv_len             = 0.0;
147   petsc_wait_ct               = 0.0;
148   petsc_wait_any_ct           = 0.0;
149   petsc_wait_all_ct           = 0.0;
150   petsc_sum_of_waits_ct       = 0.0;
151   petsc_allreduce_ct          = 0.0;
152   petsc_gather_ct             = 0.0;
153   petsc_scatter_ct            = 0.0;
154   PETSC_LARGEST_EVENT         = PETSC_EVENT;
155   PetscLogPHC                 = NULL;
156   PetscLogPHD                 = NULL;
157   petsc_tracefile             = NULL;
158   petsc_tracelevel            = 0;
159   petsc_traceblanks           = "                                                                                                    ";
160   petsc_tracespace[0]         = ' '; petsc_tracespace[1] = 0;
161   petsc_tracetime             = 0.0;
162   PETSC_LARGEST_CLASSID       = PETSC_SMALLEST_CLASSID;
163   PETSC_OBJECT_CLASSID        = 0;
164   petsc_stageLog              = 0;
165   PetscLogInitializeCalled = PETSC_FALSE;
166   PetscFunctionReturn(0);
167 }
168 
169 /*@C
170   PetscLogSet - Sets the logging functions called at the beginning and ending of every event.
171 
172   Not Collective
173 
174   Input Parameters:
175 + b - The function called at beginning of event
176 - e - The function called at end of event
177 
178   Level: developer
179 
180 .seealso: PetscLogDump(), PetscLogDefaultBegin(), PetscLogAllBegin(), PetscLogTraceBegin()
181 @*/
182 PetscErrorCode  PetscLogSet(PetscErrorCode (*b)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject),
183                             PetscErrorCode (*e)(PetscLogEvent, int, PetscObject, PetscObject, PetscObject, PetscObject))
184 {
185   PetscFunctionBegin;
186   PetscLogPLB = b;
187   PetscLogPLE = e;
188   PetscFunctionReturn(0);
189 }
190 
191 /*------------------------------------------- Initialization Functions ----------------------------------------------*/
192 /*
193     The data structures for logging are always created even if no logging is turned on. This is so events etc can
194   be registered in the code before the actually logging is turned on.
195  */
196 PetscErrorCode  PetscLogInitialize(void)
197 {
198   int            stage;
199   PetscBool      opt;
200   PetscErrorCode ierr;
201 
202   PetscFunctionBegin;
203   if (PetscLogInitializeCalled) PetscFunctionReturn(0);
204   PetscLogInitializeCalled = PETSC_TRUE;
205 
206   ierr = PetscOptionsHasName(NULL,NULL, "-log_exclude_actions", &opt);CHKERRQ(ierr);
207   if (opt) petsc_logActions = PETSC_FALSE;
208   ierr = PetscOptionsHasName(NULL,NULL, "-log_exclude_objects", &opt);CHKERRQ(ierr);
209   if (opt) petsc_logObjects = PETSC_FALSE;
210   if (petsc_logActions) {
211     ierr = PetscMalloc1(petsc_maxActions, &petsc_actions);CHKERRQ(ierr);
212   }
213   if (petsc_logObjects) {
214     ierr = PetscMalloc1(petsc_maxObjects, &petsc_objects);CHKERRQ(ierr);
215   }
216   PetscLogPHC = PetscLogObjCreateDefault;
217   PetscLogPHD = PetscLogObjDestroyDefault;
218   /* Setup default logging structures */
219   ierr = PetscStageLogCreate(&petsc_stageLog);CHKERRQ(ierr);
220   ierr = PetscStageLogRegister(petsc_stageLog, "Main Stage", &stage);CHKERRQ(ierr);
221 
222   /* All processors sync here for more consistent logging */
223   ierr = MPI_Barrier(PETSC_COMM_WORLD);CHKERRQ(ierr);
224   PetscTime(&petsc_BaseTime);
225   ierr = PetscLogStagePush(stage);CHKERRQ(ierr);
226   PetscFunctionReturn(0);
227 }
228 
229 /*@C
230   PetscLogDefaultBegin - Turns on logging of objects and events. This logs flop
231   rates and object creation and should not slow programs down too much.
232   This routine may be called more than once.
233 
234   Logically Collective over PETSC_COMM_WORLD
235 
236   Options Database Keys:
237 . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the
238                   screen (for code configured with --with-log=1 (which is the default))
239 
240   Usage:
241 .vb
242       PetscInitialize(...);
243       PetscLogDefaultBegin();
244        ... code ...
245       PetscLogView(viewer); or PetscLogDump();
246       PetscFinalize();
247 .ve
248 
249   Notes:
250   PetscLogView(viewer) or PetscLogDump() actually cause the printing of
251   the logging information.
252 
253   Level: advanced
254 
255 .keywords: log, begin
256 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogTraceBegin()
257 @*/
258 PetscErrorCode  PetscLogDefaultBegin(void)
259 {
260   PetscErrorCode ierr;
261 
262   PetscFunctionBegin;
263   ierr = PetscLogSet(PetscLogEventBeginDefault, PetscLogEventEndDefault);CHKERRQ(ierr);
264   PetscFunctionReturn(0);
265 }
266 
267 /*@C
268   PetscLogAllBegin - Turns on extensive logging of objects and events. Logs
269   all events. This creates large log files and slows the program down.
270 
271   Logically Collective on PETSC_COMM_WORLD
272 
273   Options Database Keys:
274 . -log_all - Prints extensive log information
275 
276   Usage:
277 .vb
278      PetscInitialize(...);
279      PetscLogAllBegin();
280      ... code ...
281      PetscLogDump(filename);
282      PetscFinalize();
283 .ve
284 
285   Notes:
286   A related routine is PetscLogDefaultBegin() (with the options key -log), which is
287   intended for production runs since it logs only flop rates and object
288   creation (and shouldn't significantly slow the programs).
289 
290   Level: advanced
291 
292 .keywords: log, all, begin
293 .seealso: PetscLogDump(), PetscLogDefaultBegin(), PetscLogTraceBegin()
294 @*/
295 PetscErrorCode  PetscLogAllBegin(void)
296 {
297   PetscErrorCode ierr;
298 
299   PetscFunctionBegin;
300   ierr = PetscLogSet(PetscLogEventBeginComplete, PetscLogEventEndComplete);CHKERRQ(ierr);
301   PetscFunctionReturn(0);
302 }
303 
304 /*@
305   PetscLogTraceBegin - Activates trace logging.  Every time a PETSc event
306   begins or ends, the event name is printed.
307 
308   Logically Collective on PETSC_COMM_WORLD
309 
310   Input Parameter:
311 . file - The file to print trace in (e.g. stdout)
312 
313   Options Database Key:
314 . -log_trace [filename] - Activates PetscLogTraceBegin()
315 
316   Notes:
317   PetscLogTraceBegin() prints the processor number, the execution time (sec),
318   then "Event begin:" or "Event end:" followed by the event name.
319 
320   PetscLogTraceBegin() allows tracing of all PETSc calls, which is useful
321   to determine where a program is hanging without running in the
322   debugger.  Can be used in conjunction with the -info option.
323 
324   Level: intermediate
325 
326 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogView(), PetscLogDefaultBegin()
327 @*/
328 PetscErrorCode  PetscLogTraceBegin(FILE *file)
329 {
330   PetscErrorCode ierr;
331 
332   PetscFunctionBegin;
333   petsc_tracefile = file;
334 
335   ierr = PetscLogSet(PetscLogEventBeginTrace, PetscLogEventEndTrace);CHKERRQ(ierr);
336   PetscFunctionReturn(0);
337 }
338 
339 /*@
340   PetscLogActions - Determines whether actions are logged for the graphical viewer.
341 
342   Not Collective
343 
344   Input Parameter:
345 . flag - PETSC_TRUE if actions are to be logged
346 
347   Level: intermediate
348 
349   Note: Logging of actions continues to consume more memory as the program
350   runs. Long running programs should consider turning this feature off.
351 
352   Options Database Keys:
353 . -log_exclude_actions - Turns off actions logging
354 
355 .keywords: log, stage, register
356 .seealso: PetscLogStagePush(), PetscLogStagePop()
357 @*/
358 PetscErrorCode  PetscLogActions(PetscBool flag)
359 {
360   PetscFunctionBegin;
361   petsc_logActions = flag;
362   PetscFunctionReturn(0);
363 }
364 
365 /*@
366   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
367 
368   Not Collective
369 
370   Input Parameter:
371 . flag - PETSC_TRUE if objects are to be logged
372 
373   Level: intermediate
374 
375   Note: Logging of objects continues to consume more memory as the program
376   runs. Long running programs should consider turning this feature off.
377 
378   Options Database Keys:
379 . -log_exclude_objects - Turns off objects logging
380 
381 .keywords: log, stage, register
382 .seealso: PetscLogStagePush(), PetscLogStagePop()
383 @*/
384 PetscErrorCode  PetscLogObjects(PetscBool flag)
385 {
386   PetscFunctionBegin;
387   petsc_logObjects = flag;
388   PetscFunctionReturn(0);
389 }
390 
391 /*------------------------------------------------ Stage Functions --------------------------------------------------*/
392 /*@C
393   PetscLogStageRegister - Attaches a charactor string name to a logging stage.
394 
395   Not Collective
396 
397   Input Parameter:
398 . sname - The name to associate with that stage
399 
400   Output Parameter:
401 . stage - The stage number
402 
403   Level: intermediate
404 
405 .keywords: log, stage, register
406 .seealso: PetscLogStagePush(), PetscLogStagePop()
407 @*/
408 PetscErrorCode  PetscLogStageRegister(const char sname[],PetscLogStage *stage)
409 {
410   PetscStageLog  stageLog;
411   PetscLogEvent  event;
412   PetscErrorCode ierr;
413 
414   PetscFunctionBegin;
415   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
416   ierr = PetscStageLogRegister(stageLog, sname, stage);CHKERRQ(ierr);
417   /* Copy events already changed in the main stage, this sucks */
418   ierr = PetscEventPerfLogEnsureSize(stageLog->stageInfo[*stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr);
419   for (event = 0; event < stageLog->eventLog->numEvents; event++) {
420     ierr = PetscEventPerfInfoCopy(&stageLog->stageInfo[0].eventLog->eventInfo[event],&stageLog->stageInfo[*stage].eventLog->eventInfo[event]);CHKERRQ(ierr);
421   }
422   ierr = PetscClassPerfLogEnsureSize(stageLog->stageInfo[*stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr);
423   PetscFunctionReturn(0);
424 }
425 
426 /*@C
427   PetscLogStagePush - This function pushes a stage on the stack.
428 
429   Not Collective
430 
431   Input Parameter:
432 . stage - The stage on which to log
433 
434   Usage:
435   If the option -log_sumary is used to run the program containing the
436   following code, then 2 sets of summary data will be printed during
437   PetscFinalize().
438 .vb
439       PetscInitialize(int *argc,char ***args,0,0);
440       [stage 0 of code]
441       PetscLogStagePush(1);
442       [stage 1 of code]
443       PetscLogStagePop();
444       PetscBarrier(...);
445       [more stage 0 of code]
446       PetscFinalize();
447 .ve
448 
449   Notes:
450   Use PetscLogStageRegister() to register a stage.
451 
452   Level: intermediate
453 
454 .keywords: log, push, stage
455 .seealso: PetscLogStagePop(), PetscLogStageRegister(), PetscBarrier()
456 @*/
457 PetscErrorCode  PetscLogStagePush(PetscLogStage stage)
458 {
459   PetscStageLog  stageLog;
460   PetscErrorCode ierr;
461 
462   PetscFunctionBegin;
463   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
464   ierr = PetscStageLogPush(stageLog, stage);CHKERRQ(ierr);
465   PetscFunctionReturn(0);
466 }
467 
468 /*@C
469   PetscLogStagePop - This function pops a stage from the stack.
470 
471   Not Collective
472 
473   Usage:
474   If the option -log_sumary is used to run the program containing the
475   following code, then 2 sets of summary data will be printed during
476   PetscFinalize().
477 .vb
478       PetscInitialize(int *argc,char ***args,0,0);
479       [stage 0 of code]
480       PetscLogStagePush(1);
481       [stage 1 of code]
482       PetscLogStagePop();
483       PetscBarrier(...);
484       [more stage 0 of code]
485       PetscFinalize();
486 .ve
487 
488   Notes:
489   Use PetscLogStageRegister() to register a stage.
490 
491   Level: intermediate
492 
493 .keywords: log, pop, stage
494 .seealso: PetscLogStagePush(), PetscLogStageRegister(), PetscBarrier()
495 @*/
496 PetscErrorCode  PetscLogStagePop(void)
497 {
498   PetscStageLog  stageLog;
499   PetscErrorCode ierr;
500 
501   PetscFunctionBegin;
502   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
503   ierr = PetscStageLogPop(stageLog);CHKERRQ(ierr);
504   PetscFunctionReturn(0);
505 }
506 
507 /*@
508   PetscLogStageSetActive - Determines stage activity for PetscLogEventBegin() and PetscLogEventEnd().
509 
510   Not Collective
511 
512   Input Parameters:
513 + stage    - The stage
514 - isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE)
515 
516   Level: intermediate
517 
518 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage()
519 @*/
520 PetscErrorCode  PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive)
521 {
522   PetscStageLog  stageLog;
523   PetscErrorCode ierr;
524 
525   PetscFunctionBegin;
526   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
527   ierr = PetscStageLogSetActive(stageLog, stage, isActive);CHKERRQ(ierr);
528   PetscFunctionReturn(0);
529 }
530 
531 /*@
532   PetscLogStageGetActive - Returns stage activity for PetscLogEventBegin() and PetscLogEventEnd().
533 
534   Not Collective
535 
536   Input Parameter:
537 . stage    - The stage
538 
539   Output Parameter:
540 . isActive - The activity flag, PETSC_TRUE for logging, else PETSC_FALSE (defaults to PETSC_TRUE)
541 
542   Level: intermediate
543 
544 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage()
545 @*/
546 PetscErrorCode  PetscLogStageGetActive(PetscLogStage stage, PetscBool  *isActive)
547 {
548   PetscStageLog  stageLog;
549   PetscErrorCode ierr;
550 
551   PetscFunctionBegin;
552   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
553   ierr = PetscStageLogGetActive(stageLog, stage, isActive);CHKERRQ(ierr);
554   PetscFunctionReturn(0);
555 }
556 
557 /*@
558   PetscLogStageSetVisible - Determines stage visibility in PetscLogView()
559 
560   Not Collective
561 
562   Input Parameters:
563 + stage     - The stage
564 - isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE)
565 
566   Level: intermediate
567 
568 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView()
569 @*/
570 PetscErrorCode  PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible)
571 {
572   PetscStageLog  stageLog;
573   PetscErrorCode ierr;
574 
575   PetscFunctionBegin;
576   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
577   ierr = PetscStageLogSetVisible(stageLog, stage, isVisible);CHKERRQ(ierr);
578   PetscFunctionReturn(0);
579 }
580 
581 /*@
582   PetscLogStageGetVisible - Returns stage visibility in PetscLogView()
583 
584   Not Collective
585 
586   Input Parameter:
587 . stage     - The stage
588 
589   Output Parameter:
590 . isVisible - The visibility flag, PETSC_TRUE to print, else PETSC_FALSE (defaults to PETSC_TRUE)
591 
592   Level: intermediate
593 
594 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscLogView()
595 @*/
596 PetscErrorCode  PetscLogStageGetVisible(PetscLogStage stage, PetscBool  *isVisible)
597 {
598   PetscStageLog  stageLog;
599   PetscErrorCode ierr;
600 
601   PetscFunctionBegin;
602   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
603   ierr = PetscStageLogGetVisible(stageLog, stage, isVisible);CHKERRQ(ierr);
604   PetscFunctionReturn(0);
605 }
606 
607 /*@C
608   PetscLogStageGetId - Returns the stage id when given the stage name.
609 
610   Not Collective
611 
612   Input Parameter:
613 . name  - The stage name
614 
615   Output Parameter:
616 . stage - The stage, , or -1 if no stage with that name exists
617 
618   Level: intermediate
619 
620 .seealso: PetscLogStagePush(), PetscLogStagePop(), PetscPreLoadBegin(), PetscPreLoadEnd(), PetscPreLoadStage()
621 @*/
622 PetscErrorCode  PetscLogStageGetId(const char name[], PetscLogStage *stage)
623 {
624   PetscStageLog  stageLog;
625   PetscErrorCode ierr;
626 
627   PetscFunctionBegin;
628   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
629   ierr = PetscStageLogGetStage(stageLog, name, stage);CHKERRQ(ierr);
630   PetscFunctionReturn(0);
631 }
632 
633 /*------------------------------------------------ Event Functions --------------------------------------------------*/
634 /*@C
635   PetscLogEventRegister - Registers an event name for logging operations in an application code.
636 
637   Not Collective
638 
639   Input Parameter:
640 + name   - The name associated with the event
641 - classid - The classid associated to the class for this event, obtain either with
642            PetscClassIdRegister() or use a predefined one such as KSP_CLASSID, SNES_CLASSID, the predefined ones
643            are only available in C code
644 
645   Output Parameter:
646 . event - The event id for use with PetscLogEventBegin() and PetscLogEventEnd().
647 
648   Example of Usage:
649 .vb
650       PetscLogEvent USER_EVENT;
651       PetscClassId classid;
652       PetscLogDouble user_event_flops;
653       PetscClassIdRegister("class name",&classid);
654       PetscLogEventRegister("User event name",classid,&USER_EVENT);
655       PetscLogEventBegin(USER_EVENT,0,0,0,0);
656          [code segment to monitor]
657          PetscLogFlops(user_event_flops);
658       PetscLogEventEnd(USER_EVENT,0,0,0,0);
659 .ve
660 
661   Notes:
662   PETSc automatically logs library events if the code has been
663   configured with --with-log (which is the default) and
664   -log_view or -log_all is specified.  PetscLogEventRegister() is
665   intended for logging user events to supplement this PETSc
666   information.
667 
668   PETSc can gather data for use with the utilities Jumpshot
669   (part of the MPICH distribution).  If PETSc has been compiled
670   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
671   MPICH), the user can employ another command line option, -log_mpe,
672   to create a logfile, "mpe.log", which can be visualized
673   Jumpshot.
674 
675   The classid is associated with each event so that classes of events
676   can be disabled simultaneously, such as all matrix events. The user
677   can either use an existing classid, such as MAT_CLASSID, or create
678   their own as shown in the example.
679 
680   If an existing event with the same name exists, its event handle is
681   returned instead of creating a new event.
682 
683   Level: intermediate
684 
685 .keywords: log, event, register
686 .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogFlops(),
687           PetscLogEventMPEActivate(), PetscLogEventMPEDeactivate(),
688           PetscLogEventActivate(), PetscLogEventDeactivate(), PetscClassIdRegister()
689 @*/
690 PetscErrorCode  PetscLogEventRegister(const char name[],PetscClassId classid,PetscLogEvent *event)
691 {
692   PetscStageLog  stageLog;
693   int            stage;
694   PetscErrorCode ierr;
695 
696   PetscFunctionBegin;
697   *event = PETSC_DECIDE;
698   ierr   = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
699   ierr   = PetscEventRegLogGetEvent(stageLog->eventLog, name, event);CHKERRQ(ierr);
700   if (*event > 0) PetscFunctionReturn(0);
701   ierr   = PetscEventRegLogRegister(stageLog->eventLog, name, classid, event);CHKERRQ(ierr);
702   for (stage = 0; stage < stageLog->numStages; stage++) {
703     ierr = PetscEventPerfLogEnsureSize(stageLog->stageInfo[stage].eventLog, stageLog->eventLog->numEvents);CHKERRQ(ierr);
704     ierr = PetscClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr);
705   }
706   PetscFunctionReturn(0);
707 }
708 
709 /*@
710   PetscLogEventActivate - Indicates that a particular event should be logged.
711 
712   Not Collective
713 
714   Input Parameter:
715 . event - The event id
716 
717   Usage:
718 .vb
719       PetscLogEventDeactivate(VEC_SetValues);
720         [code where you do not want to log VecSetValues()]
721       PetscLogEventActivate(VEC_SetValues);
722         [code where you do want to log VecSetValues()]
723 .ve
724 
725   Note:
726   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
727   or an event number obtained with PetscLogEventRegister().
728 
729   Level: advanced
730 
731 .keywords: log, event, activate
732 .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventDeactivate()
733 @*/
734 PetscErrorCode  PetscLogEventActivate(PetscLogEvent event)
735 {
736   PetscStageLog  stageLog;
737   int            stage;
738   PetscErrorCode ierr;
739 
740   PetscFunctionBegin;
741   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
742   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
743   ierr = PetscEventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
744   PetscFunctionReturn(0);
745 }
746 
747 /*@
748   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
749 
750   Not Collective
751 
752   Input Parameter:
753 . event - The event id
754 
755   Usage:
756 .vb
757       PetscLogEventDeactivate(VEC_SetValues);
758         [code where you do not want to log VecSetValues()]
759       PetscLogEventActivate(VEC_SetValues);
760         [code where you do want to log VecSetValues()]
761 .ve
762 
763   Note:
764   The event may be either a pre-defined PETSc event (found in
765   include/petsclog.h) or an event number obtained with PetscLogEventRegister()).
766 
767   Level: advanced
768 
769 .keywords: log, event, deactivate
770 .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate()
771 @*/
772 PetscErrorCode  PetscLogEventDeactivate(PetscLogEvent event)
773 {
774   PetscStageLog  stageLog;
775   int            stage;
776   PetscErrorCode ierr;
777 
778   PetscFunctionBegin;
779   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
780   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
781   ierr = PetscEventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
782   PetscFunctionReturn(0);
783 }
784 
785 /*@
786   PetscLogEventSetActiveAll - Sets the event activity in every stage.
787 
788   Not Collective
789 
790   Input Parameters:
791 + event    - The event id
792 - isActive - The activity flag determining whether the event is logged
793 
794   Level: advanced
795 
796 .keywords: log, event, activate
797 .seealso: PetscLogEventMPEDeactivate(),PetscLogEventMPEActivate(),PlogEventActivate(),PlogEventDeactivate()
798 @*/
799 PetscErrorCode  PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive)
800 {
801   PetscStageLog  stageLog;
802   int            stage;
803   PetscErrorCode ierr;
804 
805   PetscFunctionBegin;
806   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
807   for (stage = 0; stage < stageLog->numStages; stage++) {
808     if (isActive) {
809       ierr = PetscEventPerfLogActivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
810     } else {
811       ierr = PetscEventPerfLogDeactivate(stageLog->stageInfo[stage].eventLog, event);CHKERRQ(ierr);
812     }
813   }
814   PetscFunctionReturn(0);
815 }
816 
817 /*@
818   PetscLogEventActivateClass - Activates event logging for a PETSc object class.
819 
820   Not Collective
821 
822   Input Parameter:
823 . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc.
824 
825   Level: developer
826 
827 .keywords: log, event, activate, class
828 .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventDeactivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate()
829 @*/
830 PetscErrorCode  PetscLogEventActivateClass(PetscClassId classid)
831 {
832   PetscStageLog  stageLog;
833   int            stage;
834   PetscErrorCode ierr;
835 
836   PetscFunctionBegin;
837   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
838   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
839   ierr = PetscEventPerfLogActivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr);
840   PetscFunctionReturn(0);
841 }
842 
843 /*@
844   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class.
845 
846   Not Collective
847 
848   Input Parameter:
849 . classid - The event class, for example MAT_CLASSID, SNES_CLASSID, etc.
850 
851   Level: developer
852 
853 .keywords: log, event, deactivate, class
854 .seealso: PetscInfoActivate(),PetscInfo(),PetscInfoAllow(),PetscLogEventActivateClass(), PetscLogEventActivate(),PetscLogEventDeactivate()
855 @*/
856 PetscErrorCode  PetscLogEventDeactivateClass(PetscClassId classid)
857 {
858   PetscStageLog  stageLog;
859   int            stage;
860   PetscErrorCode ierr;
861 
862   PetscFunctionBegin;
863   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
864   ierr = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
865   ierr = PetscEventPerfLogDeactivateClass(stageLog->stageInfo[stage].eventLog, stageLog->eventLog, classid);CHKERRQ(ierr);
866   PetscFunctionReturn(0);
867 }
868 
869 /*MC
870    PetscLogEventBegin - Logs the beginning of a user event.
871 
872    Synopsis:
873    #include <petsclog.h>
874    PetscErrorCode PetscLogEventBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)
875 
876    Not Collective
877 
878    Input Parameters:
879 +  e - integer associated with the event obtained from PetscLogEventRegister()
880 -  o1,o2,o3,o4 - objects associated with the event, or 0
881 
882 
883    Fortran Synopsis:
884    void PetscLogEventBegin(int e,PetscErrorCode ierr)
885 
886    Usage:
887 .vb
888      PetscLogEvent USER_EVENT;
889      PetscLogDouble user_event_flops;
890      PetscLogEventRegister("User event",0,&USER_EVENT);
891      PetscLogEventBegin(USER_EVENT,0,0,0,0);
892         [code segment to monitor]
893         PetscLogFlops(user_event_flops);
894      PetscLogEventEnd(USER_EVENT,0,0,0,0);
895 .ve
896 
897    Notes:
898    You need to register each integer event with the command
899    PetscLogEventRegister().
900 
901    Level: intermediate
902 
903 .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops()
904 
905 .keywords: log, event, begin
906 M*/
907 
908 /*MC
909    PetscLogEventEnd - Log the end of a user event.
910 
911    Synopsis:
912    #include <petsclog.h>
913    PetscErrorCode PetscLogEventEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)
914 
915    Not Collective
916 
917    Input Parameters:
918 +  e - integer associated with the event obtained with PetscLogEventRegister()
919 -  o1,o2,o3,o4 - objects associated with the event, or 0
920 
921 
922    Fortran Synopsis:
923    void PetscLogEventEnd(int e,PetscErrorCode ierr)
924 
925    Usage:
926 .vb
927      PetscLogEvent USER_EVENT;
928      PetscLogDouble user_event_flops;
929      PetscLogEventRegister("User event",0,&USER_EVENT,);
930      PetscLogEventBegin(USER_EVENT,0,0,0,0);
931         [code segment to monitor]
932         PetscLogFlops(user_event_flops);
933      PetscLogEventEnd(USER_EVENT,0,0,0,0);
934 .ve
935 
936    Notes:
937    You should also register each additional integer event with the command
938    PetscLogEventRegister().
939 
940    Level: intermediate
941 
942 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogFlops()
943 
944 .keywords: log, event, end
945 M*/
946 
947 /*MC
948    PetscLogEventBarrierBegin - Logs the time in a barrier before an event.
949 
950    Synopsis:
951    #include <petsclog.h>
952    PetscErrorCode PetscLogEventBarrierBegin(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4,MPI_Comm comm)
953 
954    Not Collective
955 
956    Input Parameters:
957 .  e - integer associated with the event obtained from PetscLogEventRegister()
958 .  o1,o2,o3,o4 - objects associated with the event, or 0
959 .  comm - communicator the barrier takes place over
960 
961 
962    Usage:
963 .vb
964      PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm);
965        MPIU_Allreduce()
966      PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm);
967 .ve
968 
969    Notes:
970    This is for logging the amount of time spent in a barrier for an event
971    that requires synchronization.
972 
973    Additional Notes:
974    Synchronization events always come in pairs; for example, VEC_NormBarrier and
975    VEC_NormComm = VEC_NormBarrier + 1
976 
977    Level: advanced
978 
979 .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(),
980           PetscLogEventBarrierEnd()
981 
982 .keywords: log, event, begin, barrier
983 M*/
984 
985 /*MC
986    PetscLogEventBarrierEnd - Logs the time in a barrier before an event.
987 
988    Synopsis:
989    #include <petsclog.h>
990    PetscErrorCode PetscLogEventBarrierEnd(int e,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4,MPI_Comm comm)
991 
992    Logically Collective on MPI_Comm
993 
994    Input Parameters:
995 .  e - integer associated with the event obtained from PetscLogEventRegister()
996 .  o1,o2,o3,o4 - objects associated with the event, or 0
997 .  comm - communicator the barrier takes place over
998 
999 
1000     Usage:
1001 .vb
1002      PetscLogEventBarrierBegin(VEC_NormBarrier,0,0,0,0,comm);
1003        MPIU_Allreduce()
1004      PetscLogEventBarrierEnd(VEC_NormBarrier,0,0,0,0,comm);
1005 .ve
1006 
1007    Notes:
1008    This is for logging the amount of time spent in a barrier for an event
1009    that requires synchronization.
1010 
1011    Additional Notes:
1012    Synchronization events always come in pairs; for example, VEC_NormBarrier and
1013    VEC_NormComm = VEC_NormBarrier + 1
1014 
1015    Level: advanced
1016 
1017 .seealso: PetscLogEventRegister(), PetscLogEventEnd(), PetscLogFlops(), PetscLogEventBegin(),
1018           PetscLogEventBarrierBegin()
1019 
1020 .keywords: log, event, begin, barrier
1021 M*/
1022 
1023 /*@C
1024   PetscLogEventGetId - Returns the event id when given the event name.
1025 
1026   Not Collective
1027 
1028   Input Parameter:
1029 . name  - The event name
1030 
1031   Output Parameter:
1032 . event - The event, or -1 if no event with that name exists
1033 
1034   Level: intermediate
1035 
1036 .seealso: PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStageGetId()
1037 @*/
1038 PetscErrorCode  PetscLogEventGetId(const char name[], PetscLogEvent *event)
1039 {
1040   PetscStageLog  stageLog;
1041   PetscErrorCode ierr;
1042 
1043   PetscFunctionBegin;
1044   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1045   ierr = PetscEventRegLogGetEvent(stageLog->eventLog, name, event);CHKERRQ(ierr);
1046   PetscFunctionReturn(0);
1047 }
1048 
1049 
1050 /*------------------------------------------------ Output Functions -------------------------------------------------*/
1051 /*@C
1052   PetscLogDump - Dumps logs of objects to a file. This file is intended to
1053   be read by bin/petscview. This program no longer exists.
1054 
1055   Collective on PETSC_COMM_WORLD
1056 
1057   Input Parameter:
1058 . name - an optional file name
1059 
1060   Usage:
1061 .vb
1062      PetscInitialize(...);
1063      PetscLogDefaultBegin(); or PetscLogAllBegin();
1064      ... code ...
1065      PetscLogDump(filename);
1066      PetscFinalize();
1067 .ve
1068 
1069   Notes:
1070   The default file name is
1071 $    Log.<rank>
1072   where <rank> is the processor number. If no name is specified,
1073   this file will be used.
1074 
1075   Level: advanced
1076 
1077 .keywords: log, dump
1078 .seealso: PetscLogDefaultBegin(), PetscLogAllBegin(), PetscLogView()
1079 @*/
1080 PetscErrorCode  PetscLogDump(const char sname[])
1081 {
1082   PetscStageLog      stageLog;
1083   PetscEventPerfInfo *eventInfo;
1084   FILE               *fd;
1085   char               file[PETSC_MAX_PATH_LEN], fname[PETSC_MAX_PATH_LEN];
1086   PetscLogDouble     flops, _TotalTime;
1087   PetscMPIInt        rank;
1088   int                action, object, curStage;
1089   PetscLogEvent      event;
1090   PetscErrorCode     ierr;
1091 
1092   PetscFunctionBegin;
1093   /* Calculate the total elapsed time */
1094   PetscTime(&_TotalTime);
1095   _TotalTime -= petsc_BaseTime;
1096   /* Open log file */
1097   ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank);CHKERRQ(ierr);
1098   if (sname) sprintf(file, "%s.%d", sname, rank);
1099   else sprintf(file, "Log.%d", rank);
1100   ierr = PetscFixFilename(file, fname);CHKERRQ(ierr);
1101   ierr = PetscFOpen(PETSC_COMM_WORLD, fname, "w", &fd);CHKERRQ(ierr);
1102   if ((!rank) && (!fd)) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_FILE_OPEN, "Cannot open file: %s", fname);
1103   /* Output totals */
1104   ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Total Flops %14e %16.8e\n", petsc_TotalFlops, _TotalTime);CHKERRQ(ierr);
1105   ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Clock Resolution %g\n", 0.0);CHKERRQ(ierr);
1106   /* Output actions */
1107   if (petsc_logActions) {
1108     ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Actions accomplished %d\n", petsc_numActions);CHKERRQ(ierr);
1109     for (action = 0; action < petsc_numActions; action++) {
1110       ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%g %d %d %d %d %d %d %g %g %g\n",
1111                           petsc_actions[action].time, petsc_actions[action].action, (int)petsc_actions[action].event, (int)petsc_actions[action].classid, petsc_actions[action].id1,
1112                           petsc_actions[action].id2, petsc_actions[action].id3, petsc_actions[action].flops, petsc_actions[action].mem, petsc_actions[action].maxmem);CHKERRQ(ierr);
1113     }
1114   }
1115   /* Output objects */
1116   if (petsc_logObjects) {
1117     ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Objects created %d destroyed %d\n", petsc_numObjects, petsc_numObjectsDestroyed);CHKERRQ(ierr);
1118     for (object = 0; object < petsc_numObjects; object++) {
1119       ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Parent ID: %d Memory: %d\n", petsc_objects[object].parent, (int) petsc_objects[object].mem);CHKERRQ(ierr);
1120       if (!petsc_objects[object].name[0]) {
1121         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd,"No Name\n");CHKERRQ(ierr);
1122       } else {
1123         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Name: %s\n", petsc_objects[object].name);CHKERRQ(ierr);
1124       }
1125       if (petsc_objects[object].info[0] != 0) {
1126         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "No Info\n");CHKERRQ(ierr);
1127       } else {
1128         ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Info: %s\n", petsc_objects[object].info);CHKERRQ(ierr);
1129       }
1130     }
1131   }
1132   /* Output events */
1133   ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "Event log:\n");CHKERRQ(ierr);
1134   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1135   ierr = PetscIntStackTop(stageLog->stack, &curStage);CHKERRQ(ierr);
1136   eventInfo = stageLog->stageInfo[curStage].eventLog->eventInfo;
1137   for (event = 0; event < stageLog->stageInfo[curStage].eventLog->numEvents; event++) {
1138     if (eventInfo[event].time != 0.0) flops = eventInfo[event].flops/eventInfo[event].time;
1139     else flops = 0.0;
1140     ierr = PetscFPrintf(PETSC_COMM_WORLD, fd, "%d %16d %16g %16g %16g\n", event, eventInfo[event].count,
1141                         eventInfo[event].flops, eventInfo[event].time, flops);CHKERRQ(ierr);
1142   }
1143   ierr = PetscFClose(PETSC_COMM_WORLD, fd);CHKERRQ(ierr);
1144   PetscFunctionReturn(0);
1145 }
1146 
1147 /*
1148   PetscLogView_Detailed - Each process prints the times for its own events
1149 
1150 */
1151 PetscErrorCode  PetscLogView_Detailed(PetscViewer viewer)
1152 {
1153   MPI_Comm           comm       = PetscObjectComm((PetscObject) viewer);
1154   PetscEventPerfInfo *eventInfo = NULL;
1155   PetscLogDouble     locTotalTime, numRed, maxMem;
1156   PetscStageLog      stageLog;
1157   int                numStages,numEvents,stage,event;
1158   PetscMPIInt        rank,size;
1159   PetscErrorCode     ierr;
1160 
1161   PetscFunctionBegin;
1162   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1163   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
1164   /* Must preserve reduction count before we go on */
1165   numRed = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct;
1166   /* Get the total elapsed time */
1167   PetscTime(&locTotalTime);  locTotalTime -= petsc_BaseTime;
1168   ierr = PetscViewerASCIIPrintf(viewer,"numProcs   = %d\n",size);CHKERRQ(ierr);
1169   ierr = PetscViewerASCIIPrintf(viewer,"LocalTimes = {}\n");CHKERRQ(ierr);
1170   ierr = PetscViewerASCIIPrintf(viewer,"LocalFlops = {}\n");CHKERRQ(ierr);
1171   ierr = PetscViewerASCIIPrintf(viewer,"LocalMessageLens = {}\n");CHKERRQ(ierr);
1172   ierr = PetscViewerASCIIPrintf(viewer,"LocalMessages = {}\n");CHKERRQ(ierr);
1173   ierr = PetscViewerASCIIPrintf(viewer,"LocalReductions = {}\n");CHKERRQ(ierr);
1174   ierr = PetscViewerASCIIPrintf(viewer,"LocalObjects = {}\n");CHKERRQ(ierr);
1175   ierr = PetscViewerASCIIPrintf(viewer,"LocalMemory = {}\n");CHKERRQ(ierr);
1176   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1177   ierr = MPIU_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1178   ierr = PetscViewerASCIIPrintf(viewer,"Stages = {}\n");CHKERRQ(ierr);
1179   for (stage=0; stage<numStages; stage++) {
1180     ierr = PetscViewerASCIIPrintf(viewer,"Stages[\"%s\"] = {}\n",stageLog->stageInfo[stage].name);CHKERRQ(ierr);
1181     ierr = PetscViewerASCIIPrintf(viewer,"Stages[\"%s\"][\"summary\"] = {}\n",stageLog->stageInfo[stage].name);CHKERRQ(ierr);
1182     ierr = MPIU_Allreduce(&stageLog->stageInfo[stage].eventLog->numEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1183     for (event = 0; event < numEvents; event++) {
1184       ierr = PetscViewerASCIIPrintf(viewer,"Stages[\"%s\"][\"%s\"] = {}\n",stageLog->stageInfo[stage].name,stageLog->eventLog->eventInfo[event].name);CHKERRQ(ierr);
1185     }
1186   }
1187   ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
1188   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalTimes[%d] = %g\n",rank,locTotalTime);CHKERRQ(ierr);
1189   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalFlops[%d] = %g\n",rank,petsc_TotalFlops);CHKERRQ(ierr);
1190   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalMessageLens[%d] = %g\n",rank,(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len));CHKERRQ(ierr);
1191   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalMessages[%d] = %g\n",rank,(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct));CHKERRQ(ierr);
1192   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalReductions[%d] = %g\n",rank,numRed);CHKERRQ(ierr);
1193   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalObjects[%d] = %g\n",rank,petsc_numObjects);CHKERRQ(ierr);
1194   ierr = PetscMallocGetMaximumUsage(&maxMem);CHKERRQ(ierr);
1195   ierr = PetscViewerASCIISynchronizedPrintf(viewer,"LocalMemory[%d] = %g\n",rank,maxMem);CHKERRQ(ierr);
1196   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1197   for (stage=0; stage<numStages; stage++) {
1198     ierr = PetscViewerASCIISynchronizedPrintf(viewer,"Stages[\"%s\"][\"summary\"][%d] = {\"time\" : %g, \"numMessages\" : %g, \"messageLength\" : %g, \"numReductions\" : %g, \"flops\" : %g}\n",
1199                                               stageLog->stageInfo[stage].name,rank,
1200                                               stageLog->stageInfo[stage].perfInfo.time,stageLog->stageInfo[stage].perfInfo.numMessages,stageLog->stageInfo[stage].perfInfo.messageLength,
1201                                               stageLog->stageInfo[stage].perfInfo.numReductions,stageLog->stageInfo[stage].perfInfo.flops);CHKERRQ(ierr);
1202     ierr = MPIU_Allreduce(&stageLog->stageInfo[stage].eventLog->numEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1203     for (event = 0; event < numEvents; event++) {
1204       eventInfo = stageLog->stageInfo[stage].eventLog->eventInfo;
1205       ierr = PetscViewerASCIISynchronizedPrintf(viewer,"Stages[\"%s\"][\"%s\"][%d] = {\"count\" : %D, \"time\" : %g, \"numMessages\" : %g, \"messageLength\" : %g, \"numReductions\" : %g, \"flops\" : %g}\n",stageLog->stageInfo[stage].name,stageLog->eventLog->eventInfo[event].name,rank,
1206                                                 eventInfo[event].count, eventInfo[event].time,eventInfo[event].numMessages, eventInfo[event].messageLength,
1207                                                 eventInfo[event].numReductions,eventInfo[event].flops);CHKERRQ(ierr);
1208     }
1209   }
1210   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
1211   ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
1212   PetscFunctionReturn(0);
1213 }
1214 
1215 static PetscErrorCode PetscLogViewWarnDebugging(MPI_Comm comm,FILE *fd)
1216 {
1217 #if defined(PETSC_USE_DEBUG)
1218   PetscErrorCode ierr;
1219 
1220   PetscFunctionBegin;
1221   ierr = PetscFPrintf(comm, fd, "\n\n");CHKERRQ(ierr);
1222   ierr = PetscFPrintf(comm, fd, "      ##########################################################\n");CHKERRQ(ierr);
1223   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1224   ierr = PetscFPrintf(comm, fd, "      #                          WARNING!!!                    #\n");CHKERRQ(ierr);
1225   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1226   ierr = PetscFPrintf(comm, fd, "      #   This code was compiled with a debugging option,      #\n");CHKERRQ(ierr);
1227   ierr = PetscFPrintf(comm, fd, "      #   To get timing results run ./configure                #\n");CHKERRQ(ierr);
1228   ierr = PetscFPrintf(comm, fd, "      #   using --with-debugging=no, the performance will      #\n");CHKERRQ(ierr);
1229   ierr = PetscFPrintf(comm, fd, "      #   be generally two or three times faster.              #\n");CHKERRQ(ierr);
1230   ierr = PetscFPrintf(comm, fd, "      #                                                        #\n");CHKERRQ(ierr);
1231   ierr = PetscFPrintf(comm, fd, "      ##########################################################\n\n\n");CHKERRQ(ierr);
1232   PetscFunctionReturn(0);
1233 #else
1234   return 0;
1235 #endif
1236 }
1237 
1238 PetscErrorCode  PetscLogView_Default(PetscViewer viewer)
1239 {
1240   FILE               *fd;
1241   PetscLogDouble     zero       = 0.0;
1242   PetscStageLog      stageLog;
1243   PetscStageInfo     *stageInfo = NULL;
1244   PetscEventPerfInfo *eventInfo = NULL;
1245   PetscClassPerfInfo *classInfo;
1246   char               arch[128],hostname[128],username[128],pname[PETSC_MAX_PATH_LEN],date[128];
1247   const char         *name;
1248   PetscLogDouble     locTotalTime, TotalTime, TotalFlops;
1249   PetscLogDouble     numMessages, messageLength, avgMessLen, numReductions;
1250   PetscLogDouble     stageTime, flops, flopr, mem, mess, messLen, red;
1251   PetscLogDouble     fracTime, fracFlops, fracMessages, fracLength, fracReductions, fracMess, fracMessLen, fracRed;
1252   PetscLogDouble     fracStageTime, fracStageFlops, fracStageMess, fracStageMessLen, fracStageRed;
1253   PetscLogDouble     min, max, tot, ratio, avg, x, y;
1254   PetscLogDouble     minf, maxf, totf, ratf, mint, maxt, tott, ratt, ratCt, totm, totml, totr;
1255   PetscMPIInt        minCt, maxCt;
1256   PetscMPIInt        size, rank;
1257   PetscBool          *localStageUsed,    *stageUsed;
1258   PetscBool          *localStageVisible, *stageVisible;
1259   int                numStages, localNumEvents, numEvents;
1260   int                stage, oclass;
1261   PetscLogEvent      event;
1262   PetscErrorCode     ierr;
1263   char               version[256];
1264   MPI_Comm           comm;
1265 
1266   PetscFunctionBegin;
1267   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
1268   ierr = PetscViewerASCIIGetPointer(viewer,&fd);CHKERRQ(ierr);
1269   ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr);
1270   ierr = MPI_Comm_rank(comm, &rank);CHKERRQ(ierr);
1271   /* Get the total elapsed time */
1272   PetscTime(&locTotalTime);  locTotalTime -= petsc_BaseTime;
1273 
1274   ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr);
1275   ierr = PetscFPrintf(comm, fd, "***             WIDEN YOUR WINDOW TO 120 CHARACTERS.  Use 'enscript -r -fCourier9' to print this document            ***\n");CHKERRQ(ierr);
1276   ierr = PetscFPrintf(comm, fd, "************************************************************************************************************************\n");CHKERRQ(ierr);
1277   ierr = PetscFPrintf(comm, fd, "\n---------------------------------------------- PETSc Performance Summary: ----------------------------------------------\n\n");CHKERRQ(ierr);
1278   ierr = PetscLogViewWarnDebugging(comm,fd);CHKERRQ(ierr);
1279   ierr = PetscGetArchType(arch,sizeof(arch));CHKERRQ(ierr);
1280   ierr = PetscGetHostName(hostname,sizeof(hostname));CHKERRQ(ierr);
1281   ierr = PetscGetUserName(username,sizeof(username));CHKERRQ(ierr);
1282   ierr = PetscGetProgramName(pname,sizeof(pname));CHKERRQ(ierr);
1283   ierr = PetscGetDate(date,sizeof(date));CHKERRQ(ierr);
1284   ierr = PetscGetVersion(version,sizeof(version));CHKERRQ(ierr);
1285   if (size == 1) {
1286     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);
1287   } else {
1288     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);
1289   }
1290 
1291   ierr = PetscFPrintf(comm, fd, "Using %s\n", version);CHKERRQ(ierr);
1292 
1293   /* Must preserve reduction count before we go on */
1294   red = petsc_allreduce_ct + petsc_gather_ct + petsc_scatter_ct;
1295 
1296   /* Calculate summary information */
1297   ierr = PetscFPrintf(comm, fd, "\n                         Max       Max/Min        Avg      Total \n");CHKERRQ(ierr);
1298   /*   Time */
1299   ierr = MPIU_Allreduce(&locTotalTime, &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1300   ierr = MPIU_Allreduce(&locTotalTime, &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1301   ierr = MPIU_Allreduce(&locTotalTime, &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1302   avg  = (tot)/((PetscLogDouble) size);
1303   if (min != 0.0) ratio = max/min;
1304   else ratio = 0.0;
1305   ierr = PetscFPrintf(comm, fd, "Time (sec):           %5.3e   %10.5f   %5.3e\n", max, ratio, avg);CHKERRQ(ierr);
1306   TotalTime = tot;
1307   /*   Objects */
1308   avg  = (PetscLogDouble) petsc_numObjects;
1309   ierr = MPIU_Allreduce(&avg,          &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1310   ierr = MPIU_Allreduce(&avg,          &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1311   ierr = MPIU_Allreduce(&avg,          &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1312   avg  = (tot)/((PetscLogDouble) size);
1313   if (min != 0.0) ratio = max/min;
1314   else ratio = 0.0;
1315   ierr = PetscFPrintf(comm, fd, "Objects:              %5.3e   %10.5f   %5.3e\n", max, ratio, avg);CHKERRQ(ierr);
1316   /*   Flops */
1317   ierr = MPIU_Allreduce(&petsc_TotalFlops,  &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1318   ierr = MPIU_Allreduce(&petsc_TotalFlops,  &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1319   ierr = MPIU_Allreduce(&petsc_TotalFlops,  &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1320   avg  = (tot)/((PetscLogDouble) size);
1321   if (min != 0.0) ratio = max/min;
1322   else ratio = 0.0;
1323   ierr = PetscFPrintf(comm, fd, "Flops:                %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1324   TotalFlops = tot;
1325   /*   Flops/sec -- Must talk to Barry here */
1326   if (locTotalTime != 0.0) flops = petsc_TotalFlops/locTotalTime;
1327   else flops = 0.0;
1328   ierr = MPIU_Allreduce(&flops,        &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1329   ierr = MPIU_Allreduce(&flops,        &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1330   ierr = MPIU_Allreduce(&flops,        &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1331   avg  = (tot)/((PetscLogDouble) size);
1332   if (min != 0.0) ratio = max/min;
1333   else ratio = 0.0;
1334   ierr = PetscFPrintf(comm, fd, "Flops/sec:            %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1335   /*   Memory */
1336   ierr = PetscMallocGetMaximumUsage(&mem);CHKERRQ(ierr);
1337   if (mem > 0.0) {
1338     ierr = MPIU_Allreduce(&mem,          &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1339     ierr = MPIU_Allreduce(&mem,          &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1340     ierr = MPIU_Allreduce(&mem,          &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1341     avg  = (tot)/((PetscLogDouble) size);
1342     if (min != 0.0) ratio = max/min;
1343     else ratio = 0.0;
1344     ierr = PetscFPrintf(comm, fd, "Memory:               %5.3e   %10.5f              %5.3e\n", max, ratio, tot);CHKERRQ(ierr);
1345   }
1346   /*   Messages */
1347   mess = 0.5*(petsc_irecv_ct + petsc_isend_ct + petsc_recv_ct + petsc_send_ct);
1348   ierr = MPIU_Allreduce(&mess,         &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1349   ierr = MPIU_Allreduce(&mess,         &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1350   ierr = MPIU_Allreduce(&mess,         &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1351   avg  = (tot)/((PetscLogDouble) size);
1352   if (min != 0.0) ratio = max/min;
1353   else ratio = 0.0;
1354   ierr = PetscFPrintf(comm, fd, "MPI Messages:         %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1355   numMessages = tot;
1356   /*   Message Lengths */
1357   mess = 0.5*(petsc_irecv_len + petsc_isend_len + petsc_recv_len + petsc_send_len);
1358   ierr = MPIU_Allreduce(&mess,         &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1359   ierr = MPIU_Allreduce(&mess,         &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1360   ierr = MPIU_Allreduce(&mess,         &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1361   if (numMessages != 0) avg = (tot)/(numMessages);
1362   else avg = 0.0;
1363   if (min != 0.0) ratio = max/min;
1364   else ratio = 0.0;
1365   ierr = PetscFPrintf(comm, fd, "MPI Message Lengths:  %5.3e   %10.5f   %5.3e  %5.3e\n", max, ratio, avg, tot);CHKERRQ(ierr);
1366   messageLength = tot;
1367   /*   Reductions */
1368   ierr = MPIU_Allreduce(&red,          &min, 1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1369   ierr = MPIU_Allreduce(&red,          &max, 1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1370   ierr = MPIU_Allreduce(&red,          &tot, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1371   if (min != 0.0) ratio = max/min;
1372   else ratio = 0.0;
1373   ierr = PetscFPrintf(comm, fd, "MPI Reductions:       %5.3e   %10.5f\n", max, ratio);CHKERRQ(ierr);
1374   numReductions = red; /* wrong because uses count from process zero */
1375   ierr = PetscFPrintf(comm, fd, "\nFlop counting convention: 1 flop = 1 real number operation of type (multiply/divide/add/subtract)\n");CHKERRQ(ierr);
1376   ierr = PetscFPrintf(comm, fd, "                            e.g., VecAXPY() for real vectors of length N --> 2N flops\n");CHKERRQ(ierr);
1377   ierr = PetscFPrintf(comm, fd, "                            and VecAXPY() for complex vectors of length N --> 8N flops\n");CHKERRQ(ierr);
1378 
1379   /* Get total number of stages --
1380        Currently, a single processor can register more stages than another, but stages must all be registered in order.
1381        We can removed this requirement if necessary by having a global stage numbering and indirection on the stage ID.
1382        This seems best accomplished by assoicating a communicator with each stage.
1383   */
1384   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1385   ierr = MPIU_Allreduce(&stageLog->numStages, &numStages, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1386   ierr = PetscMalloc1(numStages, &localStageUsed);CHKERRQ(ierr);
1387   ierr = PetscMalloc1(numStages, &stageUsed);CHKERRQ(ierr);
1388   ierr = PetscMalloc1(numStages, &localStageVisible);CHKERRQ(ierr);
1389   ierr = PetscMalloc1(numStages, &stageVisible);CHKERRQ(ierr);
1390   if (numStages > 0) {
1391     stageInfo = stageLog->stageInfo;
1392     for (stage = 0; stage < numStages; stage++) {
1393       if (stage < stageLog->numStages) {
1394         localStageUsed[stage]    = stageInfo[stage].used;
1395         localStageVisible[stage] = stageInfo[stage].perfInfo.visible;
1396       } else {
1397         localStageUsed[stage]    = PETSC_FALSE;
1398         localStageVisible[stage] = PETSC_TRUE;
1399       }
1400     }
1401     ierr = MPIU_Allreduce(localStageUsed,    stageUsed,    numStages, MPIU_BOOL, MPI_LOR,  comm);CHKERRQ(ierr);
1402     ierr = MPIU_Allreduce(localStageVisible, stageVisible, numStages, MPIU_BOOL, MPI_LAND, comm);CHKERRQ(ierr);
1403     for (stage = 0; stage < numStages; stage++) {
1404       if (stageUsed[stage]) {
1405         ierr = PetscFPrintf(comm, fd, "\nSummary of Stages:   ----- Time ------  ----- Flops -----  --- Messages ---  -- Message Lengths --  -- Reductions --\n");CHKERRQ(ierr);
1406         ierr = PetscFPrintf(comm, fd, "                        Avg     %%Total     Avg     %%Total   counts   %%Total     Avg         %%Total   counts   %%Total \n");CHKERRQ(ierr);
1407         break;
1408       }
1409     }
1410     for (stage = 0; stage < numStages; stage++) {
1411       if (!stageUsed[stage]) continue;
1412       /* CANNOT use MPIU_Allreduce() since it might fail the line number check */
1413       if (localStageUsed[stage]) {
1414         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1415         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1416         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1417         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1418         ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1419         name = stageInfo[stage].name;
1420       } else {
1421         ierr = MPI_Allreduce(&zero,                           &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1422         ierr = MPI_Allreduce(&zero,                           &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1423         ierr = MPI_Allreduce(&zero,                           &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1424         ierr = MPI_Allreduce(&zero,                           &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1425         ierr = MPI_Allreduce(&zero,                           &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1426         name = "";
1427       }
1428       mess *= 0.5; messLen *= 0.5; red /= size;
1429       if (TotalTime     != 0.0) fracTime       = stageTime/TotalTime;    else fracTime       = 0.0;
1430       if (TotalFlops    != 0.0) fracFlops      = flops/TotalFlops;       else fracFlops      = 0.0;
1431       /* Talk to Barry if (stageTime     != 0.0) flops          = (size*flops)/stageTime; else flops          = 0.0; */
1432       if (numMessages   != 0.0) fracMessages   = mess/numMessages;       else fracMessages   = 0.0;
1433       if (numMessages   != 0.0) avgMessLen     = messLen/numMessages;    else avgMessLen     = 0.0;
1434       if (messageLength != 0.0) fracLength     = messLen/messageLength;  else fracLength     = 0.0;
1435       if (numReductions != 0.0) fracReductions = red/numReductions;      else fracReductions = 0.0;
1436       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",
1437                           stage, name, stageTime/size, 100.0*fracTime, flops, 100.0*fracFlops,
1438                           mess, 100.0*fracMessages, avgMessLen, 100.0*fracLength, red, 100.0*fracReductions);CHKERRQ(ierr);
1439     }
1440   }
1441 
1442   ierr = PetscFPrintf(comm, fd,"\n------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr);
1443   ierr = PetscFPrintf(comm, fd, "See the 'Profiling' chapter of the users' manual for details on interpreting output.\n");CHKERRQ(ierr);
1444   ierr = PetscFPrintf(comm, fd, "Phase summary info:\n");CHKERRQ(ierr);
1445   ierr = PetscFPrintf(comm, fd, "   Count: number of times phase was executed\n");CHKERRQ(ierr);
1446   ierr = PetscFPrintf(comm, fd, "   Time and Flops: Max - maximum over all processors\n");CHKERRQ(ierr);
1447   ierr = PetscFPrintf(comm, fd, "                   Ratio - ratio of maximum to minimum over all processors\n");CHKERRQ(ierr);
1448   ierr = PetscFPrintf(comm, fd, "   Mess: number of messages sent\n");CHKERRQ(ierr);
1449   ierr = PetscFPrintf(comm, fd, "   Avg. len: average message length (bytes)\n");CHKERRQ(ierr);
1450   ierr = PetscFPrintf(comm, fd, "   Reduct: number of global reductions\n");CHKERRQ(ierr);
1451   ierr = PetscFPrintf(comm, fd, "   Global: entire computation\n");CHKERRQ(ierr);
1452   ierr = PetscFPrintf(comm, fd, "   Stage: stages of a computation. Set stages with PetscLogStagePush() and PetscLogStagePop().\n");CHKERRQ(ierr);
1453   ierr = PetscFPrintf(comm, fd, "      %%T - percent time in this phase         %%F - percent flops in this phase\n");CHKERRQ(ierr);
1454   ierr = PetscFPrintf(comm, fd, "      %%M - percent messages in this phase     %%L - percent message lengths in this phase\n");CHKERRQ(ierr);
1455   ierr = PetscFPrintf(comm, fd, "      %%R - percent reductions in this phase\n");CHKERRQ(ierr);
1456   ierr = PetscFPrintf(comm, fd, "   Total Mflop/s: 10e-6 * (sum of flops over all processors)/(max time over all processors)\n");CHKERRQ(ierr);
1457   ierr = PetscFPrintf(comm, fd, "------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr);
1458 
1459   ierr = PetscLogViewWarnDebugging(comm,fd);CHKERRQ(ierr);
1460 
1461   /* Report events */
1462   ierr = PetscFPrintf(comm, fd,"Event                Count      Time (sec)     Flops                             --- Global ---  --- Stage ---   Total\n");CHKERRQ(ierr);
1463   ierr = PetscFPrintf(comm, fd,"                   Max Ratio  Max     Ratio   Max  Ratio  Mess   Avg len Reduct  %%T %%F %%M %%L %%R  %%T %%F %%M %%L %%R Mflop/s\n");CHKERRQ(ierr);
1464   ierr = PetscFPrintf(comm,fd,"------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr);
1465 
1466   /* Problem: The stage name will not show up unless the stage executed on proc 1 */
1467   for (stage = 0; stage < numStages; stage++) {
1468     if (!stageVisible[stage]) continue;
1469     /* CANNOT use MPIU_Allreduce() since it might fail the line number check */
1470     if (localStageUsed[stage]) {
1471       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr);
1472       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.time,          &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1473       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.flops,         &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1474       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numMessages,   &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1475       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.messageLength, &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1476       ierr = MPI_Allreduce(&stageInfo[stage].perfInfo.numReductions, &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1477     } else {
1478       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr);
1479       ierr = MPI_Allreduce(&zero,                           &stageTime, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1480       ierr = MPI_Allreduce(&zero,                           &flops,     1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1481       ierr = MPI_Allreduce(&zero,                           &mess,      1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1482       ierr = MPI_Allreduce(&zero,                           &messLen,   1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1483       ierr = MPI_Allreduce(&zero,                           &red,       1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1484     }
1485     mess *= 0.5; messLen *= 0.5; red /= size;
1486 
1487     /* Get total number of events in this stage --
1488        Currently, a single processor can register more events than another, but events must all be registered in order,
1489        just like stages. We can removed this requirement if necessary by having a global event numbering and indirection
1490        on the event ID. This seems best accomplished by assoicating a communicator with each stage.
1491 
1492        Problem: If the event did not happen on proc 1, its name will not be available.
1493        Problem: Event visibility is not implemented
1494     */
1495     if (localStageUsed[stage]) {
1496       eventInfo      = stageLog->stageInfo[stage].eventLog->eventInfo;
1497       localNumEvents = stageLog->stageInfo[stage].eventLog->numEvents;
1498     } else localNumEvents = 0;
1499     ierr = MPIU_Allreduce(&localNumEvents, &numEvents, 1, MPI_INT, MPI_MAX, comm);CHKERRQ(ierr);
1500     for (event = 0; event < numEvents; event++) {
1501       /* CANNOT use MPIU_Allreduce() since it might fail the line number check */
1502       if (localStageUsed[stage] && (event < stageLog->stageInfo[stage].eventLog->numEvents) && (eventInfo[event].depth == 0)) {
1503         if ((eventInfo[event].count > 0) && (eventInfo[event].time > 0.0)) flopr = eventInfo[event].flops;
1504         else flopr = 0.0;
1505 
1506         ierr = MPI_Allreduce(&flopr,                          &minf,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1507         ierr = MPI_Allreduce(&flopr,                          &maxf,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1508         ierr = MPI_Allreduce(&eventInfo[event].flops,         &totf,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1509         ierr = MPI_Allreduce(&eventInfo[event].time,          &mint,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1510         ierr = MPI_Allreduce(&eventInfo[event].time,          &maxt,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1511         ierr = MPI_Allreduce(&eventInfo[event].time,          &tott,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1512         ierr = MPI_Allreduce(&eventInfo[event].numMessages,   &totm,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1513         ierr = MPI_Allreduce(&eventInfo[event].messageLength, &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1514         ierr = MPI_Allreduce(&eventInfo[event].numReductions, &totr,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1515         ierr = MPI_Allreduce(&eventInfo[event].count,         &minCt, 1, MPI_INT,             MPI_MIN, comm);CHKERRQ(ierr);
1516         ierr = MPI_Allreduce(&eventInfo[event].count,         &maxCt, 1, MPI_INT,             MPI_MAX, comm);CHKERRQ(ierr);
1517         name = stageLog->eventLog->eventInfo[event].name;
1518       } else {
1519         flopr = 0.0;
1520         ierr  = MPI_Allreduce(&flopr,                          &minf,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1521         ierr  = MPI_Allreduce(&flopr,                          &maxf,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1522         ierr  = MPI_Allreduce(&zero,                           &totf,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1523         ierr  = MPI_Allreduce(&zero,                           &mint,  1, MPIU_PETSCLOGDOUBLE, MPI_MIN, comm);CHKERRQ(ierr);
1524         ierr  = MPI_Allreduce(&zero,                           &maxt,  1, MPIU_PETSCLOGDOUBLE, MPI_MAX, comm);CHKERRQ(ierr);
1525         ierr  = MPI_Allreduce(&zero,                           &tott,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1526         ierr  = MPI_Allreduce(&zero,                           &totm,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1527         ierr  = MPI_Allreduce(&zero,                           &totml, 1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1528         ierr  = MPI_Allreduce(&zero,                           &totr,  1, MPIU_PETSCLOGDOUBLE, MPI_SUM, comm);CHKERRQ(ierr);
1529         ierr  = MPI_Allreduce(&ierr,                           &minCt, 1, MPI_INT,             MPI_MIN, comm);CHKERRQ(ierr);
1530         ierr  = MPI_Allreduce(&ierr,                           &maxCt, 1, MPI_INT,             MPI_MAX, comm);CHKERRQ(ierr);
1531         name  = "";
1532       }
1533       if (mint < 0.0) {
1534         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);
1535         mint = 0;
1536       }
1537       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);
1538       totm *= 0.5; totml *= 0.5; totr /= size;
1539 
1540       if (maxCt != 0) {
1541         if (minCt         != 0)   ratCt            = ((PetscLogDouble) maxCt)/minCt; else ratCt            = 0.0;
1542         if (mint          != 0.0) ratt             = maxt/mint;                  else ratt             = 0.0;
1543         if (minf          != 0.0) ratf             = maxf/minf;                  else ratf             = 0.0;
1544         if (TotalTime     != 0.0) fracTime         = tott/TotalTime;             else fracTime         = 0.0;
1545         if (TotalFlops    != 0.0) fracFlops        = totf/TotalFlops;            else fracFlops        = 0.0;
1546         if (stageTime     != 0.0) fracStageTime    = tott/stageTime;             else fracStageTime    = 0.0;
1547         if (flops         != 0.0) fracStageFlops   = totf/flops;                 else fracStageFlops   = 0.0;
1548         if (numMessages   != 0.0) fracMess         = totm/numMessages;           else fracMess         = 0.0;
1549         if (messageLength != 0.0) fracMessLen      = totml/messageLength;        else fracMessLen      = 0.0;
1550         if (numReductions != 0.0) fracRed          = totr/numReductions;         else fracRed          = 0.0;
1551         if (mess          != 0.0) fracStageMess    = totm/mess;                  else fracStageMess    = 0.0;
1552         if (messLen       != 0.0) fracStageMessLen = totml/messLen;              else fracStageMessLen = 0.0;
1553         if (red           != 0.0) fracStageRed     = totr/red;                   else fracStageRed     = 0.0;
1554         if (totm          != 0.0) totml           /= totm;                       else totml            = 0.0;
1555         if (maxt          != 0.0) flopr            = totf/maxt;                  else flopr            = 0.0;
1556         if (fracStageTime > 1.00)  ierr = PetscFPrintf(comm, fd,"Warning -- total time of event greater than time of entire stage -- something is wrong with the timer\n");CHKERRQ(ierr);
1557         ierr = PetscFPrintf(comm, fd,
1558           "%-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",
1559                             name, maxCt, ratCt, maxt, ratt, maxf, ratf, totm, totml, totr,
1560                             100.0*fracTime, 100.0*fracFlops, 100.0*fracMess, 100.0*fracMessLen, 100.0*fracRed,
1561                             100.0*fracStageTime, 100.0*fracStageFlops, 100.0*fracStageMess, 100.0*fracStageMessLen, 100.0*fracStageRed,
1562                             PetscAbsReal(flopr/1.0e6));CHKERRQ(ierr);
1563       }
1564     }
1565   }
1566 
1567   /* Memory usage and object creation */
1568   ierr = PetscFPrintf(comm, fd, "------------------------------------------------------------------------------------------------------------------------\n");CHKERRQ(ierr);
1569   ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr);
1570   ierr = PetscFPrintf(comm, fd, "Memory usage is given in bytes:\n\n");CHKERRQ(ierr);
1571 
1572   /* Right now, only stages on the first processor are reported here, meaning only objects associated with
1573      the global communicator, or MPI_COMM_SELF for proc 1. We really should report global stats and then
1574      stats for stages local to processor sets.
1575   */
1576   /* We should figure out the longest object name here (now 20 characters) */
1577   ierr = PetscFPrintf(comm, fd, "Object Type          Creations   Destructions     Memory  Descendants' Mem.\n");CHKERRQ(ierr);
1578   ierr = PetscFPrintf(comm, fd, "Reports information only for process 0.\n");CHKERRQ(ierr);
1579   for (stage = 0; stage < numStages; stage++) {
1580     if (localStageUsed[stage]) {
1581       classInfo = stageLog->stageInfo[stage].classLog->classInfo;
1582       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: %s\n\n", stage, stageInfo[stage].name);CHKERRQ(ierr);
1583       for (oclass = 0; oclass < stageLog->stageInfo[stage].classLog->numClasses; oclass++) {
1584         if ((classInfo[oclass].creations > 0) || (classInfo[oclass].destructions > 0)) {
1585           ierr = PetscFPrintf(comm, fd, "%20s %5d          %5d  %11.0f     %g\n", stageLog->classLog->classInfo[oclass].name,
1586                               classInfo[oclass].creations, classInfo[oclass].destructions, classInfo[oclass].mem,
1587                               classInfo[oclass].descMem);CHKERRQ(ierr);
1588         }
1589       }
1590     } else {
1591       ierr = PetscFPrintf(comm, fd, "\n--- Event Stage %d: Unknown\n\n", stage);CHKERRQ(ierr);
1592     }
1593   }
1594 
1595   ierr = PetscFree(localStageUsed);CHKERRQ(ierr);
1596   ierr = PetscFree(stageUsed);CHKERRQ(ierr);
1597   ierr = PetscFree(localStageVisible);CHKERRQ(ierr);
1598   ierr = PetscFree(stageVisible);CHKERRQ(ierr);
1599 
1600   /* Information unrelated to this particular run */
1601   ierr = PetscFPrintf(comm, fd, "========================================================================================================================\n");CHKERRQ(ierr);
1602   PetscTime(&y);
1603   PetscTime(&x);
1604   PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y);
1605   PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y); PetscTime(&y);
1606   ierr = PetscFPrintf(comm,fd,"Average time to get PetscTime(): %g\n", (y-x)/10.0);CHKERRQ(ierr);
1607   /* MPI information */
1608   if (size > 1) {
1609     MPI_Status  status;
1610     PetscMPIInt tag;
1611     MPI_Comm    newcomm;
1612 
1613     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1614     PetscTime(&x);
1615     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1616     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1617     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1618     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1619     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1620     PetscTime(&y);
1621     ierr = PetscFPrintf(comm, fd, "Average time for MPI_Barrier(): %g\n", (y-x)/5.0);CHKERRQ(ierr);
1622     ierr = PetscCommDuplicate(comm,&newcomm, &tag);CHKERRQ(ierr);
1623     ierr = MPI_Barrier(comm);CHKERRQ(ierr);
1624     if (rank) {
1625       ierr = MPI_Recv(0, 0, MPI_INT, rank-1,            tag, newcomm, &status);CHKERRQ(ierr);
1626       ierr = MPI_Send(0, 0, MPI_INT, (rank+1)%size, tag, newcomm);CHKERRQ(ierr);
1627     } else {
1628       PetscTime(&x);
1629       ierr = MPI_Send(0, 0, MPI_INT, 1,          tag, newcomm);CHKERRQ(ierr);
1630       ierr = MPI_Recv(0, 0, MPI_INT, size-1, tag, newcomm, &status);CHKERRQ(ierr);
1631       PetscTime(&y);
1632       ierr = PetscFPrintf(comm,fd,"Average time for zero size MPI_Send(): %g\n", (y-x)/size);CHKERRQ(ierr);
1633     }
1634     ierr = PetscCommDestroy(&newcomm);CHKERRQ(ierr);
1635   }
1636   ierr = PetscOptionsView(NULL,viewer);CHKERRQ(ierr);
1637 
1638   /* Machine and compile information */
1639 #if defined(PETSC_USE_FORTRAN_KERNELS)
1640   ierr = PetscFPrintf(comm, fd, "Compiled with FORTRAN kernels\n");CHKERRQ(ierr);
1641 #else
1642   ierr = PetscFPrintf(comm, fd, "Compiled without FORTRAN kernels\n");CHKERRQ(ierr);
1643 #endif
1644 #if defined(PETSC_USE_REAL_SINGLE)
1645   ierr = PetscFPrintf(comm, fd, "Compiled with single precision PetscScalar and PetscReal\n");CHKERRQ(ierr);
1646 #elif defined(PETSC_USE_LONGDOUBLE)
1647   ierr = PetscFPrintf(comm, fd, "Compiled with long double precision PetscScalar and PetscReal\n");CHKERRQ(ierr);
1648 #endif
1649 
1650 #if defined(PETSC_USE_REAL_MAT_SINGLE)
1651   ierr = PetscFPrintf(comm, fd, "Compiled with single precision matrices\n");CHKERRQ(ierr);
1652 #else
1653   ierr = PetscFPrintf(comm, fd, "Compiled with full precision matrices (default)\n");CHKERRQ(ierr);
1654 #endif
1655   ierr = PetscFPrintf(comm, fd, "sizeof(short) %d sizeof(int) %d sizeof(long) %d sizeof(void*) %d sizeof(PetscScalar) %d sizeof(PetscInt) %d\n",
1656                       (int) sizeof(short), (int) sizeof(int), (int) sizeof(long), (int) sizeof(void*),(int) sizeof(PetscScalar),(int) sizeof(PetscInt));CHKERRQ(ierr);
1657 
1658   ierr = PetscFPrintf(comm, fd, "Configure options: %s",petscconfigureoptions);CHKERRQ(ierr);
1659   ierr = PetscFPrintf(comm, fd, "%s", petscmachineinfo);CHKERRQ(ierr);
1660   ierr = PetscFPrintf(comm, fd, "%s", petsccompilerinfo);CHKERRQ(ierr);
1661   ierr = PetscFPrintf(comm, fd, "%s", petsccompilerflagsinfo);CHKERRQ(ierr);
1662   ierr = PetscFPrintf(comm, fd, "%s", petsclinkerinfo);CHKERRQ(ierr);
1663 
1664   /* Cleanup */
1665   ierr = PetscFPrintf(comm, fd, "\n");CHKERRQ(ierr);
1666   ierr = PetscLogViewWarnDebugging(comm,fd);CHKERRQ(ierr);
1667   PetscFunctionReturn(0);
1668 }
1669 
1670 PetscErrorCode  PetscLogView_Nested(PetscViewer);
1671 
1672 /*@C
1673   PetscLogView - Prints a summary of the logging.
1674 
1675   Collective over MPI_Comm
1676 
1677   Input Parameter:
1678 .  viewer - an ASCII viewer
1679 
1680   Options Database Keys:
1681 +  -log_view [:filename] - Prints summary of log information
1682 .  -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file
1683 .  -log_view :filename.xml:ascii_xml - Saves a summary of the logging information in a nested format, use a browser to open this file, for example on
1684              Apple MacOS systems use open -a Safari filename.xml
1685 .  -log_all - Saves a file Log.rank for each MPI process with details of each step of the computation
1686 -  -log_trace [filename] - Displays a trace of what each process is doing
1687 
1688   Notes:
1689   It is possible to control the logging programatically but we recommend using the options database approach whenever possible
1690   By default the summary is printed to stdout.
1691 
1692   Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin()
1693 
1694   If PETSc is configured with --with-logging=0 then this functionality is not available
1695 
1696   The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij  MARITIME  RESEARCH  INSTITUTE  NETHERLANDS
1697 
1698   Level: beginner
1699 
1700 .keywords: log, dump, print
1701 .seealso: PetscLogDefaultBegin(), PetscLogDump()
1702 @*/
1703 PetscErrorCode  PetscLogView(PetscViewer viewer)
1704 {
1705   PetscErrorCode    ierr;
1706   PetscBool         isascii;
1707   PetscViewerFormat format;
1708   int               stage, lastStage;
1709   PetscStageLog     stageLog;
1710 
1711   PetscFunctionBegin;
1712   if (!PetscLogPLB) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Must use -log_summary or PetscLogDefaultBegin() before calling this routine");
1713   /* Pop off any stages the user forgot to remove */
1714   lastStage = 0;
1715   ierr      = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1716   ierr      = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
1717   while (stage >= 0) {
1718     lastStage = stage;
1719     ierr      = PetscStageLogPop(stageLog);CHKERRQ(ierr);
1720     ierr      = PetscStageLogGetCurrent(stageLog, &stage);CHKERRQ(ierr);
1721   }
1722   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr);
1723   if (!isascii) SETERRQ(PetscObjectComm((PetscObject)viewer),PETSC_ERR_SUP,"Currently can only view logging to ASCII");
1724   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1725   if (format == PETSC_VIEWER_DEFAULT || format == PETSC_VIEWER_ASCII_INFO) {
1726     ierr = PetscLogView_Default(viewer);CHKERRQ(ierr);
1727   } else if (format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
1728     ierr = PetscLogView_Detailed(viewer);CHKERRQ(ierr);
1729   } else if (format == PETSC_VIEWER_ASCII_XML) {
1730     ierr = PetscLogView_Nested(viewer);CHKERRQ(ierr);
1731   }
1732   ierr = PetscStageLogPush(stageLog, lastStage);CHKERRQ(ierr);
1733   PetscFunctionReturn(0);
1734 }
1735 
1736 /*@C
1737   PetscLogViewFromOptions - Processes command line options to determine if/how a PetscLog is to be viewed.
1738 
1739   Collective on PETSC_COMM_WORLD
1740 
1741   Not normally called by user
1742 
1743   Level: intermediate
1744 
1745 @*/
1746 PetscErrorCode PetscLogViewFromOptions(void)
1747 {
1748   PetscErrorCode    ierr;
1749   PetscViewer       viewer;
1750   PetscBool         flg;
1751   PetscViewerFormat format;
1752 
1753   PetscFunctionBegin;
1754   ierr   = PetscOptionsGetViewer(PETSC_COMM_WORLD,NULL,"-log_view",&viewer,&format,&flg);CHKERRQ(ierr);
1755   if (flg) {
1756     ierr = PetscViewerPushFormat(viewer,format);CHKERRQ(ierr);
1757     ierr = PetscLogView(viewer);CHKERRQ(ierr);
1758     ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr);
1759     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1760   }
1761   PetscFunctionReturn(0);
1762 }
1763 
1764 
1765 
1766 /*----------------------------------------------- Counter Functions -------------------------------------------------*/
1767 /*@C
1768    PetscGetFlops - Returns the number of flops used on this processor
1769    since the program began.
1770 
1771    Not Collective
1772 
1773    Output Parameter:
1774    flops - number of floating point operations
1775 
1776    Notes:
1777    A global counter logs all PETSc flop counts.  The user can use
1778    PetscLogFlops() to increment this counter to include flops for the
1779    application code.
1780 
1781    Level: intermediate
1782 
1783 .keywords: log, flops, floating point operations
1784 
1785 .seealso: PetscTime(), PetscLogFlops()
1786 @*/
1787 PetscErrorCode  PetscGetFlops(PetscLogDouble *flops)
1788 {
1789   PetscFunctionBegin;
1790   *flops = petsc_TotalFlops;
1791   PetscFunctionReturn(0);
1792 }
1793 
1794 PetscErrorCode  PetscLogObjectState(PetscObject obj, const char format[], ...)
1795 {
1796   PetscErrorCode ierr;
1797   size_t         fullLength;
1798   va_list        Argp;
1799 
1800   PetscFunctionBegin;
1801   if (!petsc_logObjects) PetscFunctionReturn(0);
1802   va_start(Argp, format);
1803   ierr = PetscVSNPrintf(petsc_objects[obj->id].info, 64,format,&fullLength, Argp);CHKERRQ(ierr);
1804   va_end(Argp);
1805   PetscFunctionReturn(0);
1806 }
1807 
1808 
1809 /*MC
1810    PetscLogFlops - Adds floating point operations to the global counter.
1811 
1812    Synopsis:
1813    #include <petsclog.h>
1814    PetscErrorCode PetscLogFlops(PetscLogDouble f)
1815 
1816    Not Collective
1817 
1818    Input Parameter:
1819 .  f - flop counter
1820 
1821 
1822    Usage:
1823 .vb
1824      PetscLogEvent USER_EVENT;
1825      PetscLogEventRegister("User event",0,&USER_EVENT);
1826      PetscLogEventBegin(USER_EVENT,0,0,0,0);
1827         [code segment to monitor]
1828         PetscLogFlops(user_flops)
1829      PetscLogEventEnd(USER_EVENT,0,0,0,0);
1830 .ve
1831 
1832    Notes:
1833    A global counter logs all PETSc flop counts.  The user can use
1834    PetscLogFlops() to increment this counter to include flops for the
1835    application code.
1836 
1837    Level: intermediate
1838 
1839 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscGetFlops()
1840 
1841 .keywords: log, flops, floating point operations
1842 M*/
1843 
1844 /*MC
1845    PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice)
1846     to get accurate timings
1847 
1848    Synopsis:
1849    #include <petsclog.h>
1850    void PetscPreLoadBegin(PetscBool  flag,char *name);
1851 
1852    Not Collective
1853 
1854    Input Parameter:
1855 +   flag - PETSC_TRUE to run twice, PETSC_FALSE to run once, may be overridden
1856            with command line option -preload true or -preload false
1857 -   name - name of first stage (lines of code timed separately with -log_summary) to
1858            be preloaded
1859 
1860    Usage:
1861 .vb
1862      PetscPreLoadBegin(PETSC_TRUE,"first stage);
1863        lines of code
1864        PetscPreLoadStage("second stage");
1865        lines of code
1866      PetscPreLoadEnd();
1867 .ve
1868 
1869    Notes: Only works in C/C++, not Fortran
1870 
1871      Flags available within the macro.
1872 +    PetscPreLoadingUsed - true if we are or have done preloading
1873 .    PetscPreLoadingOn - true if it is CURRENTLY doing preload
1874 .    PetscPreLoadIt - 0 for the first computation (with preloading turned off it is only 0) 1 for the second
1875 -    PetscPreLoadMax - number of times it will do the computation, only one when preloading is turned on
1876      The first two variables are available throughout the program, the second two only between the PetscPreLoadBegin()
1877      and PetscPreLoadEnd()
1878 
1879    Level: intermediate
1880 
1881 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadEnd(), PetscPreLoadStage()
1882 
1883    Concepts: preloading
1884    Concepts: timing^accurate
1885    Concepts: paging^eliminating effects of
1886 
1887 
1888 M*/
1889 
1890 /*MC
1891    PetscPreLoadEnd - End a segment of code that may be preloaded (run twice)
1892     to get accurate timings
1893 
1894    Synopsis:
1895    #include <petsclog.h>
1896    void PetscPreLoadEnd(void);
1897 
1898    Not Collective
1899 
1900    Usage:
1901 .vb
1902      PetscPreLoadBegin(PETSC_TRUE,"first stage);
1903        lines of code
1904        PetscPreLoadStage("second stage");
1905        lines of code
1906      PetscPreLoadEnd();
1907 .ve
1908 
1909    Notes: only works in C/C++ not fortran
1910 
1911    Level: intermediate
1912 
1913 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadStage()
1914 
1915 M*/
1916 
1917 /*MC
1918    PetscPreLoadStage - Start a new segment of code to be timed separately.
1919     to get accurate timings
1920 
1921    Synopsis:
1922    #include <petsclog.h>
1923    void PetscPreLoadStage(char *name);
1924 
1925    Not Collective
1926 
1927    Usage:
1928 .vb
1929      PetscPreLoadBegin(PETSC_TRUE,"first stage);
1930        lines of code
1931        PetscPreLoadStage("second stage");
1932        lines of code
1933      PetscPreLoadEnd();
1934 .ve
1935 
1936    Notes: only works in C/C++ not fortran
1937 
1938    Level: intermediate
1939 
1940 .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscPreLoadBegin(), PetscPreLoadEnd()
1941 
1942 M*/
1943 
1944 
1945 #else /* end of -DPETSC_USE_LOG section */
1946 
1947 PetscErrorCode  PetscLogObjectState(PetscObject obj, const char format[], ...)
1948 {
1949   PetscFunctionBegin;
1950   PetscFunctionReturn(0);
1951 }
1952 
1953 #endif /* PETSC_USE_LOG*/
1954 
1955 
1956 PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
1957 PetscClassId PETSC_OBJECT_CLASSID  = 0;
1958 
1959 /*@C
1960   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
1961 
1962   Not Collective
1963 
1964   Input Parameter:
1965 . name   - The class name
1966 
1967   Output Parameter:
1968 . oclass - The class id or classid
1969 
1970   Level: developer
1971 
1972 .keywords: log, class, register
1973 
1974 @*/
1975 PetscErrorCode  PetscClassIdRegister(const char name[],PetscClassId *oclass)
1976 {
1977 #if defined(PETSC_USE_LOG)
1978   PetscStageLog  stageLog;
1979   PetscInt       stage;
1980   PetscErrorCode ierr;
1981 #endif
1982 
1983   PetscFunctionBegin;
1984   *oclass = ++PETSC_LARGEST_CLASSID;
1985 #if defined(PETSC_USE_LOG)
1986   ierr = PetscLogGetStageLog(&stageLog);CHKERRQ(ierr);
1987   ierr = PetscClassRegLogRegister(stageLog->classLog, name, *oclass);CHKERRQ(ierr);
1988   for (stage = 0; stage < stageLog->numStages; stage++) {
1989     ierr = PetscClassPerfLogEnsureSize(stageLog->stageInfo[stage].classLog, stageLog->classLog->numClasses);CHKERRQ(ierr);
1990   }
1991 #endif
1992   PetscFunctionReturn(0);
1993 }
1994 
1995 #if defined(PETSC_USE_LOG) && defined(PETSC_HAVE_MPE)
1996 #include <mpe.h>
1997 
1998 PetscBool PetscBeganMPE = PETSC_FALSE;
1999 
2000 PETSC_INTERN PetscErrorCode PetscLogEventBeginMPE(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
2001 PETSC_INTERN PetscErrorCode PetscLogEventEndMPE(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
2002 
2003 /*@C
2004    PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files
2005    and slows the program down.
2006 
2007    Collective over PETSC_COMM_WORLD
2008 
2009    Options Database Keys:
2010 . -log_mpe - Prints extensive log information
2011 
2012    Notes:
2013    A related routine is PetscLogDefaultBegin() (with the options key -log_summary), which is
2014    intended for production runs since it logs only flop rates and object
2015    creation (and should not significantly slow the programs).
2016 
2017    Level: advanced
2018 
2019    Concepts: logging^MPE
2020    Concepts: logging^message passing
2021 
2022 .seealso: PetscLogDump(), PetscLogDefaultBegin(), PetscLogAllBegin(), PetscLogEventActivate(),
2023           PetscLogEventDeactivate()
2024 @*/
2025 PetscErrorCode  PetscLogMPEBegin(void)
2026 {
2027   PetscErrorCode ierr;
2028 
2029   PetscFunctionBegin;
2030   /* Do MPE initialization */
2031   if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */
2032     ierr = PetscInfo(0,"Initializing MPE.\n");CHKERRQ(ierr);
2033     ierr = MPE_Init_log();CHKERRQ(ierr);
2034 
2035     PetscBeganMPE = PETSC_TRUE;
2036   } else {
2037     ierr = PetscInfo(0,"MPE already initialized. Not attempting to reinitialize.\n");CHKERRQ(ierr);
2038   }
2039   ierr = PetscLogSet(PetscLogEventBeginMPE, PetscLogEventEndMPE);CHKERRQ(ierr);
2040   PetscFunctionReturn(0);
2041 }
2042 
2043 /*@C
2044    PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot.
2045 
2046    Collective over PETSC_COMM_WORLD
2047 
2048    Level: advanced
2049 
2050 .seealso: PetscLogDump(), PetscLogAllBegin(), PetscLogMPEBegin()
2051 @*/
2052 PetscErrorCode  PetscLogMPEDump(const char sname[])
2053 {
2054   char           name[PETSC_MAX_PATH_LEN];
2055   PetscErrorCode ierr;
2056 
2057   PetscFunctionBegin;
2058   if (PetscBeganMPE) {
2059     ierr = PetscInfo(0,"Finalizing MPE.\n");CHKERRQ(ierr);
2060     if (sname) {
2061       ierr = PetscStrcpy(name,sname);CHKERRQ(ierr);
2062     } else {
2063       ierr = PetscGetProgramName(name,PETSC_MAX_PATH_LEN);CHKERRQ(ierr);
2064     }
2065     ierr = MPE_Finish_log(name);CHKERRQ(ierr);
2066   } else {
2067     ierr = PetscInfo(0,"Not finalizing MPE (not started by PETSc).\n");CHKERRQ(ierr);
2068   }
2069   PetscFunctionReturn(0);
2070 }
2071 
2072 #define PETSC_RGB_COLORS_MAX 39
2073 static const char *PetscLogMPERGBColors[PETSC_RGB_COLORS_MAX] = {
2074   "OliveDrab:      ",
2075   "BlueViolet:     ",
2076   "CadetBlue:      ",
2077   "CornflowerBlue: ",
2078   "DarkGoldenrod:  ",
2079   "DarkGreen:      ",
2080   "DarkKhaki:      ",
2081   "DarkOliveGreen: ",
2082   "DarkOrange:     ",
2083   "DarkOrchid:     ",
2084   "DarkSeaGreen:   ",
2085   "DarkSlateGray:  ",
2086   "DarkTurquoise:  ",
2087   "DeepPink:       ",
2088   "DarkKhaki:      ",
2089   "DimGray:        ",
2090   "DodgerBlue:     ",
2091   "GreenYellow:    ",
2092   "HotPink:        ",
2093   "IndianRed:      ",
2094   "LavenderBlush:  ",
2095   "LawnGreen:      ",
2096   "LemonChiffon:   ",
2097   "LightCoral:     ",
2098   "LightCyan:      ",
2099   "LightPink:      ",
2100   "LightSalmon:    ",
2101   "LightSlateGray: ",
2102   "LightYellow:    ",
2103   "LimeGreen:      ",
2104   "MediumPurple:   ",
2105   "MediumSeaGreen: ",
2106   "MediumSlateBlue:",
2107   "MidnightBlue:   ",
2108   "MintCream:      ",
2109   "MistyRose:      ",
2110   "NavajoWhite:    ",
2111   "NavyBlue:       ",
2112   "OliveDrab:      "
2113 };
2114 
2115 /*@C
2116   PetscLogMPEGetRGBColor - This routine returns a rgb color useable with PetscLogEventRegister()
2117 
2118   Not collective. Maybe it should be?
2119 
2120   Output Parameter
2121 . str - character string representing the color
2122 
2123   Level: developer
2124 
2125 .keywords: log, mpe , color
2126 .seealso: PetscLogEventRegister
2127 @*/
2128 PetscErrorCode  PetscLogMPEGetRGBColor(const char *str[])
2129 {
2130   static int idx = 0;
2131 
2132   PetscFunctionBegin;
2133   *str = PetscLogMPERGBColors[idx];
2134   idx  = (idx + 1)% PETSC_RGB_COLORS_MAX;
2135   PetscFunctionReturn(0);
2136 }
2137 
2138 #endif /* PETSC_USE_LOG && PETSC_HAVE_MPE */
2139