xref: /petsc/src/sys/logging/plog.c (revision f4f49eeac7efa77fffa46b7ff95a3ed169f659ed) !
15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith       PETSc code to log object creation and destruction and PETSc events.
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith       This provides the public API used by the rest of PETSc and by users.
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith       These routines use a private API that is not used elsewhere in PETSc and is not
75c6c1daeSBarry Smith       accessible to users. The private API is defined in logimpl.h and the utils directory.
85c6c1daeSBarry Smith 
9b665b14eSToby Isaac       ***
10b665b14eSToby Isaac 
11b665b14eSToby Isaac       This file, and only this file, is for functions that interact with the global logging state
125c6c1daeSBarry Smith */
13af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I    "petscsys.h"   I*/
1453e0a2f3SToby Isaac #include <petsc/private/loghandlerimpl.h>
155c6c1daeSBarry Smith #include <petsctime.h>
16665c2dedSJed Brown #include <petscviewer.h>
178fe3844cSJunchao Zhang #include <petscdevice.h>
188fe3844cSJunchao Zhang #include <petsc/private/deviceimpl.h>
195c6c1daeSBarry Smith 
20c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY)
21c708d6e3SStefano Zampini 
22c708d6e3SStefano Zampini PetscInt           petsc_log_gid = -1; /* Global threadId counter */
23c708d6e3SStefano Zampini PETSC_TLS PetscInt petsc_log_tid = -1; /* Local threadId */
24c708d6e3SStefano Zampini 
25c708d6e3SStefano Zampini /* shared variables */
26c708d6e3SStefano Zampini PetscSpinlock PetscLogSpinLock;
27c708d6e3SStefano Zampini 
282611ad71SToby Isaac PetscInt PetscLogGetTid(void)
292611ad71SToby Isaac {
302611ad71SToby Isaac   if (petsc_log_tid < 0) {
312611ad71SToby Isaac     PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
322611ad71SToby Isaac     petsc_log_tid = ++petsc_log_gid;
332611ad71SToby Isaac     PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
342611ad71SToby Isaac   }
352611ad71SToby Isaac   return petsc_log_tid;
362611ad71SToby Isaac }
372611ad71SToby Isaac 
38c708d6e3SStefano Zampini #endif
39c708d6e3SStefano Zampini 
405c6c1daeSBarry Smith /* Global counters */
415c6c1daeSBarry Smith PetscLogDouble petsc_BaseTime        = 0.0;
425c6c1daeSBarry Smith PetscLogDouble petsc_TotalFlops      = 0.0; /* The number of flops */
435c6c1daeSBarry Smith PetscLogDouble petsc_send_ct         = 0.0; /* The number of sends */
445c6c1daeSBarry Smith PetscLogDouble petsc_recv_ct         = 0.0; /* The number of receives */
455c6c1daeSBarry Smith PetscLogDouble petsc_send_len        = 0.0; /* The total length of all sent messages */
465c6c1daeSBarry Smith PetscLogDouble petsc_recv_len        = 0.0; /* The total length of all received messages */
475c6c1daeSBarry Smith PetscLogDouble petsc_isend_ct        = 0.0; /* The number of immediate sends */
485c6c1daeSBarry Smith PetscLogDouble petsc_irecv_ct        = 0.0; /* The number of immediate receives */
495c6c1daeSBarry Smith PetscLogDouble petsc_isend_len       = 0.0; /* The total length of all immediate send messages */
505c6c1daeSBarry Smith PetscLogDouble petsc_irecv_len       = 0.0; /* The total length of all immediate receive messages */
515c6c1daeSBarry Smith PetscLogDouble petsc_wait_ct         = 0.0; /* The number of waits */
525c6c1daeSBarry Smith PetscLogDouble petsc_wait_any_ct     = 0.0; /* The number of anywaits */
535c6c1daeSBarry Smith PetscLogDouble petsc_wait_all_ct     = 0.0; /* The number of waitalls */
545c6c1daeSBarry Smith PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */
555c6c1daeSBarry Smith PetscLogDouble petsc_allreduce_ct    = 0.0; /* The number of reductions */
565c6c1daeSBarry Smith PetscLogDouble petsc_gather_ct       = 0.0; /* The number of gathers and gathervs */
575c6c1daeSBarry Smith PetscLogDouble petsc_scatter_ct      = 0.0; /* The number of scatters and scattervs */
58c708d6e3SStefano Zampini 
59c708d6e3SStefano Zampini /* Thread Local storage */
60c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_TotalFlops_th      = 0.0;
61c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_ct_th         = 0.0;
62c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_ct_th         = 0.0;
63c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_len_th        = 0.0;
64c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_len_th        = 0.0;
65c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_ct_th        = 0.0;
66c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_ct_th        = 0.0;
67c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_len_th       = 0.0;
68c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_len_th       = 0.0;
69c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_ct_th         = 0.0;
70c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_any_ct_th     = 0.0;
71c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_all_ct_th     = 0.0;
72c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_sum_of_waits_ct_th = 0.0;
73c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_allreduce_ct_th    = 0.0;
74c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gather_ct_th       = 0.0;
75c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_scatter_ct_th      = 0.0;
76c708d6e3SStefano Zampini 
77bec0b493Shannah_mairs PetscLogDouble petsc_ctog_ct        = 0.0; /* The total number of CPU to GPU copies */
78bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_ct        = 0.0; /* The total number of GPU to CPU copies */
79bec0b493Shannah_mairs PetscLogDouble petsc_ctog_sz        = 0.0; /* The total size of CPU to GPU copies */
80bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_sz        = 0.0; /* The total size of GPU to CPU copies */
8145c4b7c1SBarry Smith PetscLogDouble petsc_ctog_ct_scalar = 0.0; /* The total number of CPU to GPU copies */
8245c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_ct_scalar = 0.0; /* The total number of GPU to CPU copies */
8345c4b7c1SBarry Smith PetscLogDouble petsc_ctog_sz_scalar = 0.0; /* The total size of CPU to GPU copies */
8445c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_sz_scalar = 0.0; /* The total size of GPU to CPU copies */
85958c4211Shannah_mairs PetscLogDouble petsc_gflops         = 0.0; /* The flops done on a GPU */
86958c4211Shannah_mairs PetscLogDouble petsc_gtime          = 0.0; /* The time spent on a GPU */
87c708d6e3SStefano Zampini 
88c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_th        = 0.0;
89c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_th        = 0.0;
90c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_th        = 0.0;
91c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_th        = 0.0;
92c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_scalar_th = 0.0;
93c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_scalar_th = 0.0;
94c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_scalar_th = 0.0;
95c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_scalar_th = 0.0;
96c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gflops_th         = 0.0;
97c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtime_th          = 0.0;
982611ad71SToby Isaac 
992611ad71SToby Isaac PetscBool PetscLogMemory = PETSC_FALSE;
1002611ad71SToby Isaac PetscBool PetscLogSyncOn = PETSC_FALSE;
1012611ad71SToby Isaac 
1022611ad71SToby Isaac PetscBool PetscLogGpuTimeFlag = PETSC_FALSE;
1032611ad71SToby Isaac 
1042611ad71SToby Isaac PetscLogState petsc_log_state = NULL;
1052611ad71SToby Isaac 
1062611ad71SToby Isaac #define PETSC_LOG_HANDLER_HOT_BLANK \
1072611ad71SToby Isaac   { \
1082611ad71SToby Isaac     NULL, NULL, NULL, NULL, NULL, NULL \
1092611ad71SToby Isaac   }
1102611ad71SToby Isaac 
1112611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = {
1122611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1132611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1142611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1152611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1162611ad71SToby Isaac };
1172611ad71SToby Isaac 
1182611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK
1192611ad71SToby Isaac 
1202611ad71SToby Isaac #if defined(PETSC_USE_LOG)
1212611ad71SToby Isaac   #include <../src/sys/logging/handler/impls/default/logdefault.h>
122c708d6e3SStefano Zampini 
123c708d6e3SStefano Zampini   #if defined(PETSC_HAVE_THREADSAFETY)
124c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp)
125c708d6e3SStefano Zampini {
126c708d6e3SStefano Zampini   *tot_th += tmp;
1273ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
128c708d6e3SStefano Zampini   *tot += tmp;
1293ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1303ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
131c708d6e3SStefano Zampini }
132c708d6e3SStefano Zampini 
133c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp)
134c708d6e3SStefano Zampini {
135c708d6e3SStefano Zampini   *cnt_th = *cnt_th + 1;
136c708d6e3SStefano Zampini   *tot_th += tmp;
1373ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
138c708d6e3SStefano Zampini   *tot += (PetscLogDouble)(tmp);
139c708d6e3SStefano Zampini   *cnt += *cnt + 1;
1403ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1413ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
142c708d6e3SStefano Zampini }
143c708d6e3SStefano Zampini 
144bec0b493Shannah_mairs   #endif
1455c6c1daeSBarry Smith 
14653e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
14753e0a2f3SToby Isaac {
14853e0a2f3SToby Isaac   PetscFunctionBegin;
14953e0a2f3SToby Isaac   PetscAssertPointer(handler, 2);
15053e0a2f3SToby Isaac   *handler = NULL;
15153e0a2f3SToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
15253e0a2f3SToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
15353e0a2f3SToby Isaac     if (h) {
15453e0a2f3SToby Isaac       PetscBool match;
15553e0a2f3SToby Isaac 
15653e0a2f3SToby Isaac       PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match));
15753e0a2f3SToby Isaac       if (match) {
15853e0a2f3SToby Isaac         *handler = PetscLogHandlers[i].handler;
15953e0a2f3SToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
16053e0a2f3SToby Isaac       }
16153e0a2f3SToby Isaac     }
16253e0a2f3SToby Isaac   }
16353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
16453e0a2f3SToby Isaac }
16553e0a2f3SToby Isaac 
16653e0a2f3SToby Isaac /*@
167b665b14eSToby Isaac   PetscLogGetDefaultHandler - Get the default log handler if it is running.
168b665b14eSToby Isaac 
169b665b14eSToby Isaac   Not collective
170b665b14eSToby Isaac 
171b665b14eSToby Isaac   Output Parameter:
172b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running.
173b665b14eSToby Isaac 
174b665b14eSToby Isaac   Level: developer
175b665b14eSToby Isaac 
176b665b14eSToby Isaac   Notes:
177b665b14eSToby Isaac   The default handler is started with `PetscLogDefaultBegin()`,
178b665b14eSToby Isaac   if the options flags `-log_all` or `-log_view` is given without arguments,
179b665b14eSToby Isaac   or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`.
180b665b14eSToby Isaac 
181b665b14eSToby Isaac .seealso: [](ch_profiling)
182b665b14eSToby Isaac @*/
183b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler)
184b665b14eSToby Isaac {
185b665b14eSToby Isaac   PetscFunctionBegin;
186294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler));
187b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
188b665b14eSToby Isaac }
189b665b14eSToby Isaac 
190b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
191b665b14eSToby Isaac {
192b665b14eSToby Isaac   PetscFunctionBegin;
193b665b14eSToby Isaac   PetscAssertPointer(handler, 2);
194b665b14eSToby Isaac   PetscCall(PetscLogTryGetHandler(type, handler));
1951943a749SToby Isaac   PetscCheck(*handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type);
196b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
197b665b14eSToby Isaac }
198b665b14eSToby Isaac 
199b665b14eSToby Isaac /*@
20053e0a2f3SToby Isaac   PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used
20153e0a2f3SToby Isaac   by all default log handlers (`PetscLogDefaultBegin()`,
20253e0a2f3SToby Isaac   `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`,
20353e0a2f3SToby Isaac   `PetscLogPerfstubsBegin()`).
20453e0a2f3SToby Isaac 
20553e0a2f3SToby Isaac   Collective on `PETSC_COMM_WORLD`
20653e0a2f3SToby Isaac 
20753e0a2f3SToby Isaac   Output Parameter:
208b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as
209b665b14eSToby Isaac           `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or
210b8004f34SBarry Smith           `PetscLogStagePush()`), or `NULL` if logging is not active
21153e0a2f3SToby Isaac 
21253e0a2f3SToby Isaac   Level: developer
21353e0a2f3SToby Isaac 
21453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState`
21553e0a2f3SToby Isaac @*/
21653e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state)
21753e0a2f3SToby Isaac {
21853e0a2f3SToby Isaac   PetscFunctionBegin;
21953e0a2f3SToby Isaac   PetscAssertPointer(state, 1);
22053e0a2f3SToby Isaac   *state = petsc_log_state;
22153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
22253e0a2f3SToby Isaac }
22353e0a2f3SToby Isaac 
22453e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot)
22553e0a2f3SToby Isaac {
22653e0a2f3SToby Isaac   PetscFunctionBegin;
22753e0a2f3SToby Isaac   hot->handler       = h;
22853e0a2f3SToby Isaac   hot->eventBegin    = h->ops->eventbegin;
22953e0a2f3SToby Isaac   hot->eventEnd      = h->ops->eventend;
23053e0a2f3SToby Isaac   hot->eventSync     = h->ops->eventsync;
23153e0a2f3SToby Isaac   hot->objectCreate  = h->ops->objectcreate;
23253e0a2f3SToby Isaac   hot->objectDestroy = h->ops->objectdestroy;
23353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
23453e0a2f3SToby Isaac }
23553e0a2f3SToby Isaac 
23653e0a2f3SToby Isaac /*@
23753e0a2f3SToby Isaac   PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state.
23853e0a2f3SToby Isaac 
23953e0a2f3SToby Isaac   Logically collective
24053e0a2f3SToby Isaac 
24153e0a2f3SToby Isaac   Input Parameters:
24253e0a2f3SToby Isaac . h - a `PetscLogHandler`
24353e0a2f3SToby Isaac 
24453e0a2f3SToby Isaac   Level: developer
24553e0a2f3SToby Isaac 
24653e0a2f3SToby Isaac   Notes:
24753e0a2f3SToby Isaac   Users should only need this if they create their own log handlers: handlers that are started
24853e0a2f3SToby Isaac   from the command line (such as `-log_view` and `-log_trace`) or from a function like
24953e0a2f3SToby Isaac   `PetscLogNestedBegin()` will automatically be started.
25053e0a2f3SToby Isaac 
25153e0a2f3SToby Isaac   There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time.
25253e0a2f3SToby Isaac 
25353e0a2f3SToby Isaac   To disconnect a handler from the global stream call `PetscLogHandlerStop()`.
25453e0a2f3SToby Isaac 
25553e0a2f3SToby Isaac   When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`,
25653e0a2f3SToby Isaac   will be pushed for the new log handler, but it will not be informed of any events that are
25753e0a2f3SToby Isaac   in progress.  It is recommended to start any user-defined log handlers immediately following
258b8004f34SBarry Smith   `PetscInitialize()`  before any user-defined stages are pushed.
25953e0a2f3SToby Isaac 
260b8004f34SBarry Smith .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()`, `PetscInitialize()`
26153e0a2f3SToby Isaac @*/
26253e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h)
26353e0a2f3SToby Isaac {
26453e0a2f3SToby Isaac   PetscFunctionBegin;
26553e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26653e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS);
26753e0a2f3SToby Isaac   }
26853e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26953e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == NULL) {
27053e0a2f3SToby Isaac       PetscCall(PetscObjectReference((PetscObject)h));
27153e0a2f3SToby Isaac       PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i]));
27253e0a2f3SToby Isaac       if (petsc_log_state) {
27353e0a2f3SToby Isaac         PetscLogStage stack_height;
27453e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
27553e0a2f3SToby Isaac 
27653e0a2f3SToby Isaac         PetscCall(PetscLogHandlerSetState(h, petsc_log_state));
27753e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
27853e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
27953e0a2f3SToby Isaac         orig_stack                     = petsc_log_state->stage_stack;
28053e0a2f3SToby Isaac         petsc_log_state->stage_stack   = temp_stack;
28153e0a2f3SToby Isaac         petsc_log_state->current_stage = -1;
28253e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
28353e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
28453e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePush(h, stage));
28553e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
28653e0a2f3SToby Isaac           petsc_log_state->current_stage = stage;
28753e0a2f3SToby Isaac         }
28853e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
28953e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
29053e0a2f3SToby Isaac       }
29153e0a2f3SToby Isaac       PetscFunctionReturn(PETSC_SUCCESS);
29253e0a2f3SToby Isaac     }
29353e0a2f3SToby Isaac   }
29453e0a2f3SToby Isaac   SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX);
29553e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
29653e0a2f3SToby Isaac }
29753e0a2f3SToby Isaac 
29853e0a2f3SToby Isaac /*@
29953e0a2f3SToby Isaac   PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream.
30053e0a2f3SToby Isaac 
30153e0a2f3SToby Isaac   Logically collective
30253e0a2f3SToby Isaac 
30353e0a2f3SToby Isaac   Input Parameters:
30453e0a2f3SToby Isaac . h - a `PetscLogHandler`
30553e0a2f3SToby Isaac 
30653e0a2f3SToby Isaac   Level: developer
30753e0a2f3SToby Isaac 
30853e0a2f3SToby Isaac   Note:
30953e0a2f3SToby Isaac   After `PetscLogHandlerStop()`, the handler can still access the global logging state
31053e0a2f3SToby Isaac   with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing
31153e0a2f3SToby Isaac   (for instance, in `PetscLogHandlerView()`),
31253e0a2f3SToby Isaac 
31353e0a2f3SToby Isaac   When a log handler is stopped, the remaining stages will be popped before it is
31453e0a2f3SToby Isaac   disconnected from the log stream.
31553e0a2f3SToby Isaac 
31653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()`
31753e0a2f3SToby Isaac @*/
31853e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h)
31953e0a2f3SToby Isaac {
32053e0a2f3SToby Isaac   PetscFunctionBegin;
32153e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
32253e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) {
32353e0a2f3SToby Isaac       if (petsc_log_state) {
32453e0a2f3SToby Isaac         PetscLogState state;
32553e0a2f3SToby Isaac         PetscLogStage stack_height;
32653e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
32753e0a2f3SToby Isaac 
32853e0a2f3SToby Isaac         PetscCall(PetscLogHandlerGetState(h, &state));
32953e0a2f3SToby Isaac         PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started.");
33053e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
33153e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
33253e0a2f3SToby Isaac         orig_stack                   = petsc_log_state->stage_stack;
33353e0a2f3SToby Isaac         petsc_log_state->stage_stack = temp_stack;
33453e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
33553e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
33653e0a2f3SToby Isaac 
33753e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
33853e0a2f3SToby Isaac         }
33953e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
34053e0a2f3SToby Isaac           PetscLogStage stage;
34153e0a2f3SToby Isaac           PetscBool     empty;
34253e0a2f3SToby Isaac 
34353e0a2f3SToby Isaac           PetscCall(PetscIntStackPop(temp_stack, &stage));
34453e0a2f3SToby Isaac           PetscCall(PetscIntStackEmpty(temp_stack, &empty));
34553e0a2f3SToby Isaac           if (!empty) {
34653e0a2f3SToby Isaac             PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage));
34753e0a2f3SToby Isaac           } else petsc_log_state->current_stage = -1;
34853e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePop(h, stage));
34953e0a2f3SToby Isaac         }
35053e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
35153e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
35253e0a2f3SToby Isaac         PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage));
35353e0a2f3SToby Isaac       }
35453e0a2f3SToby Isaac       PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1));
35553e0a2f3SToby Isaac       PetscCall(PetscObjectDereference((PetscObject)h));
35653e0a2f3SToby Isaac     }
35753e0a2f3SToby Isaac   }
35853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
35953e0a2f3SToby Isaac }
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith /*@C
3624dd65854SConnor Ward   PetscLogIsActive - Check if logging is currently in progress.
3634dd65854SConnor Ward 
3644dd65854SConnor Ward   Not Collective
3654dd65854SConnor Ward 
3664dd65854SConnor Ward   Output Parameter:
367811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise
3684dd65854SConnor Ward 
3694dd65854SConnor Ward   Level: beginner
3704dd65854SConnor Ward 
371b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`
3724dd65854SConnor Ward @*/
373d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive)
374d71ae5a4SJacob Faibussowitsch {
3754dd65854SConnor Ward   PetscFunctionBegin;
376b665b14eSToby Isaac   *isActive = PETSC_FALSE;
377b665b14eSToby Isaac   if (petsc_log_state) {
378b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
379b665b14eSToby Isaac       if (PetscLogHandlers[i].handler) {
380b665b14eSToby Isaac         *isActive = PETSC_TRUE;
381b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
382b665b14eSToby Isaac       }
383b665b14eSToby Isaac     }
384b665b14eSToby Isaac   }
385b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
386b665b14eSToby Isaac }
387b665b14eSToby Isaac 
388b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive)
389b665b14eSToby Isaac {
390b665b14eSToby Isaac   PetscFunctionBegin;
391b665b14eSToby Isaac   *isActive = PETSC_FALSE;
392b665b14eSToby Isaac   if (petsc_log_state) {
393b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
394b665b14eSToby Isaac       if (PetscLogHandlers[i].eventBegin) {
395b665b14eSToby Isaac         *isActive = PETSC_TRUE;
396b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
397b665b14eSToby Isaac       }
398b665b14eSToby Isaac     }
399b665b14eSToby Isaac   }
400b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
401b665b14eSToby Isaac }
402b665b14eSToby Isaac 
403b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive)
404b665b14eSToby Isaac {
405b665b14eSToby Isaac   PetscFunctionBegin;
406b665b14eSToby Isaac   *isActive = PETSC_FALSE;
407b665b14eSToby Isaac   if (petsc_log_state) {
408b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
409b665b14eSToby Isaac       if (PetscLogHandlers[i].eventEnd) {
410b665b14eSToby Isaac         *isActive = PETSC_TRUE;
411b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
412b665b14eSToby Isaac       }
413b665b14eSToby Isaac     }
414b665b14eSToby Isaac   }
4153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4164dd65854SConnor Ward }
4174dd65854SConnor Ward 
41861cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type)
41953e0a2f3SToby Isaac {
42053e0a2f3SToby Isaac   PetscLogHandler handler;
42153e0a2f3SToby Isaac 
42253e0a2f3SToby Isaac   PetscFunctionBegin;
42353e0a2f3SToby Isaac   PetscCall(PetscLogTryGetHandler(type, &handler));
42453e0a2f3SToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
42553e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler));
42653e0a2f3SToby Isaac   PetscCall(PetscLogHandlerSetType(handler, type));
42753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
42853e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
42953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
43053e0a2f3SToby Isaac }
43153e0a2f3SToby Isaac 
4324dd65854SConnor Ward /*@C
433b665b14eSToby Isaac   PetscLogDefaultBegin - Turns on logging of objects and events using the default log handler. This logs flop
4345c6c1daeSBarry Smith   rates and object creation and should not slow programs down too much.
4355c6c1daeSBarry Smith   This routine may be called more than once.
4365c6c1daeSBarry Smith 
4378f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
4385c6c1daeSBarry Smith 
439811af0c4SBarry Smith   Options Database Key:
440a2553e36SBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the
441a2553e36SBarry Smith                   screen (for code configured with --with-log=1 (which is the default))
4425c6c1daeSBarry Smith 
44310450e9eSJacob Faibussowitsch   Example Usage:
4445c6c1daeSBarry Smith .vb
4455c6c1daeSBarry Smith       PetscInitialize(...);
446bb1d7374SBarry Smith       PetscLogDefaultBegin();
4475c6c1daeSBarry Smith        ... code ...
4485c6c1daeSBarry Smith       PetscLogView(viewer); or PetscLogDump();
4495c6c1daeSBarry Smith       PetscFinalize();
4505c6c1daeSBarry Smith .ve
4515c6c1daeSBarry Smith 
452d1f92df0SBarry Smith   Level: advanced
453d1f92df0SBarry Smith 
454811af0c4SBarry Smith   Note:
455811af0c4SBarry Smith   `PetscLogView()` or `PetscLogDump()` actually cause the printing of
4565c6c1daeSBarry Smith   the logging information.
4575c6c1daeSBarry Smith 
458b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`
4595c6c1daeSBarry Smith @*/
460d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDefaultBegin(void)
461d71ae5a4SJacob Faibussowitsch {
4625c6c1daeSBarry Smith   PetscFunctionBegin;
463294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERDEFAULT));
4643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4655c6c1daeSBarry Smith }
4665c6c1daeSBarry Smith 
4675c6c1daeSBarry Smith /*@C
468b665b14eSToby Isaac   PetscLogTraceBegin - Begins trace logging.  Every time a PETSc event
4695c6c1daeSBarry Smith   begins or ends, the event name is printed.
4705c6c1daeSBarry Smith 
471811af0c4SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith   Input Parameter:
4745c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout)
4755c6c1daeSBarry Smith 
4765c6c1daeSBarry Smith   Options Database Key:
477b665b14eSToby Isaac . -log_trace [filename] - Begins `PetscLogTraceBegin()`
4785c6c1daeSBarry Smith 
479d1f92df0SBarry Smith   Level: intermediate
480d1f92df0SBarry Smith 
4815c6c1daeSBarry Smith   Notes:
482811af0c4SBarry Smith   `PetscLogTraceBegin()` prints the processor number, the execution time (sec),
4835c6c1daeSBarry Smith   then "Event begin:" or "Event end:" followed by the event name.
4845c6c1daeSBarry Smith 
485811af0c4SBarry Smith   `PetscLogTraceBegin()` allows tracing of all PETSc calls, which is useful
4865c6c1daeSBarry Smith   to determine where a program is hanging without running in the
4875c6c1daeSBarry Smith   debugger.  Can be used in conjunction with the -info option.
4885c6c1daeSBarry Smith 
489b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogDefaultBegin()`
4905c6c1daeSBarry Smith @*/
491d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogTraceBegin(FILE *file)
492d71ae5a4SJacob Faibussowitsch {
493b665b14eSToby Isaac   PetscLogHandler handler;
4944d86920dSPierre Jolivet 
4955c6c1daeSBarry Smith   PetscFunctionBegin;
496294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler));
497b665b14eSToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
498b665b14eSToby Isaac   PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler));
499b665b14eSToby Isaac   PetscCall(PetscLogHandlerStart(handler));
500b665b14eSToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
501b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
502b665b14eSToby Isaac }
503a297a907SKarl Rupp 
504b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *);
505b665b14eSToby Isaac 
506b665b14eSToby Isaac /*@C
507b665b14eSToby Isaac   PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop
508b665b14eSToby Isaac   rates and object creation and should not slow programs down too much.
509b665b14eSToby Isaac 
5108f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
511b665b14eSToby Isaac 
512b665b14eSToby Isaac   Options Database Keys:
513b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
514b665b14eSToby Isaac 
515b665b14eSToby Isaac   Example Usage:
516b665b14eSToby Isaac .vb
517b665b14eSToby Isaac       PetscInitialize(...);
518b665b14eSToby Isaac       PetscLogNestedBegin();
519b665b14eSToby Isaac        ... code ...
520b665b14eSToby Isaac       PetscLogView(viewer);
521b665b14eSToby Isaac       PetscFinalize();
522b665b14eSToby Isaac .ve
523b665b14eSToby Isaac 
524b665b14eSToby Isaac   Level: advanced
525b665b14eSToby Isaac 
526b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`
527b665b14eSToby Isaac @*/
528b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void)
529b665b14eSToby Isaac {
530b665b14eSToby Isaac   PetscFunctionBegin;
531294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED));
5323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5335c6c1daeSBarry Smith }
5345c6c1daeSBarry Smith 
53553e0a2f3SToby Isaac /*@C
53653e0a2f3SToby Isaac   PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks
53753e0a2f3SToby Isaac   matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`,
53853e0a2f3SToby Isaac   `PetscLogPHC`, `PetscLogPHD`.
53953e0a2f3SToby Isaac 
5408f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
54153e0a2f3SToby Isaac 
54253e0a2f3SToby Isaac   Input Parameters:
54353e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`)
54453e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`)
54553e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54653e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54753e0a2f3SToby Isaac 
54853e0a2f3SToby Isaac   Calling sequence of `PetscLogPLB`:
54953e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55053e0a2f3SToby Isaac . _i - deprecated, unused
55153e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
55253e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
55353e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
55453e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
55553e0a2f3SToby Isaac 
55653e0a2f3SToby Isaac   Calling sequence of `PetscLogPLE`:
55753e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55853e0a2f3SToby Isaac . _i - deprecated, unused
55953e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
56053e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
56153e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
56253e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
56353e0a2f3SToby Isaac 
56453e0a2f3SToby Isaac   Calling sequence of `PetscLogPHC`:
56553e0a2f3SToby Isaac . o - a `PetscObject` that has just been created
56653e0a2f3SToby Isaac 
56753e0a2f3SToby Isaac   Calling sequence of `PetscLogPHD`:
56853e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed
56953e0a2f3SToby Isaac 
57053e0a2f3SToby Isaac   Level: advanced
57153e0a2f3SToby Isaac 
57253e0a2f3SToby Isaac   Notes:
57353e0a2f3SToby Isaac   This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code.
57453e0a2f3SToby Isaac 
57553e0a2f3SToby Isaac   This should help migrate external log handlers to use `PetscLogHandler`, but
57653e0a2f3SToby Isaac   callbacks that depend on the deprecated `PetscLogStage` datatype will have to be
57753e0a2f3SToby Isaac   updated.
57853e0a2f3SToby Isaac 
57953e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState`
58053e0a2f3SToby Isaac @*/
58153e0a2f3SToby Isaac PetscErrorCode PetscLogLegacyCallbacksBegin(PetscErrorCode (*PetscLogPLB)(PetscLogEvent e, int _i, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4), PetscErrorCode (*PetscLogPLE)(PetscLogEvent e, int _i, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4), PetscErrorCode (*PetscLogPHC)(PetscObject o), PetscErrorCode (*PetscLogPHD)(PetscObject o))
58253e0a2f3SToby Isaac {
58353e0a2f3SToby Isaac   PetscLogHandler handler;
58453e0a2f3SToby Isaac 
58553e0a2f3SToby Isaac   PetscFunctionBegin;
58653e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler));
58753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
58853e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
58953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
59053e0a2f3SToby Isaac }
59153e0a2f3SToby Isaac 
5922611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
5932611ad71SToby Isaac     #include <mpe.h>
5942611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE;
5952611ad71SToby Isaac   #endif
5962611ad71SToby Isaac 
5972611ad71SToby Isaac /*@C
5982611ad71SToby Isaac   PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the
5992611ad71SToby Isaac   program down.
6002611ad71SToby Isaac 
6018f14a041SBarry Smith   Collective on `PETSC_COMM_WORLD`
6022611ad71SToby Isaac 
6032611ad71SToby Isaac   Options Database Key:
6042611ad71SToby Isaac . -log_mpe - Prints extensive log information
6052611ad71SToby Isaac 
6062611ad71SToby Isaac   Level: advanced
6072611ad71SToby Isaac 
6082611ad71SToby Isaac   Note:
6092611ad71SToby Isaac   A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is
6102611ad71SToby Isaac   intended for production runs since it logs only flop rates and object creation (and should
6112611ad71SToby Isaac   not significantly slow the programs).
6122611ad71SToby Isaac 
613b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`,
6142611ad71SToby Isaac           `PetscLogEventDeactivate()`
6152611ad71SToby Isaac @*/
6162611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void)
6172611ad71SToby Isaac {
6182611ad71SToby Isaac   PetscFunctionBegin;
6192611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
6202611ad71SToby Isaac   /* Do MPE initialization */
6212611ad71SToby Isaac   if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */
6222611ad71SToby Isaac     PetscCall(PetscInfo(0, "Initializing MPE.\n"));
6232611ad71SToby Isaac     PetscCall(MPE_Init_log());
6242611ad71SToby Isaac 
6252611ad71SToby Isaac     PetscBeganMPE = PETSC_TRUE;
6262611ad71SToby Isaac   } else {
6272611ad71SToby Isaac     PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n"));
6282611ad71SToby Isaac   }
629294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE));
6302611ad71SToby Isaac   #else
6312611ad71SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
6322611ad71SToby Isaac   #endif
6332611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6342611ad71SToby Isaac }
6352611ad71SToby Isaac 
63653e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
63753e0a2f3SToby Isaac     #include <../src/sys/perfstubs/timer.h>
63853e0a2f3SToby Isaac   #endif
63953e0a2f3SToby Isaac 
64053e0a2f3SToby Isaac /*@C
64153e0a2f3SToby Isaac   PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface.
64253e0a2f3SToby Isaac 
6438f14a041SBarry Smith   Collective on `PETSC_COMM_WORLD`
64453e0a2f3SToby Isaac 
64553e0a2f3SToby Isaac   Options Database Key:
64653e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface
64753e0a2f3SToby Isaac 
64853e0a2f3SToby Isaac   Level: advanced
64953e0a2f3SToby Isaac 
65053e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()`
65153e0a2f3SToby Isaac @*/
65253e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void)
65353e0a2f3SToby Isaac {
65453e0a2f3SToby Isaac   PetscFunctionBegin;
65553e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
656294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS));
65753e0a2f3SToby Isaac   #else
65853e0a2f3SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs");
65953e0a2f3SToby Isaac   #endif
66053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
66153e0a2f3SToby Isaac }
66253e0a2f3SToby Isaac 
6635c6c1daeSBarry Smith /*@
664b665b14eSToby Isaac   PetscLogActions - Determines whether actions are logged for the default log handler.
6655c6c1daeSBarry Smith 
6665c6c1daeSBarry Smith   Not Collective
6675c6c1daeSBarry Smith 
6685c6c1daeSBarry Smith   Input Parameter:
669811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged
670811af0c4SBarry Smith 
671811af0c4SBarry Smith   Options Database Key:
672b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing
673b665b14eSToby Isaac - -log_include_actions - Turn on action logging
6745c6c1daeSBarry Smith 
6755c6c1daeSBarry Smith   Level: intermediate
6765c6c1daeSBarry Smith 
677811af0c4SBarry Smith   Note:
678811af0c4SBarry Smith   Logging of actions continues to consume more memory as the program
6795c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
680aec76313SJacob Faibussowitsch 
681b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
6825c6c1daeSBarry Smith @*/
683d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag)
684d71ae5a4SJacob Faibussowitsch {
6855c6c1daeSBarry Smith   PetscFunctionBegin;
686dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
687dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
688dff009beSToby Isaac 
689dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag));
690dff009beSToby Isaac   }
6913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6925c6c1daeSBarry Smith }
6935c6c1daeSBarry Smith 
6945c6c1daeSBarry Smith /*@
6955c6c1daeSBarry Smith   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
6965c6c1daeSBarry Smith 
6975c6c1daeSBarry Smith   Not Collective
6985c6c1daeSBarry Smith 
6995c6c1daeSBarry Smith   Input Parameter:
700811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged
701811af0c4SBarry Smith 
702811af0c4SBarry Smith   Options Database Key:
703b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing
704b665b14eSToby Isaac - -log_include_objects - Turns on object logging
7055c6c1daeSBarry Smith 
7065c6c1daeSBarry Smith   Level: intermediate
7075c6c1daeSBarry Smith 
708811af0c4SBarry Smith   Note:
709811af0c4SBarry Smith   Logging of objects continues to consume more memory as the program
7105c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
7115c6c1daeSBarry Smith 
712b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
7135c6c1daeSBarry Smith @*/
714d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag)
715d71ae5a4SJacob Faibussowitsch {
7165c6c1daeSBarry Smith   PetscFunctionBegin;
717dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
718dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
719dff009beSToby Isaac 
720dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag));
721dff009beSToby Isaac   }
7223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7235c6c1daeSBarry Smith }
7245c6c1daeSBarry Smith 
7255c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/
7265c6c1daeSBarry Smith /*@C
72774c0405dSRichard Tran Mills   PetscLogStageRegister - Attaches a character string name to a logging stage.
7285c6c1daeSBarry Smith 
7295c6c1daeSBarry Smith   Not Collective
7305c6c1daeSBarry Smith 
7315c6c1daeSBarry Smith   Input Parameter:
7325c6c1daeSBarry Smith . sname - The name to associate with that stage
7335c6c1daeSBarry Smith 
7345c6c1daeSBarry Smith   Output Parameter:
735b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`).
7365c6c1daeSBarry Smith 
7375c6c1daeSBarry Smith   Level: intermediate
7385c6c1daeSBarry Smith 
739d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`
7405c6c1daeSBarry Smith @*/
741d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage)
742d71ae5a4SJacob Faibussowitsch {
743b665b14eSToby Isaac   PetscLogState state;
7445c6c1daeSBarry Smith 
7455c6c1daeSBarry Smith   PetscFunctionBegin;
746b665b14eSToby Isaac   *stage = -1;
747b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
748b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage));
7493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7505c6c1daeSBarry Smith }
7515c6c1daeSBarry Smith 
7525c6c1daeSBarry Smith /*@C
753811af0c4SBarry Smith   PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage
7545c6c1daeSBarry Smith 
7555c6c1daeSBarry Smith   Not Collective
7565c6c1daeSBarry Smith 
7575c6c1daeSBarry Smith   Input Parameter:
7585c6c1daeSBarry Smith . stage - The stage on which to log
7595c6c1daeSBarry Smith 
76010450e9eSJacob Faibussowitsch   Example Usage:
761811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
7625c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
7635c6c1daeSBarry Smith   PetscFinalize().
7645c6c1daeSBarry Smith .vb
7655c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
7665c6c1daeSBarry Smith       [stage 0 of code]
7675c6c1daeSBarry Smith       PetscLogStagePush(1);
7685c6c1daeSBarry Smith       [stage 1 of code]
7695c6c1daeSBarry Smith       PetscLogStagePop();
7705c6c1daeSBarry Smith       PetscBarrier(...);
7715c6c1daeSBarry Smith       [more stage 0 of code]
7725c6c1daeSBarry Smith       PetscFinalize();
7735c6c1daeSBarry Smith .ve
7745c6c1daeSBarry Smith 
775d1f92df0SBarry Smith   Level: intermediate
776d1f92df0SBarry Smith 
777811af0c4SBarry Smith   Note:
778811af0c4SBarry Smith   Use `PetscLogStageRegister()` to register a stage.
7795c6c1daeSBarry Smith 
780d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()`
7815c6c1daeSBarry Smith @*/
782d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage)
783d71ae5a4SJacob Faibussowitsch {
784b665b14eSToby Isaac   PetscLogState state;
7855c6c1daeSBarry Smith 
7865c6c1daeSBarry Smith   PetscFunctionBegin;
787b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
788b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
789b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
790b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
791b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePush(h, stage));
792b665b14eSToby Isaac   }
793b665b14eSToby Isaac   PetscCall(PetscLogStateStagePush(state, stage));
7943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7955c6c1daeSBarry Smith }
7965c6c1daeSBarry Smith 
7975c6c1daeSBarry Smith /*@C
798811af0c4SBarry Smith   PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()`
7995c6c1daeSBarry Smith 
8005c6c1daeSBarry Smith   Not Collective
8015c6c1daeSBarry Smith 
80210450e9eSJacob Faibussowitsch   Example Usage:
803811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
8045c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
8055c6c1daeSBarry Smith   PetscFinalize().
8065c6c1daeSBarry Smith .vb
8075c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
8085c6c1daeSBarry Smith       [stage 0 of code]
8095c6c1daeSBarry Smith       PetscLogStagePush(1);
8105c6c1daeSBarry Smith       [stage 1 of code]
8115c6c1daeSBarry Smith       PetscLogStagePop();
8125c6c1daeSBarry Smith       PetscBarrier(...);
8135c6c1daeSBarry Smith       [more stage 0 of code]
8145c6c1daeSBarry Smith       PetscFinalize();
8155c6c1daeSBarry Smith .ve
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith   Level: intermediate
8185c6c1daeSBarry Smith 
819d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()`
8205c6c1daeSBarry Smith @*/
821d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void)
822d71ae5a4SJacob Faibussowitsch {
823b665b14eSToby Isaac   PetscLogState state;
824b665b14eSToby Isaac   PetscLogStage current_stage;
8255c6c1daeSBarry Smith 
8265c6c1daeSBarry Smith   PetscFunctionBegin;
827b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
828b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
829b665b14eSToby Isaac   current_stage = state->current_stage;
830b665b14eSToby Isaac   PetscCall(PetscLogStateStagePop(state));
831b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
832b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
833b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage));
834b665b14eSToby Isaac   }
8353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8365c6c1daeSBarry Smith }
8375c6c1daeSBarry Smith 
8385c6c1daeSBarry Smith /*@
839811af0c4SBarry Smith   PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8405c6c1daeSBarry Smith 
8415c6c1daeSBarry Smith   Not Collective
8425c6c1daeSBarry Smith 
8435c6c1daeSBarry Smith   Input Parameters:
8445c6c1daeSBarry Smith + stage    - The stage
845811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8465c6c1daeSBarry Smith 
8475c6c1daeSBarry Smith   Level: intermediate
8485c6c1daeSBarry Smith 
849811af0c4SBarry Smith   Note:
850811af0c4SBarry Smith   If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist
851811af0c4SBarry Smith 
852d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8535c6c1daeSBarry Smith @*/
854d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive)
855d71ae5a4SJacob Faibussowitsch {
856b665b14eSToby Isaac   PetscLogState state;
8575c6c1daeSBarry Smith 
8585c6c1daeSBarry Smith   PetscFunctionBegin;
859b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
860b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive));
8613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8625c6c1daeSBarry Smith }
8635c6c1daeSBarry Smith 
8645c6c1daeSBarry Smith /*@
865811af0c4SBarry Smith   PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8665c6c1daeSBarry Smith 
8675c6c1daeSBarry Smith   Not Collective
8685c6c1daeSBarry Smith 
8695c6c1daeSBarry Smith   Input Parameter:
8705c6c1daeSBarry Smith . stage - The stage
8715c6c1daeSBarry Smith 
8725c6c1daeSBarry Smith   Output Parameter:
873811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8745c6c1daeSBarry Smith 
8755c6c1daeSBarry Smith   Level: intermediate
8765c6c1daeSBarry Smith 
877d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8785c6c1daeSBarry Smith @*/
879d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive)
880d71ae5a4SJacob Faibussowitsch {
881b665b14eSToby Isaac   PetscLogState state;
8825c6c1daeSBarry Smith 
8835c6c1daeSBarry Smith   PetscFunctionBegin;
884b665b14eSToby Isaac   *isActive = PETSC_FALSE;
885b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
886b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive));
8873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8885c6c1daeSBarry Smith }
8895c6c1daeSBarry Smith 
8905c6c1daeSBarry Smith /*@
891811af0c4SBarry Smith   PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()`
8925c6c1daeSBarry Smith 
8935c6c1daeSBarry Smith   Not Collective
8945c6c1daeSBarry Smith 
8955c6c1daeSBarry Smith   Input Parameters:
8965c6c1daeSBarry Smith + stage     - The stage
897811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8985c6c1daeSBarry Smith 
8995c6c1daeSBarry Smith   Level: intermediate
9005c6c1daeSBarry Smith 
901aec76313SJacob Faibussowitsch   Developer Notes:
902b665b14eSToby Isaac   Visibility only affects the default log handler in `PetscLogView()`: stages that are
903b665b14eSToby Isaac   set to invisible are suppressed from output.
904811af0c4SBarry Smith 
905b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9065c6c1daeSBarry Smith @*/
907d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible)
9085c6c1daeSBarry Smith 
909dff009beSToby Isaac {
9105c6c1daeSBarry Smith   PetscFunctionBegin;
911dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
912dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
913dff009beSToby Isaac 
914dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible));
915dff009beSToby Isaac   }
9163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9175c6c1daeSBarry Smith }
9185c6c1daeSBarry Smith 
9195c6c1daeSBarry Smith /*@
920811af0c4SBarry Smith   PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()`
9215c6c1daeSBarry Smith 
9225c6c1daeSBarry Smith   Not Collective
9235c6c1daeSBarry Smith 
9245c6c1daeSBarry Smith   Input Parameter:
9255c6c1daeSBarry Smith . stage - The stage
9265c6c1daeSBarry Smith 
9275c6c1daeSBarry Smith   Output Parameter:
928811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9295c6c1daeSBarry Smith 
9305c6c1daeSBarry Smith   Level: intermediate
9315c6c1daeSBarry Smith 
932b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9335c6c1daeSBarry Smith @*/
934d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible)
935d71ae5a4SJacob Faibussowitsch {
936b665b14eSToby Isaac   PetscLogHandler handler;
9375c6c1daeSBarry Smith 
9385c6c1daeSBarry Smith   PetscFunctionBegin;
939b665b14eSToby Isaac   *isVisible = PETSC_FALSE;
940294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
941dff009beSToby Isaac   if (handler) { PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible)); }
9423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9435c6c1daeSBarry Smith }
9445c6c1daeSBarry Smith 
9455c6c1daeSBarry Smith /*@C
9465c6c1daeSBarry Smith   PetscLogStageGetId - Returns the stage id when given the stage name.
9475c6c1daeSBarry Smith 
9485c6c1daeSBarry Smith   Not Collective
9495c6c1daeSBarry Smith 
9505c6c1daeSBarry Smith   Input Parameter:
9515c6c1daeSBarry Smith . name - The stage name
9525c6c1daeSBarry Smith 
9535c6c1daeSBarry Smith   Output Parameter:
9545a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists
9555c6c1daeSBarry Smith 
9565c6c1daeSBarry Smith   Level: intermediate
9575c6c1daeSBarry Smith 
958d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
9595c6c1daeSBarry Smith @*/
960d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage)
961d71ae5a4SJacob Faibussowitsch {
962b665b14eSToby Isaac   PetscLogState state;
9635c6c1daeSBarry Smith 
9645c6c1daeSBarry Smith   PetscFunctionBegin;
965b665b14eSToby Isaac   *stage = -1;
966b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
967b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage));
9683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9695c6c1daeSBarry Smith }
9705c6c1daeSBarry Smith 
97153e0a2f3SToby Isaac /*@C
97253e0a2f3SToby Isaac   PetscLogStageGetName - Returns the stage name when given the stage id.
97353e0a2f3SToby Isaac 
97453e0a2f3SToby Isaac   Not Collective
97553e0a2f3SToby Isaac 
97653e0a2f3SToby Isaac   Input Parameter:
97753e0a2f3SToby Isaac . stage - The stage
97853e0a2f3SToby Isaac 
97953e0a2f3SToby Isaac   Output Parameter:
98053e0a2f3SToby Isaac . name - The stage name
98153e0a2f3SToby Isaac 
98253e0a2f3SToby Isaac   Level: intermediate
98353e0a2f3SToby Isaac 
98453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
98553e0a2f3SToby Isaac @*/
98653e0a2f3SToby Isaac PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char **name)
98753e0a2f3SToby Isaac {
98853e0a2f3SToby Isaac   PetscLogStageInfo stage_info;
98953e0a2f3SToby Isaac   PetscLogState     state;
99053e0a2f3SToby Isaac 
99153e0a2f3SToby Isaac   PetscFunctionBegin;
992b665b14eSToby Isaac   *name = NULL;
99353e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
994b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
99553e0a2f3SToby Isaac   PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info));
99653e0a2f3SToby Isaac   *name = stage_info.name;
99753e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
99853e0a2f3SToby Isaac }
99953e0a2f3SToby Isaac 
10005c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/
10017a101e5eSJacob Faibussowitsch 
10025c6c1daeSBarry Smith /*@C
1003811af0c4SBarry Smith   PetscLogEventRegister - Registers an event name for logging operations
10045c6c1daeSBarry Smith 
10055c6c1daeSBarry Smith   Not Collective
10065c6c1daeSBarry Smith 
1007d8d19677SJose E. Roman   Input Parameters:
10085c6c1daeSBarry Smith + name    - The name associated with the event
10095c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with
1010811af0c4SBarry Smith            `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones
10115c6c1daeSBarry Smith            are only available in C code
10125c6c1daeSBarry Smith 
10135c6c1daeSBarry Smith   Output Parameter:
1014811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`.
10155c6c1daeSBarry Smith 
101610450e9eSJacob Faibussowitsch   Example Usage:
10175c6c1daeSBarry Smith .vb
10185c6c1daeSBarry Smith       PetscLogEvent USER_EVENT;
10195c6c1daeSBarry Smith       PetscClassId classid;
10205c6c1daeSBarry Smith       PetscLogDouble user_event_flops;
10215c6c1daeSBarry Smith       PetscClassIdRegister("class name",&classid);
10225c6c1daeSBarry Smith       PetscLogEventRegister("User event name",classid,&USER_EVENT);
10235c6c1daeSBarry Smith       PetscLogEventBegin(USER_EVENT,0,0,0,0);
10245c6c1daeSBarry Smith          [code segment to monitor]
10255c6c1daeSBarry Smith          PetscLogFlops(user_event_flops);
10265c6c1daeSBarry Smith       PetscLogEventEnd(USER_EVENT,0,0,0,0);
10275c6c1daeSBarry Smith .ve
10285c6c1daeSBarry Smith 
1029d1f92df0SBarry Smith   Level: intermediate
1030d1f92df0SBarry Smith 
10315c6c1daeSBarry Smith   Notes:
10325c6c1daeSBarry Smith   PETSc automatically logs library events if the code has been
1033a2553e36SBarry Smith   configured with --with-log (which is the default) and
1034811af0c4SBarry Smith   -log_view or -log_all is specified.  `PetscLogEventRegister()` is
10355c6c1daeSBarry Smith   intended for logging user events to supplement this PETSc
10365c6c1daeSBarry Smith   information.
10375c6c1daeSBarry Smith 
1038495fc317SBarry Smith   PETSc can gather data for use with the utilities Jumpshot
10395c6c1daeSBarry Smith   (part of the MPICH distribution).  If PETSc has been compiled
10405c6c1daeSBarry Smith   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
10415c6c1daeSBarry Smith   MPICH), the user can employ another command line option, -log_mpe,
10425c6c1daeSBarry Smith   to create a logfile, "mpe.log", which can be visualized
1043495fc317SBarry Smith   Jumpshot.
10445c6c1daeSBarry Smith 
10455c6c1daeSBarry Smith   The classid is associated with each event so that classes of events
10465c6c1daeSBarry Smith   can be disabled simultaneously, such as all matrix events. The user
1047811af0c4SBarry Smith   can either use an existing classid, such as `MAT_CLASSID`, or create
10485c6c1daeSBarry Smith   their own as shown in the example.
10495c6c1daeSBarry Smith 
1050c5deb1d5SJed Brown   If an existing event with the same name exists, its event handle is
1051c5deb1d5SJed Brown   returned instead of creating a new event.
1052c5deb1d5SJed Brown 
1053d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`,
1054db781477SPatrick Sanan           `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()`
10555c6c1daeSBarry Smith @*/
1056d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event)
1057d71ae5a4SJacob Faibussowitsch {
1058b665b14eSToby Isaac   PetscLogState state;
10595c6c1daeSBarry Smith 
10605c6c1daeSBarry Smith   PetscFunctionBegin;
1061b665b14eSToby Isaac   *event = -1;
1062b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1063b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event));
10643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10655c6c1daeSBarry Smith }
10665c6c1daeSBarry Smith 
10675c6c1daeSBarry Smith /*@
1068217044c2SLisandro Dalcin   PetscLogEventSetCollective - Indicates that a particular event is collective.
1069217044c2SLisandro Dalcin 
10705aefd447SStefano Zampini   Logically Collective
1071217044c2SLisandro Dalcin 
1072d8d19677SJose E. Roman   Input Parameters:
1073217044c2SLisandro Dalcin + event      - The event id
1074d5b43468SJose E. Roman - collective - Boolean flag indicating whether a particular event is collective
1075217044c2SLisandro Dalcin 
1076d1f92df0SBarry Smith   Level: developer
1077d1f92df0SBarry Smith 
1078811af0c4SBarry Smith   Notes:
1079811af0c4SBarry Smith   New events returned from `PetscLogEventRegister()` are collective by default.
1080811af0c4SBarry Smith 
10815aefd447SStefano Zampini   Collective events are handled specially if the command line option -log_sync is used. In that case the logging saves information about
1082811af0c4SBarry Smith   two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication
10835aefd447SStefano Zampini   to be performed. This option is useful to debug imbalance within the computations or communications.
1084217044c2SLisandro Dalcin 
1085d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()`
1086217044c2SLisandro Dalcin @*/
1087d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective)
1088d71ae5a4SJacob Faibussowitsch {
1089b665b14eSToby Isaac   PetscLogState state;
1090217044c2SLisandro Dalcin 
1091217044c2SLisandro Dalcin   PetscFunctionBegin;
1092b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1093b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective));
1094b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1095b665b14eSToby Isaac }
1096b665b14eSToby Isaac 
1097b665b14eSToby Isaac /*
1098b665b14eSToby Isaac   PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage.
1099b665b14eSToby Isaac 
1100b665b14eSToby Isaac   Not Collective
1101b665b14eSToby Isaac 
1102b665b14eSToby Isaac   Input Parameters:
1103b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1104b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers.
1105b665b14eSToby Isaac 
1106b665b14eSToby Isaac   Level: developer
1107b665b14eSToby Isaac 
1108b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()`
1109b665b14eSToby Isaac */
1110b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive)
1111b665b14eSToby Isaac {
1112b665b14eSToby Isaac   PetscLogState state;
1113b665b14eSToby Isaac 
1114b665b14eSToby Isaac   PetscFunctionBegin;
1115b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1116b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive));
11173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1118217044c2SLisandro Dalcin }
1119217044c2SLisandro Dalcin 
1120217044c2SLisandro Dalcin /*@
1121fa2bb9feSLisandro Dalcin   PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage.
1122fa2bb9feSLisandro Dalcin 
1123fa2bb9feSLisandro Dalcin   Not Collective
1124fa2bb9feSLisandro Dalcin 
1125fa2bb9feSLisandro Dalcin   Input Parameter:
1126811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1127fa2bb9feSLisandro Dalcin 
1128fa2bb9feSLisandro Dalcin   Level: developer
1129fa2bb9feSLisandro Dalcin 
1130d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
1131fa2bb9feSLisandro Dalcin @*/
1132d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid)
1133d71ae5a4SJacob Faibussowitsch {
1134fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1135b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE));
11363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1137fa2bb9feSLisandro Dalcin }
1138fa2bb9feSLisandro Dalcin 
1139fa2bb9feSLisandro Dalcin /*@
1140fa2bb9feSLisandro Dalcin   PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage.
1141fa2bb9feSLisandro Dalcin 
1142fa2bb9feSLisandro Dalcin   Not Collective
1143fa2bb9feSLisandro Dalcin 
1144fa2bb9feSLisandro Dalcin   Input Parameter:
1145811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1146fa2bb9feSLisandro Dalcin 
1147fa2bb9feSLisandro Dalcin   Level: developer
1148fa2bb9feSLisandro Dalcin 
1149811af0c4SBarry Smith   Note:
1150811af0c4SBarry Smith   If a class is excluded then events associated with that class are not logged.
1151811af0c4SBarry Smith 
1152d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()`
1153fa2bb9feSLisandro Dalcin @*/
1154d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid)
1155d71ae5a4SJacob Faibussowitsch {
1156b665b14eSToby Isaac   PetscFunctionBegin;
1157b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE));
1158b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1159b665b14eSToby Isaac }
1160b665b14eSToby Isaac 
1161b665b14eSToby Isaac /*
1162b665b14eSToby Isaac   PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage
1163b665b14eSToby Isaac 
1164b665b14eSToby Isaac   Not Collective
1165b665b14eSToby Isaac 
1166b665b14eSToby Isaac   Input Parameters:
1167b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1168b665b14eSToby Isaac . event - A `PetscLogEvent`
1169b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage
1170b665b14eSToby Isaac 
1171b665b14eSToby Isaac   Usage:
1172b665b14eSToby Isaac .vb
1173b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE);
1174b665b14eSToby Isaac         [code where you do not want to log VecSetValues()]
1175b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE);
1176b665b14eSToby Isaac         [code where you do want to log VecSetValues()]
1177b665b14eSToby Isaac .ve
1178b665b14eSToby Isaac 
1179b665b14eSToby Isaac   Level: advanced
1180b665b14eSToby Isaac 
1181b665b14eSToby Isaac   Note:
1182b665b14eSToby Isaac   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1183b665b14eSToby Isaac   or an event number obtained with `PetscLogEventRegister()`.
1184b665b14eSToby Isaac 
1185b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
1186b665b14eSToby Isaac */
1187b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
1188b665b14eSToby Isaac {
1189b665b14eSToby Isaac   PetscLogState state;
1190fa2bb9feSLisandro Dalcin 
1191fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1192b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1193b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive));
11943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1195fa2bb9feSLisandro Dalcin }
1196fa2bb9feSLisandro Dalcin 
1197fa2bb9feSLisandro Dalcin /*@
11985c6c1daeSBarry Smith   PetscLogEventActivate - Indicates that a particular event should be logged.
11995c6c1daeSBarry Smith 
12005c6c1daeSBarry Smith   Not Collective
12015c6c1daeSBarry Smith 
12025c6c1daeSBarry Smith   Input Parameter:
12035c6c1daeSBarry Smith . event - The event id
12045c6c1daeSBarry Smith 
120510450e9eSJacob Faibussowitsch   Example Usage:
12065c6c1daeSBarry Smith .vb
12075c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12085c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12095c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12105c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12115c6c1daeSBarry Smith .ve
12125c6c1daeSBarry Smith 
1213d1f92df0SBarry Smith   Level: advanced
1214d1f92df0SBarry Smith 
12155c6c1daeSBarry Smith   Note:
12165c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1217811af0c4SBarry Smith   or an event number obtained with `PetscLogEventRegister()`.
12185c6c1daeSBarry Smith 
1219b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12205c6c1daeSBarry Smith @*/
1221d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event)
1222d71ae5a4SJacob Faibussowitsch {
12235c6c1daeSBarry Smith   PetscFunctionBegin;
1224b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE));
12253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12265c6c1daeSBarry Smith }
12275c6c1daeSBarry Smith 
12285c6c1daeSBarry Smith /*@
12295c6c1daeSBarry Smith   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
12305c6c1daeSBarry Smith 
12315c6c1daeSBarry Smith   Not Collective
12325c6c1daeSBarry Smith 
12335c6c1daeSBarry Smith   Input Parameter:
12345c6c1daeSBarry Smith . event - The event id
12355c6c1daeSBarry Smith 
123610450e9eSJacob Faibussowitsch   Example Usage:
12375c6c1daeSBarry Smith .vb
12385c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12395c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12405c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12415c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12425c6c1daeSBarry Smith .ve
12435c6c1daeSBarry Smith 
1244d1f92df0SBarry Smith   Level: advanced
1245d1f92df0SBarry Smith 
12465c6c1daeSBarry Smith   Note:
12475c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in
1248811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
12495c6c1daeSBarry Smith 
1250d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12515c6c1daeSBarry Smith @*/
1252d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event)
1253d71ae5a4SJacob Faibussowitsch {
12545c6c1daeSBarry Smith   PetscFunctionBegin;
1255b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE));
12563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12575c6c1daeSBarry Smith }
12585c6c1daeSBarry Smith 
12595c6c1daeSBarry Smith /*@
1260811af0c4SBarry Smith   PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called
1261c00cb57fSBarry Smith 
1262c00cb57fSBarry Smith   Not Collective
1263c00cb57fSBarry Smith 
1264c00cb57fSBarry Smith   Input Parameter:
1265c00cb57fSBarry Smith . event - The event id
1266c00cb57fSBarry Smith 
126710450e9eSJacob Faibussowitsch   Example Usage:
1268c00cb57fSBarry Smith .vb
1269c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1270c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1271c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1272c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1273c00cb57fSBarry Smith .ve
1274c00cb57fSBarry Smith 
1275d1f92df0SBarry Smith   Level: advanced
1276d1f92df0SBarry Smith 
1277c00cb57fSBarry Smith   Note:
1278c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1279811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1280c00cb57fSBarry Smith 
1281baca6076SPierre Jolivet   PETSc's default log handler (`PetscLogDefaultBegin()`) respects this function because it can make the output of `PetscLogView()` easier to interpret, but other handlers (such as the nested handler, `PetscLogNestedBegin()`) ignore it because suppressing events is not helpful in their output formats.
1282b665b14eSToby Isaac 
12834b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePop()`
1284c00cb57fSBarry Smith @*/
1285d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event)
1286d71ae5a4SJacob Faibussowitsch {
1287c00cb57fSBarry Smith   PetscFunctionBegin;
1288dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1289dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1290dff009beSToby Isaac 
1291dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event));
1292dff009beSToby Isaac   }
12933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1294c00cb57fSBarry Smith }
1295c00cb57fSBarry Smith 
1296c00cb57fSBarry Smith /*@
1297811af0c4SBarry Smith   PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()`
1298c00cb57fSBarry Smith 
1299c00cb57fSBarry Smith   Not Collective
1300c00cb57fSBarry Smith 
1301c00cb57fSBarry Smith   Input Parameter:
1302c00cb57fSBarry Smith . event - The event id
1303c00cb57fSBarry Smith 
130410450e9eSJacob Faibussowitsch   Example Usage:
1305c00cb57fSBarry Smith .vb
1306c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1307c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1308c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1309c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1310c00cb57fSBarry Smith .ve
1311c00cb57fSBarry Smith 
1312d1f92df0SBarry Smith   Level: advanced
1313d1f92df0SBarry Smith 
1314c00cb57fSBarry Smith   Note:
1315c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1316811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1317c00cb57fSBarry Smith 
1318d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`
1319c00cb57fSBarry Smith @*/
1320d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event)
1321d71ae5a4SJacob Faibussowitsch {
1322c00cb57fSBarry Smith   PetscFunctionBegin;
1323dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1324dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1325dff009beSToby Isaac 
1326dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event));
1327dff009beSToby Isaac   }
13283ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1329c00cb57fSBarry Smith }
1330c00cb57fSBarry Smith 
1331c00cb57fSBarry Smith /*@
1332811af0c4SBarry Smith   PetscLogEventSetActiveAll - Turns on logging of all events
13335c6c1daeSBarry Smith 
13345c6c1daeSBarry Smith   Not Collective
13355c6c1daeSBarry Smith 
13365c6c1daeSBarry Smith   Input Parameters:
13375c6c1daeSBarry Smith + event    - The event id
13385c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged
13395c6c1daeSBarry Smith 
13405c6c1daeSBarry Smith   Level: advanced
13415c6c1daeSBarry Smith 
1342b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13435c6c1daeSBarry Smith @*/
1344d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive)
1345d71ae5a4SJacob Faibussowitsch {
1346b665b14eSToby Isaac   PetscLogState state;
13475c6c1daeSBarry Smith 
13485c6c1daeSBarry Smith   PetscFunctionBegin;
1349b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1350b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive));
1351b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13525c6c1daeSBarry Smith }
1353b665b14eSToby Isaac 
1354b665b14eSToby Isaac /*
1355b665b14eSToby Isaac   PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage
1356b665b14eSToby Isaac 
1357b665b14eSToby Isaac   Not Collective
1358b665b14eSToby Isaac 
1359b665b14eSToby Isaac   Input Parameters:
1360b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1361b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1362b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers.
1363b665b14eSToby Isaac 
1364b665b14eSToby Isaac   Level: developer
1365b665b14eSToby Isaac 
1366b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`
1367b665b14eSToby Isaac */
1368b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive)
1369b665b14eSToby Isaac {
1370b665b14eSToby Isaac   PetscLogState state;
1371b665b14eSToby Isaac 
1372b665b14eSToby Isaac   PetscFunctionBegin;
1373b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1374b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive));
13753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13765c6c1daeSBarry Smith }
13775c6c1daeSBarry Smith 
13785c6c1daeSBarry Smith /*@
1379811af0c4SBarry Smith   PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage
13805c6c1daeSBarry Smith 
13815c6c1daeSBarry Smith   Not Collective
13825c6c1daeSBarry Smith 
13835c6c1daeSBarry Smith   Input Parameter:
1384811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
13855c6c1daeSBarry Smith 
13865c6c1daeSBarry Smith   Level: developer
13875c6c1daeSBarry Smith 
1388d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13895c6c1daeSBarry Smith @*/
1390d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid)
1391d71ae5a4SJacob Faibussowitsch {
13925c6c1daeSBarry Smith   PetscFunctionBegin;
1393b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE));
13943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13955c6c1daeSBarry Smith }
13965c6c1daeSBarry Smith 
13975c6c1daeSBarry Smith /*@
1398811af0c4SBarry Smith   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage
13995c6c1daeSBarry Smith 
14005c6c1daeSBarry Smith   Not Collective
14015c6c1daeSBarry Smith 
14025c6c1daeSBarry Smith   Input Parameter:
1403811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
14045c6c1daeSBarry Smith 
14055c6c1daeSBarry Smith   Level: developer
14065c6c1daeSBarry Smith 
1407d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
14085c6c1daeSBarry Smith @*/
1409d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid)
1410d71ae5a4SJacob Faibussowitsch {
14115c6c1daeSBarry Smith   PetscFunctionBegin;
1412b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE));
14133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
14145c6c1daeSBarry Smith }
14155c6c1daeSBarry Smith 
14165c6c1daeSBarry Smith /*MC
141762872c28SLisandro Dalcin   PetscLogEventSync - Synchronizes the beginning of a user event.
141862872c28SLisandro Dalcin 
141962872c28SLisandro Dalcin   Synopsis:
142062872c28SLisandro Dalcin   #include <petsclog.h>
1421b665b14eSToby Isaac   PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm)
142262872c28SLisandro Dalcin 
142362872c28SLisandro Dalcin   Collective
142462872c28SLisandro Dalcin 
142562872c28SLisandro Dalcin   Input Parameters:
1426b665b14eSToby Isaac + e    - `PetscLogEvent` obtained from `PetscLogEventRegister()`
142762872c28SLisandro Dalcin - comm - an MPI communicator
142862872c28SLisandro Dalcin 
142910450e9eSJacob Faibussowitsch   Example Usage:
143062872c28SLisandro Dalcin .vb
143162872c28SLisandro Dalcin   PetscLogEvent USER_EVENT;
143210450e9eSJacob Faibussowitsch 
143362872c28SLisandro Dalcin   PetscLogEventRegister("User event", 0, &USER_EVENT);
143462872c28SLisandro Dalcin   PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD);
143562872c28SLisandro Dalcin   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
143662872c28SLisandro Dalcin   [code segment to monitor]
143762872c28SLisandro Dalcin   PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0);
143862872c28SLisandro Dalcin .ve
143962872c28SLisandro Dalcin 
1440d1f92df0SBarry Smith   Level: developer
1441d1f92df0SBarry Smith 
1442811af0c4SBarry Smith   Note:
144310450e9eSJacob Faibussowitsch   This routine should be called only if there is not a `PetscObject` available to pass to
144410450e9eSJacob Faibussowitsch   `PetscLogEventBegin()`.
144562872c28SLisandro Dalcin 
1446d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`
144762872c28SLisandro Dalcin M*/
144862872c28SLisandro Dalcin 
144962872c28SLisandro Dalcin /*MC
14505c6c1daeSBarry Smith   PetscLogEventBegin - Logs the beginning of a user event.
14515c6c1daeSBarry Smith 
14525c6c1daeSBarry Smith   Synopsis:
1453aaa7dc30SBarry Smith   #include <petsclog.h>
1454b665b14eSToby Isaac   PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14555c6c1daeSBarry Smith 
14565c6c1daeSBarry Smith   Not Collective
14575c6c1daeSBarry Smith 
14585c6c1daeSBarry Smith   Input Parameters:
1459b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1460baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1461baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1462baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1463baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
14645c6c1daeSBarry Smith 
14655c6c1daeSBarry Smith   Fortran Synopsis:
14665c6c1daeSBarry Smith   void PetscLogEventBegin(int e, PetscErrorCode ierr)
14675c6c1daeSBarry Smith 
146810450e9eSJacob Faibussowitsch   Example Usage:
14695c6c1daeSBarry Smith .vb
14705c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
147110450e9eSJacob Faibussowitsch 
14725c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
14735c6c1daeSBarry Smith   PetscLogEventRegister("User event",0, &USER_EVENT);
14745c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
14755c6c1daeSBarry Smith   [code segment to monitor]
14765c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
14775c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
14785c6c1daeSBarry Smith .ve
14795c6c1daeSBarry Smith 
1480d1f92df0SBarry Smith   Level: intermediate
1481d1f92df0SBarry Smith 
1482811af0c4SBarry Smith   Developer Note:
148310450e9eSJacob Faibussowitsch   `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly
148410450e9eSJacob Faibussowitsch   handling the errors that occur in the macro directly because other packages that use this
148510450e9eSJacob Faibussowitsch   macros have used them in their own functions or methods that do not return error codes and it
148610450e9eSJacob Faibussowitsch   would be disruptive to change the current behavior.
1487d0609cedSBarry Smith 
1488d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()`
14895c6c1daeSBarry Smith M*/
14905c6c1daeSBarry Smith 
14915c6c1daeSBarry Smith /*MC
14925c6c1daeSBarry Smith   PetscLogEventEnd - Log the end of a user event.
14935c6c1daeSBarry Smith 
14945c6c1daeSBarry Smith   Synopsis:
1495aaa7dc30SBarry Smith   #include <petsclog.h>
1496b665b14eSToby Isaac   PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14975c6c1daeSBarry Smith 
14985c6c1daeSBarry Smith   Not Collective
14995c6c1daeSBarry Smith 
15005c6c1daeSBarry Smith   Input Parameters:
1501b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1502baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1503baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1504baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1505baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
15065c6c1daeSBarry Smith 
15075c6c1daeSBarry Smith   Fortran Synopsis:
15085c6c1daeSBarry Smith   void PetscLogEventEnd(int e, PetscErrorCode ierr)
15095c6c1daeSBarry Smith 
151010450e9eSJacob Faibussowitsch   Example Usage:
15115c6c1daeSBarry Smith .vb
15125c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
151310450e9eSJacob Faibussowitsch 
15145c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
151510450e9eSJacob Faibussowitsch   PetscLogEventRegister("User event", 0, &USER_EVENT);
15165c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
15175c6c1daeSBarry Smith   [code segment to monitor]
15185c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
15195c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
15205c6c1daeSBarry Smith .ve
15215c6c1daeSBarry Smith 
15225c6c1daeSBarry Smith   Level: intermediate
15235c6c1daeSBarry Smith 
1524d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()`
15255c6c1daeSBarry Smith M*/
15265c6c1daeSBarry Smith 
15275c6c1daeSBarry Smith /*@C
15288b08f494SToby Isaac   PetscLogStageGetPerfInfo - Return the performance information about the given stage
15298b08f494SToby Isaac 
15308b08f494SToby Isaac   Input Parameters:
15318b08f494SToby Isaac . stage - The stage number or `PETSC_DETERMINE` for the current stage
15328b08f494SToby Isaac 
15338b08f494SToby Isaac   Output Parameter:
15348b08f494SToby Isaac . info - This structure is filled with the performance information
15358b08f494SToby Isaac 
15368b08f494SToby Isaac   Level: intermediate
15378b08f494SToby Isaac 
15388b08f494SToby Isaac   Notes:
15398b08f494SToby Isaac   This is a low level routine used by the logging functions in PETSc.
15408b08f494SToby Isaac 
15418b08f494SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15425804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15430ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15448b08f494SToby Isaac 
15458b08f494SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
15468b08f494SToby Isaac @*/
15478b08f494SToby Isaac PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage stage, PetscEventPerfInfo *info)
15488b08f494SToby Isaac {
15498b08f494SToby Isaac   PetscLogHandler     handler;
15508b08f494SToby Isaac   PetscEventPerfInfo *event_info;
15518b08f494SToby Isaac 
15528b08f494SToby Isaac   PetscFunctionBegin;
15538b08f494SToby Isaac   PetscAssertPointer(info, 2);
15540ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
15550ba5dad9SToby Isaac   if (handler) {
15568b08f494SToby Isaac     PetscCall(PetscLogHandlerGetStagePerfInfo(handler, stage, &event_info));
15578b08f494SToby Isaac     *info = *event_info;
15580ba5dad9SToby Isaac   } else {
15590ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogStageGetPerfInfo() returning zeros\n"));
15600ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
15610ba5dad9SToby Isaac   }
15628b08f494SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
15638b08f494SToby Isaac }
15648b08f494SToby Isaac 
15658b08f494SToby Isaac /*@C
1566b665b14eSToby Isaac   PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage
1567b665b14eSToby Isaac 
1568b665b14eSToby Isaac   Input Parameters:
1569b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage
1570b665b14eSToby Isaac - event - The event number
1571b665b14eSToby Isaac 
1572b665b14eSToby Isaac   Output Parameter:
1573b665b14eSToby Isaac . info - This structure is filled with the performance information
1574b665b14eSToby Isaac 
1575b665b14eSToby Isaac   Level: intermediate
1576b665b14eSToby Isaac 
1577b665b14eSToby Isaac   Note:
1578b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1579b665b14eSToby Isaac 
15800ba5dad9SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15815804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15820ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15830ba5dad9SToby Isaac 
1584b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
1585b665b14eSToby Isaac @*/
1586b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info)
1587b665b14eSToby Isaac {
1588b665b14eSToby Isaac   PetscLogHandler     handler;
1589b665b14eSToby Isaac   PetscEventPerfInfo *event_info;
1590b665b14eSToby Isaac 
1591b665b14eSToby Isaac   PetscFunctionBegin;
1592b665b14eSToby Isaac   PetscAssertPointer(info, 3);
15930ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
15940ba5dad9SToby Isaac   if (handler) {
1595dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info));
1596b665b14eSToby Isaac     *info = *event_info;
15970ba5dad9SToby Isaac   } else {
15980ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogEventGetPerfInfo() returning zeros\n"));
15990ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
16000ba5dad9SToby Isaac   }
1601b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1602b665b14eSToby Isaac }
1603b665b14eSToby Isaac 
1604b665b14eSToby Isaac /*@C
1605b665b14eSToby Isaac   PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event
1606b665b14eSToby Isaac 
1607b665b14eSToby Isaac   Not Collective
1608b665b14eSToby Isaac 
1609b665b14eSToby Isaac   Input Parameters:
1610b665b14eSToby Isaac + event - The event id to log
1611b665b14eSToby Isaac . n     - The dof index, in [0, 8)
1612b665b14eSToby Isaac - dof   - The number of dofs
1613b665b14eSToby Isaac 
1614b665b14eSToby Isaac   Options Database Key:
1615b665b14eSToby Isaac . -log_view - Activates log summary
1616b665b14eSToby Isaac 
1617b665b14eSToby Isaac   Level: developer
1618b665b14eSToby Isaac 
1619b665b14eSToby Isaac   Note:
1620b665b14eSToby Isaac   This is to enable logging of convergence
1621b665b14eSToby Isaac 
1622b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1623b665b14eSToby Isaac @*/
1624b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof)
1625b665b14eSToby Isaac {
1626b665b14eSToby Isaac   PetscFunctionBegin;
1627b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1628dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1629dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1630dff009beSToby Isaac 
1631dff009beSToby Isaac     if (h) {
1632dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1633dff009beSToby Isaac 
1634dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1635dff009beSToby Isaac       if (event_info) event_info->dof[n] = dof;
1636dff009beSToby Isaac     }
1637b665b14eSToby Isaac   }
1638b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1639b665b14eSToby Isaac }
1640b665b14eSToby Isaac 
1641b665b14eSToby Isaac /*@C
1642b665b14eSToby Isaac   PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event
1643b665b14eSToby Isaac 
1644b665b14eSToby Isaac   Not Collective
1645b665b14eSToby Isaac 
1646b665b14eSToby Isaac   Input Parameters:
1647b665b14eSToby Isaac + event - The event id to log
1648b665b14eSToby Isaac . n     - The error index, in [0, 8)
1649b665b14eSToby Isaac - error - The error
1650b665b14eSToby Isaac 
1651b665b14eSToby Isaac   Options Database Key:
1652b665b14eSToby Isaac . -log_view - Activates log summary
1653b665b14eSToby Isaac 
1654b665b14eSToby Isaac   Level: developer
1655b665b14eSToby Isaac 
1656b665b14eSToby Isaac   Notes:
1657b665b14eSToby Isaac   This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example,
1658b665b14eSToby Isaac   as different norms, or as errors for different fields
1659b665b14eSToby Isaac 
1660b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1661b665b14eSToby Isaac 
1662b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1663b665b14eSToby Isaac @*/
1664b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error)
1665b665b14eSToby Isaac {
1666b665b14eSToby Isaac   PetscFunctionBegin;
1667b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1668dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1669dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1670dff009beSToby Isaac 
1671dff009beSToby Isaac     if (h) {
1672dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1673dff009beSToby Isaac 
1674dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1675dff009beSToby Isaac       if (event_info) event_info->errors[n] = error;
1676dff009beSToby Isaac     }
1677b665b14eSToby Isaac   }
1678b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1679b665b14eSToby Isaac }
1680b665b14eSToby Isaac 
1681b665b14eSToby Isaac /*@C
16825c6c1daeSBarry Smith   PetscLogEventGetId - Returns the event id when given the event name.
16835c6c1daeSBarry Smith 
16845c6c1daeSBarry Smith   Not Collective
16855c6c1daeSBarry Smith 
16865c6c1daeSBarry Smith   Input Parameter:
16875c6c1daeSBarry Smith . name - The event name
16885c6c1daeSBarry Smith 
16895c6c1daeSBarry Smith   Output Parameter:
1690c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists
16915c6c1daeSBarry Smith 
16925c6c1daeSBarry Smith   Level: intermediate
16935c6c1daeSBarry Smith 
1694d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
16955c6c1daeSBarry Smith @*/
1696d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event)
1697d71ae5a4SJacob Faibussowitsch {
1698b665b14eSToby Isaac   PetscLogState state;
16995c6c1daeSBarry Smith 
17005c6c1daeSBarry Smith   PetscFunctionBegin;
1701b665b14eSToby Isaac   *event = -1;
1702b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1703b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event));
17043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
17055c6c1daeSBarry Smith }
17065c6c1daeSBarry Smith 
170753e0a2f3SToby Isaac /*@C
170853e0a2f3SToby Isaac   PetscLogEventGetName - Returns the event name when given the event id.
170953e0a2f3SToby Isaac 
171053e0a2f3SToby Isaac   Not Collective
171153e0a2f3SToby Isaac 
171253e0a2f3SToby Isaac   Input Parameter:
171353e0a2f3SToby Isaac . event - The event
171453e0a2f3SToby Isaac 
171553e0a2f3SToby Isaac   Output Parameter:
171653e0a2f3SToby Isaac . name - The event name
171753e0a2f3SToby Isaac 
171853e0a2f3SToby Isaac   Level: intermediate
171953e0a2f3SToby Isaac 
172053e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
172153e0a2f3SToby Isaac @*/
172253e0a2f3SToby Isaac PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char **name)
172353e0a2f3SToby Isaac {
172453e0a2f3SToby Isaac   PetscLogEventInfo event_info;
172553e0a2f3SToby Isaac   PetscLogState     state;
172653e0a2f3SToby Isaac 
172753e0a2f3SToby Isaac   PetscFunctionBegin;
1728b665b14eSToby Isaac   *name = NULL;
172953e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1730b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
173153e0a2f3SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
173253e0a2f3SToby Isaac   *name = event_info.name;
173353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
173453e0a2f3SToby Isaac }
173553e0a2f3SToby Isaac 
173653e0a2f3SToby Isaac /*@
173753e0a2f3SToby Isaac   PetscLogEventsPause - Put event logging into "paused" mode: timers and counters for in-progress events are paused, and any events that happen before logging is resumed with `PetscLogEventsResume()` are logged in the "Main Stage" of execution.
173853e0a2f3SToby Isaac 
173953e0a2f3SToby Isaac   Not collective
174053e0a2f3SToby Isaac 
174153e0a2f3SToby Isaac   Level: advanced
174253e0a2f3SToby Isaac 
174353e0a2f3SToby Isaac   Notes:
174453e0a2f3SToby Isaac   When an external library or runtime has is initialized it can involve lots of setup time that skews the statistics of any unrelated running events: this function is intended to isolate such calls in the default log summary (`PetscLogDefaultBegin()`, `PetscLogView()`).
174553e0a2f3SToby Isaac 
174653e0a2f3SToby Isaac   Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function.
174753e0a2f3SToby Isaac 
1748b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()`
174953e0a2f3SToby Isaac @*/
175053e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(void)
175153e0a2f3SToby Isaac {
175253e0a2f3SToby Isaac   PetscFunctionBegin;
1753dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1754dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1755dff009beSToby Isaac 
1756dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsPause(h));
1757dff009beSToby Isaac   }
175853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
175953e0a2f3SToby Isaac }
176053e0a2f3SToby Isaac 
176153e0a2f3SToby Isaac /*@
176253e0a2f3SToby Isaac   PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`.
176353e0a2f3SToby Isaac 
176453e0a2f3SToby Isaac   Not collective
176553e0a2f3SToby Isaac 
176653e0a2f3SToby Isaac   Level: advanced
176753e0a2f3SToby Isaac 
1768b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()`
176953e0a2f3SToby Isaac @*/
177053e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void)
177153e0a2f3SToby Isaac {
177253e0a2f3SToby Isaac   PetscFunctionBegin;
1773dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1774dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1775dff009beSToby Isaac 
1776dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsResume(h));
1777dff009beSToby Isaac   }
177853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
177953e0a2f3SToby Isaac }
178053e0a2f3SToby Isaac 
17811c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/
17821c1ad86eSToby Isaac 
17831c1ad86eSToby Isaac /*MC
17841c1ad86eSToby Isaac    PetscLogObjectCreate - Log the creation of a `PetscObject`
17851c1ad86eSToby Isaac 
17861c1ad86eSToby Isaac    Synopsis:
17871c1ad86eSToby Isaac    #include <petsclog.h>
17881c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectCreate(PetscObject h)
17891c1ad86eSToby Isaac 
17901c1ad86eSToby Isaac    Not Collective
17911c1ad86eSToby Isaac 
17921c1ad86eSToby Isaac    Input Parameters:
17931c1ad86eSToby Isaac .  h - A `PetscObject`
17941c1ad86eSToby Isaac 
17951c1ad86eSToby Isaac    Level: developer
17961c1ad86eSToby Isaac 
17971c1ad86eSToby Isaac    Developer Note:
17981c1ad86eSToby Isaac      Called internally by PETSc when creating objects: users do not need to call this directly.
1799b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18001c1ad86eSToby Isaac 
1801b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()`
18021c1ad86eSToby Isaac M*/
18031c1ad86eSToby Isaac 
18041c1ad86eSToby Isaac /*MC
18051c1ad86eSToby Isaac    PetscLogObjectDestroy - Logs the destruction of a `PetscObject`
18061c1ad86eSToby Isaac 
18071c1ad86eSToby Isaac    Synopsis:
18081c1ad86eSToby Isaac    #include <petsclog.h>
18091c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectDestroy(PetscObject h)
18101c1ad86eSToby Isaac 
18111c1ad86eSToby Isaac    Not Collective
18121c1ad86eSToby Isaac 
18131c1ad86eSToby Isaac    Input Parameters:
18141c1ad86eSToby Isaac .  h - A `PetscObject`
18151c1ad86eSToby Isaac 
18161c1ad86eSToby Isaac    Level: developer
18171c1ad86eSToby Isaac 
18181c1ad86eSToby Isaac    Developer Note:
18191c1ad86eSToby Isaac      Called internally by PETSc when destroying objects: users do not need to call this directly.
1820b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18211c1ad86eSToby Isaac 
1822b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()`
18231c1ad86eSToby Isaac M*/
18241c1ad86eSToby Isaac 
182553e0a2f3SToby Isaac /*@C
182653e0a2f3SToby Isaac   PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name.
182753e0a2f3SToby Isaac 
182853e0a2f3SToby Isaac   Not Collective
182953e0a2f3SToby Isaac 
183053e0a2f3SToby Isaac   Input Parameter:
183153e0a2f3SToby Isaac . name - The class name
183253e0a2f3SToby Isaac 
183353e0a2f3SToby Isaac   Output Parameter:
183453e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists
183553e0a2f3SToby Isaac 
183653e0a2f3SToby Isaac   Level: intermediate
183753e0a2f3SToby Isaac 
183853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
183953e0a2f3SToby Isaac @*/
184053e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid)
184153e0a2f3SToby Isaac {
184253e0a2f3SToby Isaac   PetscLogClass     log_class;
184353e0a2f3SToby Isaac   PetscLogClassInfo class_info;
184453e0a2f3SToby Isaac   PetscLogState     state;
184553e0a2f3SToby Isaac 
184653e0a2f3SToby Isaac   PetscFunctionBegin;
1847b665b14eSToby Isaac   *classid = -1;
184853e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1849b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
185053e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromName(state, name, &log_class));
185153e0a2f3SToby Isaac   if (log_class < 0) {
185253e0a2f3SToby Isaac     *classid = -1;
185353e0a2f3SToby Isaac     PetscFunctionReturn(PETSC_SUCCESS);
185453e0a2f3SToby Isaac   }
185553e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
185653e0a2f3SToby Isaac   *classid = class_info.classid;
185753e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
185853e0a2f3SToby Isaac }
185953e0a2f3SToby Isaac 
186053e0a2f3SToby Isaac /*@C
186153e0a2f3SToby Isaac   PetscLogClassIdGetName - Returns a `PetscClassId`'s name.
186253e0a2f3SToby Isaac 
186353e0a2f3SToby Isaac   Not Collective
186453e0a2f3SToby Isaac 
186553e0a2f3SToby Isaac   Input Parameter:
186653e0a2f3SToby Isaac . classid - A `PetscClassId`
186753e0a2f3SToby Isaac 
186853e0a2f3SToby Isaac   Output Parameter:
186953e0a2f3SToby Isaac . name - The class name
187053e0a2f3SToby Isaac 
187153e0a2f3SToby Isaac   Level: intermediate
187253e0a2f3SToby Isaac 
187353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()`
187453e0a2f3SToby Isaac @*/
187553e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name)
187653e0a2f3SToby Isaac {
187753e0a2f3SToby Isaac   PetscLogClass     log_class;
187853e0a2f3SToby Isaac   PetscLogClassInfo class_info;
187953e0a2f3SToby Isaac   PetscLogState     state;
188053e0a2f3SToby Isaac 
188153e0a2f3SToby Isaac   PetscFunctionBegin;
188253e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
188353e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class));
188453e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
188553e0a2f3SToby Isaac   *name = class_info.name;
188653e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
188753e0a2f3SToby Isaac }
188853e0a2f3SToby Isaac 
18895c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/
18905c6c1daeSBarry Smith /*@C
18915c6c1daeSBarry Smith   PetscLogDump - Dumps logs of objects to a file. This file is intended to
18925c6c1daeSBarry Smith   be read by bin/petscview. This program no longer exists.
18935c6c1daeSBarry Smith 
1894811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
18955c6c1daeSBarry Smith 
18965c6c1daeSBarry Smith   Input Parameter:
1897aec76313SJacob Faibussowitsch . sname - an optional file name
18985c6c1daeSBarry Smith 
189910450e9eSJacob Faibussowitsch   Example Usage:
19005c6c1daeSBarry Smith .vb
19015c6c1daeSBarry Smith   PetscInitialize(...);
1902b665b14eSToby Isaac   PetscLogDefaultBegin();
1903b665b14eSToby Isaac   // ... code ...
19045c6c1daeSBarry Smith   PetscLogDump(filename);
19055c6c1daeSBarry Smith   PetscFinalize();
19065c6c1daeSBarry Smith .ve
19075c6c1daeSBarry Smith 
1908d1f92df0SBarry Smith   Level: advanced
1909d1f92df0SBarry Smith 
1910811af0c4SBarry Smith   Note:
191137fdd005SBarry Smith   The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified,
19125c6c1daeSBarry Smith   this file will be used.
19135c6c1daeSBarry Smith 
1914b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
19155c6c1daeSBarry Smith @*/
1916d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[])
1917d71ae5a4SJacob Faibussowitsch {
1918b665b14eSToby Isaac   PetscLogHandler handler;
19195c6c1daeSBarry Smith 
19205c6c1daeSBarry Smith   PetscFunctionBegin;
1921294de794SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1922dff009beSToby Isaac   PetscCall(PetscLogHandlerDump(handler, sname));
1923b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
19245c6c1daeSBarry Smith }
1925b665b14eSToby Isaac 
1926b665b14eSToby Isaac /*@C
1927b665b14eSToby Isaac   PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot.
1928b665b14eSToby Isaac 
19298f14a041SBarry Smith   Collective on `PETSC_COMM_WORLD`
1930b665b14eSToby Isaac 
1931b665b14eSToby Isaac   Input Parameter:
1932b665b14eSToby Isaac . sname - filename for the MPE logfile
1933b665b14eSToby Isaac 
1934b665b14eSToby Isaac   Level: advanced
1935b665b14eSToby Isaac 
1936b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()`
1937b665b14eSToby Isaac @*/
1938b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[])
1939b665b14eSToby Isaac {
1940b665b14eSToby Isaac   PetscFunctionBegin;
1941b665b14eSToby Isaac   #if defined(PETSC_HAVE_MPE)
1942b665b14eSToby Isaac   if (PetscBeganMPE) {
1943b665b14eSToby Isaac     char name[PETSC_MAX_PATH_LEN];
1944b665b14eSToby Isaac 
1945b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Finalizing MPE.\n"));
1946b665b14eSToby Isaac     if (sname) {
1947b665b14eSToby Isaac       PetscCall(PetscStrncpy(name, sname, sizeof(name)));
19485c6c1daeSBarry Smith     } else {
1949b665b14eSToby Isaac       PetscCall(PetscGetProgramName(name, sizeof(name)));
19505c6c1daeSBarry Smith     }
1951b665b14eSToby Isaac     PetscCall(MPE_Finish_log(name));
19525c6c1daeSBarry Smith   } else {
1953b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n"));
19545c6c1daeSBarry Smith   }
1955c2a741eeSJunchao Zhang   #else
1956b665b14eSToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
1957c2a741eeSJunchao Zhang   #endif
19583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19595c6c1daeSBarry Smith }
19605c6c1daeSBarry Smith 
19617d6c928cSSatish Balay /*@C
19627d6c928cSSatish Balay   PetscLogView - Prints a summary of the logging.
19635c6c1daeSBarry Smith 
19648f14a041SBarry Smith   Collective
19655c6c1daeSBarry Smith 
19665c6c1daeSBarry Smith   Input Parameter:
1967f14045dbSBarry Smith . viewer - an ASCII viewer
19685c6c1daeSBarry Smith 
19695c6c1daeSBarry Smith   Options Database Keys:
1970bb1d7374SBarry Smith + -log_view [:filename]                    - Prints summary of log information
1971bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file
1972607d249eSBarry Smith . -log_view :filename.xml:ascii_xml        - Saves a summary of the logging information in a nested format (see below for how to view it)
1973d0a29bd7SConnor Ward . -log_view :filename.txt:ascii_flamegraph - Saves logging information in a format suitable for visualising as a Flame Graph (see below for how to view it)
1974156b51fbSBarry Smith . -log_view_memory                         - Also display memory usage in each event
1975156b51fbSBarry Smith . -log_view_gpu_time                       - Also display time in each event for GPU kernels (Note this may slow the computation)
1976811af0c4SBarry Smith . -log_all                                 - Saves a file Log.rank for each MPI rank with details of each step of the computation
1977bb1d7374SBarry Smith - -log_trace [filename]                    - Displays a trace of what each process is doing
19785c6c1daeSBarry Smith 
1979d1f92df0SBarry Smith   Level: beginner
1980d1f92df0SBarry Smith 
19815c6c1daeSBarry Smith   Notes:
1982da81f932SPierre Jolivet   It is possible to control the logging programmatically but we recommend using the options database approach whenever possible
19835c6c1daeSBarry Smith   By default the summary is printed to stdout.
19845c6c1daeSBarry Smith 
1985bb1d7374SBarry Smith   Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin()
1986bb1d7374SBarry Smith 
1987bb1d7374SBarry Smith   If PETSc is configured with --with-logging=0 then this functionality is not available
1988bb1d7374SBarry Smith 
1989607d249eSBarry Smith   To view the nested XML format filename.xml first copy  ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current
1990607d249eSBarry Smith   directory then open filename.xml with your browser. Specific notes for certain browsers
19911d27aa22SBarry Smith .vb
19921d27aa22SBarry Smith     Firefox and Internet explorer - simply open the file
19931d27aa22SBarry Smith     Google Chrome - you must start up Chrome with the option --allow-file-access-from-files
19941d27aa22SBarry Smith     Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access
19951d27aa22SBarry Smith .ve
19961d27aa22SBarry Smith   or one can use the package <http://xmlsoft.org/XSLT/xsltproc2.html> to translate the xml file to html and then open it with
1997607d249eSBarry Smith   your browser.
19982add09c0SLisandro Dalcin   Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser
19992add09c0SLisandro Dalcin   window and render the XML log file contents.
2000607d249eSBarry Smith 
2001bb1d7374SBarry Smith   The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij  MARITIME  RESEARCH  INSTITUTE  NETHERLANDS
2002bb1d7374SBarry Smith 
20031d27aa22SBarry Smith   The Flame Graph output can be visualised using either the original Flame Graph script <https://github.com/brendangregg/FlameGraph>
20041d27aa22SBarry Smith   or using speedscope <https://www.speedscope.app>.
2005d0a29bd7SConnor Ward   Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py.
2006d0a29bd7SConnor Ward 
2007d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()`
20085c6c1daeSBarry Smith @*/
2009d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer)
2010d71ae5a4SJacob Faibussowitsch {
2011f14045dbSBarry Smith   PetscBool         isascii;
2012f14045dbSBarry Smith   PetscViewerFormat format;
2013b665b14eSToby Isaac   int               stage;
2014b665b14eSToby Isaac   PetscLogState     state;
2015b665b14eSToby Isaac   PetscIntStack     temp_stack;
2016b665b14eSToby Isaac   PetscLogHandler   handler;
2017b665b14eSToby Isaac   PetscBool         is_empty;
20185c6c1daeSBarry Smith 
20195c6c1daeSBarry Smith   PetscFunctionBegin;
2020b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
202137b78d16SBarry Smith   /* Pop off any stages the user forgot to remove */
2022b665b14eSToby Isaac   PetscCall(PetscIntStackCreate(&temp_stack));
2023b665b14eSToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
202437b78d16SBarry Smith   while (stage >= 0) {
2025b665b14eSToby Isaac     PetscCall(PetscLogStagePop());
2026b665b14eSToby Isaac     PetscCall(PetscIntStackPush(temp_stack, stage));
2027b665b14eSToby Isaac     PetscCall(PetscLogStateGetCurrentStage(state, &stage));
202837b78d16SBarry Smith   }
20299566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
203028b400f6SJacob Faibussowitsch   PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII");
20319566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
2032b665b14eSToby Isaac   if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
2033294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler));
2034b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
2035b665b14eSToby Isaac   } else {
2036294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
2037b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
20385c6c1daeSBarry Smith   }
2039b665b14eSToby Isaac   PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2040b665b14eSToby Isaac   while (!is_empty) {
2041b665b14eSToby Isaac     PetscCall(PetscIntStackPop(temp_stack, &stage));
2042b665b14eSToby Isaac     PetscCall(PetscLogStagePush(stage));
2043b665b14eSToby Isaac     PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2044b665b14eSToby Isaac   }
2045b665b14eSToby Isaac   PetscCall(PetscIntStackDestroy(temp_stack));
20463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20475c6c1daeSBarry Smith }
20485c6c1daeSBarry Smith 
2049f14045dbSBarry Smith /*@C
2050811af0c4SBarry Smith   PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed.
2051f14045dbSBarry Smith 
2052811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
2053f14045dbSBarry Smith 
2054811af0c4SBarry Smith   Level: developer
2055f14045dbSBarry Smith 
2056d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`
2057f14045dbSBarry Smith @*/
2058d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void)
2059d71ae5a4SJacob Faibussowitsch {
2060ad2e3d55SToby Isaac   PetscInt          n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX;
2061ad2e3d55SToby Isaac   PetscViewer       viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2062ad2e3d55SToby Isaac   PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2063f14045dbSBarry Smith   PetscBool         flg;
2064f14045dbSBarry Smith 
2065f14045dbSBarry Smith   PetscFunctionBegin;
2066ad2e3d55SToby Isaac   PetscCall(PetscOptionsGetViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg));
2067ad2e3d55SToby Isaac   for (PetscInt i = 0; i < n_max; i++) {
2068ad2e3d55SToby Isaac     PetscCall(PetscViewerPushFormat(viewers[i], formats[i]));
2069ad2e3d55SToby Isaac     PetscCall(PetscLogView(viewers[i]));
2070ad2e3d55SToby Isaac     PetscCall(PetscViewerPopFormat(viewers[i]));
2071*f4f49eeaSPierre Jolivet     PetscCall(PetscOptionsRestoreViewer(&viewers[i]));
2072f14045dbSBarry Smith   }
20733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2074f14045dbSBarry Smith }
2075f14045dbSBarry Smith 
2076b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *);
2077b665b14eSToby Isaac 
2078b665b14eSToby Isaac /*@
2079b665b14eSToby Isaac   PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event
2080b665b14eSToby Isaac   that takes 1 or more percent of the time.
2081b665b14eSToby Isaac 
20828f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
2083b665b14eSToby Isaac 
2084b665b14eSToby Isaac   Input Parameter:
2085b665b14eSToby Isaac . newThresh - the threshold to use
2086b665b14eSToby Isaac 
2087b665b14eSToby Isaac   Output Parameter:
2088b665b14eSToby Isaac . oldThresh - the previously set threshold value
2089b665b14eSToby Isaac 
2090b665b14eSToby Isaac   Options Database Keys:
2091b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
2092b665b14eSToby Isaac 
2093b665b14eSToby Isaac   Example Usage:
2094b665b14eSToby Isaac .vb
2095b665b14eSToby Isaac   PetscInitialize(...);
2096b665b14eSToby Isaac   PetscLogNestedBegin();
2097b665b14eSToby Isaac   PetscLogSetThreshold(0.1,&oldthresh);
2098b665b14eSToby Isaac   // ... code ...
2099b665b14eSToby Isaac   PetscLogView(viewer);
2100b665b14eSToby Isaac   PetscFinalize();
2101b665b14eSToby Isaac .ve
2102b665b14eSToby Isaac 
2103b665b14eSToby Isaac   Level: advanced
2104b665b14eSToby Isaac 
2105b665b14eSToby Isaac   Note:
2106b665b14eSToby Isaac   This threshold is only used by the nested log handler
2107b665b14eSToby Isaac 
2108b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`,
2109b665b14eSToby Isaac           `PetscLogNestedBegin()`
2110b665b14eSToby Isaac @*/
2111b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh)
2112b665b14eSToby Isaac {
2113b665b14eSToby Isaac   PetscLogHandler handler;
2114b665b14eSToby Isaac 
2115b665b14eSToby Isaac   PetscFunctionBegin;
2116294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler));
2117b665b14eSToby Isaac   PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh));
2118b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2119b665b14eSToby Isaac }
2120b665b14eSToby Isaac 
21215c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/
21225c6c1daeSBarry Smith /*@C
21235c6c1daeSBarry Smith   PetscGetFlops - Returns the number of flops used on this processor
21245c6c1daeSBarry Smith   since the program began.
21255c6c1daeSBarry Smith 
21265c6c1daeSBarry Smith   Not Collective
21275c6c1daeSBarry Smith 
21285c6c1daeSBarry Smith   Output Parameter:
212910450e9eSJacob Faibussowitsch . flops - number of floating point operations
21305c6c1daeSBarry Smith 
2131d1f92df0SBarry Smith   Level: intermediate
2132d1f92df0SBarry Smith 
21335c6c1daeSBarry Smith   Notes:
21345c6c1daeSBarry Smith   A global counter logs all PETSc flop counts.  The user can use
2135811af0c4SBarry Smith   `PetscLogFlops()` to increment this counter to include flops for the
21365c6c1daeSBarry Smith   application code.
21375c6c1daeSBarry Smith 
21384b7c4d4dSPierre Jolivet   A separate counter `PetscLogGpuFlops()` logs the flops that occur on any GPU associated with this MPI rank
2139811af0c4SBarry Smith 
21404b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscTime()`, `PetscLogFlops()`
21415c6c1daeSBarry Smith @*/
2142d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops)
2143d71ae5a4SJacob Faibussowitsch {
21445c6c1daeSBarry Smith   PetscFunctionBegin;
21455c6c1daeSBarry Smith   *flops = petsc_TotalFlops;
21463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21475c6c1daeSBarry Smith }
21485c6c1daeSBarry Smith 
21491c1ad86eSToby Isaac /*@C
21501c1ad86eSToby Isaac   PetscLogObjectState - Record information about an object with the default log handler
21511c1ad86eSToby Isaac 
21521c1ad86eSToby Isaac   Not Collective
21531c1ad86eSToby Isaac 
21541c1ad86eSToby Isaac   Input Parameters:
21551c1ad86eSToby Isaac + obj    - the `PetscObject`
21561c1ad86eSToby Isaac . format - a printf-style format string
21571c1ad86eSToby Isaac - ...    - printf arguments to format
21581c1ad86eSToby Isaac 
21591c1ad86eSToby Isaac   Level: developer
21601c1ad86eSToby Isaac 
2161b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()`
21621c1ad86eSToby Isaac @*/
2163d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...)
2164d71ae5a4SJacob Faibussowitsch {
21655c6c1daeSBarry Smith   PetscFunctionBegin;
2166dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
2167dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
2168dff009beSToby Isaac 
2169dff009beSToby Isaac     if (h) {
2170dff009beSToby Isaac       va_list Argp;
21715c6c1daeSBarry Smith       va_start(Argp, format);
2172dff009beSToby Isaac       PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp));
21735c6c1daeSBarry Smith       va_end(Argp);
2174b665b14eSToby Isaac     }
2175dff009beSToby Isaac   }
21763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21775c6c1daeSBarry Smith }
21785c6c1daeSBarry Smith 
21795c6c1daeSBarry Smith /*MC
21805c6c1daeSBarry Smith   PetscLogFlops - Adds floating point operations to the global counter.
21815c6c1daeSBarry Smith 
21825c6c1daeSBarry Smith   Synopsis:
2183aaa7dc30SBarry Smith   #include <petsclog.h>
21845c6c1daeSBarry Smith   PetscErrorCode PetscLogFlops(PetscLogDouble f)
21855c6c1daeSBarry Smith 
21865c6c1daeSBarry Smith   Not Collective
21875c6c1daeSBarry Smith 
21885c6c1daeSBarry Smith   Input Parameter:
21895c6c1daeSBarry Smith . f - flop counter
21905c6c1daeSBarry Smith 
219110450e9eSJacob Faibussowitsch   Example Usage:
21925c6c1daeSBarry Smith .vb
21935c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
219410450e9eSJacob Faibussowitsch 
21955c6c1daeSBarry Smith   PetscLogEventRegister("User event", 0, &USER_EVENT);
21965c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
21975c6c1daeSBarry Smith   [code segment to monitor]
21985c6c1daeSBarry Smith   PetscLogFlops(user_flops)
21995c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
22005c6c1daeSBarry Smith .ve
22015c6c1daeSBarry Smith 
2202d1f92df0SBarry Smith   Level: intermediate
2203d1f92df0SBarry Smith 
2204811af0c4SBarry Smith   Note:
220510450e9eSJacob Faibussowitsch    A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment
220610450e9eSJacob Faibussowitsch    this counter to include flops for the application code.
22075c6c1daeSBarry Smith 
22084b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()`
22095c6c1daeSBarry Smith M*/
22105c6c1daeSBarry Smith 
22115c6c1daeSBarry Smith /*MC
221210450e9eSJacob Faibussowitsch   PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate
221310450e9eSJacob Faibussowitsch   timings
22145c6c1daeSBarry Smith 
22155c6c1daeSBarry Smith   Synopsis:
2216aaa7dc30SBarry Smith   #include <petsclog.h>
22175c6c1daeSBarry Smith   void PetscPreLoadBegin(PetscBool flag, char *name);
22185c6c1daeSBarry Smith 
22195c6c1daeSBarry Smith   Not Collective
22205c6c1daeSBarry Smith 
2221d8d19677SJose E. Roman   Input Parameters:
222210450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command
222310450e9eSJacob Faibussowitsch          line option `-preload true|false`
222410450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded
22255c6c1daeSBarry Smith 
222610450e9eSJacob Faibussowitsch   Example Usage:
22275c6c1daeSBarry Smith .vb
222810450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
222910450e9eSJacob Faibussowitsch   // lines of code
22305c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
223110450e9eSJacob Faibussowitsch   // lines of code
22325c6c1daeSBarry Smith   PetscPreLoadEnd();
22335c6c1daeSBarry Smith .ve
22345c6c1daeSBarry Smith 
2235d1f92df0SBarry Smith   Level: intermediate
2236d1f92df0SBarry Smith 
2237811af0c4SBarry Smith   Note:
223895452b02SPatrick Sanan   Only works in C/C++, not Fortran
22395c6c1daeSBarry Smith 
224010450e9eSJacob Faibussowitsch   Flags available within the macro\:
224110450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading
224210450e9eSJacob Faibussowitsch . PetscPreLoadingOn   - `PETSC_TRUE` if it is CURRENTLY doing preload
224310450e9eSJacob Faibussowitsch . PetscPreLoadIt      - `0` for the first computation (with preloading turned off it is only
224410450e9eSJacob Faibussowitsch                         `0`) `1`  for the second
224510450e9eSJacob Faibussowitsch - PetscPreLoadMax     - number of times it will do the computation, only one when preloading is
224610450e9eSJacob Faibussowitsch                         turned on
224710450e9eSJacob Faibussowitsch 
224810450e9eSJacob Faibussowitsch   The first two variables are available throughout the program, the second two only between the
224910450e9eSJacob Faibussowitsch   `PetscPreLoadBegin()` and `PetscPreLoadEnd()`
22505c6c1daeSBarry Smith 
2251d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
22525c6c1daeSBarry Smith M*/
22535c6c1daeSBarry Smith 
22545c6c1daeSBarry Smith /*MC
225510450e9eSJacob Faibussowitsch   PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate
225610450e9eSJacob Faibussowitsch   timings
22575c6c1daeSBarry Smith 
22585c6c1daeSBarry Smith   Synopsis:
2259aaa7dc30SBarry Smith   #include <petsclog.h>
22605c6c1daeSBarry Smith   void PetscPreLoadEnd(void);
22615c6c1daeSBarry Smith 
22625c6c1daeSBarry Smith   Not Collective
22635c6c1daeSBarry Smith 
226410450e9eSJacob Faibussowitsch   Example Usage:
22655c6c1daeSBarry Smith .vb
226610450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
226710450e9eSJacob Faibussowitsch   // lines of code
22685c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
226910450e9eSJacob Faibussowitsch   // lines of code
22705c6c1daeSBarry Smith   PetscPreLoadEnd();
22715c6c1daeSBarry Smith .ve
22725c6c1daeSBarry Smith 
2273d1f92df0SBarry Smith   Level: intermediate
2274d1f92df0SBarry Smith 
2275811af0c4SBarry Smith   Note:
2276dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
22775c6c1daeSBarry Smith 
2278d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()`
22795c6c1daeSBarry Smith M*/
22805c6c1daeSBarry Smith 
22815c6c1daeSBarry Smith /*MC
228210450e9eSJacob Faibussowitsch   PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings
22835c6c1daeSBarry Smith 
22845c6c1daeSBarry Smith   Synopsis:
2285aaa7dc30SBarry Smith   #include <petsclog.h>
22865c6c1daeSBarry Smith   void PetscPreLoadStage(char *name);
22875c6c1daeSBarry Smith 
22885c6c1daeSBarry Smith   Not Collective
22895c6c1daeSBarry Smith 
229010450e9eSJacob Faibussowitsch   Example Usage:
22915c6c1daeSBarry Smith .vb
229210450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE,"first stage");
229310450e9eSJacob Faibussowitsch   // lines of code
22945c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
229510450e9eSJacob Faibussowitsch   // lines of code
22965c6c1daeSBarry Smith   PetscPreLoadEnd();
22975c6c1daeSBarry Smith .ve
22985c6c1daeSBarry Smith 
2299d1f92df0SBarry Smith   Level: intermediate
2300d1f92df0SBarry Smith 
2301811af0c4SBarry Smith   Note:
2302dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
23035c6c1daeSBarry Smith 
2304d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`
23055c6c1daeSBarry Smith M*/
23065c6c1daeSBarry Smith 
2307a4af0ceeSJacob Faibussowitsch   #if PetscDefined(HAVE_DEVICE)
2308a4af0ceeSJacob Faibussowitsch     #include <petsc/private/deviceimpl.h>
23099ffd0706SHong Zhang 
2310156b51fbSBarry Smith /*@C
2311156b51fbSBarry Smith   PetscLogGpuTime - turn on the logging of GPU time for GPU kernels
2312156b51fbSBarry Smith 
2313811af0c4SBarry Smith   Options Database Key:
2314efa05fe8SBarry Smith . -log_view_gpu_time - provide the GPU times for all events in the `-log_view` output
2315156b51fbSBarry Smith 
2316d1f92df0SBarry Smith   Level: advanced
2317d1f92df0SBarry Smith 
2318156b51fbSBarry Smith   Notes:
231910450e9eSJacob Faibussowitsch   Turning on the timing of the GPU kernels can slow down the entire computation and should only
2320efa05fe8SBarry Smith   be used when studying the performance of individual operations on GPU such as vector operations and
232110450e9eSJacob Faibussowitsch   matrix-vector operations.
2322156b51fbSBarry Smith 
2323efa05fe8SBarry Smith   If this option is not used then times for most of the events in the `-log_view` output will be listed as Nan, indicating the times are not available
2324efa05fe8SBarry Smith 
232510450e9eSJacob Faibussowitsch   This routine should only be called once near the beginning of the program. Once it is started
232610450e9eSJacob Faibussowitsch   it cannot be turned off.
2327156b51fbSBarry Smith 
2328d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()`
2329156b51fbSBarry Smith @*/
2330d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void)
2331d71ae5a4SJacob Faibussowitsch {
2332473903fcSJunchao Zhang   PetscFunctionBegin;
2333473903fcSJunchao Zhang   PetscCheck(petsc_gtime == 0.0, PETSC_COMM_SELF, PETSC_ERR_SUP, "GPU logging has already been turned on");
2334156b51fbSBarry Smith   PetscLogGpuTimeFlag = PETSC_TRUE;
2335473903fcSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
2336156b51fbSBarry Smith }
2337156b51fbSBarry Smith 
23389ffd0706SHong Zhang /*@C
23399ffd0706SHong Zhang   PetscLogGpuTimeBegin - Start timer for device
23409ffd0706SHong Zhang 
2341d1f92df0SBarry Smith   Level: intermediate
2342d1f92df0SBarry Smith 
23439ffd0706SHong Zhang   Notes:
234410450e9eSJacob Faibussowitsch   When CUDA or HIP is enabled, the timer is run on the GPU, it is a separate logging of time
234510450e9eSJacob Faibussowitsch   devoted to GPU computations (excluding kernel launch times).
2346811af0c4SBarry Smith 
234710450e9eSJacob Faibussowitsch   When CUDA or HIP is not available, the timer is run on the CPU, it is a separate logging of
234810450e9eSJacob Faibussowitsch   time devoted to GPU computations (including kernel launch times).
2349811af0c4SBarry Smith 
235010450e9eSJacob Faibussowitsch   There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and
235110450e9eSJacob Faibussowitsch   `PetscLogGpuTimeEnd()`
2352811af0c4SBarry Smith 
235310450e9eSJacob Faibussowitsch   This timer should NOT include times for data transfers between the GPU and CPU, nor setup
235410450e9eSJacob Faibussowitsch   actions such as allocating space.
2355811af0c4SBarry Smith 
235610450e9eSJacob Faibussowitsch   The regular logging captures the time for data transfers and any CPU activities during the
235710450e9eSJacob Faibussowitsch   event. It is used to compute the flop rate on the GPU as it is actively engaged in running a
235810450e9eSJacob Faibussowitsch   kernel.
23599ffd0706SHong Zhang 
23609ffd0706SHong Zhang   Developer Notes:
236110450e9eSJacob Faibussowitsch   The GPU event timer captures the execution time of all the kernels launched in the default
236210450e9eSJacob Faibussowitsch   stream by the CPU between `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()`.
2363811af0c4SBarry Smith 
236410450e9eSJacob Faibussowitsch   `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()` insert the begin and end events into the
236510450e9eSJacob Faibussowitsch   default stream (stream 0). The device will record a time stamp for the event when it reaches
236610450e9eSJacob Faibussowitsch   that event in the stream. The function xxxEventSynchronize() is called in
236710450e9eSJacob Faibussowitsch   `PetsLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the
236810450e9eSJacob Faibussowitsch   timer event is recorded.
23699ffd0706SHong Zhang 
2370d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()`
23719ffd0706SHong Zhang @*/
2372d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void)
2373d71ae5a4SJacob Faibussowitsch {
2374b665b14eSToby Isaac   PetscBool isActive;
2375b665b14eSToby Isaac 
23769ffd0706SHong Zhang   PetscFunctionBegin;
2377b665b14eSToby Isaac   PetscCall(PetscLogEventBeginIsActive(&isActive));
2378b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
2379744d70b0SJunchao Zhang   if (PetscDefined(HAVE_DEVICE)) {
2380a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2381a4af0ceeSJacob Faibussowitsch 
23829566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
23839566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextBeginTimer_Internal(dctx));
2384a4af0ceeSJacob Faibussowitsch   } else {
23859566063dSJacob Faibussowitsch     PetscCall(PetscTimeSubtract(&petsc_gtime));
2386a4af0ceeSJacob Faibussowitsch   }
23873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23889ffd0706SHong Zhang }
23899ffd0706SHong Zhang 
23909ffd0706SHong Zhang /*@C
23919ffd0706SHong Zhang   PetscLogGpuTimeEnd - Stop timer for device
23929ffd0706SHong Zhang 
23939ffd0706SHong Zhang   Level: intermediate
23949ffd0706SHong Zhang 
2395d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()`
23969ffd0706SHong Zhang @*/
2397d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void)
2398d71ae5a4SJacob Faibussowitsch {
2399b665b14eSToby Isaac   PetscBool isActive;
2400b665b14eSToby Isaac 
24019ffd0706SHong Zhang   PetscFunctionBegin;
2402b665b14eSToby Isaac   PetscCall(PetscLogEventEndIsActive(&isActive));
2403b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
2404744d70b0SJunchao Zhang   if (PetscDefined(HAVE_DEVICE)) {
2405a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2406a4af0ceeSJacob Faibussowitsch     PetscLogDouble     elapsed;
2407a4af0ceeSJacob Faibussowitsch 
24089566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
24099566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed));
2410a4af0ceeSJacob Faibussowitsch     petsc_gtime += (elapsed / 1000.0);
2411a4af0ceeSJacob Faibussowitsch   } else {
24129566063dSJacob Faibussowitsch     PetscCall(PetscTimeAdd(&petsc_gtime));
2413a4af0ceeSJacob Faibussowitsch   }
24143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24159ffd0706SHong Zhang }
2416c708d6e3SStefano Zampini 
24179ffd0706SHong Zhang   #endif /* end of PETSC_HAVE_DEVICE */
24189ffd0706SHong Zhang 
2419cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/
2420cb9ef012SToby Isaac 
2421dd01b7e5SBarry Smith /* -- Utility functions for logging from Fortran -- */
2422b665b14eSToby Isaac 
2423b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype)
2424b665b14eSToby Isaac {
2425b665b14eSToby Isaac   PetscFunctionBegin;
2426cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2427b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1));
2428b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2429b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th));
2430b665b14eSToby Isaac   #endif
2431cb9ef012SToby Isaac #endif
2432b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2433b665b14eSToby Isaac }
2434b665b14eSToby Isaac 
2435b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype)
2436b665b14eSToby Isaac {
2437b665b14eSToby Isaac   PetscFunctionBegin;
2438cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2439b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1));
2440b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2441b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_recv_len, &petsc_recv_len_th));
2442b665b14eSToby Isaac   #endif
2443cb9ef012SToby Isaac #endif
2444b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2445b665b14eSToby Isaac }
2446b665b14eSToby Isaac 
2447b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void)
2448b665b14eSToby Isaac {
2449b665b14eSToby Isaac   PetscFunctionBegin;
2450cb9ef012SToby Isaac   if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1));
2451b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2452b665b14eSToby Isaac }
2453b665b14eSToby Isaac 
24545c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
24555c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID  = 0;
24565c6c1daeSBarry Smith 
24572611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE;
24582611ad71SToby Isaac 
24592611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void)
24602611ad71SToby Isaac {
24612611ad71SToby Isaac   int stage;
24622611ad71SToby Isaac 
24632611ad71SToby Isaac   PetscFunctionBegin;
24642611ad71SToby Isaac   if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS);
24652611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_TRUE;
24662611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
24672611ad71SToby Isaac     /* Setup default logging structures */
24682611ad71SToby Isaac     PetscCall(PetscLogStateCreate(&petsc_log_state));
24692611ad71SToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
24702611ad71SToby Isaac       if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state));
24712611ad71SToby Isaac     }
24722611ad71SToby Isaac     PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage));
24732611ad71SToby Isaac     PetscCall(PetscSpinlockCreate(&PetscLogSpinLock));
24742611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY)
24752611ad71SToby Isaac     petsc_log_tid = 0;
24762611ad71SToby Isaac     petsc_log_gid = 0;
24772611ad71SToby Isaac #endif
24782611ad71SToby Isaac 
24792611ad71SToby Isaac     /* All processors sync here for more consistent logging */
24802611ad71SToby Isaac     PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
24812611ad71SToby Isaac     PetscCall(PetscTime(&petsc_BaseTime));
24822611ad71SToby Isaac     PetscCall(PetscLogStagePush(stage));
24832611ad71SToby Isaac   }
24842611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
24852611ad71SToby Isaac }
24862611ad71SToby Isaac 
24872611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void)
24882611ad71SToby Isaac {
24892611ad71SToby Isaac   PetscFunctionBegin;
24902611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
2491b665b14eSToby Isaac     /* Resetting phase */
2492b665b14eSToby Isaac     // pop remaining stages
2493b665b14eSToby Isaac     if (petsc_log_state) {
2494b665b14eSToby Isaac       while (petsc_log_state->current_stage >= 0) { PetscCall(PetscLogStagePop()); }
2495b665b14eSToby Isaac     }
24962611ad71SToby Isaac     for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler));
24972611ad71SToby Isaac     PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX));
24982611ad71SToby Isaac     PetscCall(PetscLogStateDestroy(&petsc_log_state));
24992611ad71SToby Isaac 
25002611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25012611ad71SToby Isaac     petsc_BaseTime           = 0.0;
25022611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25032611ad71SToby Isaac     petsc_send_ct            = 0.0;
25042611ad71SToby Isaac     petsc_recv_ct            = 0.0;
25052611ad71SToby Isaac     petsc_send_len           = 0.0;
25062611ad71SToby Isaac     petsc_recv_len           = 0.0;
25072611ad71SToby Isaac     petsc_isend_ct           = 0.0;
25082611ad71SToby Isaac     petsc_irecv_ct           = 0.0;
25092611ad71SToby Isaac     petsc_isend_len          = 0.0;
25102611ad71SToby Isaac     petsc_irecv_len          = 0.0;
25112611ad71SToby Isaac     petsc_wait_ct            = 0.0;
25122611ad71SToby Isaac     petsc_wait_any_ct        = 0.0;
25132611ad71SToby Isaac     petsc_wait_all_ct        = 0.0;
25142611ad71SToby Isaac     petsc_sum_of_waits_ct    = 0.0;
25152611ad71SToby Isaac     petsc_allreduce_ct       = 0.0;
25162611ad71SToby Isaac     petsc_gather_ct          = 0.0;
25172611ad71SToby Isaac     petsc_scatter_ct         = 0.0;
25182611ad71SToby Isaac     petsc_TotalFlops_th      = 0.0;
25192611ad71SToby Isaac     petsc_send_ct_th         = 0.0;
25202611ad71SToby Isaac     petsc_recv_ct_th         = 0.0;
25212611ad71SToby Isaac     petsc_send_len_th        = 0.0;
25222611ad71SToby Isaac     petsc_recv_len_th        = 0.0;
25232611ad71SToby Isaac     petsc_isend_ct_th        = 0.0;
25242611ad71SToby Isaac     petsc_irecv_ct_th        = 0.0;
25252611ad71SToby Isaac     petsc_isend_len_th       = 0.0;
25262611ad71SToby Isaac     petsc_irecv_len_th       = 0.0;
25272611ad71SToby Isaac     petsc_wait_ct_th         = 0.0;
25282611ad71SToby Isaac     petsc_wait_any_ct_th     = 0.0;
25292611ad71SToby Isaac     petsc_wait_all_ct_th     = 0.0;
25302611ad71SToby Isaac     petsc_sum_of_waits_ct_th = 0.0;
25312611ad71SToby Isaac     petsc_allreduce_ct_th    = 0.0;
25322611ad71SToby Isaac     petsc_gather_ct_th       = 0.0;
25332611ad71SToby Isaac     petsc_scatter_ct_th      = 0.0;
25342611ad71SToby Isaac 
25352611ad71SToby Isaac     petsc_ctog_ct    = 0.0;
25362611ad71SToby Isaac     petsc_gtoc_ct    = 0.0;
25372611ad71SToby Isaac     petsc_ctog_sz    = 0.0;
25382611ad71SToby Isaac     petsc_gtoc_sz    = 0.0;
25392611ad71SToby Isaac     petsc_gflops     = 0.0;
25402611ad71SToby Isaac     petsc_gtime      = 0.0;
25412611ad71SToby Isaac     petsc_ctog_ct_th = 0.0;
25422611ad71SToby Isaac     petsc_gtoc_ct_th = 0.0;
25432611ad71SToby Isaac     petsc_ctog_sz_th = 0.0;
25442611ad71SToby Isaac     petsc_gtoc_sz_th = 0.0;
25452611ad71SToby Isaac     petsc_gflops_th  = 0.0;
25462611ad71SToby Isaac     petsc_gtime_th   = 0.0;
25472611ad71SToby Isaac   }
25482611ad71SToby Isaac   PETSC_LARGEST_CLASSID    = PETSC_SMALLEST_CLASSID;
25492611ad71SToby Isaac   PETSC_OBJECT_CLASSID     = 0;
25502611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_FALSE;
25512611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25522611ad71SToby Isaac }
25532611ad71SToby Isaac 
25545c6c1daeSBarry Smith /*@C
25555c6c1daeSBarry Smith   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
25565c6c1daeSBarry Smith 
25575c6c1daeSBarry Smith   Not Collective
25585c6c1daeSBarry Smith 
25595c6c1daeSBarry Smith   Input Parameter:
25605c6c1daeSBarry Smith . name - The class name
25615c6c1daeSBarry Smith 
25625c6c1daeSBarry Smith   Output Parameter:
25635c6c1daeSBarry Smith . oclass - The class id or classid
25645c6c1daeSBarry Smith 
25655c6c1daeSBarry Smith   Level: developer
25665c6c1daeSBarry Smith 
2567d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`
25685c6c1daeSBarry Smith @*/
2569d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass)
2570d71ae5a4SJacob Faibussowitsch {
25715c6c1daeSBarry Smith   PetscFunctionBegin;
25725c6c1daeSBarry Smith   *oclass = ++PETSC_LARGEST_CLASSID;
25735c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2574b665b14eSToby Isaac   {
2575b665b14eSToby Isaac     PetscLogState state;
2576b665b14eSToby Isaac     PetscLogClass logclass;
2577b665b14eSToby Isaac 
2578b665b14eSToby Isaac     PetscCall(PetscLogGetState(&state));
2579b665b14eSToby Isaac     if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass));
2580b665b14eSToby Isaac   }
25815c6c1daeSBarry Smith #endif
25823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
25835c6c1daeSBarry Smith }
2584