xref: /petsc/src/sys/logging/plog.c (revision 0b4b7b1c20c2ed4ade67e3d50a7710fe0ffbfca5)
15c6c1daeSBarry Smith /*
25c6c1daeSBarry Smith       PETSc code to log object creation and destruction and PETSc events.
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith       This provides the public API used by the rest of PETSc and by users.
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith       These routines use a private API that is not used elsewhere in PETSc and is not
75c6c1daeSBarry Smith       accessible to users. The private API is defined in logimpl.h and the utils directory.
85c6c1daeSBarry Smith 
9b665b14eSToby Isaac       ***
10b665b14eSToby Isaac 
11b665b14eSToby Isaac       This file, and only this file, is for functions that interact with the global logging state
125c6c1daeSBarry Smith */
13af0996ceSBarry Smith #include <petsc/private/logimpl.h> /*I    "petscsys.h"   I*/
1453e0a2f3SToby Isaac #include <petsc/private/loghandlerimpl.h>
155c6c1daeSBarry Smith #include <petsctime.h>
16665c2dedSJed Brown #include <petscviewer.h>
178fe3844cSJunchao Zhang #include <petscdevice.h>
188fe3844cSJunchao Zhang #include <petsc/private/deviceimpl.h>
195c6c1daeSBarry Smith 
20c708d6e3SStefano Zampini #if defined(PETSC_HAVE_THREADSAFETY)
21c708d6e3SStefano Zampini 
22c708d6e3SStefano Zampini PetscInt           petsc_log_gid = -1; /* Global threadId counter */
23c708d6e3SStefano Zampini PETSC_TLS PetscInt petsc_log_tid = -1; /* Local threadId */
24c708d6e3SStefano Zampini 
25c708d6e3SStefano Zampini /* shared variables */
26c708d6e3SStefano Zampini PetscSpinlock PetscLogSpinLock;
27c708d6e3SStefano Zampini 
282611ad71SToby Isaac PetscInt PetscLogGetTid(void)
292611ad71SToby Isaac {
302611ad71SToby Isaac   if (petsc_log_tid < 0) {
312611ad71SToby Isaac     PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
322611ad71SToby Isaac     petsc_log_tid = ++petsc_log_gid;
332611ad71SToby Isaac     PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
342611ad71SToby Isaac   }
352611ad71SToby Isaac   return petsc_log_tid;
362611ad71SToby Isaac }
372611ad71SToby Isaac 
38c708d6e3SStefano Zampini #endif
39c708d6e3SStefano Zampini 
405c6c1daeSBarry Smith /* Global counters */
415c6c1daeSBarry Smith PetscLogDouble petsc_BaseTime        = 0.0;
425c6c1daeSBarry Smith PetscLogDouble petsc_TotalFlops      = 0.0; /* The number of flops */
435c6c1daeSBarry Smith PetscLogDouble petsc_send_ct         = 0.0; /* The number of sends */
445c6c1daeSBarry Smith PetscLogDouble petsc_recv_ct         = 0.0; /* The number of receives */
455c6c1daeSBarry Smith PetscLogDouble petsc_send_len        = 0.0; /* The total length of all sent messages */
465c6c1daeSBarry Smith PetscLogDouble petsc_recv_len        = 0.0; /* The total length of all received messages */
475c6c1daeSBarry Smith PetscLogDouble petsc_isend_ct        = 0.0; /* The number of immediate sends */
485c6c1daeSBarry Smith PetscLogDouble petsc_irecv_ct        = 0.0; /* The number of immediate receives */
495c6c1daeSBarry Smith PetscLogDouble petsc_isend_len       = 0.0; /* The total length of all immediate send messages */
505c6c1daeSBarry Smith PetscLogDouble petsc_irecv_len       = 0.0; /* The total length of all immediate receive messages */
515c6c1daeSBarry Smith PetscLogDouble petsc_wait_ct         = 0.0; /* The number of waits */
525c6c1daeSBarry Smith PetscLogDouble petsc_wait_any_ct     = 0.0; /* The number of anywaits */
535c6c1daeSBarry Smith PetscLogDouble petsc_wait_all_ct     = 0.0; /* The number of waitalls */
545c6c1daeSBarry Smith PetscLogDouble petsc_sum_of_waits_ct = 0.0; /* The total number of waits */
555c6c1daeSBarry Smith PetscLogDouble petsc_allreduce_ct    = 0.0; /* The number of reductions */
565c6c1daeSBarry Smith PetscLogDouble petsc_gather_ct       = 0.0; /* The number of gathers and gathervs */
575c6c1daeSBarry Smith PetscLogDouble petsc_scatter_ct      = 0.0; /* The number of scatters and scattervs */
58c708d6e3SStefano Zampini 
59c708d6e3SStefano Zampini /* Thread Local storage */
60c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_TotalFlops_th      = 0.0;
61c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_ct_th         = 0.0;
62c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_ct_th         = 0.0;
63c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_send_len_th        = 0.0;
64c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_recv_len_th        = 0.0;
65c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_ct_th        = 0.0;
66c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_ct_th        = 0.0;
67c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_isend_len_th       = 0.0;
68c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_irecv_len_th       = 0.0;
69c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_ct_th         = 0.0;
70c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_any_ct_th     = 0.0;
71c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_wait_all_ct_th     = 0.0;
72c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_sum_of_waits_ct_th = 0.0;
73c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_allreduce_ct_th    = 0.0;
74c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gather_ct_th       = 0.0;
75c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_scatter_ct_th      = 0.0;
76c708d6e3SStefano Zampini 
77bec0b493Shannah_mairs PetscLogDouble petsc_ctog_ct        = 0.0; /* The total number of CPU to GPU copies */
78bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_ct        = 0.0; /* The total number of GPU to CPU copies */
79bec0b493Shannah_mairs PetscLogDouble petsc_ctog_sz        = 0.0; /* The total size of CPU to GPU copies */
80bec0b493Shannah_mairs PetscLogDouble petsc_gtoc_sz        = 0.0; /* The total size of GPU to CPU copies */
8145c4b7c1SBarry Smith PetscLogDouble petsc_ctog_ct_scalar = 0.0; /* The total number of CPU to GPU copies */
8245c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_ct_scalar = 0.0; /* The total number of GPU to CPU copies */
8345c4b7c1SBarry Smith PetscLogDouble petsc_ctog_sz_scalar = 0.0; /* The total size of CPU to GPU copies */
8445c4b7c1SBarry Smith PetscLogDouble petsc_gtoc_sz_scalar = 0.0; /* The total size of GPU to CPU copies */
85958c4211Shannah_mairs PetscLogDouble petsc_gflops         = 0.0; /* The flops done on a GPU */
86958c4211Shannah_mairs PetscLogDouble petsc_gtime          = 0.0; /* The time spent on a GPU */
87c708d6e3SStefano Zampini 
88c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_th        = 0.0;
89c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_th        = 0.0;
90c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_th        = 0.0;
91c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_th        = 0.0;
92c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_ct_scalar_th = 0.0;
93c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_ct_scalar_th = 0.0;
94c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_ctog_sz_scalar_th = 0.0;
95c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtoc_sz_scalar_th = 0.0;
96c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gflops_th         = 0.0;
97c708d6e3SStefano Zampini PETSC_TLS PetscLogDouble petsc_gtime_th          = 0.0;
982611ad71SToby Isaac 
992611ad71SToby Isaac PetscBool PetscLogMemory = PETSC_FALSE;
1002611ad71SToby Isaac PetscBool PetscLogSyncOn = PETSC_FALSE;
1012611ad71SToby Isaac 
1022611ad71SToby Isaac PetscBool PetscLogGpuTimeFlag = PETSC_FALSE;
1032611ad71SToby Isaac 
1042611ad71SToby Isaac PetscLogState petsc_log_state = NULL;
1052611ad71SToby Isaac 
10610dd146fSPierre Jolivet #define PETSC_LOG_HANDLER_HOT_BLANK {NULL, NULL, NULL, NULL, NULL, NULL}
1072611ad71SToby Isaac 
1082611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = {
1092611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1102611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1112611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1122611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1132611ad71SToby Isaac };
1142611ad71SToby Isaac 
1152611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK
1162611ad71SToby Isaac 
1172611ad71SToby Isaac #if defined(PETSC_USE_LOG)
1182611ad71SToby Isaac   #include <../src/sys/logging/handler/impls/default/logdefault.h>
119c708d6e3SStefano Zampini 
120c708d6e3SStefano Zampini   #if defined(PETSC_HAVE_THREADSAFETY)
121c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp)
122c708d6e3SStefano Zampini {
123c708d6e3SStefano Zampini   *tot_th += tmp;
1243ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
125c708d6e3SStefano Zampini   *tot += tmp;
1263ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1273ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
128c708d6e3SStefano Zampini }
129c708d6e3SStefano Zampini 
130c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp)
131c708d6e3SStefano Zampini {
132c708d6e3SStefano Zampini   *cnt_th = *cnt_th + 1;
133c708d6e3SStefano Zampini   *tot_th += tmp;
1343ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
13557508eceSPierre Jolivet   *tot += (PetscLogDouble)tmp;
136c708d6e3SStefano Zampini   *cnt += *cnt + 1;
1373ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1383ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
139c708d6e3SStefano Zampini }
140c708d6e3SStefano Zampini 
141bec0b493Shannah_mairs   #endif
1425c6c1daeSBarry Smith 
14353e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
14453e0a2f3SToby Isaac {
14553e0a2f3SToby Isaac   PetscFunctionBegin;
14653e0a2f3SToby Isaac   PetscAssertPointer(handler, 2);
14753e0a2f3SToby Isaac   *handler = NULL;
14853e0a2f3SToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
14953e0a2f3SToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
15053e0a2f3SToby Isaac     if (h) {
15153e0a2f3SToby Isaac       PetscBool match;
15253e0a2f3SToby Isaac 
15353e0a2f3SToby Isaac       PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match));
15453e0a2f3SToby Isaac       if (match) {
15553e0a2f3SToby Isaac         *handler = PetscLogHandlers[i].handler;
15653e0a2f3SToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
15753e0a2f3SToby Isaac       }
15853e0a2f3SToby Isaac     }
15953e0a2f3SToby Isaac   }
16053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
16153e0a2f3SToby Isaac }
16253e0a2f3SToby Isaac 
16353e0a2f3SToby Isaac /*@
164b665b14eSToby Isaac   PetscLogGetDefaultHandler - Get the default log handler if it is running.
165b665b14eSToby Isaac 
166b665b14eSToby Isaac   Not collective
167b665b14eSToby Isaac 
168b665b14eSToby Isaac   Output Parameter:
169b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running.
170b665b14eSToby Isaac 
171b665b14eSToby Isaac   Level: developer
172b665b14eSToby Isaac 
173b665b14eSToby Isaac   Notes:
174b665b14eSToby Isaac   The default handler is started with `PetscLogDefaultBegin()`,
175b665b14eSToby Isaac   if the options flags `-log_all` or `-log_view` is given without arguments,
176b665b14eSToby Isaac   or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`.
177b665b14eSToby Isaac 
178b665b14eSToby Isaac .seealso: [](ch_profiling)
179b665b14eSToby Isaac @*/
180b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler)
181b665b14eSToby Isaac {
182b665b14eSToby Isaac   PetscFunctionBegin;
183294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler));
184b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
185b665b14eSToby Isaac }
186b665b14eSToby Isaac 
187b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
188b665b14eSToby Isaac {
189b665b14eSToby Isaac   PetscFunctionBegin;
190b665b14eSToby Isaac   PetscAssertPointer(handler, 2);
191b665b14eSToby Isaac   PetscCall(PetscLogTryGetHandler(type, handler));
1921943a749SToby Isaac   PetscCheck(*handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type);
193b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
194b665b14eSToby Isaac }
195b665b14eSToby Isaac 
196b665b14eSToby Isaac /*@
19753e0a2f3SToby Isaac   PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used
19853e0a2f3SToby Isaac   by all default log handlers (`PetscLogDefaultBegin()`,
19953e0a2f3SToby Isaac   `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`,
20053e0a2f3SToby Isaac   `PetscLogPerfstubsBegin()`).
20153e0a2f3SToby Isaac 
20253e0a2f3SToby Isaac   Collective on `PETSC_COMM_WORLD`
20353e0a2f3SToby Isaac 
20453e0a2f3SToby Isaac   Output Parameter:
205b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as
206b665b14eSToby Isaac           `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or
207b8004f34SBarry Smith           `PetscLogStagePush()`), or `NULL` if logging is not active
20853e0a2f3SToby Isaac 
20953e0a2f3SToby Isaac   Level: developer
21053e0a2f3SToby Isaac 
21153e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState`
21253e0a2f3SToby Isaac @*/
21353e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state)
21453e0a2f3SToby Isaac {
21553e0a2f3SToby Isaac   PetscFunctionBegin;
21653e0a2f3SToby Isaac   PetscAssertPointer(state, 1);
21753e0a2f3SToby Isaac   *state = petsc_log_state;
21853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
21953e0a2f3SToby Isaac }
22053e0a2f3SToby Isaac 
22153e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot)
22253e0a2f3SToby Isaac {
22353e0a2f3SToby Isaac   PetscFunctionBegin;
22453e0a2f3SToby Isaac   hot->handler       = h;
22553e0a2f3SToby Isaac   hot->eventBegin    = h->ops->eventbegin;
22653e0a2f3SToby Isaac   hot->eventEnd      = h->ops->eventend;
22753e0a2f3SToby Isaac   hot->eventSync     = h->ops->eventsync;
22853e0a2f3SToby Isaac   hot->objectCreate  = h->ops->objectcreate;
22953e0a2f3SToby Isaac   hot->objectDestroy = h->ops->objectdestroy;
23053e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
23153e0a2f3SToby Isaac }
23253e0a2f3SToby Isaac 
23353e0a2f3SToby Isaac /*@
23453e0a2f3SToby Isaac   PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state.
23553e0a2f3SToby Isaac 
23653e0a2f3SToby Isaac   Logically collective
23753e0a2f3SToby Isaac 
23853e0a2f3SToby Isaac   Input Parameters:
23953e0a2f3SToby Isaac . h - a `PetscLogHandler`
24053e0a2f3SToby Isaac 
24153e0a2f3SToby Isaac   Level: developer
24253e0a2f3SToby Isaac 
24353e0a2f3SToby Isaac   Notes:
24453e0a2f3SToby Isaac   Users should only need this if they create their own log handlers: handlers that are started
24553e0a2f3SToby Isaac   from the command line (such as `-log_view` and `-log_trace`) or from a function like
24653e0a2f3SToby Isaac   `PetscLogNestedBegin()` will automatically be started.
24753e0a2f3SToby Isaac 
24853e0a2f3SToby Isaac   There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time.
24953e0a2f3SToby Isaac 
25053e0a2f3SToby Isaac   To disconnect a handler from the global stream call `PetscLogHandlerStop()`.
25153e0a2f3SToby Isaac 
25253e0a2f3SToby Isaac   When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`,
25353e0a2f3SToby Isaac   will be pushed for the new log handler, but it will not be informed of any events that are
25453e0a2f3SToby Isaac   in progress.  It is recommended to start any user-defined log handlers immediately following
255b8004f34SBarry Smith   `PetscInitialize()`  before any user-defined stages are pushed.
25653e0a2f3SToby Isaac 
257b8004f34SBarry Smith .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()`, `PetscInitialize()`
25853e0a2f3SToby Isaac @*/
25953e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h)
26053e0a2f3SToby Isaac {
26153e0a2f3SToby Isaac   PetscFunctionBegin;
26253e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26353e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS);
26453e0a2f3SToby Isaac   }
26553e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26653e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == NULL) {
26753e0a2f3SToby Isaac       PetscCall(PetscObjectReference((PetscObject)h));
26853e0a2f3SToby Isaac       PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i]));
26953e0a2f3SToby Isaac       if (petsc_log_state) {
27053e0a2f3SToby Isaac         PetscLogStage stack_height;
27153e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
27253e0a2f3SToby Isaac 
27353e0a2f3SToby Isaac         PetscCall(PetscLogHandlerSetState(h, petsc_log_state));
27453e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
27553e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
27653e0a2f3SToby Isaac         orig_stack                     = petsc_log_state->stage_stack;
27753e0a2f3SToby Isaac         petsc_log_state->stage_stack   = temp_stack;
27853e0a2f3SToby Isaac         petsc_log_state->current_stage = -1;
27953e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
28053e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
28153e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePush(h, stage));
28253e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
28353e0a2f3SToby Isaac           petsc_log_state->current_stage = stage;
28453e0a2f3SToby Isaac         }
28553e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
28653e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
28753e0a2f3SToby Isaac       }
28853e0a2f3SToby Isaac       PetscFunctionReturn(PETSC_SUCCESS);
28953e0a2f3SToby Isaac     }
29053e0a2f3SToby Isaac   }
29153e0a2f3SToby Isaac   SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX);
29253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
29353e0a2f3SToby Isaac }
29453e0a2f3SToby Isaac 
29553e0a2f3SToby Isaac /*@
29653e0a2f3SToby Isaac   PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream.
29753e0a2f3SToby Isaac 
29853e0a2f3SToby Isaac   Logically collective
29953e0a2f3SToby Isaac 
30053e0a2f3SToby Isaac   Input Parameters:
30153e0a2f3SToby Isaac . h - a `PetscLogHandler`
30253e0a2f3SToby Isaac 
30353e0a2f3SToby Isaac   Level: developer
30453e0a2f3SToby Isaac 
30553e0a2f3SToby Isaac   Note:
30653e0a2f3SToby Isaac   After `PetscLogHandlerStop()`, the handler can still access the global logging state
30753e0a2f3SToby Isaac   with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing
30853e0a2f3SToby Isaac   (for instance, in `PetscLogHandlerView()`),
30953e0a2f3SToby Isaac 
31053e0a2f3SToby Isaac   When a log handler is stopped, the remaining stages will be popped before it is
31153e0a2f3SToby Isaac   disconnected from the log stream.
31253e0a2f3SToby Isaac 
31353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()`
31453e0a2f3SToby Isaac @*/
31553e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h)
31653e0a2f3SToby Isaac {
31753e0a2f3SToby Isaac   PetscFunctionBegin;
31853e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
31953e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) {
32053e0a2f3SToby Isaac       if (petsc_log_state) {
32153e0a2f3SToby Isaac         PetscLogState state;
32253e0a2f3SToby Isaac         PetscLogStage stack_height;
32353e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
32453e0a2f3SToby Isaac 
32553e0a2f3SToby Isaac         PetscCall(PetscLogHandlerGetState(h, &state));
32653e0a2f3SToby Isaac         PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started.");
32753e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
32853e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
32953e0a2f3SToby Isaac         orig_stack                   = petsc_log_state->stage_stack;
33053e0a2f3SToby Isaac         petsc_log_state->stage_stack = temp_stack;
33153e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
33253e0a2f3SToby Isaac           PetscLogStage stage = (PetscLogStage)orig_stack->stack[s];
33353e0a2f3SToby Isaac 
33453e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
33553e0a2f3SToby Isaac         }
33653e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
33753e0a2f3SToby Isaac           PetscLogStage stage;
33853e0a2f3SToby Isaac           PetscBool     empty;
33953e0a2f3SToby Isaac 
34053e0a2f3SToby Isaac           PetscCall(PetscIntStackPop(temp_stack, &stage));
34153e0a2f3SToby Isaac           PetscCall(PetscIntStackEmpty(temp_stack, &empty));
34253e0a2f3SToby Isaac           if (!empty) {
34353e0a2f3SToby Isaac             PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage));
34453e0a2f3SToby Isaac           } else petsc_log_state->current_stage = -1;
34553e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePop(h, stage));
34653e0a2f3SToby Isaac         }
34753e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
34853e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
34953e0a2f3SToby Isaac         PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage));
35053e0a2f3SToby Isaac       }
35153e0a2f3SToby Isaac       PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1));
35253e0a2f3SToby Isaac       PetscCall(PetscObjectDereference((PetscObject)h));
35353e0a2f3SToby Isaac     }
35453e0a2f3SToby Isaac   }
35553e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
35653e0a2f3SToby Isaac }
3575c6c1daeSBarry Smith 
358cc4c1da9SBarry Smith /*@
359*0b4b7b1cSBarry Smith   PetscLogIsActive - Check if logging (profiling) is currently in progress.
3604dd65854SConnor Ward 
3614dd65854SConnor Ward   Not Collective
3624dd65854SConnor Ward 
3634dd65854SConnor Ward   Output Parameter:
364811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise
3654dd65854SConnor Ward 
3664dd65854SConnor Ward   Level: beginner
3674dd65854SConnor Ward 
368b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`
3694dd65854SConnor Ward @*/
370d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive)
371d71ae5a4SJacob Faibussowitsch {
3724dd65854SConnor Ward   PetscFunctionBegin;
373b665b14eSToby Isaac   *isActive = PETSC_FALSE;
374b665b14eSToby Isaac   if (petsc_log_state) {
375b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
376b665b14eSToby Isaac       if (PetscLogHandlers[i].handler) {
377b665b14eSToby Isaac         *isActive = PETSC_TRUE;
378b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
379b665b14eSToby Isaac       }
380b665b14eSToby Isaac     }
381b665b14eSToby Isaac   }
382b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
383b665b14eSToby Isaac }
384b665b14eSToby Isaac 
385b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive)
386b665b14eSToby Isaac {
387b665b14eSToby Isaac   PetscFunctionBegin;
388b665b14eSToby Isaac   *isActive = PETSC_FALSE;
389b665b14eSToby Isaac   if (petsc_log_state) {
390b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
391b665b14eSToby Isaac       if (PetscLogHandlers[i].eventBegin) {
392b665b14eSToby Isaac         *isActive = PETSC_TRUE;
393b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
394b665b14eSToby Isaac       }
395b665b14eSToby Isaac     }
396b665b14eSToby Isaac   }
397b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
398b665b14eSToby Isaac }
399b665b14eSToby Isaac 
400b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive)
401b665b14eSToby Isaac {
402b665b14eSToby Isaac   PetscFunctionBegin;
403b665b14eSToby Isaac   *isActive = PETSC_FALSE;
404b665b14eSToby Isaac   if (petsc_log_state) {
405b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
406b665b14eSToby Isaac       if (PetscLogHandlers[i].eventEnd) {
407b665b14eSToby Isaac         *isActive = PETSC_TRUE;
408b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
409b665b14eSToby Isaac       }
410b665b14eSToby Isaac     }
411b665b14eSToby Isaac   }
4123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4134dd65854SConnor Ward }
4144dd65854SConnor Ward 
41561cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type)
41653e0a2f3SToby Isaac {
41753e0a2f3SToby Isaac   PetscLogHandler handler;
41853e0a2f3SToby Isaac 
41953e0a2f3SToby Isaac   PetscFunctionBegin;
42053e0a2f3SToby Isaac   PetscCall(PetscLogTryGetHandler(type, &handler));
42153e0a2f3SToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
42253e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler));
42353e0a2f3SToby Isaac   PetscCall(PetscLogHandlerSetType(handler, type));
42453e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
42553e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
42653e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
42753e0a2f3SToby Isaac }
42853e0a2f3SToby Isaac 
429cc4c1da9SBarry Smith /*@
430*0b4b7b1cSBarry Smith   PetscLogDefaultBegin - Turns on logging (profiling) of PETSc code using the default log handler (profiler). This logs time, flop
431*0b4b7b1cSBarry Smith   rates, and object creation and should not slow programs down too much.
4325c6c1daeSBarry Smith 
4338f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
4345c6c1daeSBarry Smith 
435811af0c4SBarry Smith   Options Database Key:
436*0b4b7b1cSBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing (profiling) information to the
437*0b4b7b1cSBarry Smith                                                  screen (for PETSc configured with `--with-log=1` (which is the default)).
438*0b4b7b1cSBarry Smith                                                  This option must be provided before `PetscInitialize()`.
4395c6c1daeSBarry Smith 
44010450e9eSJacob Faibussowitsch   Example Usage:
4415c6c1daeSBarry Smith .vb
4425c6c1daeSBarry Smith       PetscInitialize(...);
443bb1d7374SBarry Smith       PetscLogDefaultBegin();
4445c6c1daeSBarry Smith        ... code ...
4455c6c1daeSBarry Smith       PetscLogView(viewer); or PetscLogDump();
4465c6c1daeSBarry Smith       PetscFinalize();
4475c6c1daeSBarry Smith .ve
4485c6c1daeSBarry Smith 
449d1f92df0SBarry Smith   Level: advanced
450d1f92df0SBarry Smith 
451*0b4b7b1cSBarry Smith   Notes:
452811af0c4SBarry Smith   `PetscLogView()` or `PetscLogDump()` actually cause the printing of
4535c6c1daeSBarry Smith   the logging information.
4545c6c1daeSBarry Smith 
455*0b4b7b1cSBarry Smith   This routine may be called more than once.
456*0b4b7b1cSBarry Smith 
457*0b4b7b1cSBarry Smith   To provide the `-log_view` option in your source code you must call  PetscCall(PetscOptionsSetValue(NULL, "-log_view", NULL));
458*0b4b7b1cSBarry Smith   before you call `PetscInitialize()`
459*0b4b7b1cSBarry 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 
473cc4c1da9SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`, No Fortran Support
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;
4964d86920dSPierre Jolivet 
4975c6c1daeSBarry Smith   PetscFunctionBegin;
498294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler));
499b665b14eSToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
500b665b14eSToby Isaac   PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler));
501b665b14eSToby Isaac   PetscCall(PetscLogHandlerStart(handler));
502b665b14eSToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
503b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
504b665b14eSToby Isaac }
505a297a907SKarl Rupp 
506b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *);
507b665b14eSToby Isaac 
508cc4c1da9SBarry Smith /*@
509b665b14eSToby Isaac   PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop
510b665b14eSToby Isaac   rates and object creation and should not slow programs down too much.
511b665b14eSToby Isaac 
512cc4c1da9SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`, No Fortran Support
513b665b14eSToby Isaac 
514b665b14eSToby Isaac   Options Database Keys:
515b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
516b665b14eSToby Isaac 
517b665b14eSToby Isaac   Example Usage:
518b665b14eSToby Isaac .vb
519b665b14eSToby Isaac       PetscInitialize(...);
520b665b14eSToby Isaac       PetscLogNestedBegin();
521b665b14eSToby Isaac        ... code ...
522b665b14eSToby Isaac       PetscLogView(viewer);
523b665b14eSToby Isaac       PetscFinalize();
524b665b14eSToby Isaac .ve
525b665b14eSToby Isaac 
526b665b14eSToby Isaac   Level: advanced
527b665b14eSToby Isaac 
528b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`
529b665b14eSToby Isaac @*/
530b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void)
531b665b14eSToby Isaac {
532b665b14eSToby Isaac   PetscFunctionBegin;
533294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED));
5343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5355c6c1daeSBarry Smith }
5365c6c1daeSBarry Smith 
53753e0a2f3SToby Isaac /*@C
53853e0a2f3SToby Isaac   PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks
53953e0a2f3SToby Isaac   matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`,
54053e0a2f3SToby Isaac   `PetscLogPHC`, `PetscLogPHD`.
54153e0a2f3SToby Isaac 
5428f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
54353e0a2f3SToby Isaac 
54453e0a2f3SToby Isaac   Input Parameters:
54553e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`)
54653e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`)
54753e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54853e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
54953e0a2f3SToby Isaac 
55053e0a2f3SToby Isaac   Calling sequence of `PetscLogPLB`:
55153e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55253e0a2f3SToby Isaac . _i - deprecated, unused
55353e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
55453e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
55553e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
55653e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
55753e0a2f3SToby Isaac 
55853e0a2f3SToby Isaac   Calling sequence of `PetscLogPLE`:
55953e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
56053e0a2f3SToby Isaac . _i - deprecated, unused
56153e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
56253e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
56353e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
56453e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
56553e0a2f3SToby Isaac 
56653e0a2f3SToby Isaac   Calling sequence of `PetscLogPHC`:
56753e0a2f3SToby Isaac . o - a `PetscObject` that has just been created
56853e0a2f3SToby Isaac 
56953e0a2f3SToby Isaac   Calling sequence of `PetscLogPHD`:
57053e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed
57153e0a2f3SToby Isaac 
57253e0a2f3SToby Isaac   Level: advanced
57353e0a2f3SToby Isaac 
57453e0a2f3SToby Isaac   Notes:
57553e0a2f3SToby Isaac   This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code.
57653e0a2f3SToby Isaac 
57753e0a2f3SToby Isaac   This should help migrate external log handlers to use `PetscLogHandler`, but
57853e0a2f3SToby Isaac   callbacks that depend on the deprecated `PetscLogStage` datatype will have to be
57953e0a2f3SToby Isaac   updated.
58053e0a2f3SToby Isaac 
58153e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState`
58253e0a2f3SToby Isaac @*/
58353e0a2f3SToby 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))
58453e0a2f3SToby Isaac {
58553e0a2f3SToby Isaac   PetscLogHandler handler;
58653e0a2f3SToby Isaac 
58753e0a2f3SToby Isaac   PetscFunctionBegin;
58853e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler));
58953e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
59053e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
59153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
59253e0a2f3SToby Isaac }
59353e0a2f3SToby Isaac 
5942611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
5952611ad71SToby Isaac     #include <mpe.h>
5962611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE;
5972611ad71SToby Isaac   #endif
5982611ad71SToby Isaac 
5992611ad71SToby Isaac /*@C
6002611ad71SToby Isaac   PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the
6012611ad71SToby Isaac   program down.
6022611ad71SToby Isaac 
603cc4c1da9SBarry Smith   Collective on `PETSC_COMM_WORLD`, No Fortran Support
6042611ad71SToby Isaac 
6052611ad71SToby Isaac   Options Database Key:
6062611ad71SToby Isaac . -log_mpe - Prints extensive log information
6072611ad71SToby Isaac 
6082611ad71SToby Isaac   Level: advanced
6092611ad71SToby Isaac 
6102611ad71SToby Isaac   Note:
6112611ad71SToby Isaac   A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is
6122611ad71SToby Isaac   intended for production runs since it logs only flop rates and object creation (and should
6132611ad71SToby Isaac   not significantly slow the programs).
6142611ad71SToby Isaac 
615b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`,
6162611ad71SToby Isaac           `PetscLogEventDeactivate()`
6172611ad71SToby Isaac @*/
6182611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void)
6192611ad71SToby Isaac {
6202611ad71SToby Isaac   PetscFunctionBegin;
6212611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
6222611ad71SToby Isaac   /* Do MPE initialization */
6232611ad71SToby Isaac   if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */
6242611ad71SToby Isaac     PetscCall(PetscInfo(0, "Initializing MPE.\n"));
6252611ad71SToby Isaac     PetscCall(MPE_Init_log());
6262611ad71SToby Isaac 
6272611ad71SToby Isaac     PetscBeganMPE = PETSC_TRUE;
6282611ad71SToby Isaac   } else {
6292611ad71SToby Isaac     PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n"));
6302611ad71SToby Isaac   }
631294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE));
6322611ad71SToby Isaac   #else
6332611ad71SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
6342611ad71SToby Isaac   #endif
6352611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6362611ad71SToby Isaac }
6372611ad71SToby Isaac 
63853e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
63953e0a2f3SToby Isaac     #include <../src/sys/perfstubs/timer.h>
64053e0a2f3SToby Isaac   #endif
64153e0a2f3SToby Isaac 
64253e0a2f3SToby Isaac /*@C
64353e0a2f3SToby Isaac   PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface.
64453e0a2f3SToby Isaac 
645cc4c1da9SBarry Smith   Collective on `PETSC_COMM_WORLD`, No Fortran Support
64653e0a2f3SToby Isaac 
64753e0a2f3SToby Isaac   Options Database Key:
64853e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface
64953e0a2f3SToby Isaac 
65053e0a2f3SToby Isaac   Level: advanced
65153e0a2f3SToby Isaac 
65253e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()`
65353e0a2f3SToby Isaac @*/
65453e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void)
65553e0a2f3SToby Isaac {
65653e0a2f3SToby Isaac   PetscFunctionBegin;
65753e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
658294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS));
65953e0a2f3SToby Isaac   #else
66053e0a2f3SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs");
66153e0a2f3SToby Isaac   #endif
66253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
66353e0a2f3SToby Isaac }
66453e0a2f3SToby Isaac 
6655c6c1daeSBarry Smith /*@
666b665b14eSToby Isaac   PetscLogActions - Determines whether actions are logged for the default log handler.
6675c6c1daeSBarry Smith 
6685c6c1daeSBarry Smith   Not Collective
6695c6c1daeSBarry Smith 
6705c6c1daeSBarry Smith   Input Parameter:
671811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged
672811af0c4SBarry Smith 
673811af0c4SBarry Smith   Options Database Key:
674b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing
675b665b14eSToby Isaac - -log_include_actions - Turn on action logging
6765c6c1daeSBarry Smith 
6775c6c1daeSBarry Smith   Level: intermediate
6785c6c1daeSBarry Smith 
679811af0c4SBarry Smith   Note:
680811af0c4SBarry Smith   Logging of actions continues to consume more memory as the program
6815c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
682aec76313SJacob Faibussowitsch 
683b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
6845c6c1daeSBarry Smith @*/
685d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag)
686d71ae5a4SJacob Faibussowitsch {
6875c6c1daeSBarry Smith   PetscFunctionBegin;
688dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
689dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
690dff009beSToby Isaac 
691dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag));
692dff009beSToby Isaac   }
6933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6945c6c1daeSBarry Smith }
6955c6c1daeSBarry Smith 
6965c6c1daeSBarry Smith /*@
6975c6c1daeSBarry Smith   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
6985c6c1daeSBarry Smith 
6995c6c1daeSBarry Smith   Not Collective
7005c6c1daeSBarry Smith 
7015c6c1daeSBarry Smith   Input Parameter:
702811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged
703811af0c4SBarry Smith 
704811af0c4SBarry Smith   Options Database Key:
705b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing
706b665b14eSToby Isaac - -log_include_objects - Turns on object logging
7075c6c1daeSBarry Smith 
7085c6c1daeSBarry Smith   Level: intermediate
7095c6c1daeSBarry Smith 
710811af0c4SBarry Smith   Note:
711811af0c4SBarry Smith   Logging of objects continues to consume more memory as the program
7125c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
7135c6c1daeSBarry Smith 
714b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
7155c6c1daeSBarry Smith @*/
716d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag)
717d71ae5a4SJacob Faibussowitsch {
7185c6c1daeSBarry Smith   PetscFunctionBegin;
719dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
720dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
721dff009beSToby Isaac 
722dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag));
723dff009beSToby Isaac   }
7243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7255c6c1daeSBarry Smith }
7265c6c1daeSBarry Smith 
7275c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/
728cc4c1da9SBarry Smith /*@
72974c0405dSRichard Tran Mills   PetscLogStageRegister - Attaches a character string name to a logging stage.
7305c6c1daeSBarry Smith 
7315c6c1daeSBarry Smith   Not Collective
7325c6c1daeSBarry Smith 
7335c6c1daeSBarry Smith   Input Parameter:
7345c6c1daeSBarry Smith . sname - The name to associate with that stage
7355c6c1daeSBarry Smith 
7365c6c1daeSBarry Smith   Output Parameter:
737b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`).
7385c6c1daeSBarry Smith 
7395c6c1daeSBarry Smith   Level: intermediate
7405c6c1daeSBarry Smith 
741d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`
7425c6c1daeSBarry Smith @*/
743d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage)
744d71ae5a4SJacob Faibussowitsch {
745b665b14eSToby Isaac   PetscLogState state;
7465c6c1daeSBarry Smith 
7475c6c1daeSBarry Smith   PetscFunctionBegin;
748b665b14eSToby Isaac   *stage = -1;
749b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
750b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage));
7513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7525c6c1daeSBarry Smith }
7535c6c1daeSBarry Smith 
754cc4c1da9SBarry Smith /*@
755811af0c4SBarry Smith   PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage
7565c6c1daeSBarry Smith 
7575c6c1daeSBarry Smith   Not Collective
7585c6c1daeSBarry Smith 
7595c6c1daeSBarry Smith   Input Parameter:
7605c6c1daeSBarry Smith . stage - The stage on which to log
7615c6c1daeSBarry Smith 
76210450e9eSJacob Faibussowitsch   Example Usage:
763811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
7645c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
7655c6c1daeSBarry Smith   PetscFinalize().
7665c6c1daeSBarry Smith .vb
7675c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
7685c6c1daeSBarry Smith       [stage 0 of code]
7695c6c1daeSBarry Smith       PetscLogStagePush(1);
7705c6c1daeSBarry Smith       [stage 1 of code]
7715c6c1daeSBarry Smith       PetscLogStagePop();
7725c6c1daeSBarry Smith       PetscBarrier(...);
7735c6c1daeSBarry Smith       [more stage 0 of code]
7745c6c1daeSBarry Smith       PetscFinalize();
7755c6c1daeSBarry Smith .ve
7765c6c1daeSBarry Smith 
777d1f92df0SBarry Smith   Level: intermediate
778d1f92df0SBarry Smith 
779811af0c4SBarry Smith   Note:
780811af0c4SBarry Smith   Use `PetscLogStageRegister()` to register a stage.
7815c6c1daeSBarry Smith 
782d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()`
7835c6c1daeSBarry Smith @*/
784d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage)
785d71ae5a4SJacob Faibussowitsch {
786b665b14eSToby Isaac   PetscLogState state;
7875c6c1daeSBarry Smith 
7885c6c1daeSBarry Smith   PetscFunctionBegin;
789b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
790b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
791b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
792b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
793b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePush(h, stage));
794b665b14eSToby Isaac   }
795b665b14eSToby Isaac   PetscCall(PetscLogStateStagePush(state, stage));
7963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7975c6c1daeSBarry Smith }
7985c6c1daeSBarry Smith 
799cc4c1da9SBarry Smith /*@
800811af0c4SBarry Smith   PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()`
8015c6c1daeSBarry Smith 
8025c6c1daeSBarry Smith   Not Collective
8035c6c1daeSBarry Smith 
80410450e9eSJacob Faibussowitsch   Example Usage:
805811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
8065c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
8075c6c1daeSBarry Smith   PetscFinalize().
8085c6c1daeSBarry Smith .vb
8095c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
8105c6c1daeSBarry Smith       [stage 0 of code]
8115c6c1daeSBarry Smith       PetscLogStagePush(1);
8125c6c1daeSBarry Smith       [stage 1 of code]
8135c6c1daeSBarry Smith       PetscLogStagePop();
8145c6c1daeSBarry Smith       PetscBarrier(...);
8155c6c1daeSBarry Smith       [more stage 0 of code]
8165c6c1daeSBarry Smith       PetscFinalize();
8175c6c1daeSBarry Smith .ve
8185c6c1daeSBarry Smith 
8195c6c1daeSBarry Smith   Level: intermediate
8205c6c1daeSBarry Smith 
821d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()`
8225c6c1daeSBarry Smith @*/
823d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void)
824d71ae5a4SJacob Faibussowitsch {
825b665b14eSToby Isaac   PetscLogState state;
826b665b14eSToby Isaac   PetscLogStage current_stage;
8275c6c1daeSBarry Smith 
8285c6c1daeSBarry Smith   PetscFunctionBegin;
829b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
830b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
831b665b14eSToby Isaac   current_stage = state->current_stage;
832b665b14eSToby Isaac   PetscCall(PetscLogStateStagePop(state));
833b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
834b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
835b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage));
836b665b14eSToby Isaac   }
8373ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8385c6c1daeSBarry Smith }
8395c6c1daeSBarry Smith 
8405c6c1daeSBarry Smith /*@
841811af0c4SBarry Smith   PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8425c6c1daeSBarry Smith 
8435c6c1daeSBarry Smith   Not Collective
8445c6c1daeSBarry Smith 
8455c6c1daeSBarry Smith   Input Parameters:
8465c6c1daeSBarry Smith + stage    - The stage
847811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8485c6c1daeSBarry Smith 
8495c6c1daeSBarry Smith   Level: intermediate
8505c6c1daeSBarry Smith 
851811af0c4SBarry Smith   Note:
852811af0c4SBarry Smith   If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist
853811af0c4SBarry Smith 
854d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8555c6c1daeSBarry Smith @*/
856d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive)
857d71ae5a4SJacob Faibussowitsch {
858b665b14eSToby Isaac   PetscLogState state;
8595c6c1daeSBarry Smith 
8605c6c1daeSBarry Smith   PetscFunctionBegin;
861b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
862b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive));
8633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8645c6c1daeSBarry Smith }
8655c6c1daeSBarry Smith 
8665c6c1daeSBarry Smith /*@
867811af0c4SBarry Smith   PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8685c6c1daeSBarry Smith 
8695c6c1daeSBarry Smith   Not Collective
8705c6c1daeSBarry Smith 
8715c6c1daeSBarry Smith   Input Parameter:
8725c6c1daeSBarry Smith . stage - The stage
8735c6c1daeSBarry Smith 
8745c6c1daeSBarry Smith   Output Parameter:
875811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8765c6c1daeSBarry Smith 
8775c6c1daeSBarry Smith   Level: intermediate
8785c6c1daeSBarry Smith 
879d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8805c6c1daeSBarry Smith @*/
881d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive)
882d71ae5a4SJacob Faibussowitsch {
883b665b14eSToby Isaac   PetscLogState state;
8845c6c1daeSBarry Smith 
8855c6c1daeSBarry Smith   PetscFunctionBegin;
886b665b14eSToby Isaac   *isActive = PETSC_FALSE;
887b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
888b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive));
8893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8905c6c1daeSBarry Smith }
8915c6c1daeSBarry Smith 
8925c6c1daeSBarry Smith /*@
893811af0c4SBarry Smith   PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()`
8945c6c1daeSBarry Smith 
8955c6c1daeSBarry Smith   Not Collective
8965c6c1daeSBarry Smith 
8975c6c1daeSBarry Smith   Input Parameters:
8985c6c1daeSBarry Smith + stage     - The stage
899811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9005c6c1daeSBarry Smith 
9015c6c1daeSBarry Smith   Level: intermediate
9025c6c1daeSBarry Smith 
903aec76313SJacob Faibussowitsch   Developer Notes:
904b665b14eSToby Isaac   Visibility only affects the default log handler in `PetscLogView()`: stages that are
905b665b14eSToby Isaac   set to invisible are suppressed from output.
906811af0c4SBarry Smith 
907b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9085c6c1daeSBarry Smith @*/
909d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible)
9105c6c1daeSBarry Smith 
911dff009beSToby Isaac {
9125c6c1daeSBarry Smith   PetscFunctionBegin;
913dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
914dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
915dff009beSToby Isaac 
916dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible));
917dff009beSToby Isaac   }
9183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9195c6c1daeSBarry Smith }
9205c6c1daeSBarry Smith 
9215c6c1daeSBarry Smith /*@
922811af0c4SBarry Smith   PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()`
9235c6c1daeSBarry Smith 
9245c6c1daeSBarry Smith   Not Collective
9255c6c1daeSBarry Smith 
9265c6c1daeSBarry Smith   Input Parameter:
9275c6c1daeSBarry Smith . stage - The stage
9285c6c1daeSBarry Smith 
9295c6c1daeSBarry Smith   Output Parameter:
930811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9315c6c1daeSBarry Smith 
9325c6c1daeSBarry Smith   Level: intermediate
9335c6c1daeSBarry Smith 
934b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9355c6c1daeSBarry Smith @*/
936d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible)
937d71ae5a4SJacob Faibussowitsch {
938b665b14eSToby Isaac   PetscLogHandler handler;
9395c6c1daeSBarry Smith 
9405c6c1daeSBarry Smith   PetscFunctionBegin;
941b665b14eSToby Isaac   *isVisible = PETSC_FALSE;
942294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
943dff009beSToby Isaac   if (handler) { PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible)); }
9443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9455c6c1daeSBarry Smith }
9465c6c1daeSBarry Smith 
947cc4c1da9SBarry Smith /*@
9485c6c1daeSBarry Smith   PetscLogStageGetId - Returns the stage id when given the stage name.
9495c6c1daeSBarry Smith 
9505c6c1daeSBarry Smith   Not Collective
9515c6c1daeSBarry Smith 
9525c6c1daeSBarry Smith   Input Parameter:
9535c6c1daeSBarry Smith . name - The stage name
9545c6c1daeSBarry Smith 
9555c6c1daeSBarry Smith   Output Parameter:
9565a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists
9575c6c1daeSBarry Smith 
9585c6c1daeSBarry Smith   Level: intermediate
9595c6c1daeSBarry Smith 
960d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
9615c6c1daeSBarry Smith @*/
962d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage)
963d71ae5a4SJacob Faibussowitsch {
964b665b14eSToby Isaac   PetscLogState state;
9655c6c1daeSBarry Smith 
9665c6c1daeSBarry Smith   PetscFunctionBegin;
967b665b14eSToby Isaac   *stage = -1;
968b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
969b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage));
9703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9715c6c1daeSBarry Smith }
9725c6c1daeSBarry Smith 
973cc4c1da9SBarry Smith /*@
97453e0a2f3SToby Isaac   PetscLogStageGetName - Returns the stage name when given the stage id.
97553e0a2f3SToby Isaac 
97653e0a2f3SToby Isaac   Not Collective
97753e0a2f3SToby Isaac 
97853e0a2f3SToby Isaac   Input Parameter:
97953e0a2f3SToby Isaac . stage - The stage
98053e0a2f3SToby Isaac 
98153e0a2f3SToby Isaac   Output Parameter:
98253e0a2f3SToby Isaac . name - The stage name
98353e0a2f3SToby Isaac 
98453e0a2f3SToby Isaac   Level: intermediate
98553e0a2f3SToby Isaac 
98653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
98753e0a2f3SToby Isaac @*/
988cc4c1da9SBarry Smith PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char *name[])
98953e0a2f3SToby Isaac {
99053e0a2f3SToby Isaac   PetscLogStageInfo stage_info;
99153e0a2f3SToby Isaac   PetscLogState     state;
99253e0a2f3SToby Isaac 
99353e0a2f3SToby Isaac   PetscFunctionBegin;
994b665b14eSToby Isaac   *name = NULL;
99553e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
996b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
99753e0a2f3SToby Isaac   PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info));
99853e0a2f3SToby Isaac   *name = stage_info.name;
99953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
100053e0a2f3SToby Isaac }
100153e0a2f3SToby Isaac 
10025c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/
10037a101e5eSJacob Faibussowitsch 
1004cc4c1da9SBarry Smith /*@
1005811af0c4SBarry Smith   PetscLogEventRegister - Registers an event name for logging operations
10065c6c1daeSBarry Smith 
10075c6c1daeSBarry Smith   Not Collective
10085c6c1daeSBarry Smith 
1009d8d19677SJose E. Roman   Input Parameters:
10105c6c1daeSBarry Smith + name    - The name associated with the event
10115c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with
1012811af0c4SBarry Smith            `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones
10135c6c1daeSBarry Smith            are only available in C code
10145c6c1daeSBarry Smith 
10155c6c1daeSBarry Smith   Output Parameter:
1016811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`.
10175c6c1daeSBarry Smith 
101810450e9eSJacob Faibussowitsch   Example Usage:
10195c6c1daeSBarry Smith .vb
10205c6c1daeSBarry Smith       PetscLogEvent USER_EVENT;
10215c6c1daeSBarry Smith       PetscClassId classid;
10225c6c1daeSBarry Smith       PetscLogDouble user_event_flops;
10235c6c1daeSBarry Smith       PetscClassIdRegister("class name",&classid);
10245c6c1daeSBarry Smith       PetscLogEventRegister("User event name",classid,&USER_EVENT);
10255c6c1daeSBarry Smith       PetscLogEventBegin(USER_EVENT,0,0,0,0);
10265c6c1daeSBarry Smith          [code segment to monitor]
10275c6c1daeSBarry Smith          PetscLogFlops(user_event_flops);
10285c6c1daeSBarry Smith       PetscLogEventEnd(USER_EVENT,0,0,0,0);
10295c6c1daeSBarry Smith .ve
10305c6c1daeSBarry Smith 
1031d1f92df0SBarry Smith   Level: intermediate
1032d1f92df0SBarry Smith 
10335c6c1daeSBarry Smith   Notes:
10345c6c1daeSBarry Smith   PETSc automatically logs library events if the code has been
1035a2553e36SBarry Smith   configured with --with-log (which is the default) and
1036811af0c4SBarry Smith   -log_view or -log_all is specified.  `PetscLogEventRegister()` is
10375c6c1daeSBarry Smith   intended for logging user events to supplement this PETSc
10385c6c1daeSBarry Smith   information.
10395c6c1daeSBarry Smith 
1040495fc317SBarry Smith   PETSc can gather data for use with the utilities Jumpshot
10415c6c1daeSBarry Smith   (part of the MPICH distribution).  If PETSc has been compiled
10425c6c1daeSBarry Smith   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
10435c6c1daeSBarry Smith   MPICH), the user can employ another command line option, -log_mpe,
10445c6c1daeSBarry Smith   to create a logfile, "mpe.log", which can be visualized
1045495fc317SBarry Smith   Jumpshot.
10465c6c1daeSBarry Smith 
10475c6c1daeSBarry Smith   The classid is associated with each event so that classes of events
10485c6c1daeSBarry Smith   can be disabled simultaneously, such as all matrix events. The user
1049811af0c4SBarry Smith   can either use an existing classid, such as `MAT_CLASSID`, or create
10505c6c1daeSBarry Smith   their own as shown in the example.
10515c6c1daeSBarry Smith 
1052c5deb1d5SJed Brown   If an existing event with the same name exists, its event handle is
1053c5deb1d5SJed Brown   returned instead of creating a new event.
1054c5deb1d5SJed Brown 
1055d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`,
1056db781477SPatrick Sanan           `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()`
10575c6c1daeSBarry Smith @*/
1058d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event)
1059d71ae5a4SJacob Faibussowitsch {
1060b665b14eSToby Isaac   PetscLogState state;
10615c6c1daeSBarry Smith 
10625c6c1daeSBarry Smith   PetscFunctionBegin;
1063b665b14eSToby Isaac   *event = -1;
1064b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1065b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event));
10663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10675c6c1daeSBarry Smith }
10685c6c1daeSBarry Smith 
10695c6c1daeSBarry Smith /*@
1070217044c2SLisandro Dalcin   PetscLogEventSetCollective - Indicates that a particular event is collective.
1071217044c2SLisandro Dalcin 
10725aefd447SStefano Zampini   Logically Collective
1073217044c2SLisandro Dalcin 
1074d8d19677SJose E. Roman   Input Parameters:
1075217044c2SLisandro Dalcin + event      - The event id
1076ffbd2f08SBarry Smith - collective - `PetscBool` indicating whether a particular event is collective
1077217044c2SLisandro Dalcin 
1078d1f92df0SBarry Smith   Level: developer
1079d1f92df0SBarry Smith 
1080811af0c4SBarry Smith   Notes:
1081811af0c4SBarry Smith   New events returned from `PetscLogEventRegister()` are collective by default.
1082811af0c4SBarry Smith 
1083ffbd2f08SBarry Smith   Collective events are handled specially if the command line option `-log_sync` is used. In that case the logging saves information about
1084811af0c4SBarry Smith   two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication
10855aefd447SStefano Zampini   to be performed. This option is useful to debug imbalance within the computations or communications.
1086217044c2SLisandro Dalcin 
1087d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()`
1088217044c2SLisandro Dalcin @*/
1089d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective)
1090d71ae5a4SJacob Faibussowitsch {
1091b665b14eSToby Isaac   PetscLogState state;
1092217044c2SLisandro Dalcin 
1093217044c2SLisandro Dalcin   PetscFunctionBegin;
1094b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1095b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective));
1096b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1097b665b14eSToby Isaac }
1098b665b14eSToby Isaac 
1099b665b14eSToby Isaac /*
1100b665b14eSToby Isaac   PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage.
1101b665b14eSToby Isaac 
1102b665b14eSToby Isaac   Not Collective
1103b665b14eSToby Isaac 
1104b665b14eSToby Isaac   Input Parameters:
1105b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1106b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers.
1107b665b14eSToby Isaac 
1108b665b14eSToby Isaac   Level: developer
1109b665b14eSToby Isaac 
1110b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()`
1111b665b14eSToby Isaac */
1112b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive)
1113b665b14eSToby Isaac {
1114b665b14eSToby Isaac   PetscLogState state;
1115b665b14eSToby Isaac 
1116b665b14eSToby Isaac   PetscFunctionBegin;
1117b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1118b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive));
11193ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1120217044c2SLisandro Dalcin }
1121217044c2SLisandro Dalcin 
1122217044c2SLisandro Dalcin /*@
1123fa2bb9feSLisandro Dalcin   PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage.
1124fa2bb9feSLisandro Dalcin 
1125fa2bb9feSLisandro Dalcin   Not Collective
1126fa2bb9feSLisandro Dalcin 
1127fa2bb9feSLisandro Dalcin   Input Parameter:
1128811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1129fa2bb9feSLisandro Dalcin 
1130fa2bb9feSLisandro Dalcin   Level: developer
1131fa2bb9feSLisandro Dalcin 
1132d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
1133fa2bb9feSLisandro Dalcin @*/
1134d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid)
1135d71ae5a4SJacob Faibussowitsch {
1136fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1137b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE));
11383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1139fa2bb9feSLisandro Dalcin }
1140fa2bb9feSLisandro Dalcin 
1141fa2bb9feSLisandro Dalcin /*@
1142fa2bb9feSLisandro Dalcin   PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage.
1143fa2bb9feSLisandro Dalcin 
1144fa2bb9feSLisandro Dalcin   Not Collective
1145fa2bb9feSLisandro Dalcin 
1146fa2bb9feSLisandro Dalcin   Input Parameter:
1147811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1148fa2bb9feSLisandro Dalcin 
1149fa2bb9feSLisandro Dalcin   Level: developer
1150fa2bb9feSLisandro Dalcin 
1151811af0c4SBarry Smith   Note:
1152811af0c4SBarry Smith   If a class is excluded then events associated with that class are not logged.
1153811af0c4SBarry Smith 
1154d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()`
1155fa2bb9feSLisandro Dalcin @*/
1156d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid)
1157d71ae5a4SJacob Faibussowitsch {
1158b665b14eSToby Isaac   PetscFunctionBegin;
1159b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE));
1160b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1161b665b14eSToby Isaac }
1162b665b14eSToby Isaac 
1163b665b14eSToby Isaac /*
1164b665b14eSToby Isaac   PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage
1165b665b14eSToby Isaac 
1166b665b14eSToby Isaac   Not Collective
1167b665b14eSToby Isaac 
1168b665b14eSToby Isaac   Input Parameters:
1169b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1170b665b14eSToby Isaac . event - A `PetscLogEvent`
1171b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage
1172b665b14eSToby Isaac 
1173b665b14eSToby Isaac   Usage:
1174b665b14eSToby Isaac .vb
1175b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE);
1176b665b14eSToby Isaac         [code where you do not want to log VecSetValues()]
1177b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE);
1178b665b14eSToby Isaac         [code where you do want to log VecSetValues()]
1179b665b14eSToby Isaac .ve
1180b665b14eSToby Isaac 
1181b665b14eSToby Isaac   Level: advanced
1182b665b14eSToby Isaac 
1183b665b14eSToby Isaac   Note:
1184b665b14eSToby Isaac   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1185b665b14eSToby Isaac   or an event number obtained with `PetscLogEventRegister()`.
1186b665b14eSToby Isaac 
1187b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
1188b665b14eSToby Isaac */
1189b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
1190b665b14eSToby Isaac {
1191b665b14eSToby Isaac   PetscLogState state;
1192fa2bb9feSLisandro Dalcin 
1193fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1194b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1195b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive));
11963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1197fa2bb9feSLisandro Dalcin }
1198fa2bb9feSLisandro Dalcin 
1199fa2bb9feSLisandro Dalcin /*@
12005c6c1daeSBarry Smith   PetscLogEventActivate - Indicates that a particular event should be logged.
12015c6c1daeSBarry Smith 
12025c6c1daeSBarry Smith   Not Collective
12035c6c1daeSBarry Smith 
12045c6c1daeSBarry Smith   Input Parameter:
12055c6c1daeSBarry Smith . event - The event id
12065c6c1daeSBarry Smith 
120710450e9eSJacob Faibussowitsch   Example Usage:
12085c6c1daeSBarry Smith .vb
12095c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12105c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12115c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12125c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12135c6c1daeSBarry Smith .ve
12145c6c1daeSBarry Smith 
1215d1f92df0SBarry Smith   Level: advanced
1216d1f92df0SBarry Smith 
12175c6c1daeSBarry Smith   Note:
12185c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1219811af0c4SBarry Smith   or an event number obtained with `PetscLogEventRegister()`.
12205c6c1daeSBarry Smith 
1221b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12225c6c1daeSBarry Smith @*/
1223d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event)
1224d71ae5a4SJacob Faibussowitsch {
12255c6c1daeSBarry Smith   PetscFunctionBegin;
1226b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE));
12273ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12285c6c1daeSBarry Smith }
12295c6c1daeSBarry Smith 
12305c6c1daeSBarry Smith /*@
12315c6c1daeSBarry Smith   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
12325c6c1daeSBarry Smith 
12335c6c1daeSBarry Smith   Not Collective
12345c6c1daeSBarry Smith 
12355c6c1daeSBarry Smith   Input Parameter:
12365c6c1daeSBarry Smith . event - The event id
12375c6c1daeSBarry Smith 
123810450e9eSJacob Faibussowitsch   Example Usage:
12395c6c1daeSBarry Smith .vb
12405c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12415c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12425c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12435c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12445c6c1daeSBarry Smith .ve
12455c6c1daeSBarry Smith 
1246d1f92df0SBarry Smith   Level: advanced
1247d1f92df0SBarry Smith 
12485c6c1daeSBarry Smith   Note:
12495c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in
1250811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
12515c6c1daeSBarry Smith 
1252d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12535c6c1daeSBarry Smith @*/
1254d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event)
1255d71ae5a4SJacob Faibussowitsch {
12565c6c1daeSBarry Smith   PetscFunctionBegin;
1257b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE));
12583ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12595c6c1daeSBarry Smith }
12605c6c1daeSBarry Smith 
12615c6c1daeSBarry Smith /*@
1262811af0c4SBarry Smith   PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called
1263c00cb57fSBarry Smith 
1264c00cb57fSBarry Smith   Not Collective
1265c00cb57fSBarry Smith 
1266c00cb57fSBarry Smith   Input Parameter:
1267c00cb57fSBarry Smith . event - The event id
1268c00cb57fSBarry Smith 
126910450e9eSJacob Faibussowitsch   Example Usage:
1270c00cb57fSBarry Smith .vb
1271c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1272c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1273c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1274c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1275c00cb57fSBarry Smith .ve
1276c00cb57fSBarry Smith 
1277d1f92df0SBarry Smith   Level: advanced
1278d1f92df0SBarry Smith 
1279c00cb57fSBarry Smith   Note:
1280c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1281811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1282c00cb57fSBarry Smith 
1283baca6076SPierre Jolivet   PETSc's default log handler (`PetscLogDefaultBegin()`) respects this function because it can make the output of `PetscLogView()` easier to interpret, but other handlers (such as the nested handler, `PetscLogNestedBegin()`) ignore it because suppressing events is not helpful in their output formats.
1284b665b14eSToby Isaac 
12854b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePop()`
1286c00cb57fSBarry Smith @*/
1287d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event)
1288d71ae5a4SJacob Faibussowitsch {
1289c00cb57fSBarry Smith   PetscFunctionBegin;
1290dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1291dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1292dff009beSToby Isaac 
1293dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event));
1294dff009beSToby Isaac   }
12953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1296c00cb57fSBarry Smith }
1297c00cb57fSBarry Smith 
1298c00cb57fSBarry Smith /*@
1299811af0c4SBarry Smith   PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()`
1300c00cb57fSBarry Smith 
1301c00cb57fSBarry Smith   Not Collective
1302c00cb57fSBarry Smith 
1303c00cb57fSBarry Smith   Input Parameter:
1304c00cb57fSBarry Smith . event - The event id
1305c00cb57fSBarry Smith 
130610450e9eSJacob Faibussowitsch   Example Usage:
1307c00cb57fSBarry Smith .vb
1308c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1309c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1310c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1311c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1312c00cb57fSBarry Smith .ve
1313c00cb57fSBarry Smith 
1314d1f92df0SBarry Smith   Level: advanced
1315d1f92df0SBarry Smith 
1316c00cb57fSBarry Smith   Note:
1317c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1318811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1319c00cb57fSBarry Smith 
1320d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`
1321c00cb57fSBarry Smith @*/
1322d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event)
1323d71ae5a4SJacob Faibussowitsch {
1324c00cb57fSBarry Smith   PetscFunctionBegin;
1325dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1326dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1327dff009beSToby Isaac 
1328dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event));
1329dff009beSToby Isaac   }
13303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1331c00cb57fSBarry Smith }
1332c00cb57fSBarry Smith 
1333c00cb57fSBarry Smith /*@
1334811af0c4SBarry Smith   PetscLogEventSetActiveAll - Turns on logging of all events
13355c6c1daeSBarry Smith 
13365c6c1daeSBarry Smith   Not Collective
13375c6c1daeSBarry Smith 
13385c6c1daeSBarry Smith   Input Parameters:
13395c6c1daeSBarry Smith + event    - The event id
13405c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged
13415c6c1daeSBarry Smith 
13425c6c1daeSBarry Smith   Level: advanced
13435c6c1daeSBarry Smith 
1344b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13455c6c1daeSBarry Smith @*/
1346d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive)
1347d71ae5a4SJacob Faibussowitsch {
1348b665b14eSToby Isaac   PetscLogState state;
13495c6c1daeSBarry Smith 
13505c6c1daeSBarry Smith   PetscFunctionBegin;
1351b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1352b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive));
1353b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13545c6c1daeSBarry Smith }
1355b665b14eSToby Isaac 
1356b665b14eSToby Isaac /*
1357b665b14eSToby Isaac   PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage
1358b665b14eSToby Isaac 
1359b665b14eSToby Isaac   Not Collective
1360b665b14eSToby Isaac 
1361b665b14eSToby Isaac   Input Parameters:
1362b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1363b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1364b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers.
1365b665b14eSToby Isaac 
1366b665b14eSToby Isaac   Level: developer
1367b665b14eSToby Isaac 
1368b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`
1369b665b14eSToby Isaac */
1370b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive)
1371b665b14eSToby Isaac {
1372b665b14eSToby Isaac   PetscLogState state;
1373b665b14eSToby Isaac 
1374b665b14eSToby Isaac   PetscFunctionBegin;
1375b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1376b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive));
13773ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13785c6c1daeSBarry Smith }
13795c6c1daeSBarry Smith 
13805c6c1daeSBarry Smith /*@
1381811af0c4SBarry Smith   PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage
13825c6c1daeSBarry Smith 
13835c6c1daeSBarry Smith   Not Collective
13845c6c1daeSBarry Smith 
13855c6c1daeSBarry Smith   Input Parameter:
1386811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
13875c6c1daeSBarry Smith 
13885c6c1daeSBarry Smith   Level: developer
13895c6c1daeSBarry Smith 
1390d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13915c6c1daeSBarry Smith @*/
1392d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid)
1393d71ae5a4SJacob Faibussowitsch {
13945c6c1daeSBarry Smith   PetscFunctionBegin;
1395b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE));
13963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13975c6c1daeSBarry Smith }
13985c6c1daeSBarry Smith 
13995c6c1daeSBarry Smith /*@
1400811af0c4SBarry Smith   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage
14015c6c1daeSBarry Smith 
14025c6c1daeSBarry Smith   Not Collective
14035c6c1daeSBarry Smith 
14045c6c1daeSBarry Smith   Input Parameter:
1405811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
14065c6c1daeSBarry Smith 
14075c6c1daeSBarry Smith   Level: developer
14085c6c1daeSBarry Smith 
1409d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
14105c6c1daeSBarry Smith @*/
1411d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid)
1412d71ae5a4SJacob Faibussowitsch {
14135c6c1daeSBarry Smith   PetscFunctionBegin;
1414b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE));
14153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
14165c6c1daeSBarry Smith }
14175c6c1daeSBarry Smith 
14185c6c1daeSBarry Smith /*MC
141962872c28SLisandro Dalcin   PetscLogEventSync - Synchronizes the beginning of a user event.
142062872c28SLisandro Dalcin 
142162872c28SLisandro Dalcin   Synopsis:
142262872c28SLisandro Dalcin   #include <petsclog.h>
1423b665b14eSToby Isaac   PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm)
142462872c28SLisandro Dalcin 
142562872c28SLisandro Dalcin   Collective
142662872c28SLisandro Dalcin 
142762872c28SLisandro Dalcin   Input Parameters:
1428b665b14eSToby Isaac + e    - `PetscLogEvent` obtained from `PetscLogEventRegister()`
142962872c28SLisandro Dalcin - comm - an MPI communicator
143062872c28SLisandro Dalcin 
143110450e9eSJacob Faibussowitsch   Example Usage:
143262872c28SLisandro Dalcin .vb
143362872c28SLisandro Dalcin   PetscLogEvent USER_EVENT;
143410450e9eSJacob Faibussowitsch 
143562872c28SLisandro Dalcin   PetscLogEventRegister("User event", 0, &USER_EVENT);
143662872c28SLisandro Dalcin   PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD);
143762872c28SLisandro Dalcin   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
143862872c28SLisandro Dalcin   [code segment to monitor]
143962872c28SLisandro Dalcin   PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0);
144062872c28SLisandro Dalcin .ve
144162872c28SLisandro Dalcin 
1442d1f92df0SBarry Smith   Level: developer
1443d1f92df0SBarry Smith 
1444811af0c4SBarry Smith   Note:
144510450e9eSJacob Faibussowitsch   This routine should be called only if there is not a `PetscObject` available to pass to
144610450e9eSJacob Faibussowitsch   `PetscLogEventBegin()`.
144762872c28SLisandro Dalcin 
1448d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`
144962872c28SLisandro Dalcin M*/
145062872c28SLisandro Dalcin 
145162872c28SLisandro Dalcin /*MC
14525c6c1daeSBarry Smith   PetscLogEventBegin - Logs the beginning of a user event.
14535c6c1daeSBarry Smith 
14545c6c1daeSBarry Smith   Synopsis:
1455aaa7dc30SBarry Smith   #include <petsclog.h>
1456b665b14eSToby Isaac   PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14575c6c1daeSBarry Smith 
14585c6c1daeSBarry Smith   Not Collective
14595c6c1daeSBarry Smith 
14605c6c1daeSBarry Smith   Input Parameters:
1461b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1462baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1463baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1464baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1465baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
14665c6c1daeSBarry Smith 
14675c6c1daeSBarry Smith   Fortran Synopsis:
14685c6c1daeSBarry Smith   void PetscLogEventBegin(int e, PetscErrorCode ierr)
14695c6c1daeSBarry Smith 
147010450e9eSJacob Faibussowitsch   Example Usage:
14715c6c1daeSBarry Smith .vb
14725c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
147310450e9eSJacob Faibussowitsch 
14745c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
14755c6c1daeSBarry Smith   PetscLogEventRegister("User event",0, &USER_EVENT);
14765c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
14775c6c1daeSBarry Smith   [code segment to monitor]
14785c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
14795c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
14805c6c1daeSBarry Smith .ve
14815c6c1daeSBarry Smith 
1482d1f92df0SBarry Smith   Level: intermediate
1483d1f92df0SBarry Smith 
1484811af0c4SBarry Smith   Developer Note:
148510450e9eSJacob Faibussowitsch   `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly
148610450e9eSJacob Faibussowitsch   handling the errors that occur in the macro directly because other packages that use this
148710450e9eSJacob Faibussowitsch   macros have used them in their own functions or methods that do not return error codes and it
148810450e9eSJacob Faibussowitsch   would be disruptive to change the current behavior.
1489d0609cedSBarry Smith 
1490d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()`
14915c6c1daeSBarry Smith M*/
14925c6c1daeSBarry Smith 
14935c6c1daeSBarry Smith /*MC
14945c6c1daeSBarry Smith   PetscLogEventEnd - Log the end of a user event.
14955c6c1daeSBarry Smith 
14965c6c1daeSBarry Smith   Synopsis:
1497aaa7dc30SBarry Smith   #include <petsclog.h>
1498b665b14eSToby Isaac   PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14995c6c1daeSBarry Smith 
15005c6c1daeSBarry Smith   Not Collective
15015c6c1daeSBarry Smith 
15025c6c1daeSBarry Smith   Input Parameters:
1503b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1504baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1505baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1506baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1507baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
15085c6c1daeSBarry Smith 
15095c6c1daeSBarry Smith   Fortran Synopsis:
15105c6c1daeSBarry Smith   void PetscLogEventEnd(int e, PetscErrorCode ierr)
15115c6c1daeSBarry Smith 
151210450e9eSJacob Faibussowitsch   Example Usage:
15135c6c1daeSBarry Smith .vb
15145c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
151510450e9eSJacob Faibussowitsch 
15165c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
151710450e9eSJacob Faibussowitsch   PetscLogEventRegister("User event", 0, &USER_EVENT);
15185c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
15195c6c1daeSBarry Smith   [code segment to monitor]
15205c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
15215c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
15225c6c1daeSBarry Smith .ve
15235c6c1daeSBarry Smith 
15245c6c1daeSBarry Smith   Level: intermediate
15255c6c1daeSBarry Smith 
1526d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()`
15275c6c1daeSBarry Smith M*/
15285c6c1daeSBarry Smith 
15295c6c1daeSBarry Smith /*@C
15308b08f494SToby Isaac   PetscLogStageGetPerfInfo - Return the performance information about the given stage
15318b08f494SToby Isaac 
1532cc4c1da9SBarry Smith   No Fortran Support
1533cc4c1da9SBarry Smith 
15348b08f494SToby Isaac   Input Parameters:
15358b08f494SToby Isaac . stage - The stage number or `PETSC_DETERMINE` for the current stage
15368b08f494SToby Isaac 
15378b08f494SToby Isaac   Output Parameter:
15388b08f494SToby Isaac . info - This structure is filled with the performance information
15398b08f494SToby Isaac 
15408b08f494SToby Isaac   Level: intermediate
15418b08f494SToby Isaac 
15428b08f494SToby Isaac   Notes:
15438b08f494SToby Isaac   This is a low level routine used by the logging functions in PETSc.
15448b08f494SToby Isaac 
15458b08f494SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15465804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15470ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15488b08f494SToby Isaac 
15498b08f494SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
15508b08f494SToby Isaac @*/
15518b08f494SToby Isaac PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage stage, PetscEventPerfInfo *info)
15528b08f494SToby Isaac {
15538b08f494SToby Isaac   PetscLogHandler     handler;
15548b08f494SToby Isaac   PetscEventPerfInfo *event_info;
15558b08f494SToby Isaac 
15568b08f494SToby Isaac   PetscFunctionBegin;
15578b08f494SToby Isaac   PetscAssertPointer(info, 2);
15580ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
15590ba5dad9SToby Isaac   if (handler) {
15608b08f494SToby Isaac     PetscCall(PetscLogHandlerGetStagePerfInfo(handler, stage, &event_info));
15618b08f494SToby Isaac     *info = *event_info;
15620ba5dad9SToby Isaac   } else {
15630ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogStageGetPerfInfo() returning zeros\n"));
15640ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
15650ba5dad9SToby Isaac   }
15668b08f494SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
15678b08f494SToby Isaac }
15688b08f494SToby Isaac 
15698b08f494SToby Isaac /*@C
1570b665b14eSToby Isaac   PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage
1571b665b14eSToby Isaac 
1572cc4c1da9SBarry Smith   No Fortran Support
1573cc4c1da9SBarry Smith 
1574b665b14eSToby Isaac   Input Parameters:
1575b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage
1576b665b14eSToby Isaac - event - The event number
1577b665b14eSToby Isaac 
1578b665b14eSToby Isaac   Output Parameter:
1579b665b14eSToby Isaac . info - This structure is filled with the performance information
1580b665b14eSToby Isaac 
1581b665b14eSToby Isaac   Level: intermediate
1582b665b14eSToby Isaac 
1583b665b14eSToby Isaac   Note:
1584b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1585b665b14eSToby Isaac 
15860ba5dad9SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15875804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15880ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15890ba5dad9SToby Isaac 
1590b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
1591b665b14eSToby Isaac @*/
1592b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info)
1593b665b14eSToby Isaac {
1594b665b14eSToby Isaac   PetscLogHandler     handler;
1595b665b14eSToby Isaac   PetscEventPerfInfo *event_info;
1596b665b14eSToby Isaac 
1597b665b14eSToby Isaac   PetscFunctionBegin;
1598b665b14eSToby Isaac   PetscAssertPointer(info, 3);
15990ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
16000ba5dad9SToby Isaac   if (handler) {
1601dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info));
1602b665b14eSToby Isaac     *info = *event_info;
16030ba5dad9SToby Isaac   } else {
16040ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogEventGetPerfInfo() returning zeros\n"));
16050ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
16060ba5dad9SToby Isaac   }
1607b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1608b665b14eSToby Isaac }
1609b665b14eSToby Isaac 
1610cc4c1da9SBarry Smith /*@
1611b665b14eSToby Isaac   PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event
1612b665b14eSToby Isaac 
1613b665b14eSToby Isaac   Not Collective
1614b665b14eSToby Isaac 
1615b665b14eSToby Isaac   Input Parameters:
1616b665b14eSToby Isaac + event - The event id to log
1617b665b14eSToby Isaac . n     - The dof index, in [0, 8)
1618b665b14eSToby Isaac - dof   - The number of dofs
1619b665b14eSToby Isaac 
1620b665b14eSToby Isaac   Options Database Key:
1621b665b14eSToby Isaac . -log_view - Activates log summary
1622b665b14eSToby Isaac 
1623b665b14eSToby Isaac   Level: developer
1624b665b14eSToby Isaac 
1625b665b14eSToby Isaac   Note:
1626b665b14eSToby Isaac   This is to enable logging of convergence
1627b665b14eSToby Isaac 
1628b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1629b665b14eSToby Isaac @*/
1630b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof)
1631b665b14eSToby Isaac {
1632b665b14eSToby Isaac   PetscFunctionBegin;
1633b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1634dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1635dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1636dff009beSToby Isaac 
1637dff009beSToby Isaac     if (h) {
1638dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1639dff009beSToby Isaac 
1640dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1641dff009beSToby Isaac       if (event_info) event_info->dof[n] = dof;
1642dff009beSToby Isaac     }
1643b665b14eSToby Isaac   }
1644b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1645b665b14eSToby Isaac }
1646b665b14eSToby Isaac 
1647cc4c1da9SBarry Smith /*@
1648b665b14eSToby Isaac   PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event
1649b665b14eSToby Isaac 
1650b665b14eSToby Isaac   Not Collective
1651b665b14eSToby Isaac 
1652b665b14eSToby Isaac   Input Parameters:
1653b665b14eSToby Isaac + event - The event id to log
1654b665b14eSToby Isaac . n     - The error index, in [0, 8)
1655b665b14eSToby Isaac - error - The error
1656b665b14eSToby Isaac 
1657b665b14eSToby Isaac   Options Database Key:
1658b665b14eSToby Isaac . -log_view - Activates log summary
1659b665b14eSToby Isaac 
1660b665b14eSToby Isaac   Level: developer
1661b665b14eSToby Isaac 
1662b665b14eSToby Isaac   Notes:
1663b665b14eSToby Isaac   This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example,
1664b665b14eSToby Isaac   as different norms, or as errors for different fields
1665b665b14eSToby Isaac 
1666b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1667b665b14eSToby Isaac 
1668b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1669b665b14eSToby Isaac @*/
1670b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error)
1671b665b14eSToby Isaac {
1672b665b14eSToby Isaac   PetscFunctionBegin;
1673b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1674dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1675dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1676dff009beSToby Isaac 
1677dff009beSToby Isaac     if (h) {
1678dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1679dff009beSToby Isaac 
1680dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1681dff009beSToby Isaac       if (event_info) event_info->errors[n] = error;
1682dff009beSToby Isaac     }
1683b665b14eSToby Isaac   }
1684b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1685b665b14eSToby Isaac }
1686b665b14eSToby Isaac 
1687cc4c1da9SBarry Smith /*@
16885c6c1daeSBarry Smith   PetscLogEventGetId - Returns the event id when given the event name.
16895c6c1daeSBarry Smith 
16905c6c1daeSBarry Smith   Not Collective
16915c6c1daeSBarry Smith 
16925c6c1daeSBarry Smith   Input Parameter:
16935c6c1daeSBarry Smith . name - The event name
16945c6c1daeSBarry Smith 
16955c6c1daeSBarry Smith   Output Parameter:
1696c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists
16975c6c1daeSBarry Smith 
16985c6c1daeSBarry Smith   Level: intermediate
16995c6c1daeSBarry Smith 
1700d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
17015c6c1daeSBarry Smith @*/
1702d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event)
1703d71ae5a4SJacob Faibussowitsch {
1704b665b14eSToby Isaac   PetscLogState state;
17055c6c1daeSBarry Smith 
17065c6c1daeSBarry Smith   PetscFunctionBegin;
1707b665b14eSToby Isaac   *event = -1;
1708b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1709b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event));
17103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
17115c6c1daeSBarry Smith }
17125c6c1daeSBarry Smith 
1713cc4c1da9SBarry Smith /*@
171453e0a2f3SToby Isaac   PetscLogEventGetName - Returns the event name when given the event id.
171553e0a2f3SToby Isaac 
171653e0a2f3SToby Isaac   Not Collective
171753e0a2f3SToby Isaac 
171853e0a2f3SToby Isaac   Input Parameter:
171953e0a2f3SToby Isaac . event - The event
172053e0a2f3SToby Isaac 
172153e0a2f3SToby Isaac   Output Parameter:
172253e0a2f3SToby Isaac . name - The event name
172353e0a2f3SToby Isaac 
172453e0a2f3SToby Isaac   Level: intermediate
172553e0a2f3SToby Isaac 
172653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
172753e0a2f3SToby Isaac @*/
1728cc4c1da9SBarry Smith PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char *name[])
172953e0a2f3SToby Isaac {
173053e0a2f3SToby Isaac   PetscLogEventInfo event_info;
173153e0a2f3SToby Isaac   PetscLogState     state;
173253e0a2f3SToby Isaac 
173353e0a2f3SToby Isaac   PetscFunctionBegin;
1734b665b14eSToby Isaac   *name = NULL;
173553e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1736b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
173753e0a2f3SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
173853e0a2f3SToby Isaac   *name = event_info.name;
173953e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
174053e0a2f3SToby Isaac }
174153e0a2f3SToby Isaac 
174253e0a2f3SToby Isaac /*@
174353e0a2f3SToby 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.
174453e0a2f3SToby Isaac 
174553e0a2f3SToby Isaac   Not collective
174653e0a2f3SToby Isaac 
174753e0a2f3SToby Isaac   Level: advanced
174853e0a2f3SToby Isaac 
174953e0a2f3SToby Isaac   Notes:
175053e0a2f3SToby 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()`).
175153e0a2f3SToby Isaac 
175253e0a2f3SToby Isaac   Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function.
175353e0a2f3SToby Isaac 
1754b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()`
175553e0a2f3SToby Isaac @*/
175653e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(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(PetscLogHandlerEventsPause(h));
1763dff009beSToby Isaac   }
176453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
176553e0a2f3SToby Isaac }
176653e0a2f3SToby Isaac 
176753e0a2f3SToby Isaac /*@
176853e0a2f3SToby Isaac   PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`.
176953e0a2f3SToby Isaac 
177053e0a2f3SToby Isaac   Not collective
177153e0a2f3SToby Isaac 
177253e0a2f3SToby Isaac   Level: advanced
177353e0a2f3SToby Isaac 
1774b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()`
177553e0a2f3SToby Isaac @*/
177653e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void)
177753e0a2f3SToby Isaac {
177853e0a2f3SToby Isaac   PetscFunctionBegin;
1779dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1780dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1781dff009beSToby Isaac 
1782dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsResume(h));
1783dff009beSToby Isaac   }
178453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
178553e0a2f3SToby Isaac }
178653e0a2f3SToby Isaac 
17871c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/
17881c1ad86eSToby Isaac 
17891c1ad86eSToby Isaac /*MC
17901c1ad86eSToby Isaac    PetscLogObjectCreate - Log the creation of a `PetscObject`
17911c1ad86eSToby Isaac 
17921c1ad86eSToby Isaac    Synopsis:
17931c1ad86eSToby Isaac    #include <petsclog.h>
17941c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectCreate(PetscObject h)
17951c1ad86eSToby Isaac 
17961c1ad86eSToby Isaac    Not Collective
17971c1ad86eSToby Isaac 
17981c1ad86eSToby Isaac    Input Parameters:
17991c1ad86eSToby Isaac .  h - A `PetscObject`
18001c1ad86eSToby Isaac 
18011c1ad86eSToby Isaac    Level: developer
18021c1ad86eSToby Isaac 
18031c1ad86eSToby Isaac    Developer Note:
18041c1ad86eSToby Isaac      Called internally by PETSc when creating objects: users do not need to call this directly.
1805b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18061c1ad86eSToby Isaac 
1807b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()`
18081c1ad86eSToby Isaac M*/
18091c1ad86eSToby Isaac 
18101c1ad86eSToby Isaac /*MC
18111c1ad86eSToby Isaac    PetscLogObjectDestroy - Logs the destruction of a `PetscObject`
18121c1ad86eSToby Isaac 
18131c1ad86eSToby Isaac    Synopsis:
18141c1ad86eSToby Isaac    #include <petsclog.h>
18151c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectDestroy(PetscObject h)
18161c1ad86eSToby Isaac 
18171c1ad86eSToby Isaac    Not Collective
18181c1ad86eSToby Isaac 
18191c1ad86eSToby Isaac    Input Parameters:
18201c1ad86eSToby Isaac .  h - A `PetscObject`
18211c1ad86eSToby Isaac 
18221c1ad86eSToby Isaac    Level: developer
18231c1ad86eSToby Isaac 
18241c1ad86eSToby Isaac    Developer Note:
18251c1ad86eSToby Isaac      Called internally by PETSc when destroying objects: users do not need to call this directly.
1826b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18271c1ad86eSToby Isaac 
1828b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()`
18291c1ad86eSToby Isaac M*/
18301c1ad86eSToby Isaac 
1831cc4c1da9SBarry Smith /*@
183253e0a2f3SToby Isaac   PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name.
183353e0a2f3SToby Isaac 
183453e0a2f3SToby Isaac   Not Collective
183553e0a2f3SToby Isaac 
183653e0a2f3SToby Isaac   Input Parameter:
183753e0a2f3SToby Isaac . name - The class name
183853e0a2f3SToby Isaac 
183953e0a2f3SToby Isaac   Output Parameter:
184053e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists
184153e0a2f3SToby Isaac 
184253e0a2f3SToby Isaac   Level: intermediate
184353e0a2f3SToby Isaac 
184453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
184553e0a2f3SToby Isaac @*/
184653e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid)
184753e0a2f3SToby Isaac {
184853e0a2f3SToby Isaac   PetscLogClass     log_class;
184953e0a2f3SToby Isaac   PetscLogClassInfo class_info;
185053e0a2f3SToby Isaac   PetscLogState     state;
185153e0a2f3SToby Isaac 
185253e0a2f3SToby Isaac   PetscFunctionBegin;
1853b665b14eSToby Isaac   *classid = -1;
185453e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1855b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
185653e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromName(state, name, &log_class));
185753e0a2f3SToby Isaac   if (log_class < 0) {
185853e0a2f3SToby Isaac     *classid = -1;
185953e0a2f3SToby Isaac     PetscFunctionReturn(PETSC_SUCCESS);
186053e0a2f3SToby Isaac   }
186153e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
186253e0a2f3SToby Isaac   *classid = class_info.classid;
186353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
186453e0a2f3SToby Isaac }
186553e0a2f3SToby Isaac 
186653e0a2f3SToby Isaac /*@C
186753e0a2f3SToby Isaac   PetscLogClassIdGetName - Returns a `PetscClassId`'s name.
186853e0a2f3SToby Isaac 
186953e0a2f3SToby Isaac   Not Collective
187053e0a2f3SToby Isaac 
187153e0a2f3SToby Isaac   Input Parameter:
187253e0a2f3SToby Isaac . classid - A `PetscClassId`
187353e0a2f3SToby Isaac 
187453e0a2f3SToby Isaac   Output Parameter:
187553e0a2f3SToby Isaac . name - The class name
187653e0a2f3SToby Isaac 
187753e0a2f3SToby Isaac   Level: intermediate
187853e0a2f3SToby Isaac 
187953e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()`
188053e0a2f3SToby Isaac @*/
188153e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name)
188253e0a2f3SToby Isaac {
188353e0a2f3SToby Isaac   PetscLogClass     log_class;
188453e0a2f3SToby Isaac   PetscLogClassInfo class_info;
188553e0a2f3SToby Isaac   PetscLogState     state;
188653e0a2f3SToby Isaac 
188753e0a2f3SToby Isaac   PetscFunctionBegin;
188853e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
188953e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class));
189053e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
189153e0a2f3SToby Isaac   *name = class_info.name;
189253e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
189353e0a2f3SToby Isaac }
189453e0a2f3SToby Isaac 
18955c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/
1896cc4c1da9SBarry Smith /*@
18975c6c1daeSBarry Smith   PetscLogDump - Dumps logs of objects to a file. This file is intended to
18985c6c1daeSBarry Smith   be read by bin/petscview. This program no longer exists.
18995c6c1daeSBarry Smith 
1900811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
19015c6c1daeSBarry Smith 
19025c6c1daeSBarry Smith   Input Parameter:
1903aec76313SJacob Faibussowitsch . sname - an optional file name
19045c6c1daeSBarry Smith 
190510450e9eSJacob Faibussowitsch   Example Usage:
19065c6c1daeSBarry Smith .vb
19075c6c1daeSBarry Smith   PetscInitialize(...);
1908b665b14eSToby Isaac   PetscLogDefaultBegin();
1909b665b14eSToby Isaac   // ... code ...
19105c6c1daeSBarry Smith   PetscLogDump(filename);
19115c6c1daeSBarry Smith   PetscFinalize();
19125c6c1daeSBarry Smith .ve
19135c6c1daeSBarry Smith 
1914d1f92df0SBarry Smith   Level: advanced
1915d1f92df0SBarry Smith 
1916811af0c4SBarry Smith   Note:
191737fdd005SBarry Smith   The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified,
19185c6c1daeSBarry Smith   this file will be used.
19195c6c1daeSBarry Smith 
1920b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
19215c6c1daeSBarry Smith @*/
1922d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[])
1923d71ae5a4SJacob Faibussowitsch {
1924b665b14eSToby Isaac   PetscLogHandler handler;
19255c6c1daeSBarry Smith 
19265c6c1daeSBarry Smith   PetscFunctionBegin;
1927294de794SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1928dff009beSToby Isaac   PetscCall(PetscLogHandlerDump(handler, sname));
1929b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
19305c6c1daeSBarry Smith }
1931b665b14eSToby Isaac 
1932cc4c1da9SBarry Smith /*@
1933b665b14eSToby Isaac   PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot.
1934b665b14eSToby Isaac 
19358f14a041SBarry Smith   Collective on `PETSC_COMM_WORLD`
1936b665b14eSToby Isaac 
1937b665b14eSToby Isaac   Input Parameter:
1938b665b14eSToby Isaac . sname - filename for the MPE logfile
1939b665b14eSToby Isaac 
1940b665b14eSToby Isaac   Level: advanced
1941b665b14eSToby Isaac 
1942b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()`
1943b665b14eSToby Isaac @*/
1944b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[])
1945b665b14eSToby Isaac {
1946b665b14eSToby Isaac   PetscFunctionBegin;
1947b665b14eSToby Isaac   #if defined(PETSC_HAVE_MPE)
1948b665b14eSToby Isaac   if (PetscBeganMPE) {
1949b665b14eSToby Isaac     char name[PETSC_MAX_PATH_LEN];
1950b665b14eSToby Isaac 
1951b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Finalizing MPE.\n"));
1952b665b14eSToby Isaac     if (sname) {
1953b665b14eSToby Isaac       PetscCall(PetscStrncpy(name, sname, sizeof(name)));
19545c6c1daeSBarry Smith     } else {
1955b665b14eSToby Isaac       PetscCall(PetscGetProgramName(name, sizeof(name)));
19565c6c1daeSBarry Smith     }
1957b665b14eSToby Isaac     PetscCall(MPE_Finish_log(name));
19585c6c1daeSBarry Smith   } else {
1959b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n"));
19605c6c1daeSBarry Smith   }
1961c2a741eeSJunchao Zhang   #else
1962b665b14eSToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
1963c2a741eeSJunchao Zhang   #endif
19643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19655c6c1daeSBarry Smith }
19665c6c1daeSBarry Smith 
1967ffeef943SBarry Smith /*@
19687d6c928cSSatish Balay   PetscLogView - Prints a summary of the logging.
19695c6c1daeSBarry Smith 
19708f14a041SBarry Smith   Collective
19715c6c1daeSBarry Smith 
19725c6c1daeSBarry Smith   Input Parameter:
1973f14045dbSBarry Smith . viewer - an ASCII viewer
19745c6c1daeSBarry Smith 
19755c6c1daeSBarry Smith   Options Database Keys:
1976bb1d7374SBarry Smith + -log_view [:filename]                    - Prints summary of log information
1977bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file
1978607d249eSBarry 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)
1979d0a29bd7SConnor 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)
1980156b51fbSBarry Smith . -log_view_memory                         - Also display memory usage in each event
1981156b51fbSBarry Smith . -log_view_gpu_time                       - Also display time in each event for GPU kernels (Note this may slow the computation)
1982811af0c4SBarry Smith . -log_all                                 - Saves a file Log.rank for each MPI rank with details of each step of the computation
1983bb1d7374SBarry Smith - -log_trace [filename]                    - Displays a trace of what each process is doing
19845c6c1daeSBarry Smith 
1985d1f92df0SBarry Smith   Level: beginner
1986d1f92df0SBarry Smith 
19875c6c1daeSBarry Smith   Notes:
1988da81f932SPierre Jolivet   It is possible to control the logging programmatically but we recommend using the options database approach whenever possible
19895c6c1daeSBarry Smith   By default the summary is printed to stdout.
19905c6c1daeSBarry Smith 
1991bb1d7374SBarry Smith   Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin()
1992bb1d7374SBarry Smith 
1993bb1d7374SBarry Smith   If PETSc is configured with --with-logging=0 then this functionality is not available
1994bb1d7374SBarry Smith 
1995607d249eSBarry Smith   To view the nested XML format filename.xml first copy  ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current
1996607d249eSBarry Smith   directory then open filename.xml with your browser. Specific notes for certain browsers
19971d27aa22SBarry Smith .vb
19981d27aa22SBarry Smith     Firefox and Internet explorer - simply open the file
19991d27aa22SBarry Smith     Google Chrome - you must start up Chrome with the option --allow-file-access-from-files
20001d27aa22SBarry Smith     Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access
20011d27aa22SBarry Smith .ve
20021d27aa22SBarry 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
2003607d249eSBarry Smith   your browser.
20042add09c0SLisandro Dalcin   Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser
20052add09c0SLisandro Dalcin   window and render the XML log file contents.
2006607d249eSBarry Smith 
2007bb1d7374SBarry Smith   The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij  MARITIME  RESEARCH  INSTITUTE  NETHERLANDS
2008bb1d7374SBarry Smith 
20091d27aa22SBarry Smith   The Flame Graph output can be visualised using either the original Flame Graph script <https://github.com/brendangregg/FlameGraph>
20101d27aa22SBarry Smith   or using speedscope <https://www.speedscope.app>.
2011d0a29bd7SConnor Ward   Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py.
2012d0a29bd7SConnor Ward 
2013d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()`
20145c6c1daeSBarry Smith @*/
2015d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer)
2016d71ae5a4SJacob Faibussowitsch {
2017f14045dbSBarry Smith   PetscBool         isascii;
2018f14045dbSBarry Smith   PetscViewerFormat format;
2019b665b14eSToby Isaac   int               stage;
2020b665b14eSToby Isaac   PetscLogState     state;
2021b665b14eSToby Isaac   PetscIntStack     temp_stack;
2022b665b14eSToby Isaac   PetscLogHandler   handler;
2023b665b14eSToby Isaac   PetscBool         is_empty;
20245c6c1daeSBarry Smith 
20255c6c1daeSBarry Smith   PetscFunctionBegin;
2026b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
202737b78d16SBarry Smith   /* Pop off any stages the user forgot to remove */
2028b665b14eSToby Isaac   PetscCall(PetscIntStackCreate(&temp_stack));
2029b665b14eSToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
203037b78d16SBarry Smith   while (stage >= 0) {
2031b665b14eSToby Isaac     PetscCall(PetscLogStagePop());
2032b665b14eSToby Isaac     PetscCall(PetscIntStackPush(temp_stack, stage));
2033b665b14eSToby Isaac     PetscCall(PetscLogStateGetCurrentStage(state, &stage));
203437b78d16SBarry Smith   }
20359566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
203628b400f6SJacob Faibussowitsch   PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII");
20379566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
2038b665b14eSToby Isaac   if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
2039294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler));
2040b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
2041b665b14eSToby Isaac   } else {
2042294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
2043b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
20445c6c1daeSBarry Smith   }
2045b665b14eSToby Isaac   PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2046b665b14eSToby Isaac   while (!is_empty) {
2047b665b14eSToby Isaac     PetscCall(PetscIntStackPop(temp_stack, &stage));
2048b665b14eSToby Isaac     PetscCall(PetscLogStagePush(stage));
2049b665b14eSToby Isaac     PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2050b665b14eSToby Isaac   }
2051b665b14eSToby Isaac   PetscCall(PetscIntStackDestroy(temp_stack));
20523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20535c6c1daeSBarry Smith }
20545c6c1daeSBarry Smith 
2055f14045dbSBarry Smith /*@C
2056811af0c4SBarry Smith   PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed.
2057f14045dbSBarry Smith 
2058811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
2059f14045dbSBarry Smith 
2060811af0c4SBarry Smith   Level: developer
2061f14045dbSBarry Smith 
2062d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`
2063f14045dbSBarry Smith @*/
2064d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void)
2065d71ae5a4SJacob Faibussowitsch {
2066ad2e3d55SToby Isaac   PetscInt          n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX;
2067ad2e3d55SToby Isaac   PetscViewer       viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2068ad2e3d55SToby Isaac   PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2069f14045dbSBarry Smith   PetscBool         flg;
2070f14045dbSBarry Smith 
2071f14045dbSBarry Smith   PetscFunctionBegin;
2072648c30bcSBarry Smith   PetscCall(PetscOptionsCreateViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg));
2073ad2e3d55SToby Isaac   for (PetscInt i = 0; i < n_max; i++) {
2074ad2e3d55SToby Isaac     PetscCall(PetscViewerPushFormat(viewers[i], formats[i]));
2075ad2e3d55SToby Isaac     PetscCall(PetscLogView(viewers[i]));
2076ad2e3d55SToby Isaac     PetscCall(PetscViewerPopFormat(viewers[i]));
2077648c30bcSBarry Smith     PetscCall(PetscViewerDestroy(&viewers[i]));
2078f14045dbSBarry Smith   }
20793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2080f14045dbSBarry Smith }
2081f14045dbSBarry Smith 
2082b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *);
2083b665b14eSToby Isaac 
2084b665b14eSToby Isaac /*@
2085b665b14eSToby Isaac   PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event
2086b665b14eSToby Isaac   that takes 1 or more percent of the time.
2087b665b14eSToby Isaac 
20888f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
2089b665b14eSToby Isaac 
2090b665b14eSToby Isaac   Input Parameter:
2091b665b14eSToby Isaac . newThresh - the threshold to use
2092b665b14eSToby Isaac 
2093b665b14eSToby Isaac   Output Parameter:
2094b665b14eSToby Isaac . oldThresh - the previously set threshold value
2095b665b14eSToby Isaac 
2096b665b14eSToby Isaac   Options Database Keys:
2097b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
2098b665b14eSToby Isaac 
2099b665b14eSToby Isaac   Example Usage:
2100b665b14eSToby Isaac .vb
2101b665b14eSToby Isaac   PetscInitialize(...);
2102b665b14eSToby Isaac   PetscLogNestedBegin();
2103b665b14eSToby Isaac   PetscLogSetThreshold(0.1,&oldthresh);
2104b665b14eSToby Isaac   // ... code ...
2105b665b14eSToby Isaac   PetscLogView(viewer);
2106b665b14eSToby Isaac   PetscFinalize();
2107b665b14eSToby Isaac .ve
2108b665b14eSToby Isaac 
2109b665b14eSToby Isaac   Level: advanced
2110b665b14eSToby Isaac 
2111b665b14eSToby Isaac   Note:
2112b665b14eSToby Isaac   This threshold is only used by the nested log handler
2113b665b14eSToby Isaac 
2114b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`,
2115b665b14eSToby Isaac           `PetscLogNestedBegin()`
2116b665b14eSToby Isaac @*/
2117b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh)
2118b665b14eSToby Isaac {
2119b665b14eSToby Isaac   PetscLogHandler handler;
2120b665b14eSToby Isaac 
2121b665b14eSToby Isaac   PetscFunctionBegin;
2122294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler));
2123b665b14eSToby Isaac   PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh));
2124b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2125b665b14eSToby Isaac }
2126b665b14eSToby Isaac 
21275c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/
2128cc4c1da9SBarry Smith /*@
21295c6c1daeSBarry Smith   PetscGetFlops - Returns the number of flops used on this processor
21305c6c1daeSBarry Smith   since the program began.
21315c6c1daeSBarry Smith 
21325c6c1daeSBarry Smith   Not Collective
21335c6c1daeSBarry Smith 
21345c6c1daeSBarry Smith   Output Parameter:
213510450e9eSJacob Faibussowitsch . flops - number of floating point operations
21365c6c1daeSBarry Smith 
2137d1f92df0SBarry Smith   Level: intermediate
2138d1f92df0SBarry Smith 
21395c6c1daeSBarry Smith   Notes:
21405c6c1daeSBarry Smith   A global counter logs all PETSc flop counts.  The user can use
2141811af0c4SBarry Smith   `PetscLogFlops()` to increment this counter to include flops for the
21425c6c1daeSBarry Smith   application code.
21435c6c1daeSBarry Smith 
21444b7c4d4dSPierre Jolivet   A separate counter `PetscLogGpuFlops()` logs the flops that occur on any GPU associated with this MPI rank
2145811af0c4SBarry Smith 
21464b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscTime()`, `PetscLogFlops()`
21475c6c1daeSBarry Smith @*/
2148d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops)
2149d71ae5a4SJacob Faibussowitsch {
21505c6c1daeSBarry Smith   PetscFunctionBegin;
21515c6c1daeSBarry Smith   *flops = petsc_TotalFlops;
21523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21535c6c1daeSBarry Smith }
21545c6c1daeSBarry Smith 
21551c1ad86eSToby Isaac /*@C
21561c1ad86eSToby Isaac   PetscLogObjectState - Record information about an object with the default log handler
21571c1ad86eSToby Isaac 
21581c1ad86eSToby Isaac   Not Collective
21591c1ad86eSToby Isaac 
21601c1ad86eSToby Isaac   Input Parameters:
21611c1ad86eSToby Isaac + obj    - the `PetscObject`
21621c1ad86eSToby Isaac . format - a printf-style format string
21631c1ad86eSToby Isaac - ...    - printf arguments to format
21641c1ad86eSToby Isaac 
21651c1ad86eSToby Isaac   Level: developer
21661c1ad86eSToby Isaac 
2167b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()`
21681c1ad86eSToby Isaac @*/
2169d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...)
2170d71ae5a4SJacob Faibussowitsch {
21715c6c1daeSBarry Smith   PetscFunctionBegin;
2172dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
2173dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
2174dff009beSToby Isaac 
2175dff009beSToby Isaac     if (h) {
2176dff009beSToby Isaac       va_list Argp;
21775c6c1daeSBarry Smith       va_start(Argp, format);
2178dff009beSToby Isaac       PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp));
21795c6c1daeSBarry Smith       va_end(Argp);
2180b665b14eSToby Isaac     }
2181dff009beSToby Isaac   }
21823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21835c6c1daeSBarry Smith }
21845c6c1daeSBarry Smith 
21855c6c1daeSBarry Smith /*MC
21865c6c1daeSBarry Smith   PetscLogFlops - Adds floating point operations to the global counter.
21875c6c1daeSBarry Smith 
21885c6c1daeSBarry Smith   Synopsis:
2189aaa7dc30SBarry Smith   #include <petsclog.h>
21905c6c1daeSBarry Smith   PetscErrorCode PetscLogFlops(PetscLogDouble f)
21915c6c1daeSBarry Smith 
21925c6c1daeSBarry Smith   Not Collective
21935c6c1daeSBarry Smith 
21945c6c1daeSBarry Smith   Input Parameter:
21955c6c1daeSBarry Smith . f - flop counter
21965c6c1daeSBarry Smith 
219710450e9eSJacob Faibussowitsch   Example Usage:
21985c6c1daeSBarry Smith .vb
21995c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
220010450e9eSJacob Faibussowitsch 
22015c6c1daeSBarry Smith   PetscLogEventRegister("User event", 0, &USER_EVENT);
22025c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
22035c6c1daeSBarry Smith   [code segment to monitor]
22045c6c1daeSBarry Smith   PetscLogFlops(user_flops)
22055c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
22065c6c1daeSBarry Smith .ve
22075c6c1daeSBarry Smith 
2208d1f92df0SBarry Smith   Level: intermediate
2209d1f92df0SBarry Smith 
2210811af0c4SBarry Smith   Note:
221110450e9eSJacob Faibussowitsch    A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment
221210450e9eSJacob Faibussowitsch    this counter to include flops for the application code.
22135c6c1daeSBarry Smith 
22144b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()`
22155c6c1daeSBarry Smith M*/
22165c6c1daeSBarry Smith 
22175c6c1daeSBarry Smith /*MC
221810450e9eSJacob Faibussowitsch   PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate
221910450e9eSJacob Faibussowitsch   timings
22205c6c1daeSBarry Smith 
22215c6c1daeSBarry Smith   Synopsis:
2222aaa7dc30SBarry Smith   #include <petsclog.h>
22235c6c1daeSBarry Smith   void PetscPreLoadBegin(PetscBool flag, char *name);
22245c6c1daeSBarry Smith 
22255c6c1daeSBarry Smith   Not Collective
22265c6c1daeSBarry Smith 
2227d8d19677SJose E. Roman   Input Parameters:
222810450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command
222910450e9eSJacob Faibussowitsch          line option `-preload true|false`
223010450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded
22315c6c1daeSBarry Smith 
223210450e9eSJacob Faibussowitsch   Example Usage:
22335c6c1daeSBarry Smith .vb
223410450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
223510450e9eSJacob Faibussowitsch   // lines of code
22365c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
223710450e9eSJacob Faibussowitsch   // lines of code
22385c6c1daeSBarry Smith   PetscPreLoadEnd();
22395c6c1daeSBarry Smith .ve
22405c6c1daeSBarry Smith 
2241d1f92df0SBarry Smith   Level: intermediate
2242d1f92df0SBarry Smith 
2243811af0c4SBarry Smith   Note:
224495452b02SPatrick Sanan   Only works in C/C++, not Fortran
22455c6c1daeSBarry Smith 
224610450e9eSJacob Faibussowitsch   Flags available within the macro\:
224710450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading
224810450e9eSJacob Faibussowitsch . PetscPreLoadingOn   - `PETSC_TRUE` if it is CURRENTLY doing preload
224910450e9eSJacob Faibussowitsch . PetscPreLoadIt      - `0` for the first computation (with preloading turned off it is only
225010450e9eSJacob Faibussowitsch                         `0`) `1`  for the second
225110450e9eSJacob Faibussowitsch - PetscPreLoadMax     - number of times it will do the computation, only one when preloading is
225210450e9eSJacob Faibussowitsch                         turned on
225310450e9eSJacob Faibussowitsch 
225410450e9eSJacob Faibussowitsch   The first two variables are available throughout the program, the second two only between the
225510450e9eSJacob Faibussowitsch   `PetscPreLoadBegin()` and `PetscPreLoadEnd()`
22565c6c1daeSBarry Smith 
2257d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
22585c6c1daeSBarry Smith M*/
22595c6c1daeSBarry Smith 
22605c6c1daeSBarry Smith /*MC
226110450e9eSJacob Faibussowitsch   PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate
226210450e9eSJacob Faibussowitsch   timings
22635c6c1daeSBarry Smith 
22645c6c1daeSBarry Smith   Synopsis:
2265aaa7dc30SBarry Smith   #include <petsclog.h>
22665c6c1daeSBarry Smith   void PetscPreLoadEnd(void);
22675c6c1daeSBarry Smith 
22685c6c1daeSBarry Smith   Not Collective
22695c6c1daeSBarry Smith 
227010450e9eSJacob Faibussowitsch   Example Usage:
22715c6c1daeSBarry Smith .vb
227210450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
227310450e9eSJacob Faibussowitsch   // lines of code
22745c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
227510450e9eSJacob Faibussowitsch   // lines of code
22765c6c1daeSBarry Smith   PetscPreLoadEnd();
22775c6c1daeSBarry Smith .ve
22785c6c1daeSBarry Smith 
2279d1f92df0SBarry Smith   Level: intermediate
2280d1f92df0SBarry Smith 
2281811af0c4SBarry Smith   Note:
2282dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
22835c6c1daeSBarry Smith 
2284d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()`
22855c6c1daeSBarry Smith M*/
22865c6c1daeSBarry Smith 
22875c6c1daeSBarry Smith /*MC
228810450e9eSJacob Faibussowitsch   PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings
22895c6c1daeSBarry Smith 
22905c6c1daeSBarry Smith   Synopsis:
2291aaa7dc30SBarry Smith   #include <petsclog.h>
22925c6c1daeSBarry Smith   void PetscPreLoadStage(char *name);
22935c6c1daeSBarry Smith 
22945c6c1daeSBarry Smith   Not Collective
22955c6c1daeSBarry Smith 
229610450e9eSJacob Faibussowitsch   Example Usage:
22975c6c1daeSBarry Smith .vb
229810450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE,"first stage");
229910450e9eSJacob Faibussowitsch   // lines of code
23005c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
230110450e9eSJacob Faibussowitsch   // lines of code
23025c6c1daeSBarry Smith   PetscPreLoadEnd();
23035c6c1daeSBarry Smith .ve
23045c6c1daeSBarry Smith 
2305d1f92df0SBarry Smith   Level: intermediate
2306d1f92df0SBarry Smith 
2307811af0c4SBarry Smith   Note:
2308dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
23095c6c1daeSBarry Smith 
2310d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`
23115c6c1daeSBarry Smith M*/
23125c6c1daeSBarry Smith 
2313a4af0ceeSJacob Faibussowitsch   #if PetscDefined(HAVE_DEVICE)
2314a4af0ceeSJacob Faibussowitsch     #include <petsc/private/deviceimpl.h>
23159ffd0706SHong Zhang 
2316cc4c1da9SBarry Smith /*@
2317156b51fbSBarry Smith   PetscLogGpuTime - turn on the logging of GPU time for GPU kernels
2318156b51fbSBarry Smith 
2319811af0c4SBarry Smith   Options Database Key:
2320efa05fe8SBarry Smith . -log_view_gpu_time - provide the GPU times for all events in the `-log_view` output
2321156b51fbSBarry Smith 
2322d1f92df0SBarry Smith   Level: advanced
2323d1f92df0SBarry Smith 
2324156b51fbSBarry Smith   Notes:
232510450e9eSJacob Faibussowitsch   Turning on the timing of the GPU kernels can slow down the entire computation and should only
2326efa05fe8SBarry Smith   be used when studying the performance of individual operations on GPU such as vector operations and
232710450e9eSJacob Faibussowitsch   matrix-vector operations.
2328156b51fbSBarry Smith 
2329efa05fe8SBarry Smith   If this option is not used then times for most of the events in the `-log_view` output will be listed as Nan, indicating the times are not available
2330efa05fe8SBarry Smith 
233110450e9eSJacob Faibussowitsch   This routine should only be called once near the beginning of the program. Once it is started
233210450e9eSJacob Faibussowitsch   it cannot be turned off.
2333156b51fbSBarry Smith 
2334d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()`
2335156b51fbSBarry Smith @*/
2336d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void)
2337d71ae5a4SJacob Faibussowitsch {
2338473903fcSJunchao Zhang   PetscFunctionBegin;
2339473903fcSJunchao Zhang   PetscCheck(petsc_gtime == 0.0, PETSC_COMM_SELF, PETSC_ERR_SUP, "GPU logging has already been turned on");
2340156b51fbSBarry Smith   PetscLogGpuTimeFlag = PETSC_TRUE;
2341473903fcSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
2342156b51fbSBarry Smith }
2343156b51fbSBarry Smith 
2344cc4c1da9SBarry Smith /*@
23459ffd0706SHong Zhang   PetscLogGpuTimeBegin - Start timer for device
23469ffd0706SHong Zhang 
2347d1f92df0SBarry Smith   Level: intermediate
2348d1f92df0SBarry Smith 
23499ffd0706SHong Zhang   Notes:
23507d766218SJunchao Zhang   When GPU is enabled, the timer is run on the GPU, it is a separate logging of time
235110450e9eSJacob Faibussowitsch   devoted to GPU computations (excluding kernel launch times).
2352811af0c4SBarry Smith 
23537d766218SJunchao Zhang   When GPU is not available, the timer is run on the CPU, it is a separate logging of
235410450e9eSJacob Faibussowitsch   time devoted to GPU computations (including kernel launch times).
2355811af0c4SBarry Smith 
235610450e9eSJacob Faibussowitsch   There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and
235710450e9eSJacob Faibussowitsch   `PetscLogGpuTimeEnd()`
2358811af0c4SBarry Smith 
235910450e9eSJacob Faibussowitsch   This timer should NOT include times for data transfers between the GPU and CPU, nor setup
236010450e9eSJacob Faibussowitsch   actions such as allocating space.
2361811af0c4SBarry Smith 
236210450e9eSJacob Faibussowitsch   The regular logging captures the time for data transfers and any CPU activities during the
236310450e9eSJacob Faibussowitsch   event. It is used to compute the flop rate on the GPU as it is actively engaged in running a
236410450e9eSJacob Faibussowitsch   kernel.
23659ffd0706SHong Zhang 
23669ffd0706SHong Zhang   Developer Notes:
236710450e9eSJacob Faibussowitsch   The GPU event timer captures the execution time of all the kernels launched in the default
236810450e9eSJacob Faibussowitsch   stream by the CPU between `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()`.
2369811af0c4SBarry Smith 
237010450e9eSJacob Faibussowitsch   `PetscLogGpuTimeBegin()` and `PetsLogGpuTimeEnd()` insert the begin and end events into the
237110450e9eSJacob Faibussowitsch   default stream (stream 0). The device will record a time stamp for the event when it reaches
237210450e9eSJacob Faibussowitsch   that event in the stream. The function xxxEventSynchronize() is called in
237310450e9eSJacob Faibussowitsch   `PetsLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the
237410450e9eSJacob Faibussowitsch   timer event is recorded.
23759ffd0706SHong Zhang 
2376d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()`
23779ffd0706SHong Zhang @*/
2378d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void)
2379d71ae5a4SJacob Faibussowitsch {
2380b665b14eSToby Isaac   PetscBool isActive;
2381b665b14eSToby Isaac 
23829ffd0706SHong Zhang   PetscFunctionBegin;
2383b665b14eSToby Isaac   PetscCall(PetscLogEventBeginIsActive(&isActive));
2384b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
23857d766218SJunchao Zhang     #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
23867d766218SJunchao Zhang   {
2387a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2388a4af0ceeSJacob Faibussowitsch 
23899566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
23909566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextBeginTimer_Internal(dctx));
2391a4af0ceeSJacob Faibussowitsch   }
23927d766218SJunchao Zhang     #else
23937d766218SJunchao Zhang   PetscCall(PetscTimeSubtract(&petsc_gtime));
23947d766218SJunchao Zhang     #endif
23953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23969ffd0706SHong Zhang }
23979ffd0706SHong Zhang 
2398cc4c1da9SBarry Smith /*@
23999ffd0706SHong Zhang   PetscLogGpuTimeEnd - Stop timer for device
24009ffd0706SHong Zhang 
24019ffd0706SHong Zhang   Level: intermediate
24029ffd0706SHong Zhang 
2403d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()`
24049ffd0706SHong Zhang @*/
2405d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void)
2406d71ae5a4SJacob Faibussowitsch {
2407b665b14eSToby Isaac   PetscBool isActive;
2408b665b14eSToby Isaac 
24099ffd0706SHong Zhang   PetscFunctionBegin;
2410b665b14eSToby Isaac   PetscCall(PetscLogEventEndIsActive(&isActive));
2411b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
24127d766218SJunchao Zhang     #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
24137d766218SJunchao Zhang   {
2414a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2415a4af0ceeSJacob Faibussowitsch     PetscLogDouble     elapsed;
2416a4af0ceeSJacob Faibussowitsch 
24179566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
24189566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed));
2419a4af0ceeSJacob Faibussowitsch     petsc_gtime += (elapsed / 1000.0);
2420a4af0ceeSJacob Faibussowitsch   }
24217d766218SJunchao Zhang     #else
24227d766218SJunchao Zhang   PetscCall(PetscTimeAdd(&petsc_gtime));
24237d766218SJunchao Zhang     #endif
24243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24259ffd0706SHong Zhang }
2426c708d6e3SStefano Zampini 
24279ffd0706SHong Zhang   #endif /* end of PETSC_HAVE_DEVICE */
24289ffd0706SHong Zhang 
2429cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/
2430cb9ef012SToby Isaac 
2431dd01b7e5SBarry Smith /* -- Utility functions for logging from Fortran -- */
2432b665b14eSToby Isaac 
2433b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype)
2434b665b14eSToby Isaac {
2435b665b14eSToby Isaac   PetscFunctionBegin;
2436cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2437b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1));
2438b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2439b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th));
2440b665b14eSToby Isaac   #endif
2441cb9ef012SToby Isaac #endif
2442b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2443b665b14eSToby Isaac }
2444b665b14eSToby Isaac 
2445b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype)
2446b665b14eSToby Isaac {
2447b665b14eSToby Isaac   PetscFunctionBegin;
2448cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2449b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1));
2450b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2451b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_recv_len, &petsc_recv_len_th));
2452b665b14eSToby Isaac   #endif
2453cb9ef012SToby Isaac #endif
2454b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2455b665b14eSToby Isaac }
2456b665b14eSToby Isaac 
2457b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void)
2458b665b14eSToby Isaac {
2459b665b14eSToby Isaac   PetscFunctionBegin;
2460cb9ef012SToby Isaac   if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1));
2461b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2462b665b14eSToby Isaac }
2463b665b14eSToby Isaac 
24645c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
24655c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID  = 0;
24665c6c1daeSBarry Smith 
24672611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE;
24682611ad71SToby Isaac 
24692611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void)
24702611ad71SToby Isaac {
24712611ad71SToby Isaac   int stage;
24722611ad71SToby Isaac 
24732611ad71SToby Isaac   PetscFunctionBegin;
24742611ad71SToby Isaac   if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS);
24752611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_TRUE;
24762611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
24772611ad71SToby Isaac     /* Setup default logging structures */
24782611ad71SToby Isaac     PetscCall(PetscLogStateCreate(&petsc_log_state));
24792611ad71SToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
24802611ad71SToby Isaac       if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state));
24812611ad71SToby Isaac     }
24822611ad71SToby Isaac     PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage));
24832611ad71SToby Isaac     PetscCall(PetscSpinlockCreate(&PetscLogSpinLock));
24842611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY)
24852611ad71SToby Isaac     petsc_log_tid = 0;
24862611ad71SToby Isaac     petsc_log_gid = 0;
24872611ad71SToby Isaac #endif
24882611ad71SToby Isaac 
24892611ad71SToby Isaac     /* All processors sync here for more consistent logging */
24902611ad71SToby Isaac     PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
24912611ad71SToby Isaac     PetscCall(PetscTime(&petsc_BaseTime));
24922611ad71SToby Isaac     PetscCall(PetscLogStagePush(stage));
24932611ad71SToby Isaac   }
24942611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
24952611ad71SToby Isaac }
24962611ad71SToby Isaac 
24972611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void)
24982611ad71SToby Isaac {
24992611ad71SToby Isaac   PetscFunctionBegin;
25002611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
2501b665b14eSToby Isaac     /* Resetting phase */
2502b665b14eSToby Isaac     // pop remaining stages
2503b665b14eSToby Isaac     if (petsc_log_state) {
2504b665b14eSToby Isaac       while (petsc_log_state->current_stage >= 0) { PetscCall(PetscLogStagePop()); }
2505b665b14eSToby Isaac     }
25062611ad71SToby Isaac     for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler));
25072611ad71SToby Isaac     PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX));
25082611ad71SToby Isaac     PetscCall(PetscLogStateDestroy(&petsc_log_state));
25092611ad71SToby Isaac 
25102611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25112611ad71SToby Isaac     petsc_BaseTime           = 0.0;
25122611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25132611ad71SToby Isaac     petsc_send_ct            = 0.0;
25142611ad71SToby Isaac     petsc_recv_ct            = 0.0;
25152611ad71SToby Isaac     petsc_send_len           = 0.0;
25162611ad71SToby Isaac     petsc_recv_len           = 0.0;
25172611ad71SToby Isaac     petsc_isend_ct           = 0.0;
25182611ad71SToby Isaac     petsc_irecv_ct           = 0.0;
25192611ad71SToby Isaac     petsc_isend_len          = 0.0;
25202611ad71SToby Isaac     petsc_irecv_len          = 0.0;
25212611ad71SToby Isaac     petsc_wait_ct            = 0.0;
25222611ad71SToby Isaac     petsc_wait_any_ct        = 0.0;
25232611ad71SToby Isaac     petsc_wait_all_ct        = 0.0;
25242611ad71SToby Isaac     petsc_sum_of_waits_ct    = 0.0;
25252611ad71SToby Isaac     petsc_allreduce_ct       = 0.0;
25262611ad71SToby Isaac     petsc_gather_ct          = 0.0;
25272611ad71SToby Isaac     petsc_scatter_ct         = 0.0;
25282611ad71SToby Isaac     petsc_TotalFlops_th      = 0.0;
25292611ad71SToby Isaac     petsc_send_ct_th         = 0.0;
25302611ad71SToby Isaac     petsc_recv_ct_th         = 0.0;
25312611ad71SToby Isaac     petsc_send_len_th        = 0.0;
25322611ad71SToby Isaac     petsc_recv_len_th        = 0.0;
25332611ad71SToby Isaac     petsc_isend_ct_th        = 0.0;
25342611ad71SToby Isaac     petsc_irecv_ct_th        = 0.0;
25352611ad71SToby Isaac     petsc_isend_len_th       = 0.0;
25362611ad71SToby Isaac     petsc_irecv_len_th       = 0.0;
25372611ad71SToby Isaac     petsc_wait_ct_th         = 0.0;
25382611ad71SToby Isaac     petsc_wait_any_ct_th     = 0.0;
25392611ad71SToby Isaac     petsc_wait_all_ct_th     = 0.0;
25402611ad71SToby Isaac     petsc_sum_of_waits_ct_th = 0.0;
25412611ad71SToby Isaac     petsc_allreduce_ct_th    = 0.0;
25422611ad71SToby Isaac     petsc_gather_ct_th       = 0.0;
25432611ad71SToby Isaac     petsc_scatter_ct_th      = 0.0;
25442611ad71SToby Isaac 
25452611ad71SToby Isaac     petsc_ctog_ct    = 0.0;
25462611ad71SToby Isaac     petsc_gtoc_ct    = 0.0;
25472611ad71SToby Isaac     petsc_ctog_sz    = 0.0;
25482611ad71SToby Isaac     petsc_gtoc_sz    = 0.0;
25492611ad71SToby Isaac     petsc_gflops     = 0.0;
25502611ad71SToby Isaac     petsc_gtime      = 0.0;
25512611ad71SToby Isaac     petsc_ctog_ct_th = 0.0;
25522611ad71SToby Isaac     petsc_gtoc_ct_th = 0.0;
25532611ad71SToby Isaac     petsc_ctog_sz_th = 0.0;
25542611ad71SToby Isaac     petsc_gtoc_sz_th = 0.0;
25552611ad71SToby Isaac     petsc_gflops_th  = 0.0;
25562611ad71SToby Isaac     petsc_gtime_th   = 0.0;
25572611ad71SToby Isaac   }
25582611ad71SToby Isaac   PETSC_LARGEST_CLASSID    = PETSC_SMALLEST_CLASSID;
25592611ad71SToby Isaac   PETSC_OBJECT_CLASSID     = 0;
25602611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_FALSE;
25612611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25622611ad71SToby Isaac }
25632611ad71SToby Isaac 
2564cc4c1da9SBarry Smith /*@
25655c6c1daeSBarry Smith   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
25665c6c1daeSBarry Smith 
25675c6c1daeSBarry Smith   Not Collective
25685c6c1daeSBarry Smith 
25695c6c1daeSBarry Smith   Input Parameter:
25705c6c1daeSBarry Smith . name - The class name
25715c6c1daeSBarry Smith 
25725c6c1daeSBarry Smith   Output Parameter:
25735c6c1daeSBarry Smith . oclass - The class id or classid
25745c6c1daeSBarry Smith 
25755c6c1daeSBarry Smith   Level: developer
25765c6c1daeSBarry Smith 
2577d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`
25785c6c1daeSBarry Smith @*/
2579d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass)
2580d71ae5a4SJacob Faibussowitsch {
25815c6c1daeSBarry Smith   PetscFunctionBegin;
25825c6c1daeSBarry Smith   *oclass = ++PETSC_LARGEST_CLASSID;
25835c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2584b665b14eSToby Isaac   {
2585b665b14eSToby Isaac     PetscLogState state;
2586b665b14eSToby Isaac     PetscLogClass logclass;
2587b665b14eSToby Isaac 
2588b665b14eSToby Isaac     PetscCall(PetscLogGetState(&state));
2589b665b14eSToby Isaac     if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass));
2590b665b14eSToby Isaac   }
25915c6c1daeSBarry Smith #endif
25923ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
25935c6c1daeSBarry Smith }
2594