xref: /petsc/src/sys/logging/plog.c (revision ffeef943c8ee50edff320d8a3135bb0c94853e4c)
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 
10610dd146fSPierre Jolivet // clang-format off
10710dd146fSPierre Jolivet #define PETSC_LOG_HANDLER_HOT_BLANK {NULL, NULL, NULL, NULL, NULL, NULL}
10810dd146fSPierre Jolivet // clang-format on
1092611ad71SToby Isaac 
1102611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = {
1112611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1122611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1132611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1142611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1152611ad71SToby Isaac };
1162611ad71SToby Isaac 
1172611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK
1182611ad71SToby Isaac 
1192611ad71SToby Isaac #if defined(PETSC_USE_LOG)
1202611ad71SToby Isaac   #include <../src/sys/logging/handler/impls/default/logdefault.h>
121c708d6e3SStefano Zampini 
122c708d6e3SStefano Zampini   #if defined(PETSC_HAVE_THREADSAFETY)
123c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp)
124c708d6e3SStefano Zampini {
125c708d6e3SStefano Zampini   *tot_th += tmp;
1263ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
127c708d6e3SStefano Zampini   *tot += tmp;
1283ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1293ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
130c708d6e3SStefano Zampini }
131c708d6e3SStefano Zampini 
132c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp)
133c708d6e3SStefano Zampini {
134c708d6e3SStefano Zampini   *cnt_th = *cnt_th + 1;
135c708d6e3SStefano Zampini   *tot_th += tmp;
1363ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
137c708d6e3SStefano Zampini   *tot += (PetscLogDouble)(tmp);
138c708d6e3SStefano Zampini   *cnt += *cnt + 1;
1393ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1403ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
141c708d6e3SStefano Zampini }
142c708d6e3SStefano Zampini 
143bec0b493Shannah_mairs   #endif
1445c6c1daeSBarry Smith 
14553e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
14653e0a2f3SToby Isaac {
14753e0a2f3SToby Isaac   PetscFunctionBegin;
14853e0a2f3SToby Isaac   PetscAssertPointer(handler, 2);
14953e0a2f3SToby Isaac   *handler = NULL;
15053e0a2f3SToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
15153e0a2f3SToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
15253e0a2f3SToby Isaac     if (h) {
15353e0a2f3SToby Isaac       PetscBool match;
15453e0a2f3SToby Isaac 
15553e0a2f3SToby Isaac       PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match));
15653e0a2f3SToby Isaac       if (match) {
15753e0a2f3SToby Isaac         *handler = PetscLogHandlers[i].handler;
15853e0a2f3SToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
15953e0a2f3SToby Isaac       }
16053e0a2f3SToby Isaac     }
16153e0a2f3SToby Isaac   }
16253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
16353e0a2f3SToby Isaac }
16453e0a2f3SToby Isaac 
16553e0a2f3SToby Isaac /*@
166b665b14eSToby Isaac   PetscLogGetDefaultHandler - Get the default log handler if it is running.
167b665b14eSToby Isaac 
168b665b14eSToby Isaac   Not collective
169b665b14eSToby Isaac 
170b665b14eSToby Isaac   Output Parameter:
171b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running.
172b665b14eSToby Isaac 
173b665b14eSToby Isaac   Level: developer
174b665b14eSToby Isaac 
175b665b14eSToby Isaac   Notes:
176b665b14eSToby Isaac   The default handler is started with `PetscLogDefaultBegin()`,
177b665b14eSToby Isaac   if the options flags `-log_all` or `-log_view` is given without arguments,
178b665b14eSToby Isaac   or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`.
179b665b14eSToby Isaac 
180b665b14eSToby Isaac .seealso: [](ch_profiling)
181b665b14eSToby Isaac @*/
182b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler)
183b665b14eSToby Isaac {
184b665b14eSToby Isaac   PetscFunctionBegin;
185294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler));
186b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
187b665b14eSToby Isaac }
188b665b14eSToby Isaac 
189b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
190b665b14eSToby Isaac {
191b665b14eSToby Isaac   PetscFunctionBegin;
192b665b14eSToby Isaac   PetscAssertPointer(handler, 2);
193b665b14eSToby Isaac   PetscCall(PetscLogTryGetHandler(type, handler));
1941943a749SToby Isaac   PetscCheck(*handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type);
195b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
196b665b14eSToby Isaac }
197b665b14eSToby Isaac 
198b665b14eSToby Isaac /*@
19953e0a2f3SToby Isaac   PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used
20053e0a2f3SToby Isaac   by all default log handlers (`PetscLogDefaultBegin()`,
20153e0a2f3SToby Isaac   `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`,
20253e0a2f3SToby Isaac   `PetscLogPerfstubsBegin()`).
20353e0a2f3SToby Isaac 
20453e0a2f3SToby Isaac   Collective on `PETSC_COMM_WORLD`
20553e0a2f3SToby Isaac 
20653e0a2f3SToby Isaac   Output Parameter:
207b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as
208b665b14eSToby Isaac           `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or
209b8004f34SBarry Smith           `PetscLogStagePush()`), or `NULL` if logging is not active
21053e0a2f3SToby Isaac 
21153e0a2f3SToby Isaac   Level: developer
21253e0a2f3SToby Isaac 
21353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState`
21453e0a2f3SToby Isaac @*/
21553e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state)
21653e0a2f3SToby Isaac {
21753e0a2f3SToby Isaac   PetscFunctionBegin;
21853e0a2f3SToby Isaac   PetscAssertPointer(state, 1);
21953e0a2f3SToby Isaac   *state = petsc_log_state;
22053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
22153e0a2f3SToby Isaac }
22253e0a2f3SToby Isaac 
22353e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot)
22453e0a2f3SToby Isaac {
22553e0a2f3SToby Isaac   PetscFunctionBegin;
22653e0a2f3SToby Isaac   hot->handler       = h;
22753e0a2f3SToby Isaac   hot->eventBegin    = h->ops->eventbegin;
22853e0a2f3SToby Isaac   hot->eventEnd      = h->ops->eventend;
22953e0a2f3SToby Isaac   hot->eventSync     = h->ops->eventsync;
23053e0a2f3SToby Isaac   hot->objectCreate  = h->ops->objectcreate;
23153e0a2f3SToby Isaac   hot->objectDestroy = h->ops->objectdestroy;
23253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
23353e0a2f3SToby Isaac }
23453e0a2f3SToby Isaac 
23553e0a2f3SToby Isaac /*@
23653e0a2f3SToby Isaac   PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state.
23753e0a2f3SToby Isaac 
23853e0a2f3SToby Isaac   Logically collective
23953e0a2f3SToby Isaac 
24053e0a2f3SToby Isaac   Input Parameters:
24153e0a2f3SToby Isaac . h - a `PetscLogHandler`
24253e0a2f3SToby Isaac 
24353e0a2f3SToby Isaac   Level: developer
24453e0a2f3SToby Isaac 
24553e0a2f3SToby Isaac   Notes:
24653e0a2f3SToby Isaac   Users should only need this if they create their own log handlers: handlers that are started
24753e0a2f3SToby Isaac   from the command line (such as `-log_view` and `-log_trace`) or from a function like
24853e0a2f3SToby Isaac   `PetscLogNestedBegin()` will automatically be started.
24953e0a2f3SToby Isaac 
25053e0a2f3SToby Isaac   There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time.
25153e0a2f3SToby Isaac 
25253e0a2f3SToby Isaac   To disconnect a handler from the global stream call `PetscLogHandlerStop()`.
25353e0a2f3SToby Isaac 
25453e0a2f3SToby Isaac   When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`,
25553e0a2f3SToby Isaac   will be pushed for the new log handler, but it will not be informed of any events that are
25653e0a2f3SToby Isaac   in progress.  It is recommended to start any user-defined log handlers immediately following
257b8004f34SBarry Smith   `PetscInitialize()`  before any user-defined stages are pushed.
25853e0a2f3SToby Isaac 
259b8004f34SBarry Smith .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()`, `PetscInitialize()`
26053e0a2f3SToby Isaac @*/
26153e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h)
26253e0a2f3SToby Isaac {
26353e0a2f3SToby Isaac   PetscFunctionBegin;
26453e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26553e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS);
26653e0a2f3SToby Isaac   }
26753e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26853e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == NULL) {
26953e0a2f3SToby Isaac       PetscCall(PetscObjectReference((PetscObject)h));
27053e0a2f3SToby Isaac       PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i]));
27153e0a2f3SToby Isaac       if (petsc_log_state) {
27253e0a2f3SToby Isaac         PetscLogStage stack_height;
27353e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
27453e0a2f3SToby Isaac 
27553e0a2f3SToby Isaac         PetscCall(PetscLogHandlerSetState(h, petsc_log_state));
27653e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
27753e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
27853e0a2f3SToby Isaac         orig_stack                     = petsc_log_state->stage_stack;
27953e0a2f3SToby Isaac         petsc_log_state->stage_stack   = temp_stack;
28053e0a2f3SToby Isaac         petsc_log_state->current_stage = -1;
28153e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
28253e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
28353e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePush(h, stage));
28453e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
28553e0a2f3SToby Isaac           petsc_log_state->current_stage = stage;
28653e0a2f3SToby Isaac         }
28753e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
28853e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
28953e0a2f3SToby Isaac       }
29053e0a2f3SToby Isaac       PetscFunctionReturn(PETSC_SUCCESS);
29153e0a2f3SToby Isaac     }
29253e0a2f3SToby Isaac   }
29353e0a2f3SToby Isaac   SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX);
29453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
29553e0a2f3SToby Isaac }
29653e0a2f3SToby Isaac 
29753e0a2f3SToby Isaac /*@
29853e0a2f3SToby Isaac   PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream.
29953e0a2f3SToby Isaac 
30053e0a2f3SToby Isaac   Logically collective
30153e0a2f3SToby Isaac 
30253e0a2f3SToby Isaac   Input Parameters:
30353e0a2f3SToby Isaac . h - a `PetscLogHandler`
30453e0a2f3SToby Isaac 
30553e0a2f3SToby Isaac   Level: developer
30653e0a2f3SToby Isaac 
30753e0a2f3SToby Isaac   Note:
30853e0a2f3SToby Isaac   After `PetscLogHandlerStop()`, the handler can still access the global logging state
30953e0a2f3SToby Isaac   with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing
31053e0a2f3SToby Isaac   (for instance, in `PetscLogHandlerView()`),
31153e0a2f3SToby Isaac 
31253e0a2f3SToby Isaac   When a log handler is stopped, the remaining stages will be popped before it is
31353e0a2f3SToby Isaac   disconnected from the log stream.
31453e0a2f3SToby Isaac 
31553e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()`
31653e0a2f3SToby Isaac @*/
31753e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h)
31853e0a2f3SToby Isaac {
31953e0a2f3SToby Isaac   PetscFunctionBegin;
32053e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
32153e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) {
32253e0a2f3SToby Isaac       if (petsc_log_state) {
32353e0a2f3SToby Isaac         PetscLogState state;
32453e0a2f3SToby Isaac         PetscLogStage stack_height;
32553e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
32653e0a2f3SToby Isaac 
32753e0a2f3SToby Isaac         PetscCall(PetscLogHandlerGetState(h, &state));
32853e0a2f3SToby Isaac         PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started.");
32953e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
33053e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
33153e0a2f3SToby Isaac         orig_stack                   = petsc_log_state->stage_stack;
33253e0a2f3SToby Isaac         petsc_log_state->stage_stack = temp_stack;
33353e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
33453e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
33553e0a2f3SToby Isaac 
33653e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
33753e0a2f3SToby Isaac         }
33853e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
33953e0a2f3SToby Isaac           PetscLogStage stage;
34053e0a2f3SToby Isaac           PetscBool     empty;
34153e0a2f3SToby Isaac 
34253e0a2f3SToby Isaac           PetscCall(PetscIntStackPop(temp_stack, &stage));
34353e0a2f3SToby Isaac           PetscCall(PetscIntStackEmpty(temp_stack, &empty));
34453e0a2f3SToby Isaac           if (!empty) {
34553e0a2f3SToby Isaac             PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage));
34653e0a2f3SToby Isaac           } else petsc_log_state->current_stage = -1;
34753e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePop(h, stage));
34853e0a2f3SToby Isaac         }
34953e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
35053e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
35153e0a2f3SToby Isaac         PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage));
35253e0a2f3SToby Isaac       }
35353e0a2f3SToby Isaac       PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1));
35453e0a2f3SToby Isaac       PetscCall(PetscObjectDereference((PetscObject)h));
35553e0a2f3SToby Isaac     }
35653e0a2f3SToby Isaac   }
35753e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
35853e0a2f3SToby Isaac }
3595c6c1daeSBarry Smith 
360cc4c1da9SBarry Smith /*@
3614dd65854SConnor Ward   PetscLogIsActive - Check if logging is currently in progress.
3624dd65854SConnor Ward 
3634dd65854SConnor Ward   Not Collective
3644dd65854SConnor Ward 
3654dd65854SConnor Ward   Output Parameter:
366811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise
3674dd65854SConnor Ward 
3684dd65854SConnor Ward   Level: beginner
3694dd65854SConnor Ward 
370b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`
3714dd65854SConnor Ward @*/
372d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive)
373d71ae5a4SJacob Faibussowitsch {
3744dd65854SConnor Ward   PetscFunctionBegin;
375b665b14eSToby Isaac   *isActive = PETSC_FALSE;
376b665b14eSToby Isaac   if (petsc_log_state) {
377b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
378b665b14eSToby Isaac       if (PetscLogHandlers[i].handler) {
379b665b14eSToby Isaac         *isActive = PETSC_TRUE;
380b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
381b665b14eSToby Isaac       }
382b665b14eSToby Isaac     }
383b665b14eSToby Isaac   }
384b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
385b665b14eSToby Isaac }
386b665b14eSToby Isaac 
387b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive)
388b665b14eSToby Isaac {
389b665b14eSToby Isaac   PetscFunctionBegin;
390b665b14eSToby Isaac   *isActive = PETSC_FALSE;
391b665b14eSToby Isaac   if (petsc_log_state) {
392b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
393b665b14eSToby Isaac       if (PetscLogHandlers[i].eventBegin) {
394b665b14eSToby Isaac         *isActive = PETSC_TRUE;
395b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
396b665b14eSToby Isaac       }
397b665b14eSToby Isaac     }
398b665b14eSToby Isaac   }
399b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
400b665b14eSToby Isaac }
401b665b14eSToby Isaac 
402b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive)
403b665b14eSToby Isaac {
404b665b14eSToby Isaac   PetscFunctionBegin;
405b665b14eSToby Isaac   *isActive = PETSC_FALSE;
406b665b14eSToby Isaac   if (petsc_log_state) {
407b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
408b665b14eSToby Isaac       if (PetscLogHandlers[i].eventEnd) {
409b665b14eSToby Isaac         *isActive = PETSC_TRUE;
410b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
411b665b14eSToby Isaac       }
412b665b14eSToby Isaac     }
413b665b14eSToby Isaac   }
4143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4154dd65854SConnor Ward }
4164dd65854SConnor Ward 
41761cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type)
41853e0a2f3SToby Isaac {
41953e0a2f3SToby Isaac   PetscLogHandler handler;
42053e0a2f3SToby Isaac 
42153e0a2f3SToby Isaac   PetscFunctionBegin;
42253e0a2f3SToby Isaac   PetscCall(PetscLogTryGetHandler(type, &handler));
42353e0a2f3SToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
42453e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler));
42553e0a2f3SToby Isaac   PetscCall(PetscLogHandlerSetType(handler, type));
42653e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
42753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
42853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
42953e0a2f3SToby Isaac }
43053e0a2f3SToby Isaac 
431cc4c1da9SBarry Smith /*@
432b665b14eSToby Isaac   PetscLogDefaultBegin - Turns on logging of objects and events using the default log handler. This logs flop
4335c6c1daeSBarry Smith   rates and object creation and should not slow programs down too much.
4345c6c1daeSBarry Smith   This routine may be called more than once.
4355c6c1daeSBarry Smith 
4368f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
4375c6c1daeSBarry Smith 
438811af0c4SBarry Smith   Options Database Key:
439a2553e36SBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the
440a2553e36SBarry Smith                                                  screen (for code configured with --with-log=1 (which is the default))
4415c6c1daeSBarry Smith 
44210450e9eSJacob Faibussowitsch   Example Usage:
4435c6c1daeSBarry Smith .vb
4445c6c1daeSBarry Smith       PetscInitialize(...);
445bb1d7374SBarry Smith       PetscLogDefaultBegin();
4465c6c1daeSBarry Smith        ... code ...
4475c6c1daeSBarry Smith       PetscLogView(viewer); or PetscLogDump();
4485c6c1daeSBarry Smith       PetscFinalize();
4495c6c1daeSBarry Smith .ve
4505c6c1daeSBarry Smith 
451d1f92df0SBarry Smith   Level: advanced
452d1f92df0SBarry Smith 
453811af0c4SBarry Smith   Note:
454811af0c4SBarry Smith   `PetscLogView()` or `PetscLogDump()` actually cause the printing of
4555c6c1daeSBarry Smith   the logging information.
4565c6c1daeSBarry Smith 
457b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`
4585c6c1daeSBarry Smith @*/
459d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDefaultBegin(void)
460d71ae5a4SJacob Faibussowitsch {
4615c6c1daeSBarry Smith   PetscFunctionBegin;
462294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERDEFAULT));
4633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4645c6c1daeSBarry Smith }
4655c6c1daeSBarry Smith 
4665c6c1daeSBarry Smith /*@C
467b665b14eSToby Isaac   PetscLogTraceBegin - Begins trace logging.  Every time a PETSc event
4685c6c1daeSBarry Smith   begins or ends, the event name is printed.
4695c6c1daeSBarry Smith 
470cc4c1da9SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`, No Fortran Support
4715c6c1daeSBarry Smith 
4725c6c1daeSBarry Smith   Input Parameter:
4735c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout)
4745c6c1daeSBarry Smith 
4755c6c1daeSBarry Smith   Options Database Key:
476b665b14eSToby Isaac . -log_trace [filename] - Begins `PetscLogTraceBegin()`
4775c6c1daeSBarry Smith 
478d1f92df0SBarry Smith   Level: intermediate
479d1f92df0SBarry Smith 
4805c6c1daeSBarry Smith   Notes:
481811af0c4SBarry Smith   `PetscLogTraceBegin()` prints the processor number, the execution time (sec),
4825c6c1daeSBarry Smith   then "Event begin:" or "Event end:" followed by the event name.
4835c6c1daeSBarry Smith 
484811af0c4SBarry Smith   `PetscLogTraceBegin()` allows tracing of all PETSc calls, which is useful
4855c6c1daeSBarry Smith   to determine where a program is hanging without running in the
4865c6c1daeSBarry Smith   debugger.  Can be used in conjunction with the -info option.
4875c6c1daeSBarry Smith 
488b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogDefaultBegin()`
4895c6c1daeSBarry Smith @*/
490d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogTraceBegin(FILE *file)
491d71ae5a4SJacob Faibussowitsch {
492b665b14eSToby Isaac   PetscLogHandler handler;
4934d86920dSPierre Jolivet 
4945c6c1daeSBarry Smith   PetscFunctionBegin;
495294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler));
496b665b14eSToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
497b665b14eSToby Isaac   PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler));
498b665b14eSToby Isaac   PetscCall(PetscLogHandlerStart(handler));
499b665b14eSToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
500b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
501b665b14eSToby Isaac }
502a297a907SKarl Rupp 
503b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *);
504b665b14eSToby Isaac 
505cc4c1da9SBarry Smith /*@
506b665b14eSToby Isaac   PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop
507b665b14eSToby Isaac   rates and object creation and should not slow programs down too much.
508b665b14eSToby Isaac 
509cc4c1da9SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`, No Fortran Support
510b665b14eSToby Isaac 
511b665b14eSToby Isaac   Options Database Keys:
512b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
513b665b14eSToby Isaac 
514b665b14eSToby Isaac   Example Usage:
515b665b14eSToby Isaac .vb
516b665b14eSToby Isaac       PetscInitialize(...);
517b665b14eSToby Isaac       PetscLogNestedBegin();
518b665b14eSToby Isaac        ... code ...
519b665b14eSToby Isaac       PetscLogView(viewer);
520b665b14eSToby Isaac       PetscFinalize();
521b665b14eSToby Isaac .ve
522b665b14eSToby Isaac 
523b665b14eSToby Isaac   Level: advanced
524b665b14eSToby Isaac 
525b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`
526b665b14eSToby Isaac @*/
527b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void)
528b665b14eSToby Isaac {
529b665b14eSToby Isaac   PetscFunctionBegin;
530294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED));
5313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5325c6c1daeSBarry Smith }
5335c6c1daeSBarry Smith 
53453e0a2f3SToby Isaac /*@C
53553e0a2f3SToby Isaac   PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks
53653e0a2f3SToby Isaac   matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`,
53753e0a2f3SToby Isaac   `PetscLogPHC`, `PetscLogPHD`.
53853e0a2f3SToby Isaac 
5398f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
54053e0a2f3SToby Isaac 
54153e0a2f3SToby Isaac   Input Parameters:
54253e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`)
54353e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`)
54453e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54553e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54653e0a2f3SToby Isaac 
54753e0a2f3SToby Isaac   Calling sequence of `PetscLogPLB`:
54853e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
54953e0a2f3SToby Isaac . _i - deprecated, unused
55053e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
55153e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
55253e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
55353e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
55453e0a2f3SToby Isaac 
55553e0a2f3SToby Isaac   Calling sequence of `PetscLogPLE`:
55653e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55753e0a2f3SToby Isaac . _i - deprecated, unused
55853e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
55953e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
56053e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
56153e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
56253e0a2f3SToby Isaac 
56353e0a2f3SToby Isaac   Calling sequence of `PetscLogPHC`:
56453e0a2f3SToby Isaac . o - a `PetscObject` that has just been created
56553e0a2f3SToby Isaac 
56653e0a2f3SToby Isaac   Calling sequence of `PetscLogPHD`:
56753e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed
56853e0a2f3SToby Isaac 
56953e0a2f3SToby Isaac   Level: advanced
57053e0a2f3SToby Isaac 
57153e0a2f3SToby Isaac   Notes:
57253e0a2f3SToby Isaac   This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code.
57353e0a2f3SToby Isaac 
57453e0a2f3SToby Isaac   This should help migrate external log handlers to use `PetscLogHandler`, but
57553e0a2f3SToby Isaac   callbacks that depend on the deprecated `PetscLogStage` datatype will have to be
57653e0a2f3SToby Isaac   updated.
57753e0a2f3SToby Isaac 
57853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState`
57953e0a2f3SToby Isaac @*/
58053e0a2f3SToby 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))
58153e0a2f3SToby Isaac {
58253e0a2f3SToby Isaac   PetscLogHandler handler;
58353e0a2f3SToby Isaac 
58453e0a2f3SToby Isaac   PetscFunctionBegin;
58553e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler));
58653e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
58753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
58853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
58953e0a2f3SToby Isaac }
59053e0a2f3SToby Isaac 
5912611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
5922611ad71SToby Isaac     #include <mpe.h>
5932611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE;
5942611ad71SToby Isaac   #endif
5952611ad71SToby Isaac 
5962611ad71SToby Isaac /*@C
5972611ad71SToby Isaac   PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the
5982611ad71SToby Isaac   program down.
5992611ad71SToby Isaac 
600cc4c1da9SBarry Smith   Collective on `PETSC_COMM_WORLD`, No Fortran Support
6012611ad71SToby Isaac 
6022611ad71SToby Isaac   Options Database Key:
6032611ad71SToby Isaac . -log_mpe - Prints extensive log information
6042611ad71SToby Isaac 
6052611ad71SToby Isaac   Level: advanced
6062611ad71SToby Isaac 
6072611ad71SToby Isaac   Note:
6082611ad71SToby Isaac   A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is
6092611ad71SToby Isaac   intended for production runs since it logs only flop rates and object creation (and should
6102611ad71SToby Isaac   not significantly slow the programs).
6112611ad71SToby Isaac 
612b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`,
6132611ad71SToby Isaac           `PetscLogEventDeactivate()`
6142611ad71SToby Isaac @*/
6152611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void)
6162611ad71SToby Isaac {
6172611ad71SToby Isaac   PetscFunctionBegin;
6182611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
6192611ad71SToby Isaac   /* Do MPE initialization */
6202611ad71SToby Isaac   if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */
6212611ad71SToby Isaac     PetscCall(PetscInfo(0, "Initializing MPE.\n"));
6222611ad71SToby Isaac     PetscCall(MPE_Init_log());
6232611ad71SToby Isaac 
6242611ad71SToby Isaac     PetscBeganMPE = PETSC_TRUE;
6252611ad71SToby Isaac   } else {
6262611ad71SToby Isaac     PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n"));
6272611ad71SToby Isaac   }
628294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE));
6292611ad71SToby Isaac   #else
6302611ad71SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
6312611ad71SToby Isaac   #endif
6322611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6332611ad71SToby Isaac }
6342611ad71SToby Isaac 
63553e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
63653e0a2f3SToby Isaac     #include <../src/sys/perfstubs/timer.h>
63753e0a2f3SToby Isaac   #endif
63853e0a2f3SToby Isaac 
63953e0a2f3SToby Isaac /*@C
64053e0a2f3SToby Isaac   PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface.
64153e0a2f3SToby Isaac 
642cc4c1da9SBarry Smith   Collective on `PETSC_COMM_WORLD`, No Fortran Support
64353e0a2f3SToby Isaac 
64453e0a2f3SToby Isaac   Options Database Key:
64553e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface
64653e0a2f3SToby Isaac 
64753e0a2f3SToby Isaac   Level: advanced
64853e0a2f3SToby Isaac 
64953e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()`
65053e0a2f3SToby Isaac @*/
65153e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void)
65253e0a2f3SToby Isaac {
65353e0a2f3SToby Isaac   PetscFunctionBegin;
65453e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
655294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS));
65653e0a2f3SToby Isaac   #else
65753e0a2f3SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs");
65853e0a2f3SToby Isaac   #endif
65953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
66053e0a2f3SToby Isaac }
66153e0a2f3SToby Isaac 
6625c6c1daeSBarry Smith /*@
663b665b14eSToby Isaac   PetscLogActions - Determines whether actions are logged for the default log handler.
6645c6c1daeSBarry Smith 
6655c6c1daeSBarry Smith   Not Collective
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith   Input Parameter:
668811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged
669811af0c4SBarry Smith 
670811af0c4SBarry Smith   Options Database Key:
671b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing
672b665b14eSToby Isaac - -log_include_actions - Turn on action logging
6735c6c1daeSBarry Smith 
6745c6c1daeSBarry Smith   Level: intermediate
6755c6c1daeSBarry Smith 
676811af0c4SBarry Smith   Note:
677811af0c4SBarry Smith   Logging of actions continues to consume more memory as the program
6785c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
679aec76313SJacob Faibussowitsch 
680b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
6815c6c1daeSBarry Smith @*/
682d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag)
683d71ae5a4SJacob Faibussowitsch {
6845c6c1daeSBarry Smith   PetscFunctionBegin;
685dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
686dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
687dff009beSToby Isaac 
688dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag));
689dff009beSToby Isaac   }
6903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6915c6c1daeSBarry Smith }
6925c6c1daeSBarry Smith 
6935c6c1daeSBarry Smith /*@
6945c6c1daeSBarry Smith   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
6955c6c1daeSBarry Smith 
6965c6c1daeSBarry Smith   Not Collective
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith   Input Parameter:
699811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged
700811af0c4SBarry Smith 
701811af0c4SBarry Smith   Options Database Key:
702b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing
703b665b14eSToby Isaac - -log_include_objects - Turns on object logging
7045c6c1daeSBarry Smith 
7055c6c1daeSBarry Smith   Level: intermediate
7065c6c1daeSBarry Smith 
707811af0c4SBarry Smith   Note:
708811af0c4SBarry Smith   Logging of objects continues to consume more memory as the program
7095c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
7105c6c1daeSBarry Smith 
711b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
7125c6c1daeSBarry Smith @*/
713d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag)
714d71ae5a4SJacob Faibussowitsch {
7155c6c1daeSBarry Smith   PetscFunctionBegin;
716dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
717dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
718dff009beSToby Isaac 
719dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag));
720dff009beSToby Isaac   }
7213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7225c6c1daeSBarry Smith }
7235c6c1daeSBarry Smith 
7245c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/
725cc4c1da9SBarry Smith /*@
72674c0405dSRichard Tran Mills   PetscLogStageRegister - Attaches a character string name to a logging stage.
7275c6c1daeSBarry Smith 
7285c6c1daeSBarry Smith   Not Collective
7295c6c1daeSBarry Smith 
7305c6c1daeSBarry Smith   Input Parameter:
7315c6c1daeSBarry Smith . sname - The name to associate with that stage
7325c6c1daeSBarry Smith 
7335c6c1daeSBarry Smith   Output Parameter:
734b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`).
7355c6c1daeSBarry Smith 
7365c6c1daeSBarry Smith   Level: intermediate
7375c6c1daeSBarry Smith 
738d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`
7395c6c1daeSBarry Smith @*/
740d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage)
741d71ae5a4SJacob Faibussowitsch {
742b665b14eSToby Isaac   PetscLogState state;
7435c6c1daeSBarry Smith 
7445c6c1daeSBarry Smith   PetscFunctionBegin;
745b665b14eSToby Isaac   *stage = -1;
746b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
747b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage));
7483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7495c6c1daeSBarry Smith }
7505c6c1daeSBarry Smith 
751cc4c1da9SBarry Smith /*@
752811af0c4SBarry Smith   PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage
7535c6c1daeSBarry Smith 
7545c6c1daeSBarry Smith   Not Collective
7555c6c1daeSBarry Smith 
7565c6c1daeSBarry Smith   Input Parameter:
7575c6c1daeSBarry Smith . stage - The stage on which to log
7585c6c1daeSBarry Smith 
75910450e9eSJacob Faibussowitsch   Example Usage:
760811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
7615c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
7625c6c1daeSBarry Smith   PetscFinalize().
7635c6c1daeSBarry Smith .vb
7645c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
7655c6c1daeSBarry Smith       [stage 0 of code]
7665c6c1daeSBarry Smith       PetscLogStagePush(1);
7675c6c1daeSBarry Smith       [stage 1 of code]
7685c6c1daeSBarry Smith       PetscLogStagePop();
7695c6c1daeSBarry Smith       PetscBarrier(...);
7705c6c1daeSBarry Smith       [more stage 0 of code]
7715c6c1daeSBarry Smith       PetscFinalize();
7725c6c1daeSBarry Smith .ve
7735c6c1daeSBarry Smith 
774d1f92df0SBarry Smith   Level: intermediate
775d1f92df0SBarry Smith 
776811af0c4SBarry Smith   Note:
777811af0c4SBarry Smith   Use `PetscLogStageRegister()` to register a stage.
7785c6c1daeSBarry Smith 
779d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()`
7805c6c1daeSBarry Smith @*/
781d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage)
782d71ae5a4SJacob Faibussowitsch {
783b665b14eSToby Isaac   PetscLogState state;
7845c6c1daeSBarry Smith 
7855c6c1daeSBarry Smith   PetscFunctionBegin;
786b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
787b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
788b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
789b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
790b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePush(h, stage));
791b665b14eSToby Isaac   }
792b665b14eSToby Isaac   PetscCall(PetscLogStateStagePush(state, stage));
7933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7945c6c1daeSBarry Smith }
7955c6c1daeSBarry Smith 
796cc4c1da9SBarry Smith /*@
797811af0c4SBarry Smith   PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()`
7985c6c1daeSBarry Smith 
7995c6c1daeSBarry Smith   Not Collective
8005c6c1daeSBarry Smith 
80110450e9eSJacob Faibussowitsch   Example Usage:
802811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
8035c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
8045c6c1daeSBarry Smith   PetscFinalize().
8055c6c1daeSBarry Smith .vb
8065c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
8075c6c1daeSBarry Smith       [stage 0 of code]
8085c6c1daeSBarry Smith       PetscLogStagePush(1);
8095c6c1daeSBarry Smith       [stage 1 of code]
8105c6c1daeSBarry Smith       PetscLogStagePop();
8115c6c1daeSBarry Smith       PetscBarrier(...);
8125c6c1daeSBarry Smith       [more stage 0 of code]
8135c6c1daeSBarry Smith       PetscFinalize();
8145c6c1daeSBarry Smith .ve
8155c6c1daeSBarry Smith 
8165c6c1daeSBarry Smith   Level: intermediate
8175c6c1daeSBarry Smith 
818d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()`
8195c6c1daeSBarry Smith @*/
820d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void)
821d71ae5a4SJacob Faibussowitsch {
822b665b14eSToby Isaac   PetscLogState state;
823b665b14eSToby Isaac   PetscLogStage current_stage;
8245c6c1daeSBarry Smith 
8255c6c1daeSBarry Smith   PetscFunctionBegin;
826b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
827b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
828b665b14eSToby Isaac   current_stage = state->current_stage;
829b665b14eSToby Isaac   PetscCall(PetscLogStateStagePop(state));
830b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
831b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
832b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage));
833b665b14eSToby Isaac   }
8343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8355c6c1daeSBarry Smith }
8365c6c1daeSBarry Smith 
8375c6c1daeSBarry Smith /*@
838811af0c4SBarry Smith   PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8395c6c1daeSBarry Smith 
8405c6c1daeSBarry Smith   Not Collective
8415c6c1daeSBarry Smith 
8425c6c1daeSBarry Smith   Input Parameters:
8435c6c1daeSBarry Smith + stage    - The stage
844811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8455c6c1daeSBarry Smith 
8465c6c1daeSBarry Smith   Level: intermediate
8475c6c1daeSBarry Smith 
848811af0c4SBarry Smith   Note:
849811af0c4SBarry Smith   If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist
850811af0c4SBarry Smith 
851d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8525c6c1daeSBarry Smith @*/
853d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive)
854d71ae5a4SJacob Faibussowitsch {
855b665b14eSToby Isaac   PetscLogState state;
8565c6c1daeSBarry Smith 
8575c6c1daeSBarry Smith   PetscFunctionBegin;
858b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
859b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive));
8603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8615c6c1daeSBarry Smith }
8625c6c1daeSBarry Smith 
8635c6c1daeSBarry Smith /*@
864811af0c4SBarry Smith   PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8655c6c1daeSBarry Smith 
8665c6c1daeSBarry Smith   Not Collective
8675c6c1daeSBarry Smith 
8685c6c1daeSBarry Smith   Input Parameter:
8695c6c1daeSBarry Smith . stage - The stage
8705c6c1daeSBarry Smith 
8715c6c1daeSBarry Smith   Output Parameter:
872811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8735c6c1daeSBarry Smith 
8745c6c1daeSBarry Smith   Level: intermediate
8755c6c1daeSBarry Smith 
876d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8775c6c1daeSBarry Smith @*/
878d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive)
879d71ae5a4SJacob Faibussowitsch {
880b665b14eSToby Isaac   PetscLogState state;
8815c6c1daeSBarry Smith 
8825c6c1daeSBarry Smith   PetscFunctionBegin;
883b665b14eSToby Isaac   *isActive = PETSC_FALSE;
884b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
885b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive));
8863ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8875c6c1daeSBarry Smith }
8885c6c1daeSBarry Smith 
8895c6c1daeSBarry Smith /*@
890811af0c4SBarry Smith   PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()`
8915c6c1daeSBarry Smith 
8925c6c1daeSBarry Smith   Not Collective
8935c6c1daeSBarry Smith 
8945c6c1daeSBarry Smith   Input Parameters:
8955c6c1daeSBarry Smith + stage     - The stage
896811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8975c6c1daeSBarry Smith 
8985c6c1daeSBarry Smith   Level: intermediate
8995c6c1daeSBarry Smith 
900aec76313SJacob Faibussowitsch   Developer Notes:
901b665b14eSToby Isaac   Visibility only affects the default log handler in `PetscLogView()`: stages that are
902b665b14eSToby Isaac   set to invisible are suppressed from output.
903811af0c4SBarry Smith 
904b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9055c6c1daeSBarry Smith @*/
906d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible)
9075c6c1daeSBarry Smith 
908dff009beSToby Isaac {
9095c6c1daeSBarry Smith   PetscFunctionBegin;
910dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
911dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
912dff009beSToby Isaac 
913dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible));
914dff009beSToby Isaac   }
9153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9165c6c1daeSBarry Smith }
9175c6c1daeSBarry Smith 
9185c6c1daeSBarry Smith /*@
919811af0c4SBarry Smith   PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()`
9205c6c1daeSBarry Smith 
9215c6c1daeSBarry Smith   Not Collective
9225c6c1daeSBarry Smith 
9235c6c1daeSBarry Smith   Input Parameter:
9245c6c1daeSBarry Smith . stage - The stage
9255c6c1daeSBarry Smith 
9265c6c1daeSBarry Smith   Output Parameter:
927811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9285c6c1daeSBarry Smith 
9295c6c1daeSBarry Smith   Level: intermediate
9305c6c1daeSBarry Smith 
931b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9325c6c1daeSBarry Smith @*/
933d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible)
934d71ae5a4SJacob Faibussowitsch {
935b665b14eSToby Isaac   PetscLogHandler handler;
9365c6c1daeSBarry Smith 
9375c6c1daeSBarry Smith   PetscFunctionBegin;
938b665b14eSToby Isaac   *isVisible = PETSC_FALSE;
939294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
940dff009beSToby Isaac   if (handler) { PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible)); }
9413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9425c6c1daeSBarry Smith }
9435c6c1daeSBarry Smith 
944cc4c1da9SBarry Smith /*@
9455c6c1daeSBarry Smith   PetscLogStageGetId - Returns the stage id when given the stage name.
9465c6c1daeSBarry Smith 
9475c6c1daeSBarry Smith   Not Collective
9485c6c1daeSBarry Smith 
9495c6c1daeSBarry Smith   Input Parameter:
9505c6c1daeSBarry Smith . name - The stage name
9515c6c1daeSBarry Smith 
9525c6c1daeSBarry Smith   Output Parameter:
9535a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists
9545c6c1daeSBarry Smith 
9555c6c1daeSBarry Smith   Level: intermediate
9565c6c1daeSBarry Smith 
957d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
9585c6c1daeSBarry Smith @*/
959d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage)
960d71ae5a4SJacob Faibussowitsch {
961b665b14eSToby Isaac   PetscLogState state;
9625c6c1daeSBarry Smith 
9635c6c1daeSBarry Smith   PetscFunctionBegin;
964b665b14eSToby Isaac   *stage = -1;
965b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
966b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage));
9673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9685c6c1daeSBarry Smith }
9695c6c1daeSBarry Smith 
970cc4c1da9SBarry Smith /*@
97153e0a2f3SToby Isaac   PetscLogStageGetName - Returns the stage name when given the stage id.
97253e0a2f3SToby Isaac 
97353e0a2f3SToby Isaac   Not Collective
97453e0a2f3SToby Isaac 
97553e0a2f3SToby Isaac   Input Parameter:
97653e0a2f3SToby Isaac . stage - The stage
97753e0a2f3SToby Isaac 
97853e0a2f3SToby Isaac   Output Parameter:
97953e0a2f3SToby Isaac . name - The stage name
98053e0a2f3SToby Isaac 
98153e0a2f3SToby Isaac   Level: intermediate
98253e0a2f3SToby Isaac 
98353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
98453e0a2f3SToby Isaac @*/
985cc4c1da9SBarry Smith PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char *name[])
98653e0a2f3SToby Isaac {
98753e0a2f3SToby Isaac   PetscLogStageInfo stage_info;
98853e0a2f3SToby Isaac   PetscLogState     state;
98953e0a2f3SToby Isaac 
99053e0a2f3SToby Isaac   PetscFunctionBegin;
991b665b14eSToby Isaac   *name = NULL;
99253e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
993b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
99453e0a2f3SToby Isaac   PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info));
99553e0a2f3SToby Isaac   *name = stage_info.name;
99653e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
99753e0a2f3SToby Isaac }
99853e0a2f3SToby Isaac 
9995c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/
10007a101e5eSJacob Faibussowitsch 
1001cc4c1da9SBarry Smith /*@
1002811af0c4SBarry Smith   PetscLogEventRegister - Registers an event name for logging operations
10035c6c1daeSBarry Smith 
10045c6c1daeSBarry Smith   Not Collective
10055c6c1daeSBarry Smith 
1006d8d19677SJose E. Roman   Input Parameters:
10075c6c1daeSBarry Smith + name    - The name associated with the event
10085c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with
1009811af0c4SBarry Smith            `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones
10105c6c1daeSBarry Smith            are only available in C code
10115c6c1daeSBarry Smith 
10125c6c1daeSBarry Smith   Output Parameter:
1013811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`.
10145c6c1daeSBarry Smith 
101510450e9eSJacob Faibussowitsch   Example Usage:
10165c6c1daeSBarry Smith .vb
10175c6c1daeSBarry Smith       PetscLogEvent USER_EVENT;
10185c6c1daeSBarry Smith       PetscClassId classid;
10195c6c1daeSBarry Smith       PetscLogDouble user_event_flops;
10205c6c1daeSBarry Smith       PetscClassIdRegister("class name",&classid);
10215c6c1daeSBarry Smith       PetscLogEventRegister("User event name",classid,&USER_EVENT);
10225c6c1daeSBarry Smith       PetscLogEventBegin(USER_EVENT,0,0,0,0);
10235c6c1daeSBarry Smith          [code segment to monitor]
10245c6c1daeSBarry Smith          PetscLogFlops(user_event_flops);
10255c6c1daeSBarry Smith       PetscLogEventEnd(USER_EVENT,0,0,0,0);
10265c6c1daeSBarry Smith .ve
10275c6c1daeSBarry Smith 
1028d1f92df0SBarry Smith   Level: intermediate
1029d1f92df0SBarry Smith 
10305c6c1daeSBarry Smith   Notes:
10315c6c1daeSBarry Smith   PETSc automatically logs library events if the code has been
1032a2553e36SBarry Smith   configured with --with-log (which is the default) and
1033811af0c4SBarry Smith   -log_view or -log_all is specified.  `PetscLogEventRegister()` is
10345c6c1daeSBarry Smith   intended for logging user events to supplement this PETSc
10355c6c1daeSBarry Smith   information.
10365c6c1daeSBarry Smith 
1037495fc317SBarry Smith   PETSc can gather data for use with the utilities Jumpshot
10385c6c1daeSBarry Smith   (part of the MPICH distribution).  If PETSc has been compiled
10395c6c1daeSBarry Smith   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
10405c6c1daeSBarry Smith   MPICH), the user can employ another command line option, -log_mpe,
10415c6c1daeSBarry Smith   to create a logfile, "mpe.log", which can be visualized
1042495fc317SBarry Smith   Jumpshot.
10435c6c1daeSBarry Smith 
10445c6c1daeSBarry Smith   The classid is associated with each event so that classes of events
10455c6c1daeSBarry Smith   can be disabled simultaneously, such as all matrix events. The user
1046811af0c4SBarry Smith   can either use an existing classid, such as `MAT_CLASSID`, or create
10475c6c1daeSBarry Smith   their own as shown in the example.
10485c6c1daeSBarry Smith 
1049c5deb1d5SJed Brown   If an existing event with the same name exists, its event handle is
1050c5deb1d5SJed Brown   returned instead of creating a new event.
1051c5deb1d5SJed Brown 
1052d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`,
1053db781477SPatrick Sanan           `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()`
10545c6c1daeSBarry Smith @*/
1055d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event)
1056d71ae5a4SJacob Faibussowitsch {
1057b665b14eSToby Isaac   PetscLogState state;
10585c6c1daeSBarry Smith 
10595c6c1daeSBarry Smith   PetscFunctionBegin;
1060b665b14eSToby Isaac   *event = -1;
1061b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1062b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event));
10633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10645c6c1daeSBarry Smith }
10655c6c1daeSBarry Smith 
10665c6c1daeSBarry Smith /*@
1067217044c2SLisandro Dalcin   PetscLogEventSetCollective - Indicates that a particular event is collective.
1068217044c2SLisandro Dalcin 
10695aefd447SStefano Zampini   Logically Collective
1070217044c2SLisandro Dalcin 
1071d8d19677SJose E. Roman   Input Parameters:
1072217044c2SLisandro Dalcin + event      - The event id
1073d5b43468SJose E. Roman - collective - Boolean flag indicating whether a particular event is collective
1074217044c2SLisandro Dalcin 
1075d1f92df0SBarry Smith   Level: developer
1076d1f92df0SBarry Smith 
1077811af0c4SBarry Smith   Notes:
1078811af0c4SBarry Smith   New events returned from `PetscLogEventRegister()` are collective by default.
1079811af0c4SBarry Smith 
10805aefd447SStefano Zampini   Collective events are handled specially if the command line option -log_sync is used. In that case the logging saves information about
1081811af0c4SBarry Smith   two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication
10825aefd447SStefano Zampini   to be performed. This option is useful to debug imbalance within the computations or communications.
1083217044c2SLisandro Dalcin 
1084d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()`
1085217044c2SLisandro Dalcin @*/
1086d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective)
1087d71ae5a4SJacob Faibussowitsch {
1088b665b14eSToby Isaac   PetscLogState state;
1089217044c2SLisandro Dalcin 
1090217044c2SLisandro Dalcin   PetscFunctionBegin;
1091b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1092b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective));
1093b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1094b665b14eSToby Isaac }
1095b665b14eSToby Isaac 
1096b665b14eSToby Isaac /*
1097b665b14eSToby Isaac   PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage.
1098b665b14eSToby Isaac 
1099b665b14eSToby Isaac   Not Collective
1100b665b14eSToby Isaac 
1101b665b14eSToby Isaac   Input Parameters:
1102b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1103b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers.
1104b665b14eSToby Isaac 
1105b665b14eSToby Isaac   Level: developer
1106b665b14eSToby Isaac 
1107b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()`
1108b665b14eSToby Isaac */
1109b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive)
1110b665b14eSToby Isaac {
1111b665b14eSToby Isaac   PetscLogState state;
1112b665b14eSToby Isaac 
1113b665b14eSToby Isaac   PetscFunctionBegin;
1114b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1115b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive));
11163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1117217044c2SLisandro Dalcin }
1118217044c2SLisandro Dalcin 
1119217044c2SLisandro Dalcin /*@
1120fa2bb9feSLisandro Dalcin   PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage.
1121fa2bb9feSLisandro Dalcin 
1122fa2bb9feSLisandro Dalcin   Not Collective
1123fa2bb9feSLisandro Dalcin 
1124fa2bb9feSLisandro Dalcin   Input Parameter:
1125811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1126fa2bb9feSLisandro Dalcin 
1127fa2bb9feSLisandro Dalcin   Level: developer
1128fa2bb9feSLisandro Dalcin 
1129d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
1130fa2bb9feSLisandro Dalcin @*/
1131d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid)
1132d71ae5a4SJacob Faibussowitsch {
1133fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1134b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE));
11353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1136fa2bb9feSLisandro Dalcin }
1137fa2bb9feSLisandro Dalcin 
1138fa2bb9feSLisandro Dalcin /*@
1139fa2bb9feSLisandro Dalcin   PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage.
1140fa2bb9feSLisandro Dalcin 
1141fa2bb9feSLisandro Dalcin   Not Collective
1142fa2bb9feSLisandro Dalcin 
1143fa2bb9feSLisandro Dalcin   Input Parameter:
1144811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1145fa2bb9feSLisandro Dalcin 
1146fa2bb9feSLisandro Dalcin   Level: developer
1147fa2bb9feSLisandro Dalcin 
1148811af0c4SBarry Smith   Note:
1149811af0c4SBarry Smith   If a class is excluded then events associated with that class are not logged.
1150811af0c4SBarry Smith 
1151d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()`
1152fa2bb9feSLisandro Dalcin @*/
1153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid)
1154d71ae5a4SJacob Faibussowitsch {
1155b665b14eSToby Isaac   PetscFunctionBegin;
1156b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE));
1157b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1158b665b14eSToby Isaac }
1159b665b14eSToby Isaac 
1160b665b14eSToby Isaac /*
1161b665b14eSToby Isaac   PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage
1162b665b14eSToby Isaac 
1163b665b14eSToby Isaac   Not Collective
1164b665b14eSToby Isaac 
1165b665b14eSToby Isaac   Input Parameters:
1166b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1167b665b14eSToby Isaac . event - A `PetscLogEvent`
1168b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage
1169b665b14eSToby Isaac 
1170b665b14eSToby Isaac   Usage:
1171b665b14eSToby Isaac .vb
1172b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE);
1173b665b14eSToby Isaac         [code where you do not want to log VecSetValues()]
1174b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE);
1175b665b14eSToby Isaac         [code where you do want to log VecSetValues()]
1176b665b14eSToby Isaac .ve
1177b665b14eSToby Isaac 
1178b665b14eSToby Isaac   Level: advanced
1179b665b14eSToby Isaac 
1180b665b14eSToby Isaac   Note:
1181b665b14eSToby Isaac   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1182b665b14eSToby Isaac   or an event number obtained with `PetscLogEventRegister()`.
1183b665b14eSToby Isaac 
1184b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
1185b665b14eSToby Isaac */
1186b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
1187b665b14eSToby Isaac {
1188b665b14eSToby Isaac   PetscLogState state;
1189fa2bb9feSLisandro Dalcin 
1190fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1191b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1192b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive));
11933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1194fa2bb9feSLisandro Dalcin }
1195fa2bb9feSLisandro Dalcin 
1196fa2bb9feSLisandro Dalcin /*@
11975c6c1daeSBarry Smith   PetscLogEventActivate - Indicates that a particular event should be logged.
11985c6c1daeSBarry Smith 
11995c6c1daeSBarry Smith   Not Collective
12005c6c1daeSBarry Smith 
12015c6c1daeSBarry Smith   Input Parameter:
12025c6c1daeSBarry Smith . event - The event id
12035c6c1daeSBarry Smith 
120410450e9eSJacob Faibussowitsch   Example Usage:
12055c6c1daeSBarry Smith .vb
12065c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12075c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12085c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12095c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12105c6c1daeSBarry Smith .ve
12115c6c1daeSBarry Smith 
1212d1f92df0SBarry Smith   Level: advanced
1213d1f92df0SBarry Smith 
12145c6c1daeSBarry Smith   Note:
12155c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1216811af0c4SBarry Smith   or an event number obtained with `PetscLogEventRegister()`.
12175c6c1daeSBarry Smith 
1218b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12195c6c1daeSBarry Smith @*/
1220d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event)
1221d71ae5a4SJacob Faibussowitsch {
12225c6c1daeSBarry Smith   PetscFunctionBegin;
1223b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE));
12243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12255c6c1daeSBarry Smith }
12265c6c1daeSBarry Smith 
12275c6c1daeSBarry Smith /*@
12285c6c1daeSBarry Smith   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
12295c6c1daeSBarry Smith 
12305c6c1daeSBarry Smith   Not Collective
12315c6c1daeSBarry Smith 
12325c6c1daeSBarry Smith   Input Parameter:
12335c6c1daeSBarry Smith . event - The event id
12345c6c1daeSBarry Smith 
123510450e9eSJacob Faibussowitsch   Example Usage:
12365c6c1daeSBarry Smith .vb
12375c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12385c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12395c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12405c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12415c6c1daeSBarry Smith .ve
12425c6c1daeSBarry Smith 
1243d1f92df0SBarry Smith   Level: advanced
1244d1f92df0SBarry Smith 
12455c6c1daeSBarry Smith   Note:
12465c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in
1247811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
12485c6c1daeSBarry Smith 
1249d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12505c6c1daeSBarry Smith @*/
1251d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event)
1252d71ae5a4SJacob Faibussowitsch {
12535c6c1daeSBarry Smith   PetscFunctionBegin;
1254b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE));
12553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12565c6c1daeSBarry Smith }
12575c6c1daeSBarry Smith 
12585c6c1daeSBarry Smith /*@
1259811af0c4SBarry Smith   PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called
1260c00cb57fSBarry Smith 
1261c00cb57fSBarry Smith   Not Collective
1262c00cb57fSBarry Smith 
1263c00cb57fSBarry Smith   Input Parameter:
1264c00cb57fSBarry Smith . event - The event id
1265c00cb57fSBarry Smith 
126610450e9eSJacob Faibussowitsch   Example Usage:
1267c00cb57fSBarry Smith .vb
1268c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1269c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1270c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1271c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1272c00cb57fSBarry Smith .ve
1273c00cb57fSBarry Smith 
1274d1f92df0SBarry Smith   Level: advanced
1275d1f92df0SBarry Smith 
1276c00cb57fSBarry Smith   Note:
1277c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1278811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1279c00cb57fSBarry Smith 
1280baca6076SPierre 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.
1281b665b14eSToby Isaac 
12824b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePop()`
1283c00cb57fSBarry Smith @*/
1284d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event)
1285d71ae5a4SJacob Faibussowitsch {
1286c00cb57fSBarry Smith   PetscFunctionBegin;
1287dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1288dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1289dff009beSToby Isaac 
1290dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event));
1291dff009beSToby Isaac   }
12923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1293c00cb57fSBarry Smith }
1294c00cb57fSBarry Smith 
1295c00cb57fSBarry Smith /*@
1296811af0c4SBarry Smith   PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()`
1297c00cb57fSBarry Smith 
1298c00cb57fSBarry Smith   Not Collective
1299c00cb57fSBarry Smith 
1300c00cb57fSBarry Smith   Input Parameter:
1301c00cb57fSBarry Smith . event - The event id
1302c00cb57fSBarry Smith 
130310450e9eSJacob Faibussowitsch   Example Usage:
1304c00cb57fSBarry Smith .vb
1305c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1306c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1307c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1308c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1309c00cb57fSBarry Smith .ve
1310c00cb57fSBarry Smith 
1311d1f92df0SBarry Smith   Level: advanced
1312d1f92df0SBarry Smith 
1313c00cb57fSBarry Smith   Note:
1314c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1315811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1316c00cb57fSBarry Smith 
1317d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`
1318c00cb57fSBarry Smith @*/
1319d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event)
1320d71ae5a4SJacob Faibussowitsch {
1321c00cb57fSBarry Smith   PetscFunctionBegin;
1322dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1323dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1324dff009beSToby Isaac 
1325dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event));
1326dff009beSToby Isaac   }
13273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1328c00cb57fSBarry Smith }
1329c00cb57fSBarry Smith 
1330c00cb57fSBarry Smith /*@
1331811af0c4SBarry Smith   PetscLogEventSetActiveAll - Turns on logging of all events
13325c6c1daeSBarry Smith 
13335c6c1daeSBarry Smith   Not Collective
13345c6c1daeSBarry Smith 
13355c6c1daeSBarry Smith   Input Parameters:
13365c6c1daeSBarry Smith + event    - The event id
13375c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged
13385c6c1daeSBarry Smith 
13395c6c1daeSBarry Smith   Level: advanced
13405c6c1daeSBarry Smith 
1341b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13425c6c1daeSBarry Smith @*/
1343d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive)
1344d71ae5a4SJacob Faibussowitsch {
1345b665b14eSToby Isaac   PetscLogState state;
13465c6c1daeSBarry Smith 
13475c6c1daeSBarry Smith   PetscFunctionBegin;
1348b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1349b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive));
1350b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13515c6c1daeSBarry Smith }
1352b665b14eSToby Isaac 
1353b665b14eSToby Isaac /*
1354b665b14eSToby Isaac   PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage
1355b665b14eSToby Isaac 
1356b665b14eSToby Isaac   Not Collective
1357b665b14eSToby Isaac 
1358b665b14eSToby Isaac   Input Parameters:
1359b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1360b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1361b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers.
1362b665b14eSToby Isaac 
1363b665b14eSToby Isaac   Level: developer
1364b665b14eSToby Isaac 
1365b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`
1366b665b14eSToby Isaac */
1367b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive)
1368b665b14eSToby Isaac {
1369b665b14eSToby Isaac   PetscLogState state;
1370b665b14eSToby Isaac 
1371b665b14eSToby Isaac   PetscFunctionBegin;
1372b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1373b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive));
13743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13755c6c1daeSBarry Smith }
13765c6c1daeSBarry Smith 
13775c6c1daeSBarry Smith /*@
1378811af0c4SBarry Smith   PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage
13795c6c1daeSBarry Smith 
13805c6c1daeSBarry Smith   Not Collective
13815c6c1daeSBarry Smith 
13825c6c1daeSBarry Smith   Input Parameter:
1383811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
13845c6c1daeSBarry Smith 
13855c6c1daeSBarry Smith   Level: developer
13865c6c1daeSBarry Smith 
1387d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13885c6c1daeSBarry Smith @*/
1389d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid)
1390d71ae5a4SJacob Faibussowitsch {
13915c6c1daeSBarry Smith   PetscFunctionBegin;
1392b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE));
13933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13945c6c1daeSBarry Smith }
13955c6c1daeSBarry Smith 
13965c6c1daeSBarry Smith /*@
1397811af0c4SBarry Smith   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage
13985c6c1daeSBarry Smith 
13995c6c1daeSBarry Smith   Not Collective
14005c6c1daeSBarry Smith 
14015c6c1daeSBarry Smith   Input Parameter:
1402811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
14035c6c1daeSBarry Smith 
14045c6c1daeSBarry Smith   Level: developer
14055c6c1daeSBarry Smith 
1406d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
14075c6c1daeSBarry Smith @*/
1408d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid)
1409d71ae5a4SJacob Faibussowitsch {
14105c6c1daeSBarry Smith   PetscFunctionBegin;
1411b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE));
14123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
14135c6c1daeSBarry Smith }
14145c6c1daeSBarry Smith 
14155c6c1daeSBarry Smith /*MC
141662872c28SLisandro Dalcin   PetscLogEventSync - Synchronizes the beginning of a user event.
141762872c28SLisandro Dalcin 
141862872c28SLisandro Dalcin   Synopsis:
141962872c28SLisandro Dalcin   #include <petsclog.h>
1420b665b14eSToby Isaac   PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm)
142162872c28SLisandro Dalcin 
142262872c28SLisandro Dalcin   Collective
142362872c28SLisandro Dalcin 
142462872c28SLisandro Dalcin   Input Parameters:
1425b665b14eSToby Isaac + e    - `PetscLogEvent` obtained from `PetscLogEventRegister()`
142662872c28SLisandro Dalcin - comm - an MPI communicator
142762872c28SLisandro Dalcin 
142810450e9eSJacob Faibussowitsch   Example Usage:
142962872c28SLisandro Dalcin .vb
143062872c28SLisandro Dalcin   PetscLogEvent USER_EVENT;
143110450e9eSJacob Faibussowitsch 
143262872c28SLisandro Dalcin   PetscLogEventRegister("User event", 0, &USER_EVENT);
143362872c28SLisandro Dalcin   PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD);
143462872c28SLisandro Dalcin   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
143562872c28SLisandro Dalcin   [code segment to monitor]
143662872c28SLisandro Dalcin   PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0);
143762872c28SLisandro Dalcin .ve
143862872c28SLisandro Dalcin 
1439d1f92df0SBarry Smith   Level: developer
1440d1f92df0SBarry Smith 
1441811af0c4SBarry Smith   Note:
144210450e9eSJacob Faibussowitsch   This routine should be called only if there is not a `PetscObject` available to pass to
144310450e9eSJacob Faibussowitsch   `PetscLogEventBegin()`.
144462872c28SLisandro Dalcin 
1445d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`
144662872c28SLisandro Dalcin M*/
144762872c28SLisandro Dalcin 
144862872c28SLisandro Dalcin /*MC
14495c6c1daeSBarry Smith   PetscLogEventBegin - Logs the beginning of a user event.
14505c6c1daeSBarry Smith 
14515c6c1daeSBarry Smith   Synopsis:
1452aaa7dc30SBarry Smith   #include <petsclog.h>
1453b665b14eSToby Isaac   PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14545c6c1daeSBarry Smith 
14555c6c1daeSBarry Smith   Not Collective
14565c6c1daeSBarry Smith 
14575c6c1daeSBarry Smith   Input Parameters:
1458b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1459baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1460baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1461baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1462baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
14635c6c1daeSBarry Smith 
14645c6c1daeSBarry Smith   Fortran Synopsis:
14655c6c1daeSBarry Smith   void PetscLogEventBegin(int e, PetscErrorCode ierr)
14665c6c1daeSBarry Smith 
146710450e9eSJacob Faibussowitsch   Example Usage:
14685c6c1daeSBarry Smith .vb
14695c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
147010450e9eSJacob Faibussowitsch 
14715c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
14725c6c1daeSBarry Smith   PetscLogEventRegister("User event",0, &USER_EVENT);
14735c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
14745c6c1daeSBarry Smith   [code segment to monitor]
14755c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
14765c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
14775c6c1daeSBarry Smith .ve
14785c6c1daeSBarry Smith 
1479d1f92df0SBarry Smith   Level: intermediate
1480d1f92df0SBarry Smith 
1481811af0c4SBarry Smith   Developer Note:
148210450e9eSJacob Faibussowitsch   `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly
148310450e9eSJacob Faibussowitsch   handling the errors that occur in the macro directly because other packages that use this
148410450e9eSJacob Faibussowitsch   macros have used them in their own functions or methods that do not return error codes and it
148510450e9eSJacob Faibussowitsch   would be disruptive to change the current behavior.
1486d0609cedSBarry Smith 
1487d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()`
14885c6c1daeSBarry Smith M*/
14895c6c1daeSBarry Smith 
14905c6c1daeSBarry Smith /*MC
14915c6c1daeSBarry Smith   PetscLogEventEnd - Log the end of a user event.
14925c6c1daeSBarry Smith 
14935c6c1daeSBarry Smith   Synopsis:
1494aaa7dc30SBarry Smith   #include <petsclog.h>
1495b665b14eSToby Isaac   PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14965c6c1daeSBarry Smith 
14975c6c1daeSBarry Smith   Not Collective
14985c6c1daeSBarry Smith 
14995c6c1daeSBarry Smith   Input Parameters:
1500b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1501baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1502baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1503baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1504baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
15055c6c1daeSBarry Smith 
15065c6c1daeSBarry Smith   Fortran Synopsis:
15075c6c1daeSBarry Smith   void PetscLogEventEnd(int e, PetscErrorCode ierr)
15085c6c1daeSBarry Smith 
150910450e9eSJacob Faibussowitsch   Example Usage:
15105c6c1daeSBarry Smith .vb
15115c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
151210450e9eSJacob Faibussowitsch 
15135c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
151410450e9eSJacob Faibussowitsch   PetscLogEventRegister("User event", 0, &USER_EVENT);
15155c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
15165c6c1daeSBarry Smith   [code segment to monitor]
15175c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
15185c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
15195c6c1daeSBarry Smith .ve
15205c6c1daeSBarry Smith 
15215c6c1daeSBarry Smith   Level: intermediate
15225c6c1daeSBarry Smith 
1523d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()`
15245c6c1daeSBarry Smith M*/
15255c6c1daeSBarry Smith 
15265c6c1daeSBarry Smith /*@C
15278b08f494SToby Isaac   PetscLogStageGetPerfInfo - Return the performance information about the given stage
15288b08f494SToby Isaac 
1529cc4c1da9SBarry Smith   No Fortran Support
1530cc4c1da9SBarry Smith 
15318b08f494SToby Isaac   Input Parameters:
15328b08f494SToby Isaac . stage - The stage number or `PETSC_DETERMINE` for the current stage
15338b08f494SToby Isaac 
15348b08f494SToby Isaac   Output Parameter:
15358b08f494SToby Isaac . info - This structure is filled with the performance information
15368b08f494SToby Isaac 
15378b08f494SToby Isaac   Level: intermediate
15388b08f494SToby Isaac 
15398b08f494SToby Isaac   Notes:
15408b08f494SToby Isaac   This is a low level routine used by the logging functions in PETSc.
15418b08f494SToby Isaac 
15428b08f494SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15435804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15440ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15458b08f494SToby Isaac 
15468b08f494SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
15478b08f494SToby Isaac @*/
15488b08f494SToby Isaac PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage stage, PetscEventPerfInfo *info)
15498b08f494SToby Isaac {
15508b08f494SToby Isaac   PetscLogHandler     handler;
15518b08f494SToby Isaac   PetscEventPerfInfo *event_info;
15528b08f494SToby Isaac 
15538b08f494SToby Isaac   PetscFunctionBegin;
15548b08f494SToby Isaac   PetscAssertPointer(info, 2);
15550ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
15560ba5dad9SToby Isaac   if (handler) {
15578b08f494SToby Isaac     PetscCall(PetscLogHandlerGetStagePerfInfo(handler, stage, &event_info));
15588b08f494SToby Isaac     *info = *event_info;
15590ba5dad9SToby Isaac   } else {
15600ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogStageGetPerfInfo() returning zeros\n"));
15610ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
15620ba5dad9SToby Isaac   }
15638b08f494SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
15648b08f494SToby Isaac }
15658b08f494SToby Isaac 
15668b08f494SToby Isaac /*@C
1567b665b14eSToby Isaac   PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage
1568b665b14eSToby Isaac 
1569cc4c1da9SBarry Smith   No Fortran Support
1570cc4c1da9SBarry Smith 
1571b665b14eSToby Isaac   Input Parameters:
1572b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage
1573b665b14eSToby Isaac - event - The event number
1574b665b14eSToby Isaac 
1575b665b14eSToby Isaac   Output Parameter:
1576b665b14eSToby Isaac . info - This structure is filled with the performance information
1577b665b14eSToby Isaac 
1578b665b14eSToby Isaac   Level: intermediate
1579b665b14eSToby Isaac 
1580b665b14eSToby Isaac   Note:
1581b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1582b665b14eSToby Isaac 
15830ba5dad9SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15845804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15850ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15860ba5dad9SToby Isaac 
1587b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
1588b665b14eSToby Isaac @*/
1589b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info)
1590b665b14eSToby Isaac {
1591b665b14eSToby Isaac   PetscLogHandler     handler;
1592b665b14eSToby Isaac   PetscEventPerfInfo *event_info;
1593b665b14eSToby Isaac 
1594b665b14eSToby Isaac   PetscFunctionBegin;
1595b665b14eSToby Isaac   PetscAssertPointer(info, 3);
15960ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
15970ba5dad9SToby Isaac   if (handler) {
1598dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info));
1599b665b14eSToby Isaac     *info = *event_info;
16000ba5dad9SToby Isaac   } else {
16010ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogEventGetPerfInfo() returning zeros\n"));
16020ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
16030ba5dad9SToby Isaac   }
1604b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1605b665b14eSToby Isaac }
1606b665b14eSToby Isaac 
1607cc4c1da9SBarry Smith /*@
1608b665b14eSToby Isaac   PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event
1609b665b14eSToby Isaac 
1610b665b14eSToby Isaac   Not Collective
1611b665b14eSToby Isaac 
1612b665b14eSToby Isaac   Input Parameters:
1613b665b14eSToby Isaac + event - The event id to log
1614b665b14eSToby Isaac . n     - The dof index, in [0, 8)
1615b665b14eSToby Isaac - dof   - The number of dofs
1616b665b14eSToby Isaac 
1617b665b14eSToby Isaac   Options Database Key:
1618b665b14eSToby Isaac . -log_view - Activates log summary
1619b665b14eSToby Isaac 
1620b665b14eSToby Isaac   Level: developer
1621b665b14eSToby Isaac 
1622b665b14eSToby Isaac   Note:
1623b665b14eSToby Isaac   This is to enable logging of convergence
1624b665b14eSToby Isaac 
1625b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1626b665b14eSToby Isaac @*/
1627b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof)
1628b665b14eSToby Isaac {
1629b665b14eSToby Isaac   PetscFunctionBegin;
1630b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1631dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1632dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1633dff009beSToby Isaac 
1634dff009beSToby Isaac     if (h) {
1635dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1636dff009beSToby Isaac 
1637dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1638dff009beSToby Isaac       if (event_info) event_info->dof[n] = dof;
1639dff009beSToby Isaac     }
1640b665b14eSToby Isaac   }
1641b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1642b665b14eSToby Isaac }
1643b665b14eSToby Isaac 
1644cc4c1da9SBarry Smith /*@
1645b665b14eSToby Isaac   PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event
1646b665b14eSToby Isaac 
1647b665b14eSToby Isaac   Not Collective
1648b665b14eSToby Isaac 
1649b665b14eSToby Isaac   Input Parameters:
1650b665b14eSToby Isaac + event - The event id to log
1651b665b14eSToby Isaac . n     - The error index, in [0, 8)
1652b665b14eSToby Isaac - error - The error
1653b665b14eSToby Isaac 
1654b665b14eSToby Isaac   Options Database Key:
1655b665b14eSToby Isaac . -log_view - Activates log summary
1656b665b14eSToby Isaac 
1657b665b14eSToby Isaac   Level: developer
1658b665b14eSToby Isaac 
1659b665b14eSToby Isaac   Notes:
1660b665b14eSToby Isaac   This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example,
1661b665b14eSToby Isaac   as different norms, or as errors for different fields
1662b665b14eSToby Isaac 
1663b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1664b665b14eSToby Isaac 
1665b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1666b665b14eSToby Isaac @*/
1667b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error)
1668b665b14eSToby Isaac {
1669b665b14eSToby Isaac   PetscFunctionBegin;
1670b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1671dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1672dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1673dff009beSToby Isaac 
1674dff009beSToby Isaac     if (h) {
1675dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1676dff009beSToby Isaac 
1677dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1678dff009beSToby Isaac       if (event_info) event_info->errors[n] = error;
1679dff009beSToby Isaac     }
1680b665b14eSToby Isaac   }
1681b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1682b665b14eSToby Isaac }
1683b665b14eSToby Isaac 
1684cc4c1da9SBarry Smith /*@
16855c6c1daeSBarry Smith   PetscLogEventGetId - Returns the event id when given the event name.
16865c6c1daeSBarry Smith 
16875c6c1daeSBarry Smith   Not Collective
16885c6c1daeSBarry Smith 
16895c6c1daeSBarry Smith   Input Parameter:
16905c6c1daeSBarry Smith . name - The event name
16915c6c1daeSBarry Smith 
16925c6c1daeSBarry Smith   Output Parameter:
1693c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists
16945c6c1daeSBarry Smith 
16955c6c1daeSBarry Smith   Level: intermediate
16965c6c1daeSBarry Smith 
1697d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
16985c6c1daeSBarry Smith @*/
1699d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event)
1700d71ae5a4SJacob Faibussowitsch {
1701b665b14eSToby Isaac   PetscLogState state;
17025c6c1daeSBarry Smith 
17035c6c1daeSBarry Smith   PetscFunctionBegin;
1704b665b14eSToby Isaac   *event = -1;
1705b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1706b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event));
17073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
17085c6c1daeSBarry Smith }
17095c6c1daeSBarry Smith 
1710cc4c1da9SBarry Smith /*@
171153e0a2f3SToby Isaac   PetscLogEventGetName - Returns the event name when given the event id.
171253e0a2f3SToby Isaac 
171353e0a2f3SToby Isaac   Not Collective
171453e0a2f3SToby Isaac 
171553e0a2f3SToby Isaac   Input Parameter:
171653e0a2f3SToby Isaac . event - The event
171753e0a2f3SToby Isaac 
171853e0a2f3SToby Isaac   Output Parameter:
171953e0a2f3SToby Isaac . name - The event name
172053e0a2f3SToby Isaac 
172153e0a2f3SToby Isaac   Level: intermediate
172253e0a2f3SToby Isaac 
172353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
172453e0a2f3SToby Isaac @*/
1725cc4c1da9SBarry Smith PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char *name[])
172653e0a2f3SToby Isaac {
172753e0a2f3SToby Isaac   PetscLogEventInfo event_info;
172853e0a2f3SToby Isaac   PetscLogState     state;
172953e0a2f3SToby Isaac 
173053e0a2f3SToby Isaac   PetscFunctionBegin;
1731b665b14eSToby Isaac   *name = NULL;
173253e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1733b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
173453e0a2f3SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
173553e0a2f3SToby Isaac   *name = event_info.name;
173653e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
173753e0a2f3SToby Isaac }
173853e0a2f3SToby Isaac 
173953e0a2f3SToby Isaac /*@
174053e0a2f3SToby 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.
174153e0a2f3SToby Isaac 
174253e0a2f3SToby Isaac   Not collective
174353e0a2f3SToby Isaac 
174453e0a2f3SToby Isaac   Level: advanced
174553e0a2f3SToby Isaac 
174653e0a2f3SToby Isaac   Notes:
174753e0a2f3SToby 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()`).
174853e0a2f3SToby Isaac 
174953e0a2f3SToby Isaac   Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function.
175053e0a2f3SToby Isaac 
1751b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()`
175253e0a2f3SToby Isaac @*/
175353e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(void)
175453e0a2f3SToby Isaac {
175553e0a2f3SToby Isaac   PetscFunctionBegin;
1756dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1757dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1758dff009beSToby Isaac 
1759dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsPause(h));
1760dff009beSToby Isaac   }
176153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
176253e0a2f3SToby Isaac }
176353e0a2f3SToby Isaac 
176453e0a2f3SToby Isaac /*@
176553e0a2f3SToby Isaac   PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`.
176653e0a2f3SToby Isaac 
176753e0a2f3SToby Isaac   Not collective
176853e0a2f3SToby Isaac 
176953e0a2f3SToby Isaac   Level: advanced
177053e0a2f3SToby Isaac 
1771b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()`
177253e0a2f3SToby Isaac @*/
177353e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void)
177453e0a2f3SToby Isaac {
177553e0a2f3SToby Isaac   PetscFunctionBegin;
1776dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1777dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1778dff009beSToby Isaac 
1779dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsResume(h));
1780dff009beSToby Isaac   }
178153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
178253e0a2f3SToby Isaac }
178353e0a2f3SToby Isaac 
17841c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/
17851c1ad86eSToby Isaac 
17861c1ad86eSToby Isaac /*MC
17871c1ad86eSToby Isaac    PetscLogObjectCreate - Log the creation of a `PetscObject`
17881c1ad86eSToby Isaac 
17891c1ad86eSToby Isaac    Synopsis:
17901c1ad86eSToby Isaac    #include <petsclog.h>
17911c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectCreate(PetscObject h)
17921c1ad86eSToby Isaac 
17931c1ad86eSToby Isaac    Not Collective
17941c1ad86eSToby Isaac 
17951c1ad86eSToby Isaac    Input Parameters:
17961c1ad86eSToby Isaac .  h - A `PetscObject`
17971c1ad86eSToby Isaac 
17981c1ad86eSToby Isaac    Level: developer
17991c1ad86eSToby Isaac 
18001c1ad86eSToby Isaac    Developer Note:
18011c1ad86eSToby Isaac      Called internally by PETSc when creating objects: users do not need to call this directly.
1802b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18031c1ad86eSToby Isaac 
1804b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()`
18051c1ad86eSToby Isaac M*/
18061c1ad86eSToby Isaac 
18071c1ad86eSToby Isaac /*MC
18081c1ad86eSToby Isaac    PetscLogObjectDestroy - Logs the destruction of a `PetscObject`
18091c1ad86eSToby Isaac 
18101c1ad86eSToby Isaac    Synopsis:
18111c1ad86eSToby Isaac    #include <petsclog.h>
18121c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectDestroy(PetscObject h)
18131c1ad86eSToby Isaac 
18141c1ad86eSToby Isaac    Not Collective
18151c1ad86eSToby Isaac 
18161c1ad86eSToby Isaac    Input Parameters:
18171c1ad86eSToby Isaac .  h - A `PetscObject`
18181c1ad86eSToby Isaac 
18191c1ad86eSToby Isaac    Level: developer
18201c1ad86eSToby Isaac 
18211c1ad86eSToby Isaac    Developer Note:
18221c1ad86eSToby Isaac      Called internally by PETSc when destroying objects: users do not need to call this directly.
1823b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18241c1ad86eSToby Isaac 
1825b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()`
18261c1ad86eSToby Isaac M*/
18271c1ad86eSToby Isaac 
1828cc4c1da9SBarry Smith /*@
182953e0a2f3SToby Isaac   PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name.
183053e0a2f3SToby Isaac 
183153e0a2f3SToby Isaac   Not Collective
183253e0a2f3SToby Isaac 
183353e0a2f3SToby Isaac   Input Parameter:
183453e0a2f3SToby Isaac . name - The class name
183553e0a2f3SToby Isaac 
183653e0a2f3SToby Isaac   Output Parameter:
183753e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists
183853e0a2f3SToby Isaac 
183953e0a2f3SToby Isaac   Level: intermediate
184053e0a2f3SToby Isaac 
184153e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
184253e0a2f3SToby Isaac @*/
184353e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid)
184453e0a2f3SToby Isaac {
184553e0a2f3SToby Isaac   PetscLogClass     log_class;
184653e0a2f3SToby Isaac   PetscLogClassInfo class_info;
184753e0a2f3SToby Isaac   PetscLogState     state;
184853e0a2f3SToby Isaac 
184953e0a2f3SToby Isaac   PetscFunctionBegin;
1850b665b14eSToby Isaac   *classid = -1;
185153e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1852b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
185353e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromName(state, name, &log_class));
185453e0a2f3SToby Isaac   if (log_class < 0) {
185553e0a2f3SToby Isaac     *classid = -1;
185653e0a2f3SToby Isaac     PetscFunctionReturn(PETSC_SUCCESS);
185753e0a2f3SToby Isaac   }
185853e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
185953e0a2f3SToby Isaac   *classid = class_info.classid;
186053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
186153e0a2f3SToby Isaac }
186253e0a2f3SToby Isaac 
186353e0a2f3SToby Isaac /*@C
186453e0a2f3SToby Isaac   PetscLogClassIdGetName - Returns a `PetscClassId`'s name.
186553e0a2f3SToby Isaac 
186653e0a2f3SToby Isaac   Not Collective
186753e0a2f3SToby Isaac 
186853e0a2f3SToby Isaac   Input Parameter:
186953e0a2f3SToby Isaac . classid - A `PetscClassId`
187053e0a2f3SToby Isaac 
187153e0a2f3SToby Isaac   Output Parameter:
187253e0a2f3SToby Isaac . name - The class name
187353e0a2f3SToby Isaac 
187453e0a2f3SToby Isaac   Level: intermediate
187553e0a2f3SToby Isaac 
187653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()`
187753e0a2f3SToby Isaac @*/
187853e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name)
187953e0a2f3SToby Isaac {
188053e0a2f3SToby Isaac   PetscLogClass     log_class;
188153e0a2f3SToby Isaac   PetscLogClassInfo class_info;
188253e0a2f3SToby Isaac   PetscLogState     state;
188353e0a2f3SToby Isaac 
188453e0a2f3SToby Isaac   PetscFunctionBegin;
188553e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
188653e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class));
188753e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
188853e0a2f3SToby Isaac   *name = class_info.name;
188953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
189053e0a2f3SToby Isaac }
189153e0a2f3SToby Isaac 
18925c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/
1893cc4c1da9SBarry Smith /*@
18945c6c1daeSBarry Smith   PetscLogDump - Dumps logs of objects to a file. This file is intended to
18955c6c1daeSBarry Smith   be read by bin/petscview. This program no longer exists.
18965c6c1daeSBarry Smith 
1897811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
18985c6c1daeSBarry Smith 
18995c6c1daeSBarry Smith   Input Parameter:
1900aec76313SJacob Faibussowitsch . sname - an optional file name
19015c6c1daeSBarry Smith 
190210450e9eSJacob Faibussowitsch   Example Usage:
19035c6c1daeSBarry Smith .vb
19045c6c1daeSBarry Smith   PetscInitialize(...);
1905b665b14eSToby Isaac   PetscLogDefaultBegin();
1906b665b14eSToby Isaac   // ... code ...
19075c6c1daeSBarry Smith   PetscLogDump(filename);
19085c6c1daeSBarry Smith   PetscFinalize();
19095c6c1daeSBarry Smith .ve
19105c6c1daeSBarry Smith 
1911d1f92df0SBarry Smith   Level: advanced
1912d1f92df0SBarry Smith 
1913811af0c4SBarry Smith   Note:
191437fdd005SBarry Smith   The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified,
19155c6c1daeSBarry Smith   this file will be used.
19165c6c1daeSBarry Smith 
1917b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
19185c6c1daeSBarry Smith @*/
1919d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[])
1920d71ae5a4SJacob Faibussowitsch {
1921b665b14eSToby Isaac   PetscLogHandler handler;
19225c6c1daeSBarry Smith 
19235c6c1daeSBarry Smith   PetscFunctionBegin;
1924294de794SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1925dff009beSToby Isaac   PetscCall(PetscLogHandlerDump(handler, sname));
1926b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
19275c6c1daeSBarry Smith }
1928b665b14eSToby Isaac 
1929cc4c1da9SBarry Smith /*@
1930b665b14eSToby Isaac   PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot.
1931b665b14eSToby Isaac 
19328f14a041SBarry Smith   Collective on `PETSC_COMM_WORLD`
1933b665b14eSToby Isaac 
1934b665b14eSToby Isaac   Input Parameter:
1935b665b14eSToby Isaac . sname - filename for the MPE logfile
1936b665b14eSToby Isaac 
1937b665b14eSToby Isaac   Level: advanced
1938b665b14eSToby Isaac 
1939b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()`
1940b665b14eSToby Isaac @*/
1941b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[])
1942b665b14eSToby Isaac {
1943b665b14eSToby Isaac   PetscFunctionBegin;
1944b665b14eSToby Isaac   #if defined(PETSC_HAVE_MPE)
1945b665b14eSToby Isaac   if (PetscBeganMPE) {
1946b665b14eSToby Isaac     char name[PETSC_MAX_PATH_LEN];
1947b665b14eSToby Isaac 
1948b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Finalizing MPE.\n"));
1949b665b14eSToby Isaac     if (sname) {
1950b665b14eSToby Isaac       PetscCall(PetscStrncpy(name, sname, sizeof(name)));
19515c6c1daeSBarry Smith     } else {
1952b665b14eSToby Isaac       PetscCall(PetscGetProgramName(name, sizeof(name)));
19535c6c1daeSBarry Smith     }
1954b665b14eSToby Isaac     PetscCall(MPE_Finish_log(name));
19555c6c1daeSBarry Smith   } else {
1956b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n"));
19575c6c1daeSBarry Smith   }
1958c2a741eeSJunchao Zhang   #else
1959b665b14eSToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
1960c2a741eeSJunchao Zhang   #endif
19613ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19625c6c1daeSBarry Smith }
19635c6c1daeSBarry Smith 
1964*ffeef943SBarry Smith /*@
19657d6c928cSSatish Balay   PetscLogView - Prints a summary of the logging.
19665c6c1daeSBarry Smith 
19678f14a041SBarry Smith   Collective
19685c6c1daeSBarry Smith 
19695c6c1daeSBarry Smith   Input Parameter:
1970f14045dbSBarry Smith . viewer - an ASCII viewer
19715c6c1daeSBarry Smith 
19725c6c1daeSBarry Smith   Options Database Keys:
1973bb1d7374SBarry Smith + -log_view [:filename]                    - Prints summary of log information
1974bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file
1975607d249eSBarry 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)
1976d0a29bd7SConnor 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)
1977156b51fbSBarry Smith . -log_view_memory                         - Also display memory usage in each event
1978156b51fbSBarry Smith . -log_view_gpu_time                       - Also display time in each event for GPU kernels (Note this may slow the computation)
1979811af0c4SBarry Smith . -log_all                                 - Saves a file Log.rank for each MPI rank with details of each step of the computation
1980bb1d7374SBarry Smith - -log_trace [filename]                    - Displays a trace of what each process is doing
19815c6c1daeSBarry Smith 
1982d1f92df0SBarry Smith   Level: beginner
1983d1f92df0SBarry Smith 
19845c6c1daeSBarry Smith   Notes:
1985da81f932SPierre Jolivet   It is possible to control the logging programmatically but we recommend using the options database approach whenever possible
19865c6c1daeSBarry Smith   By default the summary is printed to stdout.
19875c6c1daeSBarry Smith 
1988bb1d7374SBarry Smith   Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin()
1989bb1d7374SBarry Smith 
1990bb1d7374SBarry Smith   If PETSc is configured with --with-logging=0 then this functionality is not available
1991bb1d7374SBarry Smith 
1992607d249eSBarry Smith   To view the nested XML format filename.xml first copy  ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current
1993607d249eSBarry Smith   directory then open filename.xml with your browser. Specific notes for certain browsers
19941d27aa22SBarry Smith .vb
19951d27aa22SBarry Smith     Firefox and Internet explorer - simply open the file
19961d27aa22SBarry Smith     Google Chrome - you must start up Chrome with the option --allow-file-access-from-files
19971d27aa22SBarry Smith     Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access
19981d27aa22SBarry Smith .ve
19991d27aa22SBarry 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
2000607d249eSBarry Smith   your browser.
20012add09c0SLisandro Dalcin   Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser
20022add09c0SLisandro Dalcin   window and render the XML log file contents.
2003607d249eSBarry Smith 
2004bb1d7374SBarry Smith   The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij  MARITIME  RESEARCH  INSTITUTE  NETHERLANDS
2005bb1d7374SBarry Smith 
20061d27aa22SBarry Smith   The Flame Graph output can be visualised using either the original Flame Graph script <https://github.com/brendangregg/FlameGraph>
20071d27aa22SBarry Smith   or using speedscope <https://www.speedscope.app>.
2008d0a29bd7SConnor Ward   Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py.
2009d0a29bd7SConnor Ward 
2010d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()`
20115c6c1daeSBarry Smith @*/
2012d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer)
2013d71ae5a4SJacob Faibussowitsch {
2014f14045dbSBarry Smith   PetscBool         isascii;
2015f14045dbSBarry Smith   PetscViewerFormat format;
2016b665b14eSToby Isaac   int               stage;
2017b665b14eSToby Isaac   PetscLogState     state;
2018b665b14eSToby Isaac   PetscIntStack     temp_stack;
2019b665b14eSToby Isaac   PetscLogHandler   handler;
2020b665b14eSToby Isaac   PetscBool         is_empty;
20215c6c1daeSBarry Smith 
20225c6c1daeSBarry Smith   PetscFunctionBegin;
2023b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
202437b78d16SBarry Smith   /* Pop off any stages the user forgot to remove */
2025b665b14eSToby Isaac   PetscCall(PetscIntStackCreate(&temp_stack));
2026b665b14eSToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
202737b78d16SBarry Smith   while (stage >= 0) {
2028b665b14eSToby Isaac     PetscCall(PetscLogStagePop());
2029b665b14eSToby Isaac     PetscCall(PetscIntStackPush(temp_stack, stage));
2030b665b14eSToby Isaac     PetscCall(PetscLogStateGetCurrentStage(state, &stage));
203137b78d16SBarry Smith   }
20329566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
203328b400f6SJacob Faibussowitsch   PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII");
20349566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
2035b665b14eSToby Isaac   if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
2036294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler));
2037b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
2038b665b14eSToby Isaac   } else {
2039294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
2040b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
20415c6c1daeSBarry Smith   }
2042b665b14eSToby Isaac   PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2043b665b14eSToby Isaac   while (!is_empty) {
2044b665b14eSToby Isaac     PetscCall(PetscIntStackPop(temp_stack, &stage));
2045b665b14eSToby Isaac     PetscCall(PetscLogStagePush(stage));
2046b665b14eSToby Isaac     PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2047b665b14eSToby Isaac   }
2048b665b14eSToby Isaac   PetscCall(PetscIntStackDestroy(temp_stack));
20493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20505c6c1daeSBarry Smith }
20515c6c1daeSBarry Smith 
2052f14045dbSBarry Smith /*@C
2053811af0c4SBarry Smith   PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed.
2054f14045dbSBarry Smith 
2055811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
2056f14045dbSBarry Smith 
2057811af0c4SBarry Smith   Level: developer
2058f14045dbSBarry Smith 
2059d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`
2060f14045dbSBarry Smith @*/
2061d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void)
2062d71ae5a4SJacob Faibussowitsch {
2063ad2e3d55SToby Isaac   PetscInt          n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX;
2064ad2e3d55SToby Isaac   PetscViewer       viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2065ad2e3d55SToby Isaac   PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2066f14045dbSBarry Smith   PetscBool         flg;
2067f14045dbSBarry Smith 
2068f14045dbSBarry Smith   PetscFunctionBegin;
2069ad2e3d55SToby Isaac   PetscCall(PetscOptionsGetViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg));
2070ad2e3d55SToby Isaac   for (PetscInt i = 0; i < n_max; i++) {
2071ad2e3d55SToby Isaac     PetscCall(PetscViewerPushFormat(viewers[i], formats[i]));
2072ad2e3d55SToby Isaac     PetscCall(PetscLogView(viewers[i]));
2073ad2e3d55SToby Isaac     PetscCall(PetscViewerPopFormat(viewers[i]));
2074f4f49eeaSPierre Jolivet     PetscCall(PetscOptionsRestoreViewer(&viewers[i]));
2075f14045dbSBarry Smith   }
20763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2077f14045dbSBarry Smith }
2078f14045dbSBarry Smith 
2079b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *);
2080b665b14eSToby Isaac 
2081b665b14eSToby Isaac /*@
2082b665b14eSToby Isaac   PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event
2083b665b14eSToby Isaac   that takes 1 or more percent of the time.
2084b665b14eSToby Isaac 
20858f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
2086b665b14eSToby Isaac 
2087b665b14eSToby Isaac   Input Parameter:
2088b665b14eSToby Isaac . newThresh - the threshold to use
2089b665b14eSToby Isaac 
2090b665b14eSToby Isaac   Output Parameter:
2091b665b14eSToby Isaac . oldThresh - the previously set threshold value
2092b665b14eSToby Isaac 
2093b665b14eSToby Isaac   Options Database Keys:
2094b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
2095b665b14eSToby Isaac 
2096b665b14eSToby Isaac   Example Usage:
2097b665b14eSToby Isaac .vb
2098b665b14eSToby Isaac   PetscInitialize(...);
2099b665b14eSToby Isaac   PetscLogNestedBegin();
2100b665b14eSToby Isaac   PetscLogSetThreshold(0.1,&oldthresh);
2101b665b14eSToby Isaac   // ... code ...
2102b665b14eSToby Isaac   PetscLogView(viewer);
2103b665b14eSToby Isaac   PetscFinalize();
2104b665b14eSToby Isaac .ve
2105b665b14eSToby Isaac 
2106b665b14eSToby Isaac   Level: advanced
2107b665b14eSToby Isaac 
2108b665b14eSToby Isaac   Note:
2109b665b14eSToby Isaac   This threshold is only used by the nested log handler
2110b665b14eSToby Isaac 
2111b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`,
2112b665b14eSToby Isaac           `PetscLogNestedBegin()`
2113b665b14eSToby Isaac @*/
2114b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh)
2115b665b14eSToby Isaac {
2116b665b14eSToby Isaac   PetscLogHandler handler;
2117b665b14eSToby Isaac 
2118b665b14eSToby Isaac   PetscFunctionBegin;
2119294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler));
2120b665b14eSToby Isaac   PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh));
2121b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2122b665b14eSToby Isaac }
2123b665b14eSToby Isaac 
21245c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/
2125cc4c1da9SBarry Smith /*@
21265c6c1daeSBarry Smith   PetscGetFlops - Returns the number of flops used on this processor
21275c6c1daeSBarry Smith   since the program began.
21285c6c1daeSBarry Smith 
21295c6c1daeSBarry Smith   Not Collective
21305c6c1daeSBarry Smith 
21315c6c1daeSBarry Smith   Output Parameter:
213210450e9eSJacob Faibussowitsch . flops - number of floating point operations
21335c6c1daeSBarry Smith 
2134d1f92df0SBarry Smith   Level: intermediate
2135d1f92df0SBarry Smith 
21365c6c1daeSBarry Smith   Notes:
21375c6c1daeSBarry Smith   A global counter logs all PETSc flop counts.  The user can use
2138811af0c4SBarry Smith   `PetscLogFlops()` to increment this counter to include flops for the
21395c6c1daeSBarry Smith   application code.
21405c6c1daeSBarry Smith 
21414b7c4d4dSPierre Jolivet   A separate counter `PetscLogGpuFlops()` logs the flops that occur on any GPU associated with this MPI rank
2142811af0c4SBarry Smith 
21434b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscTime()`, `PetscLogFlops()`
21445c6c1daeSBarry Smith @*/
2145d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops)
2146d71ae5a4SJacob Faibussowitsch {
21475c6c1daeSBarry Smith   PetscFunctionBegin;
21485c6c1daeSBarry Smith   *flops = petsc_TotalFlops;
21493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21505c6c1daeSBarry Smith }
21515c6c1daeSBarry Smith 
21521c1ad86eSToby Isaac /*@C
21531c1ad86eSToby Isaac   PetscLogObjectState - Record information about an object with the default log handler
21541c1ad86eSToby Isaac 
21551c1ad86eSToby Isaac   Not Collective
21561c1ad86eSToby Isaac 
21571c1ad86eSToby Isaac   Input Parameters:
21581c1ad86eSToby Isaac + obj    - the `PetscObject`
21591c1ad86eSToby Isaac . format - a printf-style format string
21601c1ad86eSToby Isaac - ...    - printf arguments to format
21611c1ad86eSToby Isaac 
21621c1ad86eSToby Isaac   Level: developer
21631c1ad86eSToby Isaac 
2164b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()`
21651c1ad86eSToby Isaac @*/
2166d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...)
2167d71ae5a4SJacob Faibussowitsch {
21685c6c1daeSBarry Smith   PetscFunctionBegin;
2169dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
2170dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
2171dff009beSToby Isaac 
2172dff009beSToby Isaac     if (h) {
2173dff009beSToby Isaac       va_list Argp;
21745c6c1daeSBarry Smith       va_start(Argp, format);
2175dff009beSToby Isaac       PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp));
21765c6c1daeSBarry Smith       va_end(Argp);
2177b665b14eSToby Isaac     }
2178dff009beSToby Isaac   }
21793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21805c6c1daeSBarry Smith }
21815c6c1daeSBarry Smith 
21825c6c1daeSBarry Smith /*MC
21835c6c1daeSBarry Smith   PetscLogFlops - Adds floating point operations to the global counter.
21845c6c1daeSBarry Smith 
21855c6c1daeSBarry Smith   Synopsis:
2186aaa7dc30SBarry Smith   #include <petsclog.h>
21875c6c1daeSBarry Smith   PetscErrorCode PetscLogFlops(PetscLogDouble f)
21885c6c1daeSBarry Smith 
21895c6c1daeSBarry Smith   Not Collective
21905c6c1daeSBarry Smith 
21915c6c1daeSBarry Smith   Input Parameter:
21925c6c1daeSBarry Smith . f - flop counter
21935c6c1daeSBarry Smith 
219410450e9eSJacob Faibussowitsch   Example Usage:
21955c6c1daeSBarry Smith .vb
21965c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
219710450e9eSJacob Faibussowitsch 
21985c6c1daeSBarry Smith   PetscLogEventRegister("User event", 0, &USER_EVENT);
21995c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
22005c6c1daeSBarry Smith   [code segment to monitor]
22015c6c1daeSBarry Smith   PetscLogFlops(user_flops)
22025c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
22035c6c1daeSBarry Smith .ve
22045c6c1daeSBarry Smith 
2205d1f92df0SBarry Smith   Level: intermediate
2206d1f92df0SBarry Smith 
2207811af0c4SBarry Smith   Note:
220810450e9eSJacob Faibussowitsch    A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment
220910450e9eSJacob Faibussowitsch    this counter to include flops for the application code.
22105c6c1daeSBarry Smith 
22114b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()`
22125c6c1daeSBarry Smith M*/
22135c6c1daeSBarry Smith 
22145c6c1daeSBarry Smith /*MC
221510450e9eSJacob Faibussowitsch   PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate
221610450e9eSJacob Faibussowitsch   timings
22175c6c1daeSBarry Smith 
22185c6c1daeSBarry Smith   Synopsis:
2219aaa7dc30SBarry Smith   #include <petsclog.h>
22205c6c1daeSBarry Smith   void PetscPreLoadBegin(PetscBool flag, char *name);
22215c6c1daeSBarry Smith 
22225c6c1daeSBarry Smith   Not Collective
22235c6c1daeSBarry Smith 
2224d8d19677SJose E. Roman   Input Parameters:
222510450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command
222610450e9eSJacob Faibussowitsch          line option `-preload true|false`
222710450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded
22285c6c1daeSBarry Smith 
222910450e9eSJacob Faibussowitsch   Example Usage:
22305c6c1daeSBarry Smith .vb
223110450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
223210450e9eSJacob Faibussowitsch   // lines of code
22335c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
223410450e9eSJacob Faibussowitsch   // lines of code
22355c6c1daeSBarry Smith   PetscPreLoadEnd();
22365c6c1daeSBarry Smith .ve
22375c6c1daeSBarry Smith 
2238d1f92df0SBarry Smith   Level: intermediate
2239d1f92df0SBarry Smith 
2240811af0c4SBarry Smith   Note:
224195452b02SPatrick Sanan   Only works in C/C++, not Fortran
22425c6c1daeSBarry Smith 
224310450e9eSJacob Faibussowitsch   Flags available within the macro\:
224410450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading
224510450e9eSJacob Faibussowitsch . PetscPreLoadingOn   - `PETSC_TRUE` if it is CURRENTLY doing preload
224610450e9eSJacob Faibussowitsch . PetscPreLoadIt      - `0` for the first computation (with preloading turned off it is only
224710450e9eSJacob Faibussowitsch                         `0`) `1`  for the second
224810450e9eSJacob Faibussowitsch - PetscPreLoadMax     - number of times it will do the computation, only one when preloading is
224910450e9eSJacob Faibussowitsch                         turned on
225010450e9eSJacob Faibussowitsch 
225110450e9eSJacob Faibussowitsch   The first two variables are available throughout the program, the second two only between the
225210450e9eSJacob Faibussowitsch   `PetscPreLoadBegin()` and `PetscPreLoadEnd()`
22535c6c1daeSBarry Smith 
2254d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
22555c6c1daeSBarry Smith M*/
22565c6c1daeSBarry Smith 
22575c6c1daeSBarry Smith /*MC
225810450e9eSJacob Faibussowitsch   PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate
225910450e9eSJacob Faibussowitsch   timings
22605c6c1daeSBarry Smith 
22615c6c1daeSBarry Smith   Synopsis:
2262aaa7dc30SBarry Smith   #include <petsclog.h>
22635c6c1daeSBarry Smith   void PetscPreLoadEnd(void);
22645c6c1daeSBarry Smith 
22655c6c1daeSBarry Smith   Not Collective
22665c6c1daeSBarry Smith 
226710450e9eSJacob Faibussowitsch   Example Usage:
22685c6c1daeSBarry Smith .vb
226910450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
227010450e9eSJacob Faibussowitsch   // lines of code
22715c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
227210450e9eSJacob Faibussowitsch   // lines of code
22735c6c1daeSBarry Smith   PetscPreLoadEnd();
22745c6c1daeSBarry Smith .ve
22755c6c1daeSBarry Smith 
2276d1f92df0SBarry Smith   Level: intermediate
2277d1f92df0SBarry Smith 
2278811af0c4SBarry Smith   Note:
2279dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
22805c6c1daeSBarry Smith 
2281d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()`
22825c6c1daeSBarry Smith M*/
22835c6c1daeSBarry Smith 
22845c6c1daeSBarry Smith /*MC
228510450e9eSJacob Faibussowitsch   PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings
22865c6c1daeSBarry Smith 
22875c6c1daeSBarry Smith   Synopsis:
2288aaa7dc30SBarry Smith   #include <petsclog.h>
22895c6c1daeSBarry Smith   void PetscPreLoadStage(char *name);
22905c6c1daeSBarry Smith 
22915c6c1daeSBarry Smith   Not Collective
22925c6c1daeSBarry Smith 
229310450e9eSJacob Faibussowitsch   Example Usage:
22945c6c1daeSBarry Smith .vb
229510450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE,"first stage");
229610450e9eSJacob Faibussowitsch   // lines of code
22975c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
229810450e9eSJacob Faibussowitsch   // lines of code
22995c6c1daeSBarry Smith   PetscPreLoadEnd();
23005c6c1daeSBarry Smith .ve
23015c6c1daeSBarry Smith 
2302d1f92df0SBarry Smith   Level: intermediate
2303d1f92df0SBarry Smith 
2304811af0c4SBarry Smith   Note:
2305dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
23065c6c1daeSBarry Smith 
2307d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`
23085c6c1daeSBarry Smith M*/
23095c6c1daeSBarry Smith 
2310a4af0ceeSJacob Faibussowitsch   #if PetscDefined(HAVE_DEVICE)
2311a4af0ceeSJacob Faibussowitsch     #include <petsc/private/deviceimpl.h>
23129ffd0706SHong Zhang 
2313cc4c1da9SBarry Smith /*@
2314156b51fbSBarry Smith   PetscLogGpuTime - turn on the logging of GPU time for GPU kernels
2315156b51fbSBarry Smith 
2316811af0c4SBarry Smith   Options Database Key:
2317efa05fe8SBarry Smith . -log_view_gpu_time - provide the GPU times for all events in the `-log_view` output
2318156b51fbSBarry Smith 
2319d1f92df0SBarry Smith   Level: advanced
2320d1f92df0SBarry Smith 
2321156b51fbSBarry Smith   Notes:
232210450e9eSJacob Faibussowitsch   Turning on the timing of the GPU kernels can slow down the entire computation and should only
2323efa05fe8SBarry Smith   be used when studying the performance of individual operations on GPU such as vector operations and
232410450e9eSJacob Faibussowitsch   matrix-vector operations.
2325156b51fbSBarry Smith 
2326efa05fe8SBarry 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
2327efa05fe8SBarry Smith 
232810450e9eSJacob Faibussowitsch   This routine should only be called once near the beginning of the program. Once it is started
232910450e9eSJacob Faibussowitsch   it cannot be turned off.
2330156b51fbSBarry Smith 
2331d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()`
2332156b51fbSBarry Smith @*/
2333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void)
2334d71ae5a4SJacob Faibussowitsch {
2335473903fcSJunchao Zhang   PetscFunctionBegin;
2336473903fcSJunchao Zhang   PetscCheck(petsc_gtime == 0.0, PETSC_COMM_SELF, PETSC_ERR_SUP, "GPU logging has already been turned on");
2337156b51fbSBarry Smith   PetscLogGpuTimeFlag = PETSC_TRUE;
2338473903fcSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
2339156b51fbSBarry Smith }
2340156b51fbSBarry Smith 
2341cc4c1da9SBarry Smith /*@
23429ffd0706SHong Zhang   PetscLogGpuTimeBegin - Start timer for device
23439ffd0706SHong Zhang 
2344d1f92df0SBarry Smith   Level: intermediate
2345d1f92df0SBarry Smith 
23469ffd0706SHong Zhang   Notes:
234710450e9eSJacob Faibussowitsch   When CUDA or HIP is enabled, the timer is run on the GPU, it is a separate logging of time
234810450e9eSJacob Faibussowitsch   devoted to GPU computations (excluding kernel launch times).
2349811af0c4SBarry Smith 
235010450e9eSJacob Faibussowitsch   When CUDA or HIP is not available, the timer is run on the CPU, it is a separate logging of
235110450e9eSJacob Faibussowitsch   time devoted to GPU computations (including kernel launch times).
2352811af0c4SBarry Smith 
235310450e9eSJacob Faibussowitsch   There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and
235410450e9eSJacob Faibussowitsch   `PetscLogGpuTimeEnd()`
2355811af0c4SBarry Smith 
235610450e9eSJacob Faibussowitsch   This timer should NOT include times for data transfers between the GPU and CPU, nor setup
235710450e9eSJacob Faibussowitsch   actions such as allocating space.
2358811af0c4SBarry Smith 
235910450e9eSJacob Faibussowitsch   The regular logging captures the time for data transfers and any CPU activities during the
236010450e9eSJacob Faibussowitsch   event. It is used to compute the flop rate on the GPU as it is actively engaged in running a
236110450e9eSJacob Faibussowitsch   kernel.
23629ffd0706SHong Zhang 
23639ffd0706SHong Zhang   Developer Notes:
236410450e9eSJacob Faibussowitsch   The GPU event timer captures the execution time of all the kernels launched in the default
236510450e9eSJacob Faibussowitsch   stream by the CPU between `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()`.
2366811af0c4SBarry Smith 
236710450e9eSJacob Faibussowitsch   `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()` insert the begin and end events into the
236810450e9eSJacob Faibussowitsch   default stream (stream 0). The device will record a time stamp for the event when it reaches
236910450e9eSJacob Faibussowitsch   that event in the stream. The function xxxEventSynchronize() is called in
237010450e9eSJacob Faibussowitsch   `PetsLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the
237110450e9eSJacob Faibussowitsch   timer event is recorded.
23729ffd0706SHong Zhang 
2373d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()`
23749ffd0706SHong Zhang @*/
2375d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void)
2376d71ae5a4SJacob Faibussowitsch {
2377b665b14eSToby Isaac   PetscBool isActive;
2378b665b14eSToby Isaac 
23799ffd0706SHong Zhang   PetscFunctionBegin;
2380b665b14eSToby Isaac   PetscCall(PetscLogEventBeginIsActive(&isActive));
2381b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
2382744d70b0SJunchao Zhang   if (PetscDefined(HAVE_DEVICE)) {
2383a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2384a4af0ceeSJacob Faibussowitsch 
23859566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
23869566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextBeginTimer_Internal(dctx));
2387a4af0ceeSJacob Faibussowitsch   } else {
23889566063dSJacob Faibussowitsch     PetscCall(PetscTimeSubtract(&petsc_gtime));
2389a4af0ceeSJacob Faibussowitsch   }
23903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23919ffd0706SHong Zhang }
23929ffd0706SHong Zhang 
2393cc4c1da9SBarry Smith /*@
23949ffd0706SHong Zhang   PetscLogGpuTimeEnd - Stop timer for device
23959ffd0706SHong Zhang 
23969ffd0706SHong Zhang   Level: intermediate
23979ffd0706SHong Zhang 
2398d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()`
23999ffd0706SHong Zhang @*/
2400d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void)
2401d71ae5a4SJacob Faibussowitsch {
2402b665b14eSToby Isaac   PetscBool isActive;
2403b665b14eSToby Isaac 
24049ffd0706SHong Zhang   PetscFunctionBegin;
2405b665b14eSToby Isaac   PetscCall(PetscLogEventEndIsActive(&isActive));
2406b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
2407744d70b0SJunchao Zhang   if (PetscDefined(HAVE_DEVICE)) {
2408a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2409a4af0ceeSJacob Faibussowitsch     PetscLogDouble     elapsed;
2410a4af0ceeSJacob Faibussowitsch 
24119566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
24129566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed));
2413a4af0ceeSJacob Faibussowitsch     petsc_gtime += (elapsed / 1000.0);
2414a4af0ceeSJacob Faibussowitsch   } else {
24159566063dSJacob Faibussowitsch     PetscCall(PetscTimeAdd(&petsc_gtime));
2416a4af0ceeSJacob Faibussowitsch   }
24173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24189ffd0706SHong Zhang }
2419c708d6e3SStefano Zampini 
24209ffd0706SHong Zhang   #endif /* end of PETSC_HAVE_DEVICE */
24219ffd0706SHong Zhang 
2422cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/
2423cb9ef012SToby Isaac 
2424dd01b7e5SBarry Smith /* -- Utility functions for logging from Fortran -- */
2425b665b14eSToby Isaac 
2426b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype)
2427b665b14eSToby Isaac {
2428b665b14eSToby Isaac   PetscFunctionBegin;
2429cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2430b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1));
2431b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2432b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th));
2433b665b14eSToby Isaac   #endif
2434cb9ef012SToby Isaac #endif
2435b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2436b665b14eSToby Isaac }
2437b665b14eSToby Isaac 
2438b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype)
2439b665b14eSToby Isaac {
2440b665b14eSToby Isaac   PetscFunctionBegin;
2441cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2442b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1));
2443b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2444b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_recv_len, &petsc_recv_len_th));
2445b665b14eSToby Isaac   #endif
2446cb9ef012SToby Isaac #endif
2447b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2448b665b14eSToby Isaac }
2449b665b14eSToby Isaac 
2450b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void)
2451b665b14eSToby Isaac {
2452b665b14eSToby Isaac   PetscFunctionBegin;
2453cb9ef012SToby Isaac   if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1));
2454b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2455b665b14eSToby Isaac }
2456b665b14eSToby Isaac 
24575c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
24585c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID  = 0;
24595c6c1daeSBarry Smith 
24602611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE;
24612611ad71SToby Isaac 
24622611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void)
24632611ad71SToby Isaac {
24642611ad71SToby Isaac   int stage;
24652611ad71SToby Isaac 
24662611ad71SToby Isaac   PetscFunctionBegin;
24672611ad71SToby Isaac   if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS);
24682611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_TRUE;
24692611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
24702611ad71SToby Isaac     /* Setup default logging structures */
24712611ad71SToby Isaac     PetscCall(PetscLogStateCreate(&petsc_log_state));
24722611ad71SToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
24732611ad71SToby Isaac       if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state));
24742611ad71SToby Isaac     }
24752611ad71SToby Isaac     PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage));
24762611ad71SToby Isaac     PetscCall(PetscSpinlockCreate(&PetscLogSpinLock));
24772611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY)
24782611ad71SToby Isaac     petsc_log_tid = 0;
24792611ad71SToby Isaac     petsc_log_gid = 0;
24802611ad71SToby Isaac #endif
24812611ad71SToby Isaac 
24822611ad71SToby Isaac     /* All processors sync here for more consistent logging */
24832611ad71SToby Isaac     PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
24842611ad71SToby Isaac     PetscCall(PetscTime(&petsc_BaseTime));
24852611ad71SToby Isaac     PetscCall(PetscLogStagePush(stage));
24862611ad71SToby Isaac   }
24872611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
24882611ad71SToby Isaac }
24892611ad71SToby Isaac 
24902611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void)
24912611ad71SToby Isaac {
24922611ad71SToby Isaac   PetscFunctionBegin;
24932611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
2494b665b14eSToby Isaac     /* Resetting phase */
2495b665b14eSToby Isaac     // pop remaining stages
2496b665b14eSToby Isaac     if (petsc_log_state) {
2497b665b14eSToby Isaac       while (petsc_log_state->current_stage >= 0) { PetscCall(PetscLogStagePop()); }
2498b665b14eSToby Isaac     }
24992611ad71SToby Isaac     for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler));
25002611ad71SToby Isaac     PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX));
25012611ad71SToby Isaac     PetscCall(PetscLogStateDestroy(&petsc_log_state));
25022611ad71SToby Isaac 
25032611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25042611ad71SToby Isaac     petsc_BaseTime           = 0.0;
25052611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25062611ad71SToby Isaac     petsc_send_ct            = 0.0;
25072611ad71SToby Isaac     petsc_recv_ct            = 0.0;
25082611ad71SToby Isaac     petsc_send_len           = 0.0;
25092611ad71SToby Isaac     petsc_recv_len           = 0.0;
25102611ad71SToby Isaac     petsc_isend_ct           = 0.0;
25112611ad71SToby Isaac     petsc_irecv_ct           = 0.0;
25122611ad71SToby Isaac     petsc_isend_len          = 0.0;
25132611ad71SToby Isaac     petsc_irecv_len          = 0.0;
25142611ad71SToby Isaac     petsc_wait_ct            = 0.0;
25152611ad71SToby Isaac     petsc_wait_any_ct        = 0.0;
25162611ad71SToby Isaac     petsc_wait_all_ct        = 0.0;
25172611ad71SToby Isaac     petsc_sum_of_waits_ct    = 0.0;
25182611ad71SToby Isaac     petsc_allreduce_ct       = 0.0;
25192611ad71SToby Isaac     petsc_gather_ct          = 0.0;
25202611ad71SToby Isaac     petsc_scatter_ct         = 0.0;
25212611ad71SToby Isaac     petsc_TotalFlops_th      = 0.0;
25222611ad71SToby Isaac     petsc_send_ct_th         = 0.0;
25232611ad71SToby Isaac     petsc_recv_ct_th         = 0.0;
25242611ad71SToby Isaac     petsc_send_len_th        = 0.0;
25252611ad71SToby Isaac     petsc_recv_len_th        = 0.0;
25262611ad71SToby Isaac     petsc_isend_ct_th        = 0.0;
25272611ad71SToby Isaac     petsc_irecv_ct_th        = 0.0;
25282611ad71SToby Isaac     petsc_isend_len_th       = 0.0;
25292611ad71SToby Isaac     petsc_irecv_len_th       = 0.0;
25302611ad71SToby Isaac     petsc_wait_ct_th         = 0.0;
25312611ad71SToby Isaac     petsc_wait_any_ct_th     = 0.0;
25322611ad71SToby Isaac     petsc_wait_all_ct_th     = 0.0;
25332611ad71SToby Isaac     petsc_sum_of_waits_ct_th = 0.0;
25342611ad71SToby Isaac     petsc_allreduce_ct_th    = 0.0;
25352611ad71SToby Isaac     petsc_gather_ct_th       = 0.0;
25362611ad71SToby Isaac     petsc_scatter_ct_th      = 0.0;
25372611ad71SToby Isaac 
25382611ad71SToby Isaac     petsc_ctog_ct    = 0.0;
25392611ad71SToby Isaac     petsc_gtoc_ct    = 0.0;
25402611ad71SToby Isaac     petsc_ctog_sz    = 0.0;
25412611ad71SToby Isaac     petsc_gtoc_sz    = 0.0;
25422611ad71SToby Isaac     petsc_gflops     = 0.0;
25432611ad71SToby Isaac     petsc_gtime      = 0.0;
25442611ad71SToby Isaac     petsc_ctog_ct_th = 0.0;
25452611ad71SToby Isaac     petsc_gtoc_ct_th = 0.0;
25462611ad71SToby Isaac     petsc_ctog_sz_th = 0.0;
25472611ad71SToby Isaac     petsc_gtoc_sz_th = 0.0;
25482611ad71SToby Isaac     petsc_gflops_th  = 0.0;
25492611ad71SToby Isaac     petsc_gtime_th   = 0.0;
25502611ad71SToby Isaac   }
25512611ad71SToby Isaac   PETSC_LARGEST_CLASSID    = PETSC_SMALLEST_CLASSID;
25522611ad71SToby Isaac   PETSC_OBJECT_CLASSID     = 0;
25532611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_FALSE;
25542611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25552611ad71SToby Isaac }
25562611ad71SToby Isaac 
2557cc4c1da9SBarry Smith /*@
25585c6c1daeSBarry Smith   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
25595c6c1daeSBarry Smith 
25605c6c1daeSBarry Smith   Not Collective
25615c6c1daeSBarry Smith 
25625c6c1daeSBarry Smith   Input Parameter:
25635c6c1daeSBarry Smith . name - The class name
25645c6c1daeSBarry Smith 
25655c6c1daeSBarry Smith   Output Parameter:
25665c6c1daeSBarry Smith . oclass - The class id or classid
25675c6c1daeSBarry Smith 
25685c6c1daeSBarry Smith   Level: developer
25695c6c1daeSBarry Smith 
2570d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`
25715c6c1daeSBarry Smith @*/
2572d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass)
2573d71ae5a4SJacob Faibussowitsch {
25745c6c1daeSBarry Smith   PetscFunctionBegin;
25755c6c1daeSBarry Smith   *oclass = ++PETSC_LARGEST_CLASSID;
25765c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2577b665b14eSToby Isaac   {
2578b665b14eSToby Isaac     PetscLogState state;
2579b665b14eSToby Isaac     PetscLogClass logclass;
2580b665b14eSToby Isaac 
2581b665b14eSToby Isaac     PetscCall(PetscLogGetState(&state));
2582b665b14eSToby Isaac     if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass));
2583b665b14eSToby Isaac   }
25845c6c1daeSBarry Smith #endif
25853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
25865c6c1daeSBarry Smith }
2587