xref: /petsc/src/sys/logging/plog.c (revision 8b08f49465a30f8da2431a02b9bf7861043ec889)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith /*
35c6c1daeSBarry Smith       PETSc code to log object creation and destruction and PETSc events.
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith       This provides the public API used by the rest of PETSc and by users.
65c6c1daeSBarry Smith 
75c6c1daeSBarry Smith       These routines use a private API that is not used elsewhere in PETSc and is not
85c6c1daeSBarry Smith       accessible to users. The private API is defined in logimpl.h and the utils directory.
95c6c1daeSBarry Smith 
10b665b14eSToby Isaac       ***
11b665b14eSToby Isaac 
12b665b14eSToby Isaac       This file, and only this file, is for functions that interact with the global logging state
135c6c1daeSBarry Smith */
14af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I    "petscsys.h"   I*/
1553e0a2f3SToby Isaac #include <petsc/private/loghandlerimpl.h>
165c6c1daeSBarry Smith #include <petsctime.h>
17665c2dedSJed Brown #include <petscviewer.h>
188fe3844cSJunchao Zhang #include <petscdevice.h>
198fe3844cSJunchao Zhang #include <petsc/private/deviceimpl.h>
205c6c1daeSBarry Smith 
21c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY)
22c708d6e3SStefano Zampini 
23c708d6e3SStefano Zampini PetscInt           petsc_log_gid = -1; /* Global threadId counter */
24c708d6e3SStefano Zampini PETSC_TLS PetscInt petsc_log_tid = -1; /* Local threadId */
25c708d6e3SStefano Zampini 
26c708d6e3SStefano Zampini /* shared variables */
27c708d6e3SStefano Zampini PetscSpinlock PetscLogSpinLock;
28c708d6e3SStefano Zampini 
292611ad71SToby Isaac PetscInt PetscLogGetTid(void)
302611ad71SToby Isaac {
312611ad71SToby Isaac   if (petsc_log_tid < 0) {
322611ad71SToby Isaac     PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
332611ad71SToby Isaac     petsc_log_tid = ++petsc_log_gid;
342611ad71SToby Isaac     PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
352611ad71SToby Isaac   }
362611ad71SToby Isaac   return petsc_log_tid;
372611ad71SToby Isaac }
382611ad71SToby Isaac 
39c708d6e3SStefano Zampini #endif
40c708d6e3SStefano Zampini 
415c6c1daeSBarry Smith /* Global counters */
425c6c1daeSBarry Smith PetscLogDouble petsc_BaseTime        = 0.0;
435c6c1daeSBarry Smith PetscLogDouble petsc_TotalFlops      = 0.0; /* The number of flops */
445c6c1daeSBarry Smith PetscLogDouble petsc_send_ct         = 0.0; /* The number of sends */
455c6c1daeSBarry Smith PetscLogDouble petsc_recv_ct         = 0.0; /* The number of receives */
465c6c1daeSBarry Smith PetscLogDouble petsc_send_len        = 0.0; /* The total length of all sent messages */
475c6c1daeSBarry Smith PetscLogDouble petsc_recv_len        = 0.0; /* The total length of all received messages */
485c6c1daeSBarry Smith PetscLogDouble petsc_isend_ct        = 0.0; /* The number of immediate sends */
495c6c1daeSBarry Smith PetscLogDouble petsc_irecv_ct        = 0.0; /* The number of immediate receives */
505c6c1daeSBarry Smith PetscLogDouble petsc_isend_len       = 0.0; /* The total length of all immediate send messages */
515c6c1daeSBarry Smith PetscLogDouble petsc_irecv_len       = 0.0; /* The total length of all immediate receive messages */
525c6c1daeSBarry Smith PetscLogDouble petsc_wait_ct         = 0.0; /* The number of waits */
535c6c1daeSBarry Smith PetscLogDouble petsc_wait_any_ct     = 0.0; /* The number of anywaits */
545c6c1daeSBarry Smith PetscLogDouble petsc_wait_all_ct     = 0.0; /* The number of waitalls */
555c6c1daeSBarry Smith PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */
565c6c1daeSBarry Smith PetscLogDouble petsc_allreduce_ct    = 0.0; /* The number of reductions */
575c6c1daeSBarry Smith PetscLogDouble petsc_gather_ct       = 0.0; /* The number of gathers and gathervs */
585c6c1daeSBarry Smith PetscLogDouble petsc_scatter_ct      = 0.0; /* The number of scatters and scattervs */
59c708d6e3SStefano Zampini 
60c708d6e3SStefano Zampini /* Thread Local storage */
61c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_TotalFlops_th      = 0.0;
62c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_ct_th         = 0.0;
63c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_ct_th         = 0.0;
64c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_len_th        = 0.0;
65c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_len_th        = 0.0;
66c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_ct_th        = 0.0;
67c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_ct_th        = 0.0;
68c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_len_th       = 0.0;
69c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_len_th       = 0.0;
70c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_ct_th         = 0.0;
71c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_any_ct_th     = 0.0;
72c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_all_ct_th     = 0.0;
73c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_sum_of_waits_ct_th = 0.0;
74c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_allreduce_ct_th    = 0.0;
75c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gather_ct_th       = 0.0;
76c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_scatter_ct_th      = 0.0;
77c708d6e3SStefano Zampini 
78bec0b493Shannah_mairs PetscLogDouble petsc_ctog_ct        = 0.0; /* The total number of CPU to GPU copies */
79bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_ct        = 0.0; /* The total number of GPU to CPU copies */
80bec0b493Shannah_mairs PetscLogDouble petsc_ctog_sz        = 0.0; /* The total size of CPU to GPU copies */
81bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_sz        = 0.0; /* The total size of GPU to CPU copies */
8245c4b7c1SBarry Smith PetscLogDouble petsc_ctog_ct_scalar = 0.0; /* The total number of CPU to GPU copies */
8345c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_ct_scalar = 0.0; /* The total number of GPU to CPU copies */
8445c4b7c1SBarry Smith PetscLogDouble petsc_ctog_sz_scalar = 0.0; /* The total size of CPU to GPU copies */
8545c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_sz_scalar = 0.0; /* The total size of GPU to CPU copies */
86958c4211Shannah_mairs PetscLogDouble petsc_gflops         = 0.0; /* The flops done on a GPU */
87958c4211Shannah_mairs PetscLogDouble petsc_gtime          = 0.0; /* The time spent on a GPU */
88c708d6e3SStefano Zampini 
89c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_th        = 0.0;
90c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_th        = 0.0;
91c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_th        = 0.0;
92c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_th        = 0.0;
93c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_scalar_th = 0.0;
94c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_scalar_th = 0.0;
95c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_scalar_th = 0.0;
96c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_scalar_th = 0.0;
97c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gflops_th         = 0.0;
98c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtime_th          = 0.0;
992611ad71SToby Isaac 
1002611ad71SToby Isaac PetscBool PetscLogMemory = PETSC_FALSE;
1012611ad71SToby Isaac PetscBool PetscLogSyncOn = PETSC_FALSE;
1022611ad71SToby Isaac 
1032611ad71SToby Isaac PetscBool PetscLogGpuTimeFlag = PETSC_FALSE;
1042611ad71SToby Isaac 
1052611ad71SToby Isaac PetscLogState petsc_log_state = NULL;
1062611ad71SToby Isaac 
1072611ad71SToby Isaac #define PETSC_LOG_HANDLER_HOT_BLANK \
1082611ad71SToby Isaac   { \
1092611ad71SToby Isaac     NULL, NULL, NULL, NULL, NULL, NULL \
1102611ad71SToby Isaac   }
1112611ad71SToby Isaac 
1122611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = {
1132611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1142611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1152611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1162611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1172611ad71SToby Isaac };
1182611ad71SToby Isaac 
1192611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK
1202611ad71SToby Isaac 
1212611ad71SToby Isaac #if defined(PETSC_USE_LOG)
1222611ad71SToby Isaac   #include <../src/sys/logging/handler/impls/default/logdefault.h>
123c708d6e3SStefano Zampini 
124c708d6e3SStefano Zampini   #if defined(PETSC_HAVE_THREADSAFETY)
125c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp)
126c708d6e3SStefano Zampini {
127c708d6e3SStefano Zampini   *tot_th += tmp;
1283ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
129c708d6e3SStefano Zampini   *tot += tmp;
1303ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1313ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
132c708d6e3SStefano Zampini }
133c708d6e3SStefano Zampini 
134c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp)
135c708d6e3SStefano Zampini {
136c708d6e3SStefano Zampini   *cnt_th = *cnt_th + 1;
137c708d6e3SStefano Zampini   *tot_th += tmp;
1383ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
139c708d6e3SStefano Zampini   *tot += (PetscLogDouble)(tmp);
140c708d6e3SStefano Zampini   *cnt += *cnt + 1;
1413ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1423ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
143c708d6e3SStefano Zampini }
144c708d6e3SStefano Zampini 
145bec0b493Shannah_mairs   #endif
1465c6c1daeSBarry Smith 
14753e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
14853e0a2f3SToby Isaac {
14953e0a2f3SToby Isaac   PetscFunctionBegin;
15053e0a2f3SToby Isaac   PetscAssertPointer(handler, 2);
15153e0a2f3SToby Isaac   *handler = NULL;
15253e0a2f3SToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
15353e0a2f3SToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
15453e0a2f3SToby Isaac     if (h) {
15553e0a2f3SToby Isaac       PetscBool match;
15653e0a2f3SToby Isaac 
15753e0a2f3SToby Isaac       PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match));
15853e0a2f3SToby Isaac       if (match) {
15953e0a2f3SToby Isaac         *handler = PetscLogHandlers[i].handler;
16053e0a2f3SToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
16153e0a2f3SToby Isaac       }
16253e0a2f3SToby Isaac     }
16353e0a2f3SToby Isaac   }
16453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
16553e0a2f3SToby Isaac }
16653e0a2f3SToby Isaac 
16753e0a2f3SToby Isaac /*@
168b665b14eSToby Isaac   PetscLogGetDefaultHandler - Get the default log handler if it is running.
169b665b14eSToby Isaac 
170b665b14eSToby Isaac   Not collective
171b665b14eSToby Isaac 
172b665b14eSToby Isaac   Output Parameter:
173b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running.
174b665b14eSToby Isaac 
175b665b14eSToby Isaac   Level: developer
176b665b14eSToby Isaac 
177b665b14eSToby Isaac   Notes:
178b665b14eSToby Isaac   The default handler is started with `PetscLogDefaultBegin()`,
179b665b14eSToby Isaac   if the options flags `-log_all` or `-log_view` is given without arguments,
180b665b14eSToby Isaac   or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`.
181b665b14eSToby Isaac 
182b665b14eSToby Isaac .seealso: [](ch_profiling)
183b665b14eSToby Isaac @*/
184b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler)
185b665b14eSToby Isaac {
186b665b14eSToby Isaac   PetscFunctionBegin;
187294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler));
188b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
189b665b14eSToby Isaac }
190b665b14eSToby Isaac 
191b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
192b665b14eSToby Isaac {
193b665b14eSToby Isaac   PetscFunctionBegin;
194b665b14eSToby Isaac   PetscAssertPointer(handler, 2);
195b665b14eSToby Isaac   PetscCall(PetscLogTryGetHandler(type, handler));
196b665b14eSToby Isaac   PetscCheck(handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type);
197b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
198b665b14eSToby Isaac }
199b665b14eSToby Isaac 
200b665b14eSToby Isaac /*@
20153e0a2f3SToby Isaac   PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used
20253e0a2f3SToby Isaac   by all default log handlers (`PetscLogDefaultBegin()`,
20353e0a2f3SToby Isaac   `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`,
20453e0a2f3SToby Isaac   `PetscLogPerfstubsBegin()`).
20553e0a2f3SToby Isaac 
20653e0a2f3SToby Isaac   Collective on `PETSC_COMM_WORLD`
20753e0a2f3SToby Isaac 
20853e0a2f3SToby Isaac   Output Parameter:
209b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as
210b665b14eSToby Isaac           `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or
211b665b14eSToby Isaac           `PetscLogStagePush()`), or NULL if logging is not active
21253e0a2f3SToby Isaac 
21353e0a2f3SToby Isaac   Level: developer
21453e0a2f3SToby Isaac 
21553e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState`
21653e0a2f3SToby Isaac @*/
21753e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state)
21853e0a2f3SToby Isaac {
21953e0a2f3SToby Isaac   PetscFunctionBegin;
22053e0a2f3SToby Isaac   PetscAssertPointer(state, 1);
22153e0a2f3SToby Isaac   *state = petsc_log_state;
22253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
22353e0a2f3SToby Isaac }
22453e0a2f3SToby Isaac 
22553e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot)
22653e0a2f3SToby Isaac {
22753e0a2f3SToby Isaac   PetscFunctionBegin;
22853e0a2f3SToby Isaac   hot->handler       = h;
22953e0a2f3SToby Isaac   hot->eventBegin    = h->ops->eventbegin;
23053e0a2f3SToby Isaac   hot->eventEnd      = h->ops->eventend;
23153e0a2f3SToby Isaac   hot->eventSync     = h->ops->eventsync;
23253e0a2f3SToby Isaac   hot->objectCreate  = h->ops->objectcreate;
23353e0a2f3SToby Isaac   hot->objectDestroy = h->ops->objectdestroy;
23453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
23553e0a2f3SToby Isaac }
23653e0a2f3SToby Isaac 
23753e0a2f3SToby Isaac /*@
23853e0a2f3SToby Isaac   PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state.
23953e0a2f3SToby Isaac 
24053e0a2f3SToby Isaac   Logically collective
24153e0a2f3SToby Isaac 
24253e0a2f3SToby Isaac   Input Parameters:
24353e0a2f3SToby Isaac . h - a `PetscLogHandler`
24453e0a2f3SToby Isaac 
24553e0a2f3SToby Isaac   Level: developer
24653e0a2f3SToby Isaac 
24753e0a2f3SToby Isaac   Notes:
24853e0a2f3SToby Isaac 
24953e0a2f3SToby Isaac   Users should only need this if they create their own log handlers: handlers that are started
25053e0a2f3SToby Isaac   from the command line (such as `-log_view` and `-log_trace`) or from a function like
25153e0a2f3SToby Isaac   `PetscLogNestedBegin()` will automatically be started.
25253e0a2f3SToby Isaac 
25353e0a2f3SToby Isaac   There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time.
25453e0a2f3SToby Isaac 
25553e0a2f3SToby Isaac   To disconnect a handler from the global stream call `PetscLogHandlerStop()`.
25653e0a2f3SToby Isaac 
25753e0a2f3SToby Isaac   When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`,
25853e0a2f3SToby Isaac   will be pushed for the new log handler, but it will not be informed of any events that are
25953e0a2f3SToby Isaac   in progress.  It is recommended to start any user-defined log handlers immediately following
26053e0a2f3SToby Isaac   before any user-defined stages are pushed.
26153e0a2f3SToby Isaac 
26253e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()`
26353e0a2f3SToby Isaac @*/
26453e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h)
26553e0a2f3SToby Isaac {
26653e0a2f3SToby Isaac   PetscFunctionBegin;
26753e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26853e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS);
26953e0a2f3SToby Isaac   }
27053e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
27153e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == NULL) {
27253e0a2f3SToby Isaac       PetscCall(PetscObjectReference((PetscObject)h));
27353e0a2f3SToby Isaac       PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i]));
27453e0a2f3SToby Isaac       if (petsc_log_state) {
27553e0a2f3SToby Isaac         PetscLogStage stack_height;
27653e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
27753e0a2f3SToby Isaac 
27853e0a2f3SToby Isaac         PetscCall(PetscLogHandlerSetState(h, petsc_log_state));
27953e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
28053e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
28153e0a2f3SToby Isaac         orig_stack                     = petsc_log_state->stage_stack;
28253e0a2f3SToby Isaac         petsc_log_state->stage_stack   = temp_stack;
28353e0a2f3SToby Isaac         petsc_log_state->current_stage = -1;
28453e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
28553e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
28653e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePush(h, stage));
28753e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
28853e0a2f3SToby Isaac           petsc_log_state->current_stage = stage;
28953e0a2f3SToby Isaac         }
29053e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
29153e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
29253e0a2f3SToby Isaac       }
29353e0a2f3SToby Isaac       PetscFunctionReturn(PETSC_SUCCESS);
29453e0a2f3SToby Isaac     }
29553e0a2f3SToby Isaac   }
29653e0a2f3SToby Isaac   SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX);
29753e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
29853e0a2f3SToby Isaac }
29953e0a2f3SToby Isaac 
30053e0a2f3SToby Isaac /*@
30153e0a2f3SToby Isaac   PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream.
30253e0a2f3SToby Isaac 
30353e0a2f3SToby Isaac   Logically collective
30453e0a2f3SToby Isaac 
30553e0a2f3SToby Isaac   Input Parameters:
30653e0a2f3SToby Isaac . h - a `PetscLogHandler`
30753e0a2f3SToby Isaac 
30853e0a2f3SToby Isaac   Level: developer
30953e0a2f3SToby Isaac 
31053e0a2f3SToby Isaac   Note:
31153e0a2f3SToby Isaac   After `PetscLogHandlerStop()`, the handler can still access the global logging state
31253e0a2f3SToby Isaac   with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing
31353e0a2f3SToby Isaac   (for instance, in `PetscLogHandlerView()`),
31453e0a2f3SToby Isaac 
31553e0a2f3SToby Isaac   When a log handler is stopped, the remaining stages will be popped before it is
31653e0a2f3SToby Isaac   disconnected from the log stream.
31753e0a2f3SToby Isaac 
31853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()`
31953e0a2f3SToby Isaac @*/
32053e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h)
32153e0a2f3SToby Isaac {
32253e0a2f3SToby Isaac   PetscFunctionBegin;
32353e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
32453e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) {
32553e0a2f3SToby Isaac       if (petsc_log_state) {
32653e0a2f3SToby Isaac         PetscLogState state;
32753e0a2f3SToby Isaac         PetscLogStage stack_height;
32853e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
32953e0a2f3SToby Isaac 
33053e0a2f3SToby Isaac         PetscCall(PetscLogHandlerGetState(h, &state));
33153e0a2f3SToby Isaac         PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started.");
33253e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
33353e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
33453e0a2f3SToby Isaac         orig_stack                   = petsc_log_state->stage_stack;
33553e0a2f3SToby Isaac         petsc_log_state->stage_stack = temp_stack;
33653e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
33753e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
33853e0a2f3SToby Isaac 
33953e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
34053e0a2f3SToby Isaac         }
34153e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
34253e0a2f3SToby Isaac           PetscLogStage stage;
34353e0a2f3SToby Isaac           PetscBool     empty;
34453e0a2f3SToby Isaac 
34553e0a2f3SToby Isaac           PetscCall(PetscIntStackPop(temp_stack, &stage));
34653e0a2f3SToby Isaac           PetscCall(PetscIntStackEmpty(temp_stack, &empty));
34753e0a2f3SToby Isaac           if (!empty) {
34853e0a2f3SToby Isaac             PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage));
34953e0a2f3SToby Isaac           } else petsc_log_state->current_stage = -1;
35053e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePop(h, stage));
35153e0a2f3SToby Isaac         }
35253e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
35353e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
35453e0a2f3SToby Isaac         PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage));
35553e0a2f3SToby Isaac       }
35653e0a2f3SToby Isaac       PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1));
35753e0a2f3SToby Isaac       PetscCall(PetscObjectDereference((PetscObject)h));
35853e0a2f3SToby Isaac     }
35953e0a2f3SToby Isaac   }
36053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
36153e0a2f3SToby Isaac }
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith /*@C
3644dd65854SConnor Ward   PetscLogIsActive - Check if logging is currently in progress.
3654dd65854SConnor Ward 
3664dd65854SConnor Ward   Not Collective
3674dd65854SConnor Ward 
3684dd65854SConnor Ward   Output Parameter:
369811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise
3704dd65854SConnor Ward 
3714dd65854SConnor Ward   Level: beginner
3724dd65854SConnor Ward 
373b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`
3744dd65854SConnor Ward @*/
375d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive)
376d71ae5a4SJacob Faibussowitsch {
3774dd65854SConnor Ward   PetscFunctionBegin;
378b665b14eSToby Isaac   *isActive = PETSC_FALSE;
379b665b14eSToby Isaac   if (petsc_log_state) {
380b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
381b665b14eSToby Isaac       if (PetscLogHandlers[i].handler) {
382b665b14eSToby Isaac         *isActive = PETSC_TRUE;
383b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
384b665b14eSToby Isaac       }
385b665b14eSToby Isaac     }
386b665b14eSToby Isaac   }
387b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
388b665b14eSToby Isaac }
389b665b14eSToby Isaac 
390b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive)
391b665b14eSToby Isaac {
392b665b14eSToby Isaac   PetscFunctionBegin;
393b665b14eSToby Isaac   *isActive = PETSC_FALSE;
394b665b14eSToby Isaac   if (petsc_log_state) {
395b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
396b665b14eSToby Isaac       if (PetscLogHandlers[i].eventBegin) {
397b665b14eSToby Isaac         *isActive = PETSC_TRUE;
398b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
399b665b14eSToby Isaac       }
400b665b14eSToby Isaac     }
401b665b14eSToby Isaac   }
402b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
403b665b14eSToby Isaac }
404b665b14eSToby Isaac 
405b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive)
406b665b14eSToby Isaac {
407b665b14eSToby Isaac   PetscFunctionBegin;
408b665b14eSToby Isaac   *isActive = PETSC_FALSE;
409b665b14eSToby Isaac   if (petsc_log_state) {
410b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
411b665b14eSToby Isaac       if (PetscLogHandlers[i].eventEnd) {
412b665b14eSToby Isaac         *isActive = PETSC_TRUE;
413b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
414b665b14eSToby Isaac       }
415b665b14eSToby Isaac     }
416b665b14eSToby Isaac   }
4173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4184dd65854SConnor Ward }
4194dd65854SConnor Ward 
42053e0a2f3SToby Isaac static PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type)
42153e0a2f3SToby Isaac {
42253e0a2f3SToby Isaac   PetscLogHandler handler;
42353e0a2f3SToby Isaac 
42453e0a2f3SToby Isaac   PetscFunctionBegin;
42553e0a2f3SToby Isaac   PetscCall(PetscLogTryGetHandler(type, &handler));
42653e0a2f3SToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
42753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler));
42853e0a2f3SToby Isaac   PetscCall(PetscLogHandlerSetType(handler, type));
42953e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
43053e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
43153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
43253e0a2f3SToby Isaac }
43353e0a2f3SToby Isaac 
4344dd65854SConnor Ward /*@C
435b665b14eSToby Isaac   PetscLogDefaultBegin - Turns on logging of objects and events using the default log handler. This logs flop
4365c6c1daeSBarry Smith   rates and object creation and should not slow programs down too much.
4375c6c1daeSBarry Smith   This routine may be called more than once.
4385c6c1daeSBarry Smith 
439811af0c4SBarry Smith   Logically Collective over `PETSC_COMM_WORLD`
4405c6c1daeSBarry Smith 
441811af0c4SBarry Smith   Options Database Key:
442a2553e36SBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing information to the
443a2553e36SBarry Smith                   screen (for code configured with --with-log=1 (which is the default))
4445c6c1daeSBarry Smith 
44510450e9eSJacob Faibussowitsch   Example Usage:
4465c6c1daeSBarry Smith .vb
4475c6c1daeSBarry Smith       PetscInitialize(...);
448bb1d7374SBarry Smith       PetscLogDefaultBegin();
4495c6c1daeSBarry Smith        ... code ...
4505c6c1daeSBarry Smith       PetscLogView(viewer); or PetscLogDump();
4515c6c1daeSBarry Smith       PetscFinalize();
4525c6c1daeSBarry Smith .ve
4535c6c1daeSBarry Smith 
454d1f92df0SBarry Smith   Level: advanced
455d1f92df0SBarry Smith 
456811af0c4SBarry Smith   Note:
457811af0c4SBarry Smith   `PetscLogView()` or `PetscLogDump()` actually cause the printing of
4585c6c1daeSBarry Smith   the logging information.
4595c6c1daeSBarry Smith 
460b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`
4615c6c1daeSBarry Smith @*/
462d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDefaultBegin(void)
463d71ae5a4SJacob Faibussowitsch {
4645c6c1daeSBarry Smith   PetscFunctionBegin;
465294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERDEFAULT));
4663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4675c6c1daeSBarry Smith }
4685c6c1daeSBarry Smith 
4695c6c1daeSBarry Smith /*@C
470b665b14eSToby Isaac   PetscLogTraceBegin - Begins trace logging.  Every time a PETSc event
4715c6c1daeSBarry Smith   begins or ends, the event name is printed.
4725c6c1daeSBarry Smith 
473811af0c4SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
4745c6c1daeSBarry Smith 
4755c6c1daeSBarry Smith   Input Parameter:
4765c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout)
4775c6c1daeSBarry Smith 
4785c6c1daeSBarry Smith   Options Database Key:
479b665b14eSToby Isaac . -log_trace [filename] - Begins `PetscLogTraceBegin()`
4805c6c1daeSBarry Smith 
481d1f92df0SBarry Smith   Level: intermediate
482d1f92df0SBarry Smith 
4835c6c1daeSBarry Smith   Notes:
484811af0c4SBarry Smith   `PetscLogTraceBegin()` prints the processor number, the execution time (sec),
4855c6c1daeSBarry Smith   then "Event begin:" or "Event end:" followed by the event name.
4865c6c1daeSBarry Smith 
487811af0c4SBarry Smith   `PetscLogTraceBegin()` allows tracing of all PETSc calls, which is useful
4885c6c1daeSBarry Smith   to determine where a program is hanging without running in the
4895c6c1daeSBarry Smith   debugger.  Can be used in conjunction with the -info option.
4905c6c1daeSBarry Smith 
491b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogDefaultBegin()`
4925c6c1daeSBarry Smith @*/
493d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogTraceBegin(FILE *file)
494d71ae5a4SJacob Faibussowitsch {
495b665b14eSToby Isaac   PetscLogHandler handler;
4965c6c1daeSBarry Smith   PetscFunctionBegin;
497294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler));
498b665b14eSToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
499b665b14eSToby Isaac   PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler));
500b665b14eSToby Isaac   PetscCall(PetscLogHandlerStart(handler));
501b665b14eSToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
502b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
503b665b14eSToby Isaac }
504a297a907SKarl Rupp 
505b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *);
506b665b14eSToby Isaac 
507b665b14eSToby Isaac /*@C
508b665b14eSToby Isaac   PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop
509b665b14eSToby Isaac   rates and object creation and should not slow programs down too much.
510b665b14eSToby Isaac 
511b665b14eSToby Isaac   Logically Collective over `PETSC_COMM_WORLD`
512b665b14eSToby Isaac 
513b665b14eSToby Isaac   Options Database Keys:
514b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
515b665b14eSToby Isaac 
516b665b14eSToby Isaac   Example Usage:
517b665b14eSToby Isaac .vb
518b665b14eSToby Isaac       PetscInitialize(...);
519b665b14eSToby Isaac       PetscLogNestedBegin();
520b665b14eSToby Isaac        ... code ...
521b665b14eSToby Isaac       PetscLogView(viewer);
522b665b14eSToby Isaac       PetscFinalize();
523b665b14eSToby Isaac .ve
524b665b14eSToby Isaac 
525b665b14eSToby Isaac   Level: advanced
526b665b14eSToby Isaac 
527b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`
528b665b14eSToby Isaac @*/
529b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void)
530b665b14eSToby Isaac {
531b665b14eSToby Isaac   PetscFunctionBegin;
532294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED));
5333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5345c6c1daeSBarry Smith }
5355c6c1daeSBarry Smith 
53653e0a2f3SToby Isaac /*@C
53753e0a2f3SToby Isaac   PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks
53853e0a2f3SToby Isaac   matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`,
53953e0a2f3SToby Isaac   `PetscLogPHC`, `PetscLogPHD`.
54053e0a2f3SToby Isaac 
54153e0a2f3SToby Isaac   Logically Collective over `PETSC_COMM_WORLD`
54253e0a2f3SToby Isaac 
54353e0a2f3SToby Isaac   Input Parameters:
54453e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`)
54553e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`)
54653e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54753e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54853e0a2f3SToby Isaac 
54953e0a2f3SToby Isaac   Calling sequence of `PetscLogPLB`:
55053e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55153e0a2f3SToby Isaac . _i - deprecated, unused
55253e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
55353e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
55453e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
55553e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
55653e0a2f3SToby Isaac 
55753e0a2f3SToby Isaac   Calling sequence of `PetscLogPLE`:
55853e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55953e0a2f3SToby Isaac . _i - deprecated, unused
56053e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
56153e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
56253e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
56353e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
56453e0a2f3SToby Isaac 
56553e0a2f3SToby Isaac   Calling sequence of `PetscLogPHC`:
56653e0a2f3SToby Isaac . o - a `PetscObject` that has just been created
56753e0a2f3SToby Isaac 
56853e0a2f3SToby Isaac   Calling sequence of `PetscLogPHD`:
56953e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed
57053e0a2f3SToby Isaac 
57153e0a2f3SToby Isaac   Level: advanced
57253e0a2f3SToby Isaac 
57353e0a2f3SToby Isaac   Notes:
57453e0a2f3SToby Isaac   This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code.
57553e0a2f3SToby Isaac 
57653e0a2f3SToby Isaac   This should help migrate external log handlers to use `PetscLogHandler`, but
57753e0a2f3SToby Isaac   callbacks that depend on the deprecated `PetscLogStage` datatype will have to be
57853e0a2f3SToby Isaac   updated.
57953e0a2f3SToby Isaac 
58053e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState`
58153e0a2f3SToby Isaac @*/
58253e0a2f3SToby 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))
58353e0a2f3SToby Isaac {
58453e0a2f3SToby Isaac   PetscLogHandler handler;
58553e0a2f3SToby Isaac 
58653e0a2f3SToby Isaac   PetscFunctionBegin;
58753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler));
58853e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
58953e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
59053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
59153e0a2f3SToby Isaac }
59253e0a2f3SToby Isaac 
5932611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
5942611ad71SToby Isaac     #include <mpe.h>
5952611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE;
5962611ad71SToby Isaac   #endif
5972611ad71SToby Isaac 
5982611ad71SToby Isaac /*@C
5992611ad71SToby Isaac   PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the
6002611ad71SToby Isaac   program down.
6012611ad71SToby Isaac 
6022611ad71SToby Isaac   Collective over `PETSC_COMM_WORLD`
6032611ad71SToby Isaac 
6042611ad71SToby Isaac   Options Database Key:
6052611ad71SToby Isaac . -log_mpe - Prints extensive log information
6062611ad71SToby Isaac 
6072611ad71SToby Isaac   Level: advanced
6082611ad71SToby Isaac 
6092611ad71SToby Isaac   Note:
6102611ad71SToby Isaac   A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is
6112611ad71SToby Isaac   intended for production runs since it logs only flop rates and object creation (and should
6122611ad71SToby Isaac   not significantly slow the programs).
6132611ad71SToby Isaac 
614b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`,
6152611ad71SToby Isaac           `PetscLogEventDeactivate()`
6162611ad71SToby Isaac @*/
6172611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void)
6182611ad71SToby Isaac {
6192611ad71SToby Isaac   PetscFunctionBegin;
6202611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
6212611ad71SToby Isaac   /* Do MPE initialization */
6222611ad71SToby Isaac   if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */
6232611ad71SToby Isaac     PetscCall(PetscInfo(0, "Initializing MPE.\n"));
6242611ad71SToby Isaac     PetscCall(MPE_Init_log());
6252611ad71SToby Isaac 
6262611ad71SToby Isaac     PetscBeganMPE = PETSC_TRUE;
6272611ad71SToby Isaac   } else {
6282611ad71SToby Isaac     PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n"));
6292611ad71SToby Isaac   }
630294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE));
6312611ad71SToby Isaac   #else
6322611ad71SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
6332611ad71SToby Isaac   #endif
6342611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6352611ad71SToby Isaac }
6362611ad71SToby Isaac 
63753e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
63853e0a2f3SToby Isaac     #include <../src/sys/perfstubs/timer.h>
63953e0a2f3SToby Isaac   #endif
64053e0a2f3SToby Isaac 
64153e0a2f3SToby Isaac /*@C
64253e0a2f3SToby Isaac   PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface.
64353e0a2f3SToby Isaac 
64453e0a2f3SToby Isaac   Collective over `PETSC_COMM_WORLD`
64553e0a2f3SToby Isaac 
64653e0a2f3SToby Isaac   Options Database Key:
64753e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface
64853e0a2f3SToby Isaac 
64953e0a2f3SToby Isaac   Level: advanced
65053e0a2f3SToby Isaac 
65153e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()`
65253e0a2f3SToby Isaac @*/
65353e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void)
65453e0a2f3SToby Isaac {
65553e0a2f3SToby Isaac   PetscFunctionBegin;
65653e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
657294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS));
65853e0a2f3SToby Isaac   #else
65953e0a2f3SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs");
66053e0a2f3SToby Isaac   #endif
66153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
66253e0a2f3SToby Isaac }
66353e0a2f3SToby Isaac 
6645c6c1daeSBarry Smith /*@
665b665b14eSToby Isaac   PetscLogActions - Determines whether actions are logged for the default log handler.
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith   Not Collective
6685c6c1daeSBarry Smith 
6695c6c1daeSBarry Smith   Input Parameter:
670811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged
671811af0c4SBarry Smith 
672811af0c4SBarry Smith   Options Database Key:
673b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing
674b665b14eSToby Isaac - -log_include_actions - Turn on action logging
6755c6c1daeSBarry Smith 
6765c6c1daeSBarry Smith   Level: intermediate
6775c6c1daeSBarry Smith 
678811af0c4SBarry Smith   Note:
679811af0c4SBarry Smith   Logging of actions continues to consume more memory as the program
6805c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
681aec76313SJacob Faibussowitsch 
682b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
6835c6c1daeSBarry Smith @*/
684d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag)
685d71ae5a4SJacob Faibussowitsch {
6865c6c1daeSBarry Smith   PetscFunctionBegin;
687dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
688dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
689dff009beSToby Isaac 
690dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag));
691dff009beSToby Isaac   }
6923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6935c6c1daeSBarry Smith }
6945c6c1daeSBarry Smith 
6955c6c1daeSBarry Smith /*@
6965c6c1daeSBarry Smith   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith   Not Collective
6995c6c1daeSBarry Smith 
7005c6c1daeSBarry Smith   Input Parameter:
701811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged
702811af0c4SBarry Smith 
703811af0c4SBarry Smith   Options Database Key:
704b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing
705b665b14eSToby Isaac - -log_include_objects - Turns on object logging
7065c6c1daeSBarry Smith 
7075c6c1daeSBarry Smith   Level: intermediate
7085c6c1daeSBarry Smith 
709811af0c4SBarry Smith   Note:
710811af0c4SBarry Smith   Logging of objects continues to consume more memory as the program
7115c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
7125c6c1daeSBarry Smith 
713b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
7145c6c1daeSBarry Smith @*/
715d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag)
716d71ae5a4SJacob Faibussowitsch {
7175c6c1daeSBarry Smith   PetscFunctionBegin;
718dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
719dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
720dff009beSToby Isaac 
721dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag));
722dff009beSToby Isaac   }
7233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7245c6c1daeSBarry Smith }
7255c6c1daeSBarry Smith 
7265c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/
7275c6c1daeSBarry Smith /*@C
72874c0405dSRichard Tran Mills   PetscLogStageRegister - Attaches a character string name to a logging stage.
7295c6c1daeSBarry Smith 
7305c6c1daeSBarry Smith   Not Collective
7315c6c1daeSBarry Smith 
7325c6c1daeSBarry Smith   Input Parameter:
7335c6c1daeSBarry Smith . sname - The name to associate with that stage
7345c6c1daeSBarry Smith 
7355c6c1daeSBarry Smith   Output Parameter:
736b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`).
7375c6c1daeSBarry Smith 
7385c6c1daeSBarry Smith   Level: intermediate
7395c6c1daeSBarry Smith 
740d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`
7415c6c1daeSBarry Smith @*/
742d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage)
743d71ae5a4SJacob Faibussowitsch {
744b665b14eSToby Isaac   PetscLogState state;
7455c6c1daeSBarry Smith 
7465c6c1daeSBarry Smith   PetscFunctionBegin;
747b665b14eSToby Isaac   *stage = -1;
748b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
749b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage));
7503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7515c6c1daeSBarry Smith }
7525c6c1daeSBarry Smith 
7535c6c1daeSBarry Smith /*@C
754811af0c4SBarry Smith   PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage
7555c6c1daeSBarry Smith 
7565c6c1daeSBarry Smith   Not Collective
7575c6c1daeSBarry Smith 
7585c6c1daeSBarry Smith   Input Parameter:
7595c6c1daeSBarry Smith . stage - The stage on which to log
7605c6c1daeSBarry Smith 
76110450e9eSJacob Faibussowitsch   Example Usage:
762811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
7635c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
7645c6c1daeSBarry Smith   PetscFinalize().
7655c6c1daeSBarry Smith .vb
7665c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
7675c6c1daeSBarry Smith       [stage 0 of code]
7685c6c1daeSBarry Smith       PetscLogStagePush(1);
7695c6c1daeSBarry Smith       [stage 1 of code]
7705c6c1daeSBarry Smith       PetscLogStagePop();
7715c6c1daeSBarry Smith       PetscBarrier(...);
7725c6c1daeSBarry Smith       [more stage 0 of code]
7735c6c1daeSBarry Smith       PetscFinalize();
7745c6c1daeSBarry Smith .ve
7755c6c1daeSBarry Smith 
776d1f92df0SBarry Smith   Level: intermediate
777d1f92df0SBarry Smith 
778811af0c4SBarry Smith   Note:
779811af0c4SBarry Smith   Use `PetscLogStageRegister()` to register a stage.
7805c6c1daeSBarry Smith 
781d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()`
7825c6c1daeSBarry Smith @*/
783d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage)
784d71ae5a4SJacob Faibussowitsch {
785b665b14eSToby Isaac   PetscLogState state;
7865c6c1daeSBarry Smith 
7875c6c1daeSBarry Smith   PetscFunctionBegin;
788b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
789b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
790b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
791b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
792b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePush(h, stage));
793b665b14eSToby Isaac   }
794b665b14eSToby Isaac   PetscCall(PetscLogStateStagePush(state, stage));
7953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7965c6c1daeSBarry Smith }
7975c6c1daeSBarry Smith 
7985c6c1daeSBarry Smith /*@C
799811af0c4SBarry Smith   PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()`
8005c6c1daeSBarry Smith 
8015c6c1daeSBarry Smith   Not Collective
8025c6c1daeSBarry Smith 
80310450e9eSJacob Faibussowitsch   Example Usage:
804811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
8055c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
8065c6c1daeSBarry Smith   PetscFinalize().
8075c6c1daeSBarry Smith .vb
8085c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
8095c6c1daeSBarry Smith       [stage 0 of code]
8105c6c1daeSBarry Smith       PetscLogStagePush(1);
8115c6c1daeSBarry Smith       [stage 1 of code]
8125c6c1daeSBarry Smith       PetscLogStagePop();
8135c6c1daeSBarry Smith       PetscBarrier(...);
8145c6c1daeSBarry Smith       [more stage 0 of code]
8155c6c1daeSBarry Smith       PetscFinalize();
8165c6c1daeSBarry Smith .ve
8175c6c1daeSBarry Smith 
8185c6c1daeSBarry Smith   Level: intermediate
8195c6c1daeSBarry Smith 
820d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()`
8215c6c1daeSBarry Smith @*/
822d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void)
823d71ae5a4SJacob Faibussowitsch {
824b665b14eSToby Isaac   PetscLogState state;
825b665b14eSToby Isaac   PetscLogStage current_stage;
8265c6c1daeSBarry Smith 
8275c6c1daeSBarry Smith   PetscFunctionBegin;
828b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
829b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
830b665b14eSToby Isaac   current_stage = state->current_stage;
831b665b14eSToby Isaac   PetscCall(PetscLogStateStagePop(state));
832b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
833b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
834b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage));
835b665b14eSToby Isaac   }
8363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8375c6c1daeSBarry Smith }
8385c6c1daeSBarry Smith 
8395c6c1daeSBarry Smith /*@
840811af0c4SBarry Smith   PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8415c6c1daeSBarry Smith 
8425c6c1daeSBarry Smith   Not Collective
8435c6c1daeSBarry Smith 
8445c6c1daeSBarry Smith   Input Parameters:
8455c6c1daeSBarry Smith + stage    - The stage
846811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8475c6c1daeSBarry Smith 
8485c6c1daeSBarry Smith   Level: intermediate
8495c6c1daeSBarry Smith 
850811af0c4SBarry Smith   Note:
851811af0c4SBarry Smith   If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist
852811af0c4SBarry Smith 
853d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8545c6c1daeSBarry Smith @*/
855d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive)
856d71ae5a4SJacob Faibussowitsch {
857b665b14eSToby Isaac   PetscLogState state;
8585c6c1daeSBarry Smith 
8595c6c1daeSBarry Smith   PetscFunctionBegin;
860b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
861b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive));
8623ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8635c6c1daeSBarry Smith }
8645c6c1daeSBarry Smith 
8655c6c1daeSBarry Smith /*@
866811af0c4SBarry Smith   PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8675c6c1daeSBarry Smith 
8685c6c1daeSBarry Smith   Not Collective
8695c6c1daeSBarry Smith 
8705c6c1daeSBarry Smith   Input Parameter:
8715c6c1daeSBarry Smith . stage - The stage
8725c6c1daeSBarry Smith 
8735c6c1daeSBarry Smith   Output Parameter:
874811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8755c6c1daeSBarry Smith 
8765c6c1daeSBarry Smith   Level: intermediate
8775c6c1daeSBarry Smith 
878d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8795c6c1daeSBarry Smith @*/
880d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive)
881d71ae5a4SJacob Faibussowitsch {
882b665b14eSToby Isaac   PetscLogState state;
8835c6c1daeSBarry Smith 
8845c6c1daeSBarry Smith   PetscFunctionBegin;
885b665b14eSToby Isaac   *isActive = PETSC_FALSE;
886b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
887b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive));
8883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8895c6c1daeSBarry Smith }
8905c6c1daeSBarry Smith 
8915c6c1daeSBarry Smith /*@
892811af0c4SBarry Smith   PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()`
8935c6c1daeSBarry Smith 
8945c6c1daeSBarry Smith   Not Collective
8955c6c1daeSBarry Smith 
8965c6c1daeSBarry Smith   Input Parameters:
8975c6c1daeSBarry Smith + stage     - The stage
898811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8995c6c1daeSBarry Smith 
9005c6c1daeSBarry Smith   Level: intermediate
9015c6c1daeSBarry Smith 
902aec76313SJacob Faibussowitsch   Developer Notes:
903b665b14eSToby Isaac   Visibility only affects the default log handler in `PetscLogView()`: stages that are
904b665b14eSToby Isaac   set to invisible are suppressed from output.
905811af0c4SBarry Smith 
906b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9075c6c1daeSBarry Smith @*/
908d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible)
9095c6c1daeSBarry Smith 
910dff009beSToby Isaac {
9115c6c1daeSBarry Smith   PetscFunctionBegin;
912dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
913dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
914dff009beSToby Isaac 
915dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible));
916dff009beSToby Isaac   }
9173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9185c6c1daeSBarry Smith }
9195c6c1daeSBarry Smith 
9205c6c1daeSBarry Smith /*@
921811af0c4SBarry Smith   PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()`
9225c6c1daeSBarry Smith 
9235c6c1daeSBarry Smith   Not Collective
9245c6c1daeSBarry Smith 
9255c6c1daeSBarry Smith   Input Parameter:
9265c6c1daeSBarry Smith . stage - The stage
9275c6c1daeSBarry Smith 
9285c6c1daeSBarry Smith   Output Parameter:
929811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9305c6c1daeSBarry Smith 
9315c6c1daeSBarry Smith   Level: intermediate
9325c6c1daeSBarry Smith 
933b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9345c6c1daeSBarry Smith @*/
935d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible)
936d71ae5a4SJacob Faibussowitsch {
937b665b14eSToby Isaac   PetscLogHandler handler;
9385c6c1daeSBarry Smith 
9395c6c1daeSBarry Smith   PetscFunctionBegin;
940b665b14eSToby Isaac   *isVisible = PETSC_FALSE;
941294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
942dff009beSToby Isaac   if (handler) { PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible)); }
9433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9445c6c1daeSBarry Smith }
9455c6c1daeSBarry Smith 
9465c6c1daeSBarry Smith /*@C
9475c6c1daeSBarry Smith   PetscLogStageGetId - Returns the stage id when given the stage name.
9485c6c1daeSBarry Smith 
9495c6c1daeSBarry Smith   Not Collective
9505c6c1daeSBarry Smith 
9515c6c1daeSBarry Smith   Input Parameter:
9525c6c1daeSBarry Smith . name - The stage name
9535c6c1daeSBarry Smith 
9545c6c1daeSBarry Smith   Output Parameter:
9555a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists
9565c6c1daeSBarry Smith 
9575c6c1daeSBarry Smith   Level: intermediate
9585c6c1daeSBarry Smith 
959d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
9605c6c1daeSBarry Smith @*/
961d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage)
962d71ae5a4SJacob Faibussowitsch {
963b665b14eSToby Isaac   PetscLogState state;
9645c6c1daeSBarry Smith 
9655c6c1daeSBarry Smith   PetscFunctionBegin;
966b665b14eSToby Isaac   *stage = -1;
967b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
968b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage));
9693ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9705c6c1daeSBarry Smith }
9715c6c1daeSBarry Smith 
97253e0a2f3SToby Isaac /*@C
97353e0a2f3SToby Isaac   PetscLogStageGetName - Returns the stage name when given the stage id.
97453e0a2f3SToby Isaac 
97553e0a2f3SToby Isaac   Not Collective
97653e0a2f3SToby Isaac 
97753e0a2f3SToby Isaac   Input Parameter:
97853e0a2f3SToby Isaac . stage - The stage
97953e0a2f3SToby Isaac 
98053e0a2f3SToby Isaac   Output Parameter:
98153e0a2f3SToby Isaac . name - The stage name
98253e0a2f3SToby Isaac 
98353e0a2f3SToby Isaac   Level: intermediate
98453e0a2f3SToby Isaac 
98553e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
98653e0a2f3SToby Isaac @*/
98753e0a2f3SToby Isaac PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char **name)
98853e0a2f3SToby Isaac {
98953e0a2f3SToby Isaac   PetscLogStageInfo stage_info;
99053e0a2f3SToby Isaac   PetscLogState     state;
99153e0a2f3SToby Isaac 
99253e0a2f3SToby Isaac   PetscFunctionBegin;
993b665b14eSToby Isaac   *name = NULL;
99453e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
995b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
99653e0a2f3SToby Isaac   PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info));
99753e0a2f3SToby Isaac   *name = stage_info.name;
99853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
99953e0a2f3SToby Isaac }
100053e0a2f3SToby Isaac 
10015c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/
10027a101e5eSJacob Faibussowitsch 
10035c6c1daeSBarry Smith /*@C
1004811af0c4SBarry Smith   PetscLogEventRegister - Registers an event name for logging operations
10055c6c1daeSBarry Smith 
10065c6c1daeSBarry Smith   Not Collective
10075c6c1daeSBarry Smith 
1008d8d19677SJose E. Roman   Input Parameters:
10095c6c1daeSBarry Smith + name    - The name associated with the event
10105c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with
1011811af0c4SBarry Smith            `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones
10125c6c1daeSBarry Smith            are only available in C code
10135c6c1daeSBarry Smith 
10145c6c1daeSBarry Smith   Output Parameter:
1015811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`.
10165c6c1daeSBarry Smith 
101710450e9eSJacob Faibussowitsch   Example Usage:
10185c6c1daeSBarry Smith .vb
10195c6c1daeSBarry Smith       PetscLogEvent USER_EVENT;
10205c6c1daeSBarry Smith       PetscClassId classid;
10215c6c1daeSBarry Smith       PetscLogDouble user_event_flops;
10225c6c1daeSBarry Smith       PetscClassIdRegister("class name",&classid);
10235c6c1daeSBarry Smith       PetscLogEventRegister("User event name",classid,&USER_EVENT);
10245c6c1daeSBarry Smith       PetscLogEventBegin(USER_EVENT,0,0,0,0);
10255c6c1daeSBarry Smith          [code segment to monitor]
10265c6c1daeSBarry Smith          PetscLogFlops(user_event_flops);
10275c6c1daeSBarry Smith       PetscLogEventEnd(USER_EVENT,0,0,0,0);
10285c6c1daeSBarry Smith .ve
10295c6c1daeSBarry Smith 
1030d1f92df0SBarry Smith   Level: intermediate
1031d1f92df0SBarry Smith 
10325c6c1daeSBarry Smith   Notes:
10335c6c1daeSBarry Smith   PETSc automatically logs library events if the code has been
1034a2553e36SBarry Smith   configured with --with-log (which is the default) and
1035811af0c4SBarry Smith   -log_view or -log_all is specified.  `PetscLogEventRegister()` is
10365c6c1daeSBarry Smith   intended for logging user events to supplement this PETSc
10375c6c1daeSBarry Smith   information.
10385c6c1daeSBarry Smith 
1039495fc317SBarry Smith   PETSc can gather data for use with the utilities Jumpshot
10405c6c1daeSBarry Smith   (part of the MPICH distribution).  If PETSc has been compiled
10415c6c1daeSBarry Smith   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
10425c6c1daeSBarry Smith   MPICH), the user can employ another command line option, -log_mpe,
10435c6c1daeSBarry Smith   to create a logfile, "mpe.log", which can be visualized
1044495fc317SBarry Smith   Jumpshot.
10455c6c1daeSBarry Smith 
10465c6c1daeSBarry Smith   The classid is associated with each event so that classes of events
10475c6c1daeSBarry Smith   can be disabled simultaneously, such as all matrix events. The user
1048811af0c4SBarry Smith   can either use an existing classid, such as `MAT_CLASSID`, or create
10495c6c1daeSBarry Smith   their own as shown in the example.
10505c6c1daeSBarry Smith 
1051c5deb1d5SJed Brown   If an existing event with the same name exists, its event handle is
1052c5deb1d5SJed Brown   returned instead of creating a new event.
1053c5deb1d5SJed Brown 
1054d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`,
1055db781477SPatrick Sanan           `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()`
10565c6c1daeSBarry Smith @*/
1057d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event)
1058d71ae5a4SJacob Faibussowitsch {
1059b665b14eSToby Isaac   PetscLogState state;
10605c6c1daeSBarry Smith 
10615c6c1daeSBarry Smith   PetscFunctionBegin;
1062b665b14eSToby Isaac   *event = -1;
1063b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1064b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event));
10653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10665c6c1daeSBarry Smith }
10675c6c1daeSBarry Smith 
10685c6c1daeSBarry Smith /*@
1069217044c2SLisandro Dalcin   PetscLogEventSetCollective - Indicates that a particular event is collective.
1070217044c2SLisandro Dalcin 
1071217044c2SLisandro Dalcin   Not Collective
1072217044c2SLisandro Dalcin 
1073d8d19677SJose E. Roman   Input Parameters:
1074217044c2SLisandro Dalcin + event      - The event id
1075d5b43468SJose E. Roman - collective - Boolean flag indicating whether a particular event is collective
1076217044c2SLisandro Dalcin 
1077d1f92df0SBarry Smith   Level: developer
1078d1f92df0SBarry Smith 
1079811af0c4SBarry Smith   Notes:
1080811af0c4SBarry Smith   New events returned from `PetscLogEventRegister()` are collective by default.
1081811af0c4SBarry Smith 
1082811af0c4SBarry Smith   Collective events are handled specially if the -log_sync is used. In that case the logging saves information about
1083811af0c4SBarry Smith   two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication
1084811af0c4SBarry Smith   to be performed. This option is useful to debug imbalance within the computations or communications
1085217044c2SLisandro Dalcin 
1086d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()`
1087217044c2SLisandro Dalcin @*/
1088d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective)
1089d71ae5a4SJacob Faibussowitsch {
1090b665b14eSToby Isaac   PetscLogState state;
1091217044c2SLisandro Dalcin 
1092217044c2SLisandro Dalcin   PetscFunctionBegin;
1093b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1094b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective));
1095b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1096b665b14eSToby Isaac }
1097b665b14eSToby Isaac 
1098b665b14eSToby Isaac /*
1099b665b14eSToby Isaac   PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage.
1100b665b14eSToby Isaac 
1101b665b14eSToby Isaac   Not Collective
1102b665b14eSToby Isaac 
1103b665b14eSToby Isaac   Input Parameters:
1104b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1105b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers.
1106b665b14eSToby Isaac 
1107b665b14eSToby Isaac   Level: developer
1108b665b14eSToby Isaac 
1109b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()`
1110b665b14eSToby Isaac */
1111b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive)
1112b665b14eSToby Isaac {
1113b665b14eSToby Isaac   PetscLogState state;
1114b665b14eSToby Isaac 
1115b665b14eSToby Isaac   PetscFunctionBegin;
1116b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1117b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive));
11183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1119217044c2SLisandro Dalcin }
1120217044c2SLisandro Dalcin 
1121217044c2SLisandro Dalcin /*@
1122fa2bb9feSLisandro Dalcin   PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage.
1123fa2bb9feSLisandro Dalcin 
1124fa2bb9feSLisandro Dalcin   Not Collective
1125fa2bb9feSLisandro Dalcin 
1126fa2bb9feSLisandro Dalcin   Input Parameter:
1127811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1128fa2bb9feSLisandro Dalcin 
1129fa2bb9feSLisandro Dalcin   Level: developer
1130fa2bb9feSLisandro Dalcin 
1131d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
1132fa2bb9feSLisandro Dalcin @*/
1133d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid)
1134d71ae5a4SJacob Faibussowitsch {
1135fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1136b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE));
11373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1138fa2bb9feSLisandro Dalcin }
1139fa2bb9feSLisandro Dalcin 
1140fa2bb9feSLisandro Dalcin /*@
1141fa2bb9feSLisandro Dalcin   PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage.
1142fa2bb9feSLisandro Dalcin 
1143fa2bb9feSLisandro Dalcin   Not Collective
1144fa2bb9feSLisandro Dalcin 
1145fa2bb9feSLisandro Dalcin   Input Parameter:
1146811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1147fa2bb9feSLisandro Dalcin 
1148fa2bb9feSLisandro Dalcin   Level: developer
1149fa2bb9feSLisandro Dalcin 
1150811af0c4SBarry Smith   Note:
1151811af0c4SBarry Smith   If a class is excluded then events associated with that class are not logged.
1152811af0c4SBarry Smith 
1153d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()`
1154fa2bb9feSLisandro Dalcin @*/
1155d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid)
1156d71ae5a4SJacob Faibussowitsch {
1157b665b14eSToby Isaac   PetscFunctionBegin;
1158b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE));
1159b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1160b665b14eSToby Isaac }
1161b665b14eSToby Isaac 
1162b665b14eSToby Isaac /*
1163b665b14eSToby Isaac   PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage
1164b665b14eSToby Isaac 
1165b665b14eSToby Isaac   Not Collective
1166b665b14eSToby Isaac 
1167b665b14eSToby Isaac   Input Parameters:
1168b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1169b665b14eSToby Isaac . event - A `PetscLogEvent`
1170b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage
1171b665b14eSToby Isaac 
1172b665b14eSToby Isaac   Usage:
1173b665b14eSToby Isaac .vb
1174b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE);
1175b665b14eSToby Isaac         [code where you do not want to log VecSetValues()]
1176b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE);
1177b665b14eSToby Isaac         [code where you do want to log VecSetValues()]
1178b665b14eSToby Isaac .ve
1179b665b14eSToby Isaac 
1180b665b14eSToby Isaac   Level: advanced
1181b665b14eSToby Isaac 
1182b665b14eSToby Isaac   Note:
1183b665b14eSToby Isaac   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1184b665b14eSToby Isaac   or an event number obtained with `PetscLogEventRegister()`.
1185b665b14eSToby Isaac 
1186b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
1187b665b14eSToby Isaac */
1188b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
1189b665b14eSToby Isaac {
1190b665b14eSToby Isaac   PetscLogState state;
1191fa2bb9feSLisandro Dalcin 
1192fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1193b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1194b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive));
11953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1196fa2bb9feSLisandro Dalcin }
1197fa2bb9feSLisandro Dalcin 
1198fa2bb9feSLisandro Dalcin /*@
11995c6c1daeSBarry Smith   PetscLogEventActivate - Indicates that a particular event should be logged.
12005c6c1daeSBarry Smith 
12015c6c1daeSBarry Smith   Not Collective
12025c6c1daeSBarry Smith 
12035c6c1daeSBarry Smith   Input Parameter:
12045c6c1daeSBarry Smith . event - The event id
12055c6c1daeSBarry Smith 
120610450e9eSJacob Faibussowitsch   Example Usage:
12075c6c1daeSBarry Smith .vb
12085c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12095c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12105c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12115c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12125c6c1daeSBarry Smith .ve
12135c6c1daeSBarry Smith 
1214d1f92df0SBarry Smith   Level: advanced
1215d1f92df0SBarry Smith 
12165c6c1daeSBarry Smith   Note:
12175c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1218811af0c4SBarry Smith   or an event number obtained with `PetscLogEventRegister()`.
12195c6c1daeSBarry Smith 
1220b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12215c6c1daeSBarry Smith @*/
1222d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event)
1223d71ae5a4SJacob Faibussowitsch {
12245c6c1daeSBarry Smith   PetscFunctionBegin;
1225b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE));
12263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12275c6c1daeSBarry Smith }
12285c6c1daeSBarry Smith 
12295c6c1daeSBarry Smith /*@
12305c6c1daeSBarry Smith   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
12315c6c1daeSBarry Smith 
12325c6c1daeSBarry Smith   Not Collective
12335c6c1daeSBarry Smith 
12345c6c1daeSBarry Smith   Input Parameter:
12355c6c1daeSBarry Smith . event - The event id
12365c6c1daeSBarry Smith 
123710450e9eSJacob Faibussowitsch   Example Usage:
12385c6c1daeSBarry Smith .vb
12395c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12405c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12415c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12425c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12435c6c1daeSBarry Smith .ve
12445c6c1daeSBarry Smith 
1245d1f92df0SBarry Smith   Level: advanced
1246d1f92df0SBarry Smith 
12475c6c1daeSBarry Smith   Note:
12485c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in
1249811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
12505c6c1daeSBarry Smith 
1251d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12525c6c1daeSBarry Smith @*/
1253d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event)
1254d71ae5a4SJacob Faibussowitsch {
12555c6c1daeSBarry Smith   PetscFunctionBegin;
1256b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE));
12573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12585c6c1daeSBarry Smith }
12595c6c1daeSBarry Smith 
12605c6c1daeSBarry Smith /*@
1261811af0c4SBarry Smith   PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called
1262c00cb57fSBarry Smith 
1263c00cb57fSBarry Smith   Not Collective
1264c00cb57fSBarry Smith 
1265c00cb57fSBarry Smith   Input Parameter:
1266c00cb57fSBarry Smith . event - The event id
1267c00cb57fSBarry Smith 
126810450e9eSJacob Faibussowitsch   Example Usage:
1269c00cb57fSBarry Smith .vb
1270c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1271c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1272c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1273c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1274c00cb57fSBarry Smith .ve
1275c00cb57fSBarry Smith 
1276d1f92df0SBarry Smith   Level: advanced
1277d1f92df0SBarry Smith 
1278c00cb57fSBarry Smith   Note:
1279c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1280811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1281c00cb57fSBarry Smith 
1282b665b14eSToby Isaac   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 surpressing events is not helpful in their output formats.
1283b665b14eSToby Isaac 
1284b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEVentDeactivate()`, `PetscLogEventDeactivatePop()`
1285c00cb57fSBarry Smith @*/
1286d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event)
1287d71ae5a4SJacob Faibussowitsch {
1288c00cb57fSBarry Smith   PetscFunctionBegin;
1289dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1290dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1291dff009beSToby Isaac 
1292dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event));
1293dff009beSToby Isaac   }
12943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1295c00cb57fSBarry Smith }
1296c00cb57fSBarry Smith 
1297c00cb57fSBarry Smith /*@
1298811af0c4SBarry Smith   PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()`
1299c00cb57fSBarry Smith 
1300c00cb57fSBarry Smith   Not Collective
1301c00cb57fSBarry Smith 
1302c00cb57fSBarry Smith   Input Parameter:
1303c00cb57fSBarry Smith . event - The event id
1304c00cb57fSBarry Smith 
130510450e9eSJacob Faibussowitsch   Example Usage:
1306c00cb57fSBarry Smith .vb
1307c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1308c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1309c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1310c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1311c00cb57fSBarry Smith .ve
1312c00cb57fSBarry Smith 
1313d1f92df0SBarry Smith   Level: advanced
1314d1f92df0SBarry Smith 
1315c00cb57fSBarry Smith   Note:
1316c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1317811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1318c00cb57fSBarry Smith 
1319d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`
1320c00cb57fSBarry Smith @*/
1321d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event)
1322d71ae5a4SJacob Faibussowitsch {
1323c00cb57fSBarry Smith   PetscFunctionBegin;
1324dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1325dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1326dff009beSToby Isaac 
1327dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event));
1328dff009beSToby Isaac   }
13293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1330c00cb57fSBarry Smith }
1331c00cb57fSBarry Smith 
1332c00cb57fSBarry Smith /*@
1333811af0c4SBarry Smith   PetscLogEventSetActiveAll - Turns on logging of all events
13345c6c1daeSBarry Smith 
13355c6c1daeSBarry Smith   Not Collective
13365c6c1daeSBarry Smith 
13375c6c1daeSBarry Smith   Input Parameters:
13385c6c1daeSBarry Smith + event    - The event id
13395c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged
13405c6c1daeSBarry Smith 
13415c6c1daeSBarry Smith   Level: advanced
13425c6c1daeSBarry Smith 
1343b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13445c6c1daeSBarry Smith @*/
1345d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive)
1346d71ae5a4SJacob Faibussowitsch {
1347b665b14eSToby Isaac   PetscLogState state;
13485c6c1daeSBarry Smith 
13495c6c1daeSBarry Smith   PetscFunctionBegin;
1350b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1351b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive));
1352b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13535c6c1daeSBarry Smith }
1354b665b14eSToby Isaac 
1355b665b14eSToby Isaac /*
1356b665b14eSToby Isaac   PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage
1357b665b14eSToby Isaac 
1358b665b14eSToby Isaac   Not Collective
1359b665b14eSToby Isaac 
1360b665b14eSToby Isaac   Input Parameters:
1361b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1362b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1363b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers.
1364b665b14eSToby Isaac 
1365b665b14eSToby Isaac   Level: developer
1366b665b14eSToby Isaac 
1367b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`
1368b665b14eSToby Isaac */
1369b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive)
1370b665b14eSToby Isaac {
1371b665b14eSToby Isaac   PetscLogState state;
1372b665b14eSToby Isaac 
1373b665b14eSToby Isaac   PetscFunctionBegin;
1374b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1375b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive));
13763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13775c6c1daeSBarry Smith }
13785c6c1daeSBarry Smith 
13795c6c1daeSBarry Smith /*@
1380811af0c4SBarry Smith   PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage
13815c6c1daeSBarry Smith 
13825c6c1daeSBarry Smith   Not Collective
13835c6c1daeSBarry Smith 
13845c6c1daeSBarry Smith   Input Parameter:
1385811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
13865c6c1daeSBarry Smith 
13875c6c1daeSBarry Smith   Level: developer
13885c6c1daeSBarry Smith 
1389d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13905c6c1daeSBarry Smith @*/
1391d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid)
1392d71ae5a4SJacob Faibussowitsch {
13935c6c1daeSBarry Smith   PetscFunctionBegin;
1394b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE));
13953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13965c6c1daeSBarry Smith }
13975c6c1daeSBarry Smith 
13985c6c1daeSBarry Smith /*@
1399811af0c4SBarry Smith   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage
14005c6c1daeSBarry Smith 
14015c6c1daeSBarry Smith   Not Collective
14025c6c1daeSBarry Smith 
14035c6c1daeSBarry Smith   Input Parameter:
1404811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
14055c6c1daeSBarry Smith 
14065c6c1daeSBarry Smith   Level: developer
14075c6c1daeSBarry Smith 
1408d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
14095c6c1daeSBarry Smith @*/
1410d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid)
1411d71ae5a4SJacob Faibussowitsch {
14125c6c1daeSBarry Smith   PetscFunctionBegin;
1413b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE));
14143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
14155c6c1daeSBarry Smith }
14165c6c1daeSBarry Smith 
14175c6c1daeSBarry Smith /*MC
141862872c28SLisandro Dalcin   PetscLogEventSync - Synchronizes the beginning of a user event.
141962872c28SLisandro Dalcin 
142062872c28SLisandro Dalcin   Synopsis:
142162872c28SLisandro Dalcin   #include <petsclog.h>
1422b665b14eSToby Isaac   PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm)
142362872c28SLisandro Dalcin 
142462872c28SLisandro Dalcin   Collective
142562872c28SLisandro Dalcin 
142662872c28SLisandro Dalcin   Input Parameters:
1427b665b14eSToby Isaac + e    - `PetscLogEvent` obtained from `PetscLogEventRegister()`
142862872c28SLisandro Dalcin - comm - an MPI communicator
142962872c28SLisandro Dalcin 
143010450e9eSJacob Faibussowitsch   Example Usage:
143162872c28SLisandro Dalcin .vb
143262872c28SLisandro Dalcin   PetscLogEvent USER_EVENT;
143310450e9eSJacob Faibussowitsch 
143462872c28SLisandro Dalcin   PetscLogEventRegister("User event", 0, &USER_EVENT);
143562872c28SLisandro Dalcin   PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD);
143662872c28SLisandro Dalcin   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
143762872c28SLisandro Dalcin   [code segment to monitor]
143862872c28SLisandro Dalcin   PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0);
143962872c28SLisandro Dalcin .ve
144062872c28SLisandro Dalcin 
1441d1f92df0SBarry Smith   Level: developer
1442d1f92df0SBarry Smith 
1443811af0c4SBarry Smith   Note:
144410450e9eSJacob Faibussowitsch   This routine should be called only if there is not a `PetscObject` available to pass to
144510450e9eSJacob Faibussowitsch   `PetscLogEventBegin()`.
144662872c28SLisandro Dalcin 
1447d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`
144862872c28SLisandro Dalcin M*/
144962872c28SLisandro Dalcin 
145062872c28SLisandro Dalcin /*MC
14515c6c1daeSBarry Smith   PetscLogEventBegin - Logs the beginning of a user event.
14525c6c1daeSBarry Smith 
14535c6c1daeSBarry Smith   Synopsis:
1454aaa7dc30SBarry Smith   #include <petsclog.h>
1455b665b14eSToby Isaac   PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14565c6c1daeSBarry Smith 
14575c6c1daeSBarry Smith   Not Collective
14585c6c1daeSBarry Smith 
14595c6c1daeSBarry Smith   Input Parameters:
1460b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1461b665b14eSToby Isaac . o1 - object assocated with the event, or NULL
1462b665b14eSToby Isaac . o2 - object assocated with the event, or NULL
1463b665b14eSToby Isaac . o3 - object assocated with the event, or NULL
1464b665b14eSToby Isaac - o4 - object assocated with the event, or NULL
14655c6c1daeSBarry Smith 
14665c6c1daeSBarry Smith   Fortran Synopsis:
14675c6c1daeSBarry Smith   void PetscLogEventBegin(int e, PetscErrorCode ierr)
14685c6c1daeSBarry Smith 
146910450e9eSJacob Faibussowitsch   Example Usage:
14705c6c1daeSBarry Smith .vb
14715c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
147210450e9eSJacob Faibussowitsch 
14735c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
14745c6c1daeSBarry Smith   PetscLogEventRegister("User event",0, &USER_EVENT);
14755c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
14765c6c1daeSBarry Smith   [code segment to monitor]
14775c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
14785c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
14795c6c1daeSBarry Smith .ve
14805c6c1daeSBarry Smith 
1481d1f92df0SBarry Smith   Level: intermediate
1482d1f92df0SBarry Smith 
1483811af0c4SBarry Smith   Developer Note:
148410450e9eSJacob Faibussowitsch   `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly
148510450e9eSJacob Faibussowitsch   handling the errors that occur in the macro directly because other packages that use this
148610450e9eSJacob Faibussowitsch   macros have used them in their own functions or methods that do not return error codes and it
148710450e9eSJacob Faibussowitsch   would be disruptive to change the current behavior.
1488d0609cedSBarry Smith 
1489d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()`
14905c6c1daeSBarry Smith M*/
14915c6c1daeSBarry Smith 
14925c6c1daeSBarry Smith /*MC
14935c6c1daeSBarry Smith   PetscLogEventEnd - Log the end of a user event.
14945c6c1daeSBarry Smith 
14955c6c1daeSBarry Smith   Synopsis:
1496aaa7dc30SBarry Smith   #include <petsclog.h>
1497b665b14eSToby Isaac   PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14985c6c1daeSBarry Smith 
14995c6c1daeSBarry Smith   Not Collective
15005c6c1daeSBarry Smith 
15015c6c1daeSBarry Smith   Input Parameters:
1502b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1503b665b14eSToby Isaac . o1 - object assocated with the event, or NULL
1504b665b14eSToby Isaac . o2 - object assocated with the event, or NULL
1505b665b14eSToby Isaac . o3 - object assocated with the event, or NULL
1506b665b14eSToby Isaac - o4 - object assocated with the event, or NULL
15075c6c1daeSBarry Smith 
15085c6c1daeSBarry Smith   Fortran Synopsis:
15095c6c1daeSBarry Smith   void PetscLogEventEnd(int e, PetscErrorCode ierr)
15105c6c1daeSBarry Smith 
151110450e9eSJacob Faibussowitsch   Example Usage:
15125c6c1daeSBarry Smith .vb
15135c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
151410450e9eSJacob Faibussowitsch 
15155c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
151610450e9eSJacob Faibussowitsch   PetscLogEventRegister("User event", 0, &USER_EVENT);
15175c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
15185c6c1daeSBarry Smith   [code segment to monitor]
15195c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
15205c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
15215c6c1daeSBarry Smith .ve
15225c6c1daeSBarry Smith 
15235c6c1daeSBarry Smith   Level: intermediate
15245c6c1daeSBarry Smith 
1525d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()`
15265c6c1daeSBarry Smith M*/
15275c6c1daeSBarry Smith 
15285c6c1daeSBarry Smith /*@C
1529*8b08f494SToby Isaac   PetscLogStageGetPerfInfo - Return the performance information about the given stage
1530*8b08f494SToby Isaac 
1531*8b08f494SToby Isaac   Input Parameters:
1532*8b08f494SToby Isaac . stage - The stage number or `PETSC_DETERMINE` for the current stage
1533*8b08f494SToby Isaac 
1534*8b08f494SToby Isaac   Output Parameter:
1535*8b08f494SToby Isaac . info - This structure is filled with the performance information
1536*8b08f494SToby Isaac 
1537*8b08f494SToby Isaac   Level: intermediate
1538*8b08f494SToby Isaac 
1539*8b08f494SToby Isaac   Notes:
1540*8b08f494SToby Isaac   This is a low level routine used by the logging functions in PETSc.
1541*8b08f494SToby Isaac 
1542*8b08f494SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
1543*8b08f494SToby Isaac   `PetscLogDefaultBegin()` or from the command line wth `-log_view`.
1544*8b08f494SToby Isaac 
1545*8b08f494SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
1546*8b08f494SToby Isaac @*/
1547*8b08f494SToby Isaac PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage stage, PetscEventPerfInfo *info)
1548*8b08f494SToby Isaac {
1549*8b08f494SToby Isaac   PetscLogHandler     handler;
1550*8b08f494SToby Isaac   PetscEventPerfInfo *event_info;
1551*8b08f494SToby Isaac 
1552*8b08f494SToby Isaac   PetscFunctionBegin;
1553*8b08f494SToby Isaac   PetscAssertPointer(info, 2);
1554*8b08f494SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1555*8b08f494SToby Isaac   PetscCall(PetscLogHandlerGetStagePerfInfo(handler, stage, &event_info));
1556*8b08f494SToby Isaac   *info = *event_info;
1557*8b08f494SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1558*8b08f494SToby Isaac }
1559*8b08f494SToby Isaac 
1560*8b08f494SToby Isaac /*@C
1561b665b14eSToby Isaac   PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage
1562b665b14eSToby Isaac 
1563b665b14eSToby Isaac   Input Parameters:
1564b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage
1565b665b14eSToby Isaac - event - The event number
1566b665b14eSToby Isaac 
1567b665b14eSToby Isaac   Output Parameter:
1568b665b14eSToby Isaac . info - This structure is filled with the performance information
1569b665b14eSToby Isaac 
1570b665b14eSToby Isaac   Level: intermediate
1571b665b14eSToby Isaac 
1572b665b14eSToby Isaac   Note:
1573b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1574b665b14eSToby Isaac 
1575b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
1576b665b14eSToby Isaac @*/
1577b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info)
1578b665b14eSToby Isaac {
1579b665b14eSToby Isaac   PetscLogHandler     handler;
1580b665b14eSToby Isaac   PetscEventPerfInfo *event_info;
1581b665b14eSToby Isaac 
1582b665b14eSToby Isaac   PetscFunctionBegin;
1583b665b14eSToby Isaac   PetscAssertPointer(info, 3);
1584294de794SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1585dff009beSToby Isaac   PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info));
1586b665b14eSToby Isaac   *info = *event_info;
1587b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1588b665b14eSToby Isaac }
1589b665b14eSToby Isaac 
1590b665b14eSToby Isaac /*@C
1591b665b14eSToby Isaac   PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event
1592b665b14eSToby Isaac 
1593b665b14eSToby Isaac   Not Collective
1594b665b14eSToby Isaac 
1595b665b14eSToby Isaac   Input Parameters:
1596b665b14eSToby Isaac + event - The event id to log
1597b665b14eSToby Isaac . n     - The dof index, in [0, 8)
1598b665b14eSToby Isaac - dof   - The number of dofs
1599b665b14eSToby Isaac 
1600b665b14eSToby Isaac   Options Database Key:
1601b665b14eSToby Isaac . -log_view - Activates log summary
1602b665b14eSToby Isaac 
1603b665b14eSToby Isaac   Level: developer
1604b665b14eSToby Isaac 
1605b665b14eSToby Isaac   Note:
1606b665b14eSToby Isaac   This is to enable logging of convergence
1607b665b14eSToby Isaac 
1608b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1609b665b14eSToby Isaac @*/
1610b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof)
1611b665b14eSToby Isaac {
1612b665b14eSToby Isaac   PetscFunctionBegin;
1613b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1614dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1615dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1616dff009beSToby Isaac 
1617dff009beSToby Isaac     if (h) {
1618dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1619dff009beSToby Isaac 
1620dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1621dff009beSToby Isaac       if (event_info) event_info->dof[n] = dof;
1622dff009beSToby Isaac     }
1623b665b14eSToby Isaac   }
1624b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1625b665b14eSToby Isaac }
1626b665b14eSToby Isaac 
1627b665b14eSToby Isaac /*@C
1628b665b14eSToby Isaac   PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event
1629b665b14eSToby Isaac 
1630b665b14eSToby Isaac   Not Collective
1631b665b14eSToby Isaac 
1632b665b14eSToby Isaac   Input Parameters:
1633b665b14eSToby Isaac + event - The event id to log
1634b665b14eSToby Isaac . n     - The error index, in [0, 8)
1635b665b14eSToby Isaac - error - The error
1636b665b14eSToby Isaac 
1637b665b14eSToby Isaac   Options Database Key:
1638b665b14eSToby Isaac . -log_view - Activates log summary
1639b665b14eSToby Isaac 
1640b665b14eSToby Isaac   Level: developer
1641b665b14eSToby Isaac 
1642b665b14eSToby Isaac   Notes:
1643b665b14eSToby Isaac   This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example,
1644b665b14eSToby Isaac   as different norms, or as errors for different fields
1645b665b14eSToby Isaac 
1646b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1647b665b14eSToby Isaac 
1648b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1649b665b14eSToby Isaac @*/
1650b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error)
1651b665b14eSToby Isaac {
1652b665b14eSToby Isaac   PetscFunctionBegin;
1653b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1654dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1655dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1656dff009beSToby Isaac 
1657dff009beSToby Isaac     if (h) {
1658dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1659dff009beSToby Isaac 
1660dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1661dff009beSToby Isaac       if (event_info) event_info->errors[n] = error;
1662dff009beSToby Isaac     }
1663b665b14eSToby Isaac   }
1664b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1665b665b14eSToby Isaac }
1666b665b14eSToby Isaac 
1667b665b14eSToby Isaac /*@C
16685c6c1daeSBarry Smith   PetscLogEventGetId - Returns the event id when given the event name.
16695c6c1daeSBarry Smith 
16705c6c1daeSBarry Smith   Not Collective
16715c6c1daeSBarry Smith 
16725c6c1daeSBarry Smith   Input Parameter:
16735c6c1daeSBarry Smith . name - The event name
16745c6c1daeSBarry Smith 
16755c6c1daeSBarry Smith   Output Parameter:
1676c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists
16775c6c1daeSBarry Smith 
16785c6c1daeSBarry Smith   Level: intermediate
16795c6c1daeSBarry Smith 
1680d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
16815c6c1daeSBarry Smith @*/
1682d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event)
1683d71ae5a4SJacob Faibussowitsch {
1684b665b14eSToby Isaac   PetscLogState state;
16855c6c1daeSBarry Smith 
16865c6c1daeSBarry Smith   PetscFunctionBegin;
1687b665b14eSToby Isaac   *event = -1;
1688b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1689b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event));
16903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
16915c6c1daeSBarry Smith }
16925c6c1daeSBarry Smith 
169353e0a2f3SToby Isaac /*@C
169453e0a2f3SToby Isaac   PetscLogEventGetName - Returns the event name when given the event id.
169553e0a2f3SToby Isaac 
169653e0a2f3SToby Isaac   Not Collective
169753e0a2f3SToby Isaac 
169853e0a2f3SToby Isaac   Input Parameter:
169953e0a2f3SToby Isaac . event - The event
170053e0a2f3SToby Isaac 
170153e0a2f3SToby Isaac   Output Parameter:
170253e0a2f3SToby Isaac . name - The event name
170353e0a2f3SToby Isaac 
170453e0a2f3SToby Isaac   Level: intermediate
170553e0a2f3SToby Isaac 
170653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
170753e0a2f3SToby Isaac @*/
170853e0a2f3SToby Isaac PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char **name)
170953e0a2f3SToby Isaac {
171053e0a2f3SToby Isaac   PetscLogEventInfo event_info;
171153e0a2f3SToby Isaac   PetscLogState     state;
171253e0a2f3SToby Isaac 
171353e0a2f3SToby Isaac   PetscFunctionBegin;
1714b665b14eSToby Isaac   *name = NULL;
171553e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1716b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
171753e0a2f3SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
171853e0a2f3SToby Isaac   *name = event_info.name;
171953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
172053e0a2f3SToby Isaac }
172153e0a2f3SToby Isaac 
172253e0a2f3SToby Isaac /*@
172353e0a2f3SToby 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.
172453e0a2f3SToby Isaac 
172553e0a2f3SToby Isaac   Not collective
172653e0a2f3SToby Isaac 
172753e0a2f3SToby Isaac   Level: advanced
172853e0a2f3SToby Isaac 
172953e0a2f3SToby Isaac   Notes:
173053e0a2f3SToby 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()`).
173153e0a2f3SToby Isaac 
173253e0a2f3SToby Isaac   Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function.
173353e0a2f3SToby Isaac 
1734b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()`
173553e0a2f3SToby Isaac @*/
173653e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(void)
173753e0a2f3SToby Isaac {
173853e0a2f3SToby Isaac   PetscFunctionBegin;
1739dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1740dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1741dff009beSToby Isaac 
1742dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsPause(h));
1743dff009beSToby Isaac   }
174453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
174553e0a2f3SToby Isaac }
174653e0a2f3SToby Isaac 
174753e0a2f3SToby Isaac /*@
174853e0a2f3SToby Isaac   PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`.
174953e0a2f3SToby Isaac 
175053e0a2f3SToby Isaac   Not collective
175153e0a2f3SToby Isaac 
175253e0a2f3SToby Isaac   Level: advanced
175353e0a2f3SToby Isaac 
1754b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()`
175553e0a2f3SToby Isaac @*/
175653e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void)
175753e0a2f3SToby Isaac {
175853e0a2f3SToby Isaac   PetscFunctionBegin;
1759dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1760dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1761dff009beSToby Isaac 
1762dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsResume(h));
1763dff009beSToby Isaac   }
176453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
176553e0a2f3SToby Isaac }
176653e0a2f3SToby Isaac 
17671c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/
17681c1ad86eSToby Isaac 
17691c1ad86eSToby Isaac /*MC
17701c1ad86eSToby Isaac    PetscLogObjectCreate - Log the creation of a `PetscObject`
17711c1ad86eSToby Isaac 
17721c1ad86eSToby Isaac    Synopsis:
17731c1ad86eSToby Isaac    #include <petsclog.h>
17741c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectCreate(PetscObject h)
17751c1ad86eSToby Isaac 
17761c1ad86eSToby Isaac    Not Collective
17771c1ad86eSToby Isaac 
17781c1ad86eSToby Isaac    Input Parameters:
17791c1ad86eSToby Isaac .  h - A `PetscObject`
17801c1ad86eSToby Isaac 
17811c1ad86eSToby Isaac    Level: developer
17821c1ad86eSToby Isaac 
17831c1ad86eSToby Isaac    Developer Note:
17841c1ad86eSToby Isaac      Called internally by PETSc when creating objects: users do not need to call this directly.
1785b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
17861c1ad86eSToby Isaac 
1787b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()`
17881c1ad86eSToby Isaac M*/
17891c1ad86eSToby Isaac 
17901c1ad86eSToby Isaac /*MC
17911c1ad86eSToby Isaac    PetscLogObjectDestroy - Logs the destruction of a `PetscObject`
17921c1ad86eSToby Isaac 
17931c1ad86eSToby Isaac    Synopsis:
17941c1ad86eSToby Isaac    #include <petsclog.h>
17951c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectDestroy(PetscObject h)
17961c1ad86eSToby Isaac 
17971c1ad86eSToby Isaac    Not Collective
17981c1ad86eSToby Isaac 
17991c1ad86eSToby Isaac    Input Parameters:
18001c1ad86eSToby Isaac .  h - A `PetscObject`
18011c1ad86eSToby Isaac 
18021c1ad86eSToby Isaac    Level: developer
18031c1ad86eSToby Isaac 
18041c1ad86eSToby Isaac    Developer Note:
18051c1ad86eSToby Isaac      Called internally by PETSc when destroying objects: users do not need to call this directly.
1806b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18071c1ad86eSToby Isaac 
1808b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()`
18091c1ad86eSToby Isaac M*/
18101c1ad86eSToby Isaac 
181153e0a2f3SToby Isaac /*@C
181253e0a2f3SToby Isaac   PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name.
181353e0a2f3SToby Isaac 
181453e0a2f3SToby Isaac   Not Collective
181553e0a2f3SToby Isaac 
181653e0a2f3SToby Isaac   Input Parameter:
181753e0a2f3SToby Isaac . name - The class name
181853e0a2f3SToby Isaac 
181953e0a2f3SToby Isaac   Output Parameter:
182053e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists
182153e0a2f3SToby Isaac 
182253e0a2f3SToby Isaac   Level: intermediate
182353e0a2f3SToby Isaac 
182453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
182553e0a2f3SToby Isaac @*/
182653e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid)
182753e0a2f3SToby Isaac {
182853e0a2f3SToby Isaac   PetscLogClass     log_class;
182953e0a2f3SToby Isaac   PetscLogClassInfo class_info;
183053e0a2f3SToby Isaac   PetscLogState     state;
183153e0a2f3SToby Isaac 
183253e0a2f3SToby Isaac   PetscFunctionBegin;
1833b665b14eSToby Isaac   *classid = -1;
183453e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1835b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
183653e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromName(state, name, &log_class));
183753e0a2f3SToby Isaac   if (log_class < 0) {
183853e0a2f3SToby Isaac     *classid = -1;
183953e0a2f3SToby Isaac     PetscFunctionReturn(PETSC_SUCCESS);
184053e0a2f3SToby Isaac   }
184153e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
184253e0a2f3SToby Isaac   *classid = class_info.classid;
184353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
184453e0a2f3SToby Isaac }
184553e0a2f3SToby Isaac 
184653e0a2f3SToby Isaac /*@C
184753e0a2f3SToby Isaac   PetscLogClassIdGetName - Returns a `PetscClassId`'s name.
184853e0a2f3SToby Isaac 
184953e0a2f3SToby Isaac   Not Collective
185053e0a2f3SToby Isaac 
185153e0a2f3SToby Isaac   Input Parameter:
185253e0a2f3SToby Isaac . classid - A `PetscClassId`
185353e0a2f3SToby Isaac 
185453e0a2f3SToby Isaac   Output Parameter:
185553e0a2f3SToby Isaac . name - The class name
185653e0a2f3SToby Isaac 
185753e0a2f3SToby Isaac   Level: intermediate
185853e0a2f3SToby Isaac 
185953e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()`
186053e0a2f3SToby Isaac @*/
186153e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name)
186253e0a2f3SToby Isaac {
186353e0a2f3SToby Isaac   PetscLogClass     log_class;
186453e0a2f3SToby Isaac   PetscLogClassInfo class_info;
186553e0a2f3SToby Isaac   PetscLogState     state;
186653e0a2f3SToby Isaac 
186753e0a2f3SToby Isaac   PetscFunctionBegin;
186853e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
186953e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class));
187053e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
187153e0a2f3SToby Isaac   *name = class_info.name;
187253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
187353e0a2f3SToby Isaac }
187453e0a2f3SToby Isaac 
18755c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/
18765c6c1daeSBarry Smith /*@C
18775c6c1daeSBarry Smith   PetscLogDump - Dumps logs of objects to a file. This file is intended to
18785c6c1daeSBarry Smith   be read by bin/petscview. This program no longer exists.
18795c6c1daeSBarry Smith 
1880811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
18815c6c1daeSBarry Smith 
18825c6c1daeSBarry Smith   Input Parameter:
1883aec76313SJacob Faibussowitsch . sname - an optional file name
18845c6c1daeSBarry Smith 
188510450e9eSJacob Faibussowitsch   Example Usage:
18865c6c1daeSBarry Smith .vb
18875c6c1daeSBarry Smith   PetscInitialize(...);
1888b665b14eSToby Isaac   PetscLogDefaultBegin();
1889b665b14eSToby Isaac   // ... code ...
18905c6c1daeSBarry Smith   PetscLogDump(filename);
18915c6c1daeSBarry Smith   PetscFinalize();
18925c6c1daeSBarry Smith .ve
18935c6c1daeSBarry Smith 
1894d1f92df0SBarry Smith   Level: advanced
1895d1f92df0SBarry Smith 
1896811af0c4SBarry Smith   Note:
189737fdd005SBarry Smith   The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified,
18985c6c1daeSBarry Smith   this file will be used.
18995c6c1daeSBarry Smith 
1900b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
19015c6c1daeSBarry Smith @*/
1902d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[])
1903d71ae5a4SJacob Faibussowitsch {
1904b665b14eSToby Isaac   PetscLogHandler handler;
19055c6c1daeSBarry Smith 
19065c6c1daeSBarry Smith   PetscFunctionBegin;
1907294de794SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1908dff009beSToby Isaac   PetscCall(PetscLogHandlerDump(handler, sname));
1909b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
19105c6c1daeSBarry Smith }
1911b665b14eSToby Isaac 
1912b665b14eSToby Isaac /*@C
1913b665b14eSToby Isaac   PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot.
1914b665b14eSToby Isaac 
1915b665b14eSToby Isaac   Collective over `PETSC_COMM_WORLD`
1916b665b14eSToby Isaac 
1917b665b14eSToby Isaac   Input Parameter:
1918b665b14eSToby Isaac . sname - filename for the MPE logfile
1919b665b14eSToby Isaac 
1920b665b14eSToby Isaac   Level: advanced
1921b665b14eSToby Isaac 
1922b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()`
1923b665b14eSToby Isaac @*/
1924b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[])
1925b665b14eSToby Isaac {
1926b665b14eSToby Isaac   PetscFunctionBegin;
1927b665b14eSToby Isaac   #if defined(PETSC_HAVE_MPE)
1928b665b14eSToby Isaac   if (PetscBeganMPE) {
1929b665b14eSToby Isaac     char name[PETSC_MAX_PATH_LEN];
1930b665b14eSToby Isaac 
1931b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Finalizing MPE.\n"));
1932b665b14eSToby Isaac     if (sname) {
1933b665b14eSToby Isaac       PetscCall(PetscStrncpy(name, sname, sizeof(name)));
19345c6c1daeSBarry Smith     } else {
1935b665b14eSToby Isaac       PetscCall(PetscGetProgramName(name, sizeof(name)));
19365c6c1daeSBarry Smith     }
1937b665b14eSToby Isaac     PetscCall(MPE_Finish_log(name));
19385c6c1daeSBarry Smith   } else {
1939b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n"));
19405c6c1daeSBarry Smith   }
1941c2a741eeSJunchao Zhang   #else
1942b665b14eSToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
1943c2a741eeSJunchao Zhang   #endif
19443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19455c6c1daeSBarry Smith }
19465c6c1daeSBarry Smith 
19477d6c928cSSatish Balay /*@C
19487d6c928cSSatish Balay   PetscLogView - Prints a summary of the logging.
19495c6c1daeSBarry Smith 
19505c6c1daeSBarry Smith   Collective over MPI_Comm
19515c6c1daeSBarry Smith 
19525c6c1daeSBarry Smith   Input Parameter:
1953f14045dbSBarry Smith . viewer - an ASCII viewer
19545c6c1daeSBarry Smith 
19555c6c1daeSBarry Smith   Options Database Keys:
1956bb1d7374SBarry Smith + -log_view [:filename]                    - Prints summary of log information
1957bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file
1958607d249eSBarry 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)
1959d0a29bd7SConnor 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)
1960156b51fbSBarry Smith . -log_view_memory                         - Also display memory usage in each event
1961156b51fbSBarry Smith . -log_view_gpu_time                       - Also display time in each event for GPU kernels (Note this may slow the computation)
1962811af0c4SBarry Smith . -log_all                                 - Saves a file Log.rank for each MPI rank with details of each step of the computation
1963bb1d7374SBarry Smith - -log_trace [filename]                    - Displays a trace of what each process is doing
19645c6c1daeSBarry Smith 
1965d1f92df0SBarry Smith   Level: beginner
1966d1f92df0SBarry Smith 
19675c6c1daeSBarry Smith   Notes:
1968da81f932SPierre Jolivet   It is possible to control the logging programmatically but we recommend using the options database approach whenever possible
19695c6c1daeSBarry Smith   By default the summary is printed to stdout.
19705c6c1daeSBarry Smith 
1971bb1d7374SBarry Smith   Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin()
1972bb1d7374SBarry Smith 
1973bb1d7374SBarry Smith   If PETSc is configured with --with-logging=0 then this functionality is not available
1974bb1d7374SBarry Smith 
1975607d249eSBarry Smith   To view the nested XML format filename.xml first copy  ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current
1976607d249eSBarry Smith   directory then open filename.xml with your browser. Specific notes for certain browsers
1977607d249eSBarry Smith $    Firefox and Internet explorer - simply open the file
1978607d249eSBarry Smith $    Google Chrome - you must start up Chrome with the option --allow-file-access-from-files
1979a8d69d7bSBarry Smith $    Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access
1980607d249eSBarry 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
1981607d249eSBarry Smith   your browser.
19822add09c0SLisandro Dalcin   Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser
19832add09c0SLisandro Dalcin   window and render the XML log file contents.
1984607d249eSBarry Smith 
1985bb1d7374SBarry Smith   The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij  MARITIME  RESEARCH  INSTITUTE  NETHERLANDS
1986bb1d7374SBarry Smith 
1987d0a29bd7SConnor Ward   The Flame Graph output can be visualised using either the original Flame Graph script (https://github.com/brendangregg/FlameGraph)
1988d0a29bd7SConnor Ward   or using speedscope (https://www.speedscope.app).
1989d0a29bd7SConnor Ward   Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py.
1990d0a29bd7SConnor Ward 
1991d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()`
19925c6c1daeSBarry Smith @*/
1993d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer)
1994d71ae5a4SJacob Faibussowitsch {
1995f14045dbSBarry Smith   PetscBool         isascii;
1996f14045dbSBarry Smith   PetscViewerFormat format;
1997b665b14eSToby Isaac   int               stage;
1998b665b14eSToby Isaac   PetscLogState     state;
1999b665b14eSToby Isaac   PetscIntStack     temp_stack;
2000b665b14eSToby Isaac   PetscLogHandler   handler;
2001b665b14eSToby Isaac   PetscBool         is_empty;
20025c6c1daeSBarry Smith 
20035c6c1daeSBarry Smith   PetscFunctionBegin;
2004b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
200537b78d16SBarry Smith   /* Pop off any stages the user forgot to remove */
2006b665b14eSToby Isaac   PetscCall(PetscIntStackCreate(&temp_stack));
2007b665b14eSToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
200837b78d16SBarry Smith   while (stage >= 0) {
2009b665b14eSToby Isaac     PetscCall(PetscLogStagePop());
2010b665b14eSToby Isaac     PetscCall(PetscIntStackPush(temp_stack, stage));
2011b665b14eSToby Isaac     PetscCall(PetscLogStateGetCurrentStage(state, &stage));
201237b78d16SBarry Smith   }
20139566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
201428b400f6SJacob Faibussowitsch   PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII");
20159566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
2016b665b14eSToby Isaac   if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
2017294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler));
2018b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
2019b665b14eSToby Isaac   } else {
2020294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
2021b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
20225c6c1daeSBarry Smith   }
2023b665b14eSToby Isaac   PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2024b665b14eSToby Isaac   while (!is_empty) {
2025b665b14eSToby Isaac     PetscCall(PetscIntStackPop(temp_stack, &stage));
2026b665b14eSToby Isaac     PetscCall(PetscLogStagePush(stage));
2027b665b14eSToby Isaac     PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2028b665b14eSToby Isaac   }
2029b665b14eSToby Isaac   PetscCall(PetscIntStackDestroy(temp_stack));
20303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20315c6c1daeSBarry Smith }
20325c6c1daeSBarry Smith 
2033f14045dbSBarry Smith /*@C
2034811af0c4SBarry Smith   PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed.
2035f14045dbSBarry Smith 
2036811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
2037f14045dbSBarry Smith 
2038811af0c4SBarry Smith   Level: developer
2039f14045dbSBarry Smith 
2040d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`
2041f14045dbSBarry Smith @*/
2042d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void)
2043d71ae5a4SJacob Faibussowitsch {
2044ad2e3d55SToby Isaac   PetscInt          n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX;
2045ad2e3d55SToby Isaac   PetscViewer       viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2046ad2e3d55SToby Isaac   PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2047f14045dbSBarry Smith   PetscBool         flg;
2048f14045dbSBarry Smith 
2049f14045dbSBarry Smith   PetscFunctionBegin;
2050ad2e3d55SToby Isaac   PetscCall(PetscOptionsGetViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg));
2051ad2e3d55SToby Isaac   for (PetscInt i = 0; i < n_max; i++) {
2052ad2e3d55SToby Isaac     PetscCall(PetscViewerPushFormat(viewers[i], formats[i]));
2053ad2e3d55SToby Isaac     PetscCall(PetscLogView(viewers[i]));
2054ad2e3d55SToby Isaac     PetscCall(PetscViewerPopFormat(viewers[i]));
2055ad2e3d55SToby Isaac     PetscCall(PetscViewerDestroy(&(viewers[i])));
2056f14045dbSBarry Smith   }
20573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2058f14045dbSBarry Smith }
2059f14045dbSBarry Smith 
2060b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *);
2061b665b14eSToby Isaac 
2062b665b14eSToby Isaac /*@
2063b665b14eSToby Isaac   PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event
2064b665b14eSToby Isaac   that takes 1 or more percent of the time.
2065b665b14eSToby Isaac 
2066b665b14eSToby Isaac   Logically Collective over `PETSC_COMM_WORLD`
2067b665b14eSToby Isaac 
2068b665b14eSToby Isaac   Input Parameter:
2069b665b14eSToby Isaac . newThresh - the threshold to use
2070b665b14eSToby Isaac 
2071b665b14eSToby Isaac   Output Parameter:
2072b665b14eSToby Isaac . oldThresh - the previously set threshold value
2073b665b14eSToby Isaac 
2074b665b14eSToby Isaac   Options Database Keys:
2075b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
2076b665b14eSToby Isaac 
2077b665b14eSToby Isaac   Example Usage:
2078b665b14eSToby Isaac .vb
2079b665b14eSToby Isaac   PetscInitialize(...);
2080b665b14eSToby Isaac   PetscLogNestedBegin();
2081b665b14eSToby Isaac   PetscLogSetThreshold(0.1,&oldthresh);
2082b665b14eSToby Isaac   // ... code ...
2083b665b14eSToby Isaac   PetscLogView(viewer);
2084b665b14eSToby Isaac   PetscFinalize();
2085b665b14eSToby Isaac .ve
2086b665b14eSToby Isaac 
2087b665b14eSToby Isaac   Level: advanced
2088b665b14eSToby Isaac 
2089b665b14eSToby Isaac   Note:
2090b665b14eSToby Isaac   This threshold is only used by the nested log handler
2091b665b14eSToby Isaac 
2092b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`,
2093b665b14eSToby Isaac           `PetscLogNestedBegin()`
2094b665b14eSToby Isaac @*/
2095b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh)
2096b665b14eSToby Isaac {
2097b665b14eSToby Isaac   PetscLogHandler handler;
2098b665b14eSToby Isaac 
2099b665b14eSToby Isaac   PetscFunctionBegin;
2100294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler));
2101b665b14eSToby Isaac   PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh));
2102b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2103b665b14eSToby Isaac }
2104b665b14eSToby Isaac 
21055c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/
21065c6c1daeSBarry Smith /*@C
21075c6c1daeSBarry Smith   PetscGetFlops - Returns the number of flops used on this processor
21085c6c1daeSBarry Smith   since the program began.
21095c6c1daeSBarry Smith 
21105c6c1daeSBarry Smith   Not Collective
21115c6c1daeSBarry Smith 
21125c6c1daeSBarry Smith   Output Parameter:
211310450e9eSJacob Faibussowitsch . flops - number of floating point operations
21145c6c1daeSBarry Smith 
2115d1f92df0SBarry Smith   Level: intermediate
2116d1f92df0SBarry Smith 
21175c6c1daeSBarry Smith   Notes:
21185c6c1daeSBarry Smith   A global counter logs all PETSc flop counts.  The user can use
2119811af0c4SBarry Smith   `PetscLogFlops()` to increment this counter to include flops for the
21205c6c1daeSBarry Smith   application code.
21215c6c1daeSBarry Smith 
2122811af0c4SBarry Smith   A separate counter `PetscLogGPUFlops()` logs the flops that occur on any GPU associated with this MPI rank
2123811af0c4SBarry Smith 
2124d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogGPUFlops()`, `PetscTime()`, `PetscLogFlops()`
21255c6c1daeSBarry Smith @*/
2126d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops)
2127d71ae5a4SJacob Faibussowitsch {
21285c6c1daeSBarry Smith   PetscFunctionBegin;
21295c6c1daeSBarry Smith   *flops = petsc_TotalFlops;
21303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21315c6c1daeSBarry Smith }
21325c6c1daeSBarry Smith 
21331c1ad86eSToby Isaac /*@C
21341c1ad86eSToby Isaac   PetscLogObjectState - Record information about an object with the default log handler
21351c1ad86eSToby Isaac 
21361c1ad86eSToby Isaac   Not Collective
21371c1ad86eSToby Isaac 
21381c1ad86eSToby Isaac   Input Parameters:
21391c1ad86eSToby Isaac + obj    - the `PetscObject`
21401c1ad86eSToby Isaac . format - a printf-style format string
21411c1ad86eSToby Isaac - ...    - printf arguments to format
21421c1ad86eSToby Isaac 
21431c1ad86eSToby Isaac   Level: developer
21441c1ad86eSToby Isaac 
2145b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()`
21461c1ad86eSToby Isaac @*/
2147d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...)
2148d71ae5a4SJacob Faibussowitsch {
21495c6c1daeSBarry Smith   PetscFunctionBegin;
2150dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
2151dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
2152dff009beSToby Isaac 
2153dff009beSToby Isaac     if (h) {
2154dff009beSToby Isaac       va_list Argp;
21555c6c1daeSBarry Smith       va_start(Argp, format);
2156dff009beSToby Isaac       PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp));
21575c6c1daeSBarry Smith       va_end(Argp);
2158b665b14eSToby Isaac     }
2159dff009beSToby Isaac   }
21603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21615c6c1daeSBarry Smith }
21625c6c1daeSBarry Smith 
21635c6c1daeSBarry Smith /*MC
21645c6c1daeSBarry Smith   PetscLogFlops - Adds floating point operations to the global counter.
21655c6c1daeSBarry Smith 
21665c6c1daeSBarry Smith   Synopsis:
2167aaa7dc30SBarry Smith   #include <petsclog.h>
21685c6c1daeSBarry Smith   PetscErrorCode PetscLogFlops(PetscLogDouble f)
21695c6c1daeSBarry Smith 
21705c6c1daeSBarry Smith   Not Collective
21715c6c1daeSBarry Smith 
21725c6c1daeSBarry Smith   Input Parameter:
21735c6c1daeSBarry Smith . f - flop counter
21745c6c1daeSBarry Smith 
217510450e9eSJacob Faibussowitsch   Example Usage:
21765c6c1daeSBarry Smith .vb
21775c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
217810450e9eSJacob Faibussowitsch 
21795c6c1daeSBarry Smith   PetscLogEventRegister("User event", 0, &USER_EVENT);
21805c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
21815c6c1daeSBarry Smith   [code segment to monitor]
21825c6c1daeSBarry Smith   PetscLogFlops(user_flops)
21835c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
21845c6c1daeSBarry Smith .ve
21855c6c1daeSBarry Smith 
2186d1f92df0SBarry Smith   Level: intermediate
2187d1f92df0SBarry Smith 
2188811af0c4SBarry Smith   Note:
218910450e9eSJacob Faibussowitsch    A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment
219010450e9eSJacob Faibussowitsch    this counter to include flops for the application code.
21915c6c1daeSBarry Smith 
2192d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogGPUFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()`
21935c6c1daeSBarry Smith M*/
21945c6c1daeSBarry Smith 
21955c6c1daeSBarry Smith /*MC
219610450e9eSJacob Faibussowitsch   PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate
219710450e9eSJacob Faibussowitsch   timings
21985c6c1daeSBarry Smith 
21995c6c1daeSBarry Smith   Synopsis:
2200aaa7dc30SBarry Smith   #include <petsclog.h>
22015c6c1daeSBarry Smith   void PetscPreLoadBegin(PetscBool flag, char *name);
22025c6c1daeSBarry Smith 
22035c6c1daeSBarry Smith   Not Collective
22045c6c1daeSBarry Smith 
2205d8d19677SJose E. Roman   Input Parameters:
220610450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command
220710450e9eSJacob Faibussowitsch          line option `-preload true|false`
220810450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded
22095c6c1daeSBarry Smith 
221010450e9eSJacob Faibussowitsch   Example Usage:
22115c6c1daeSBarry Smith .vb
221210450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
221310450e9eSJacob Faibussowitsch   // lines of code
22145c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
221510450e9eSJacob Faibussowitsch   // lines of code
22165c6c1daeSBarry Smith   PetscPreLoadEnd();
22175c6c1daeSBarry Smith .ve
22185c6c1daeSBarry Smith 
2219d1f92df0SBarry Smith   Level: intermediate
2220d1f92df0SBarry Smith 
2221811af0c4SBarry Smith   Note:
222295452b02SPatrick Sanan   Only works in C/C++, not Fortran
22235c6c1daeSBarry Smith 
222410450e9eSJacob Faibussowitsch   Flags available within the macro\:
222510450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading
222610450e9eSJacob Faibussowitsch . PetscPreLoadingOn   - `PETSC_TRUE` if it is CURRENTLY doing preload
222710450e9eSJacob Faibussowitsch . PetscPreLoadIt      - `0` for the first computation (with preloading turned off it is only
222810450e9eSJacob Faibussowitsch                         `0`) `1`  for the second
222910450e9eSJacob Faibussowitsch - PetscPreLoadMax     - number of times it will do the computation, only one when preloading is
223010450e9eSJacob Faibussowitsch                         turned on
223110450e9eSJacob Faibussowitsch 
223210450e9eSJacob Faibussowitsch   The first two variables are available throughout the program, the second two only between the
223310450e9eSJacob Faibussowitsch   `PetscPreLoadBegin()` and `PetscPreLoadEnd()`
22345c6c1daeSBarry Smith 
2235d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
22365c6c1daeSBarry Smith M*/
22375c6c1daeSBarry Smith 
22385c6c1daeSBarry Smith /*MC
223910450e9eSJacob Faibussowitsch   PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate
224010450e9eSJacob Faibussowitsch   timings
22415c6c1daeSBarry Smith 
22425c6c1daeSBarry Smith   Synopsis:
2243aaa7dc30SBarry Smith   #include <petsclog.h>
22445c6c1daeSBarry Smith   void PetscPreLoadEnd(void);
22455c6c1daeSBarry Smith 
22465c6c1daeSBarry Smith   Not Collective
22475c6c1daeSBarry Smith 
224810450e9eSJacob Faibussowitsch   Example Usage:
22495c6c1daeSBarry Smith .vb
225010450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
225110450e9eSJacob Faibussowitsch   // lines of code
22525c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
225310450e9eSJacob Faibussowitsch   // lines of code
22545c6c1daeSBarry Smith   PetscPreLoadEnd();
22555c6c1daeSBarry Smith .ve
22565c6c1daeSBarry Smith 
2257d1f92df0SBarry Smith   Level: intermediate
2258d1f92df0SBarry Smith 
2259811af0c4SBarry Smith   Note:
2260811af0c4SBarry Smith   Only works in C/C++ not fortran
22615c6c1daeSBarry Smith 
2262d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()`
22635c6c1daeSBarry Smith M*/
22645c6c1daeSBarry Smith 
22655c6c1daeSBarry Smith /*MC
226610450e9eSJacob Faibussowitsch   PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings
22675c6c1daeSBarry Smith 
22685c6c1daeSBarry Smith   Synopsis:
2269aaa7dc30SBarry Smith   #include <petsclog.h>
22705c6c1daeSBarry Smith   void PetscPreLoadStage(char *name);
22715c6c1daeSBarry Smith 
22725c6c1daeSBarry Smith   Not Collective
22735c6c1daeSBarry Smith 
227410450e9eSJacob Faibussowitsch   Example Usage:
22755c6c1daeSBarry Smith .vb
227610450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE,"first stage");
227710450e9eSJacob Faibussowitsch   // lines of code
22785c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
227910450e9eSJacob Faibussowitsch   // lines of code
22805c6c1daeSBarry Smith   PetscPreLoadEnd();
22815c6c1daeSBarry Smith .ve
22825c6c1daeSBarry Smith 
2283d1f92df0SBarry Smith   Level: intermediate
2284d1f92df0SBarry Smith 
2285811af0c4SBarry Smith   Note:
2286811af0c4SBarry Smith   Only works in C/C++ not fortran
22875c6c1daeSBarry Smith 
2288d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`
22895c6c1daeSBarry Smith M*/
22905c6c1daeSBarry Smith 
2291a4af0ceeSJacob Faibussowitsch   #if PetscDefined(HAVE_DEVICE)
2292a4af0ceeSJacob Faibussowitsch     #include <petsc/private/deviceimpl.h>
22939ffd0706SHong Zhang 
2294156b51fbSBarry Smith /*
2295156b51fbSBarry Smith    This cannot be called by users between PetscInitialize() and PetscFinalize() at any random location in the code
2296156b51fbSBarry Smith    because it will result in timing results that cannot be interpreted.
2297156b51fbSBarry Smith */
2298d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscLogGpuTime_Off(void)
2299d71ae5a4SJacob Faibussowitsch {
2300156b51fbSBarry Smith   PetscLogGpuTimeFlag = PETSC_FALSE;
23013ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
2302156b51fbSBarry Smith }
2303156b51fbSBarry Smith 
2304156b51fbSBarry Smith /*@C
2305156b51fbSBarry Smith   PetscLogGpuTime - turn on the logging of GPU time for GPU kernels
2306156b51fbSBarry Smith 
2307811af0c4SBarry Smith   Options Database Key:
230810450e9eSJacob Faibussowitsch . -log_view_gpu_time - provide the GPU times in the `-log_view` output
2309156b51fbSBarry Smith 
2310d1f92df0SBarry Smith   Level: advanced
2311d1f92df0SBarry Smith 
2312156b51fbSBarry Smith   Notes:
231310450e9eSJacob Faibussowitsch   Turning on the timing of the GPU kernels can slow down the entire computation and should only
231410450e9eSJacob Faibussowitsch   be used when studying the performance of operations on GPU such as vector operations and
231510450e9eSJacob Faibussowitsch   matrix-vector operations.
2316156b51fbSBarry Smith 
231710450e9eSJacob Faibussowitsch   This routine should only be called once near the beginning of the program. Once it is started
231810450e9eSJacob Faibussowitsch   it cannot be turned off.
2319156b51fbSBarry Smith 
2320d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()`
2321156b51fbSBarry Smith @*/
2322d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void)
2323d71ae5a4SJacob Faibussowitsch {
2324156b51fbSBarry Smith   if (!PetscLogGpuTimeFlag) PetscCall(PetscRegisterFinalize(PetscLogGpuTime_Off));
2325156b51fbSBarry Smith   PetscLogGpuTimeFlag = PETSC_TRUE;
23263ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
2327156b51fbSBarry Smith }
2328156b51fbSBarry Smith 
23299ffd0706SHong Zhang /*@C
23309ffd0706SHong Zhang   PetscLogGpuTimeBegin - Start timer for device
23319ffd0706SHong Zhang 
2332d1f92df0SBarry Smith   Level: intermediate
2333d1f92df0SBarry Smith 
23349ffd0706SHong Zhang   Notes:
233510450e9eSJacob Faibussowitsch   When CUDA or HIP is enabled, the timer is run on the GPU, it is a separate logging of time
233610450e9eSJacob Faibussowitsch   devoted to GPU computations (excluding kernel launch times).
2337811af0c4SBarry Smith 
233810450e9eSJacob Faibussowitsch   When CUDA or HIP is not available, the timer is run on the CPU, it is a separate logging of
233910450e9eSJacob Faibussowitsch   time devoted to GPU computations (including kernel launch times).
2340811af0c4SBarry Smith 
234110450e9eSJacob Faibussowitsch   There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and
234210450e9eSJacob Faibussowitsch   `PetscLogGpuTimeEnd()`
2343811af0c4SBarry Smith 
234410450e9eSJacob Faibussowitsch   This timer should NOT include times for data transfers between the GPU and CPU, nor setup
234510450e9eSJacob Faibussowitsch   actions such as allocating space.
2346811af0c4SBarry Smith 
234710450e9eSJacob Faibussowitsch   The regular logging captures the time for data transfers and any CPU activities during the
234810450e9eSJacob Faibussowitsch   event. It is used to compute the flop rate on the GPU as it is actively engaged in running a
234910450e9eSJacob Faibussowitsch   kernel.
23509ffd0706SHong Zhang 
23519ffd0706SHong Zhang   Developer Notes:
235210450e9eSJacob Faibussowitsch   The GPU event timer captures the execution time of all the kernels launched in the default
235310450e9eSJacob Faibussowitsch   stream by the CPU between `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()`.
2354811af0c4SBarry Smith 
235510450e9eSJacob Faibussowitsch   `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()` insert the begin and end events into the
235610450e9eSJacob Faibussowitsch   default stream (stream 0). The device will record a time stamp for the event when it reaches
235710450e9eSJacob Faibussowitsch   that event in the stream. The function xxxEventSynchronize() is called in
235810450e9eSJacob Faibussowitsch   `PetsLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the
235910450e9eSJacob Faibussowitsch   timer event is recorded.
23609ffd0706SHong Zhang 
2361d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()`
23629ffd0706SHong Zhang @*/
2363d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void)
2364d71ae5a4SJacob Faibussowitsch {
2365b665b14eSToby Isaac   PetscBool isActive;
2366b665b14eSToby Isaac 
23679ffd0706SHong Zhang   PetscFunctionBegin;
2368b665b14eSToby Isaac   PetscCall(PetscLogEventBeginIsActive(&isActive));
2369b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
2370744d70b0SJunchao Zhang   if (PetscDefined(HAVE_DEVICE)) {
2371a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2372a4af0ceeSJacob Faibussowitsch 
23739566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
23749566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextBeginTimer_Internal(dctx));
2375a4af0ceeSJacob Faibussowitsch   } else {
23769566063dSJacob Faibussowitsch     PetscCall(PetscTimeSubtract(&petsc_gtime));
2377a4af0ceeSJacob Faibussowitsch   }
23783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23799ffd0706SHong Zhang }
23809ffd0706SHong Zhang 
23819ffd0706SHong Zhang /*@C
23829ffd0706SHong Zhang   PetscLogGpuTimeEnd - Stop timer for device
23839ffd0706SHong Zhang 
23849ffd0706SHong Zhang   Level: intermediate
23859ffd0706SHong Zhang 
2386d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()`
23879ffd0706SHong Zhang @*/
2388d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void)
2389d71ae5a4SJacob Faibussowitsch {
2390b665b14eSToby Isaac   PetscBool isActive;
2391b665b14eSToby Isaac 
23929ffd0706SHong Zhang   PetscFunctionBegin;
2393b665b14eSToby Isaac   PetscCall(PetscLogEventEndIsActive(&isActive));
2394b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
2395744d70b0SJunchao Zhang   if (PetscDefined(HAVE_DEVICE)) {
2396a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2397a4af0ceeSJacob Faibussowitsch     PetscLogDouble     elapsed;
2398a4af0ceeSJacob Faibussowitsch 
23999566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
24009566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed));
2401a4af0ceeSJacob Faibussowitsch     petsc_gtime += (elapsed / 1000.0);
2402a4af0ceeSJacob Faibussowitsch   } else {
24039566063dSJacob Faibussowitsch     PetscCall(PetscTimeAdd(&petsc_gtime));
2404a4af0ceeSJacob Faibussowitsch   }
24053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24069ffd0706SHong Zhang }
2407c708d6e3SStefano Zampini 
24089ffd0706SHong Zhang   #endif /* end of PETSC_HAVE_DEVICE */
24099ffd0706SHong Zhang 
2410cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/
2411cb9ef012SToby Isaac 
2412b665b14eSToby Isaac /* -- Utility functions for logging from fortran -- */
2413b665b14eSToby Isaac 
2414b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype)
2415b665b14eSToby Isaac {
2416b665b14eSToby Isaac   PetscFunctionBegin;
2417cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2418b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1));
2419b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2420b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th));
2421b665b14eSToby Isaac   #endif
2422cb9ef012SToby Isaac #endif
2423b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2424b665b14eSToby Isaac }
2425b665b14eSToby Isaac 
2426b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype)
2427b665b14eSToby Isaac {
2428b665b14eSToby Isaac   PetscFunctionBegin;
2429cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2430b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_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_recv_len, &petsc_recv_len_th));
2433b665b14eSToby Isaac   #endif
2434cb9ef012SToby Isaac #endif
2435b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2436b665b14eSToby Isaac }
2437b665b14eSToby Isaac 
2438b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void)
2439b665b14eSToby Isaac {
2440b665b14eSToby Isaac   PetscFunctionBegin;
2441cb9ef012SToby Isaac   if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1));
2442b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2443b665b14eSToby Isaac }
2444b665b14eSToby Isaac 
24455c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
24465c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID  = 0;
24475c6c1daeSBarry Smith 
24482611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE;
24492611ad71SToby Isaac 
24502611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void)
24512611ad71SToby Isaac {
24522611ad71SToby Isaac   int stage;
24532611ad71SToby Isaac 
24542611ad71SToby Isaac   PetscFunctionBegin;
24552611ad71SToby Isaac   if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS);
24562611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_TRUE;
24572611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
24582611ad71SToby Isaac     /* Setup default logging structures */
24592611ad71SToby Isaac     PetscCall(PetscLogStateCreate(&petsc_log_state));
24602611ad71SToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
24612611ad71SToby Isaac       if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state));
24622611ad71SToby Isaac     }
24632611ad71SToby Isaac     PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage));
24642611ad71SToby Isaac     PetscCall(PetscSpinlockCreate(&PetscLogSpinLock));
24652611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY)
24662611ad71SToby Isaac     petsc_log_tid = 0;
24672611ad71SToby Isaac     petsc_log_gid = 0;
24682611ad71SToby Isaac #endif
24692611ad71SToby Isaac 
24702611ad71SToby Isaac     /* All processors sync here for more consistent logging */
24712611ad71SToby Isaac     PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
24722611ad71SToby Isaac     PetscCall(PetscTime(&petsc_BaseTime));
24732611ad71SToby Isaac     PetscCall(PetscLogStagePush(stage));
24742611ad71SToby Isaac   }
24752611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
24762611ad71SToby Isaac }
24772611ad71SToby Isaac 
24782611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void)
24792611ad71SToby Isaac {
24802611ad71SToby Isaac   PetscFunctionBegin;
24812611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
2482b665b14eSToby Isaac     /* Resetting phase */
2483b665b14eSToby Isaac     // pop remaining stages
2484b665b14eSToby Isaac     if (petsc_log_state) {
2485b665b14eSToby Isaac       while (petsc_log_state->current_stage >= 0) { PetscCall(PetscLogStagePop()); }
2486b665b14eSToby Isaac     }
24872611ad71SToby Isaac     for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler));
24882611ad71SToby Isaac     PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX));
24892611ad71SToby Isaac     PetscCall(PetscLogStateDestroy(&petsc_log_state));
24902611ad71SToby Isaac 
24912611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
24922611ad71SToby Isaac     petsc_BaseTime           = 0.0;
24932611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
24942611ad71SToby Isaac     petsc_send_ct            = 0.0;
24952611ad71SToby Isaac     petsc_recv_ct            = 0.0;
24962611ad71SToby Isaac     petsc_send_len           = 0.0;
24972611ad71SToby Isaac     petsc_recv_len           = 0.0;
24982611ad71SToby Isaac     petsc_isend_ct           = 0.0;
24992611ad71SToby Isaac     petsc_irecv_ct           = 0.0;
25002611ad71SToby Isaac     petsc_isend_len          = 0.0;
25012611ad71SToby Isaac     petsc_irecv_len          = 0.0;
25022611ad71SToby Isaac     petsc_wait_ct            = 0.0;
25032611ad71SToby Isaac     petsc_wait_any_ct        = 0.0;
25042611ad71SToby Isaac     petsc_wait_all_ct        = 0.0;
25052611ad71SToby Isaac     petsc_sum_of_waits_ct    = 0.0;
25062611ad71SToby Isaac     petsc_allreduce_ct       = 0.0;
25072611ad71SToby Isaac     petsc_gather_ct          = 0.0;
25082611ad71SToby Isaac     petsc_scatter_ct         = 0.0;
25092611ad71SToby Isaac     petsc_TotalFlops_th      = 0.0;
25102611ad71SToby Isaac     petsc_send_ct_th         = 0.0;
25112611ad71SToby Isaac     petsc_recv_ct_th         = 0.0;
25122611ad71SToby Isaac     petsc_send_len_th        = 0.0;
25132611ad71SToby Isaac     petsc_recv_len_th        = 0.0;
25142611ad71SToby Isaac     petsc_isend_ct_th        = 0.0;
25152611ad71SToby Isaac     petsc_irecv_ct_th        = 0.0;
25162611ad71SToby Isaac     petsc_isend_len_th       = 0.0;
25172611ad71SToby Isaac     petsc_irecv_len_th       = 0.0;
25182611ad71SToby Isaac     petsc_wait_ct_th         = 0.0;
25192611ad71SToby Isaac     petsc_wait_any_ct_th     = 0.0;
25202611ad71SToby Isaac     petsc_wait_all_ct_th     = 0.0;
25212611ad71SToby Isaac     petsc_sum_of_waits_ct_th = 0.0;
25222611ad71SToby Isaac     petsc_allreduce_ct_th    = 0.0;
25232611ad71SToby Isaac     petsc_gather_ct_th       = 0.0;
25242611ad71SToby Isaac     petsc_scatter_ct_th      = 0.0;
25252611ad71SToby Isaac 
25262611ad71SToby Isaac     petsc_ctog_ct    = 0.0;
25272611ad71SToby Isaac     petsc_gtoc_ct    = 0.0;
25282611ad71SToby Isaac     petsc_ctog_sz    = 0.0;
25292611ad71SToby Isaac     petsc_gtoc_sz    = 0.0;
25302611ad71SToby Isaac     petsc_gflops     = 0.0;
25312611ad71SToby Isaac     petsc_gtime      = 0.0;
25322611ad71SToby Isaac     petsc_ctog_ct_th = 0.0;
25332611ad71SToby Isaac     petsc_gtoc_ct_th = 0.0;
25342611ad71SToby Isaac     petsc_ctog_sz_th = 0.0;
25352611ad71SToby Isaac     petsc_gtoc_sz_th = 0.0;
25362611ad71SToby Isaac     petsc_gflops_th  = 0.0;
25372611ad71SToby Isaac     petsc_gtime_th   = 0.0;
25382611ad71SToby Isaac   }
25392611ad71SToby Isaac   PETSC_LARGEST_CLASSID    = PETSC_SMALLEST_CLASSID;
25402611ad71SToby Isaac   PETSC_OBJECT_CLASSID     = 0;
25412611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_FALSE;
25422611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25432611ad71SToby Isaac }
25442611ad71SToby Isaac 
25455c6c1daeSBarry Smith /*@C
25465c6c1daeSBarry Smith   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
25475c6c1daeSBarry Smith 
25485c6c1daeSBarry Smith   Not Collective
25495c6c1daeSBarry Smith 
25505c6c1daeSBarry Smith   Input Parameter:
25515c6c1daeSBarry Smith . name - The class name
25525c6c1daeSBarry Smith 
25535c6c1daeSBarry Smith   Output Parameter:
25545c6c1daeSBarry Smith . oclass - The class id or classid
25555c6c1daeSBarry Smith 
25565c6c1daeSBarry Smith   Level: developer
25575c6c1daeSBarry Smith 
2558d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`
25595c6c1daeSBarry Smith @*/
2560d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass)
2561d71ae5a4SJacob Faibussowitsch {
25625c6c1daeSBarry Smith   PetscFunctionBegin;
25635c6c1daeSBarry Smith   *oclass = ++PETSC_LARGEST_CLASSID;
25645c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2565b665b14eSToby Isaac   {
2566b665b14eSToby Isaac     PetscLogState state;
2567b665b14eSToby Isaac     PetscLogClass logclass;
2568b665b14eSToby Isaac 
2569b665b14eSToby Isaac     PetscCall(PetscLogGetState(&state));
2570b665b14eSToby Isaac     if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass));
2571b665b14eSToby Isaac   }
25725c6c1daeSBarry Smith #endif
25733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
25745c6c1daeSBarry Smith }
2575