xref: /petsc/src/sys/logging/plog.c (revision ac530a7e429a3ef5a9263376acf6071236a5db98)
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 
1040bc1c2e8SToby Isaac PetscInt PetscLogNumViewersCreated   = 0;
1050bc1c2e8SToby Isaac PetscInt PetscLogNumViewersDestroyed = 0;
1060bc1c2e8SToby Isaac 
1072611ad71SToby Isaac PetscLogState petsc_log_state = NULL;
1082611ad71SToby Isaac 
10910dd146fSPierre Jolivet #define PETSC_LOG_HANDLER_HOT_BLANK {NULL, NULL, NULL, NULL, NULL, NULL}
1102611ad71SToby Isaac 
1112611ad71SToby Isaac PetscLogHandlerHot PetscLogHandlers[PETSC_LOG_HANDLER_MAX] = {
1122611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1132611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1142611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1152611ad71SToby Isaac   PETSC_LOG_HANDLER_HOT_BLANK,
1162611ad71SToby Isaac };
1172611ad71SToby Isaac 
1182611ad71SToby Isaac #undef PETSC_LOG_HANDLERS_HOT_BLANK
1192611ad71SToby Isaac 
1202611ad71SToby Isaac #if defined(PETSC_USE_LOG)
1212611ad71SToby Isaac   #include <../src/sys/logging/handler/impls/default/logdefault.h>
122c708d6e3SStefano Zampini 
123c708d6e3SStefano Zampini   #if defined(PETSC_HAVE_THREADSAFETY)
124c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDouble(PetscLogDouble *tot, PetscLogDouble *tot_th, PetscLogDouble tmp)
125c708d6e3SStefano Zampini {
126c708d6e3SStefano Zampini   *tot_th += tmp;
1273ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
128c708d6e3SStefano Zampini   *tot += tmp;
1293ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1303ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
131c708d6e3SStefano Zampini }
132c708d6e3SStefano Zampini 
133c708d6e3SStefano Zampini PetscErrorCode PetscAddLogDoubleCnt(PetscLogDouble *cnt, PetscLogDouble *tot, PetscLogDouble *cnt_th, PetscLogDouble *tot_th, PetscLogDouble tmp)
134c708d6e3SStefano Zampini {
135c708d6e3SStefano Zampini   *cnt_th = *cnt_th + 1;
136c708d6e3SStefano Zampini   *tot_th += tmp;
1373ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockLock(&PetscLogSpinLock));
13857508eceSPierre Jolivet   *tot += (PetscLogDouble)tmp;
139c708d6e3SStefano Zampini   *cnt += *cnt + 1;
1403ba16761SJacob Faibussowitsch   PetscCall(PetscSpinlockUnlock(&PetscLogSpinLock));
1413ba16761SJacob Faibussowitsch   return PETSC_SUCCESS;
142c708d6e3SStefano Zampini }
143c708d6e3SStefano Zampini 
144bec0b493Shannah_mairs   #endif
1455c6c1daeSBarry Smith 
14653e0a2f3SToby Isaac static PetscErrorCode PetscLogTryGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
14753e0a2f3SToby Isaac {
14853e0a2f3SToby Isaac   PetscFunctionBegin;
14953e0a2f3SToby Isaac   PetscAssertPointer(handler, 2);
15053e0a2f3SToby Isaac   *handler = NULL;
15153e0a2f3SToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
15253e0a2f3SToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
15353e0a2f3SToby Isaac     if (h) {
15453e0a2f3SToby Isaac       PetscBool match;
15553e0a2f3SToby Isaac 
15653e0a2f3SToby Isaac       PetscCall(PetscObjectTypeCompare((PetscObject)h, type, &match));
15753e0a2f3SToby Isaac       if (match) {
15853e0a2f3SToby Isaac         *handler = PetscLogHandlers[i].handler;
15953e0a2f3SToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
16053e0a2f3SToby Isaac       }
16153e0a2f3SToby Isaac     }
16253e0a2f3SToby Isaac   }
16353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
16453e0a2f3SToby Isaac }
16553e0a2f3SToby Isaac 
16653e0a2f3SToby Isaac /*@
167b665b14eSToby Isaac   PetscLogGetDefaultHandler - Get the default log handler if it is running.
168b665b14eSToby Isaac 
169b665b14eSToby Isaac   Not collective
170b665b14eSToby Isaac 
171b665b14eSToby Isaac   Output Parameter:
172b665b14eSToby Isaac . handler - the default `PetscLogHandler`, or `NULL` if it is not running.
173b665b14eSToby Isaac 
174b665b14eSToby Isaac   Level: developer
175b665b14eSToby Isaac 
176b665b14eSToby Isaac   Notes:
177b665b14eSToby Isaac   The default handler is started with `PetscLogDefaultBegin()`,
178b665b14eSToby Isaac   if the options flags `-log_all` or `-log_view` is given without arguments,
179b665b14eSToby Isaac   or for `-log_view :output:format` if `format` is not `ascii_xml` or `ascii_flamegraph`.
180b665b14eSToby Isaac 
181b665b14eSToby Isaac .seealso: [](ch_profiling)
182b665b14eSToby Isaac @*/
183b665b14eSToby Isaac PetscErrorCode PetscLogGetDefaultHandler(PetscLogHandler *handler)
184b665b14eSToby Isaac {
185b665b14eSToby Isaac   PetscFunctionBegin;
186294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, handler));
187b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
188b665b14eSToby Isaac }
189b665b14eSToby Isaac 
190b665b14eSToby Isaac static PetscErrorCode PetscLogGetHandler(PetscLogHandlerType type, PetscLogHandler *handler)
191b665b14eSToby Isaac {
192b665b14eSToby Isaac   PetscFunctionBegin;
193b665b14eSToby Isaac   PetscAssertPointer(handler, 2);
194b665b14eSToby Isaac   PetscCall(PetscLogTryGetHandler(type, handler));
1951943a749SToby Isaac   PetscCheck(*handler != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE, "A PetscLogHandler of type %s has not been started.", type);
196b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
197b665b14eSToby Isaac }
198b665b14eSToby Isaac 
199b665b14eSToby Isaac /*@
20053e0a2f3SToby Isaac   PetscLogGetState - Get the `PetscLogState` for PETSc's global logging, used
20153e0a2f3SToby Isaac   by all default log handlers (`PetscLogDefaultBegin()`,
20253e0a2f3SToby Isaac   `PetscLogNestedBegin()`, `PetscLogTraceBegin()`, `PetscLogMPEBegin()`,
20353e0a2f3SToby Isaac   `PetscLogPerfstubsBegin()`).
20453e0a2f3SToby Isaac 
20553e0a2f3SToby Isaac   Collective on `PETSC_COMM_WORLD`
20653e0a2f3SToby Isaac 
20753e0a2f3SToby Isaac   Output Parameter:
208b665b14eSToby Isaac . state - The `PetscLogState` changed by registrations (such as
209b665b14eSToby Isaac           `PetscLogEventRegister()`) and actions (such as `PetscLogEventBegin()` or
210b8004f34SBarry Smith           `PetscLogStagePush()`), or `NULL` if logging is not active
21153e0a2f3SToby Isaac 
21253e0a2f3SToby Isaac   Level: developer
21353e0a2f3SToby Isaac 
21453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogState`
21553e0a2f3SToby Isaac @*/
21653e0a2f3SToby Isaac PetscErrorCode PetscLogGetState(PetscLogState *state)
21753e0a2f3SToby Isaac {
21853e0a2f3SToby Isaac   PetscFunctionBegin;
21953e0a2f3SToby Isaac   PetscAssertPointer(state, 1);
22053e0a2f3SToby Isaac   *state = petsc_log_state;
22153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
22253e0a2f3SToby Isaac }
22353e0a2f3SToby Isaac 
22453e0a2f3SToby Isaac static PetscErrorCode PetscLogHandlerCopyToHot(PetscLogHandler h, PetscLogHandlerHot *hot)
22553e0a2f3SToby Isaac {
22653e0a2f3SToby Isaac   PetscFunctionBegin;
22753e0a2f3SToby Isaac   hot->handler       = h;
22853e0a2f3SToby Isaac   hot->eventBegin    = h->ops->eventbegin;
22953e0a2f3SToby Isaac   hot->eventEnd      = h->ops->eventend;
23053e0a2f3SToby Isaac   hot->eventSync     = h->ops->eventsync;
23153e0a2f3SToby Isaac   hot->objectCreate  = h->ops->objectcreate;
23253e0a2f3SToby Isaac   hot->objectDestroy = h->ops->objectdestroy;
23353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
23453e0a2f3SToby Isaac }
23553e0a2f3SToby Isaac 
23653e0a2f3SToby Isaac /*@
23753e0a2f3SToby Isaac   PetscLogHandlerStart - Connect a log handler to PETSc's global logging stream and state.
23853e0a2f3SToby Isaac 
23953e0a2f3SToby Isaac   Logically collective
24053e0a2f3SToby Isaac 
24153e0a2f3SToby Isaac   Input Parameters:
24253e0a2f3SToby Isaac . h - a `PetscLogHandler`
24353e0a2f3SToby Isaac 
24453e0a2f3SToby Isaac   Level: developer
24553e0a2f3SToby Isaac 
24653e0a2f3SToby Isaac   Notes:
24753e0a2f3SToby Isaac   Users should only need this if they create their own log handlers: handlers that are started
24853e0a2f3SToby Isaac   from the command line (such as `-log_view` and `-log_trace`) or from a function like
24953e0a2f3SToby Isaac   `PetscLogNestedBegin()` will automatically be started.
25053e0a2f3SToby Isaac 
25153e0a2f3SToby Isaac   There is a limit of `PESC_LOG_HANDLER_MAX` handlers that can be active at one time.
25253e0a2f3SToby Isaac 
25353e0a2f3SToby Isaac   To disconnect a handler from the global stream call `PetscLogHandlerStop()`.
25453e0a2f3SToby Isaac 
25553e0a2f3SToby Isaac   When a log handler is started, stages that have already been pushed with `PetscLogStagePush()`,
25653e0a2f3SToby Isaac   will be pushed for the new log handler, but it will not be informed of any events that are
25753e0a2f3SToby Isaac   in progress.  It is recommended to start any user-defined log handlers immediately following
258b8004f34SBarry Smith   `PetscInitialize()`  before any user-defined stages are pushed.
25953e0a2f3SToby Isaac 
260b8004f34SBarry Smith .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStop()`, `PetscInitialize()`
26153e0a2f3SToby Isaac @*/
26253e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStart(PetscLogHandler h)
26353e0a2f3SToby Isaac {
26453e0a2f3SToby Isaac   PetscFunctionBegin;
26553e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26653e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) PetscFunctionReturn(PETSC_SUCCESS);
26753e0a2f3SToby Isaac   }
26853e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
26953e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == NULL) {
27053e0a2f3SToby Isaac       PetscCall(PetscObjectReference((PetscObject)h));
27153e0a2f3SToby Isaac       PetscCall(PetscLogHandlerCopyToHot(h, &PetscLogHandlers[i]));
27253e0a2f3SToby Isaac       if (petsc_log_state) {
27353e0a2f3SToby Isaac         PetscLogStage stack_height;
27453e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
27553e0a2f3SToby Isaac 
27653e0a2f3SToby Isaac         PetscCall(PetscLogHandlerSetState(h, petsc_log_state));
27753e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
27853e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
27953e0a2f3SToby Isaac         orig_stack                     = petsc_log_state->stage_stack;
28053e0a2f3SToby Isaac         petsc_log_state->stage_stack   = temp_stack;
28153e0a2f3SToby Isaac         petsc_log_state->current_stage = -1;
28253e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
283835f2295SStefano Zampini           PetscLogStage stage = orig_stack->stack[s];
28453e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePush(h, stage));
28553e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
28653e0a2f3SToby Isaac           petsc_log_state->current_stage = stage;
28753e0a2f3SToby Isaac         }
28853e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
28953e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
29053e0a2f3SToby Isaac       }
29153e0a2f3SToby Isaac       PetscFunctionReturn(PETSC_SUCCESS);
29253e0a2f3SToby Isaac     }
29353e0a2f3SToby Isaac   }
29453e0a2f3SToby Isaac   SETERRQ(PetscObjectComm((PetscObject)h), PETSC_ERR_ARG_WRONGSTATE, "%d log handlers already started, cannot start another", PETSC_LOG_HANDLER_MAX);
29553e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
29653e0a2f3SToby Isaac }
29753e0a2f3SToby Isaac 
29853e0a2f3SToby Isaac /*@
29953e0a2f3SToby Isaac   PetscLogHandlerStop - Disconnect a log handler from PETSc's global logging stream.
30053e0a2f3SToby Isaac 
30153e0a2f3SToby Isaac   Logically collective
30253e0a2f3SToby Isaac 
30353e0a2f3SToby Isaac   Input Parameters:
30453e0a2f3SToby Isaac . h - a `PetscLogHandler`
30553e0a2f3SToby Isaac 
30653e0a2f3SToby Isaac   Level: developer
30753e0a2f3SToby Isaac 
30853e0a2f3SToby Isaac   Note:
30953e0a2f3SToby Isaac   After `PetscLogHandlerStop()`, the handler can still access the global logging state
31053e0a2f3SToby Isaac   with `PetscLogHandlerGetState()`, so that it can access the registry when post-processing
31153e0a2f3SToby Isaac   (for instance, in `PetscLogHandlerView()`),
31253e0a2f3SToby Isaac 
31353e0a2f3SToby Isaac   When a log handler is stopped, the remaining stages will be popped before it is
31453e0a2f3SToby Isaac   disconnected from the log stream.
31553e0a2f3SToby Isaac 
31653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogState`, `PetscLogHandlerStart()`
31753e0a2f3SToby Isaac @*/
31853e0a2f3SToby Isaac PetscErrorCode PetscLogHandlerStop(PetscLogHandler h)
31953e0a2f3SToby Isaac {
32053e0a2f3SToby Isaac   PetscFunctionBegin;
32153e0a2f3SToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
32253e0a2f3SToby Isaac     if (PetscLogHandlers[i].handler == h) {
32353e0a2f3SToby Isaac       if (petsc_log_state) {
32453e0a2f3SToby Isaac         PetscLogState state;
32553e0a2f3SToby Isaac         PetscLogStage stack_height;
32653e0a2f3SToby Isaac         PetscIntStack orig_stack, temp_stack;
32753e0a2f3SToby Isaac 
32853e0a2f3SToby Isaac         PetscCall(PetscLogHandlerGetState(h, &state));
32953e0a2f3SToby Isaac         PetscCheck(state == petsc_log_state, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE, "Called PetscLogHandlerStop() for a PetscLogHander that was not started.");
33053e0a2f3SToby Isaac         stack_height = petsc_log_state->stage_stack->top + 1;
33153e0a2f3SToby Isaac         PetscCall(PetscIntStackCreate(&temp_stack));
33253e0a2f3SToby Isaac         orig_stack                   = petsc_log_state->stage_stack;
33353e0a2f3SToby Isaac         petsc_log_state->stage_stack = temp_stack;
33453e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
335835f2295SStefano Zampini           PetscLogStage stage = orig_stack->stack[s];
33653e0a2f3SToby Isaac 
33753e0a2f3SToby Isaac           PetscCall(PetscIntStackPush(temp_stack, stage));
33853e0a2f3SToby Isaac         }
33953e0a2f3SToby Isaac         for (int s = 0; s < stack_height; s++) {
34053e0a2f3SToby Isaac           PetscLogStage stage;
34153e0a2f3SToby Isaac           PetscBool     empty;
34253e0a2f3SToby Isaac 
34353e0a2f3SToby Isaac           PetscCall(PetscIntStackPop(temp_stack, &stage));
34453e0a2f3SToby Isaac           PetscCall(PetscIntStackEmpty(temp_stack, &empty));
345*ac530a7eSPierre Jolivet           if (!empty) PetscCall(PetscIntStackTop(temp_stack, &petsc_log_state->current_stage));
346*ac530a7eSPierre Jolivet           else petsc_log_state->current_stage = -1;
34753e0a2f3SToby Isaac           PetscCall(PetscLogHandlerStagePop(h, stage));
34853e0a2f3SToby Isaac         }
34953e0a2f3SToby Isaac         PetscCall(PetscIntStackDestroy(temp_stack));
35053e0a2f3SToby Isaac         petsc_log_state->stage_stack = orig_stack;
35153e0a2f3SToby Isaac         PetscCall(PetscIntStackTop(petsc_log_state->stage_stack, &petsc_log_state->current_stage));
35253e0a2f3SToby Isaac       }
35353e0a2f3SToby Isaac       PetscCall(PetscArrayzero(&PetscLogHandlers[i], 1));
35453e0a2f3SToby Isaac       PetscCall(PetscObjectDereference((PetscObject)h));
35553e0a2f3SToby Isaac     }
35653e0a2f3SToby Isaac   }
35753e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
35853e0a2f3SToby Isaac }
3595c6c1daeSBarry Smith 
360cc4c1da9SBarry Smith /*@
3610b4b7b1cSBarry Smith   PetscLogIsActive - Check if logging (profiling) is currently in progress.
3624dd65854SConnor Ward 
3634dd65854SConnor Ward   Not Collective
3644dd65854SConnor Ward 
3654dd65854SConnor Ward   Output Parameter:
366811af0c4SBarry Smith . isActive - `PETSC_TRUE` if logging is in progress, `PETSC_FALSE` otherwise
3674dd65854SConnor Ward 
3684dd65854SConnor Ward   Level: beginner
3694dd65854SConnor Ward 
370b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`
3714dd65854SConnor Ward @*/
372d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogIsActive(PetscBool *isActive)
373d71ae5a4SJacob Faibussowitsch {
3744dd65854SConnor Ward   PetscFunctionBegin;
375b665b14eSToby Isaac   *isActive = PETSC_FALSE;
376b665b14eSToby Isaac   if (petsc_log_state) {
377b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
378b665b14eSToby Isaac       if (PetscLogHandlers[i].handler) {
379b665b14eSToby Isaac         *isActive = PETSC_TRUE;
380b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
381b665b14eSToby Isaac       }
382b665b14eSToby Isaac     }
383b665b14eSToby Isaac   }
384b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
385b665b14eSToby Isaac }
386b665b14eSToby Isaac 
387b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventBeginIsActive(PetscBool *isActive)
388b665b14eSToby Isaac {
389b665b14eSToby Isaac   PetscFunctionBegin;
390b665b14eSToby Isaac   *isActive = PETSC_FALSE;
391b665b14eSToby Isaac   if (petsc_log_state) {
392b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
393b665b14eSToby Isaac       if (PetscLogHandlers[i].eventBegin) {
394b665b14eSToby Isaac         *isActive = PETSC_TRUE;
395b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
396b665b14eSToby Isaac       }
397b665b14eSToby Isaac     }
398b665b14eSToby Isaac   }
399b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
400b665b14eSToby Isaac }
401b665b14eSToby Isaac 
402b665b14eSToby Isaac PETSC_UNUSED static PetscErrorCode PetscLogEventEndIsActive(PetscBool *isActive)
403b665b14eSToby Isaac {
404b665b14eSToby Isaac   PetscFunctionBegin;
405b665b14eSToby Isaac   *isActive = PETSC_FALSE;
406b665b14eSToby Isaac   if (petsc_log_state) {
407b665b14eSToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
408b665b14eSToby Isaac       if (PetscLogHandlers[i].eventEnd) {
409b665b14eSToby Isaac         *isActive = PETSC_TRUE;
410b665b14eSToby Isaac         PetscFunctionReturn(PETSC_SUCCESS);
411b665b14eSToby Isaac       }
412b665b14eSToby Isaac     }
413b665b14eSToby Isaac   }
4143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4154dd65854SConnor Ward }
4164dd65854SConnor Ward 
41761cc7448SToby Isaac PETSC_INTERN PetscErrorCode PetscLogTypeBegin(PetscLogHandlerType type)
41853e0a2f3SToby Isaac {
41953e0a2f3SToby Isaac   PetscLogHandler handler;
42053e0a2f3SToby Isaac 
42153e0a2f3SToby Isaac   PetscFunctionBegin;
42253e0a2f3SToby Isaac   PetscCall(PetscLogTryGetHandler(type, &handler));
42353e0a2f3SToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
42453e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreate(PETSC_COMM_WORLD, &handler));
42553e0a2f3SToby Isaac   PetscCall(PetscLogHandlerSetType(handler, type));
42653e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
42753e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
42853e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
42953e0a2f3SToby Isaac }
43053e0a2f3SToby Isaac 
431cc4c1da9SBarry Smith /*@
4320b4b7b1cSBarry Smith   PetscLogDefaultBegin - Turns on logging (profiling) of PETSc code using the default log handler (profiler). This logs time, flop
4330b4b7b1cSBarry Smith   rates, and object creation and should not slow programs down too much.
4345c6c1daeSBarry Smith 
4358f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
4365c6c1daeSBarry Smith 
437811af0c4SBarry Smith   Options Database Key:
4380b4b7b1cSBarry Smith . -log_view [viewertype:filename:viewerformat] - Prints summary of flop and timing (profiling) information to the
4390b4b7b1cSBarry Smith                                                  screen (for PETSc configured with `--with-log=1` (which is the default)).
4400b4b7b1cSBarry Smith                                                  This option must be provided before `PetscInitialize()`.
4415c6c1daeSBarry Smith 
44210450e9eSJacob Faibussowitsch   Example Usage:
4435c6c1daeSBarry Smith .vb
4445c6c1daeSBarry Smith       PetscInitialize(...);
445bb1d7374SBarry Smith       PetscLogDefaultBegin();
4465c6c1daeSBarry Smith        ... code ...
4475c6c1daeSBarry Smith       PetscLogView(viewer); or PetscLogDump();
4485c6c1daeSBarry Smith       PetscFinalize();
4495c6c1daeSBarry Smith .ve
4505c6c1daeSBarry Smith 
451d1f92df0SBarry Smith   Level: advanced
452d1f92df0SBarry Smith 
4530b4b7b1cSBarry Smith   Notes:
454811af0c4SBarry Smith   `PetscLogView()` or `PetscLogDump()` actually cause the printing of
4555c6c1daeSBarry Smith   the logging information.
4565c6c1daeSBarry Smith 
4570b4b7b1cSBarry Smith   This routine may be called more than once.
4580b4b7b1cSBarry Smith 
4590b4b7b1cSBarry Smith   To provide the `-log_view` option in your source code you must call  PetscCall(PetscOptionsSetValue(NULL, "-log_view", NULL));
4600b4b7b1cSBarry Smith   before you call `PetscInitialize()`
4610b4b7b1cSBarry Smith 
462b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`
4635c6c1daeSBarry Smith @*/
464d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDefaultBegin(void)
465d71ae5a4SJacob Faibussowitsch {
4665c6c1daeSBarry Smith   PetscFunctionBegin;
467294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERDEFAULT));
4683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4695c6c1daeSBarry Smith }
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith /*@C
472b665b14eSToby Isaac   PetscLogTraceBegin - Begins trace logging.  Every time a PETSc event
4735c6c1daeSBarry Smith   begins or ends, the event name is printed.
4745c6c1daeSBarry Smith 
475cc4c1da9SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`, No Fortran Support
4765c6c1daeSBarry Smith 
4775c6c1daeSBarry Smith   Input Parameter:
4785c6c1daeSBarry Smith . file - The file to print trace in (e.g. stdout)
4795c6c1daeSBarry Smith 
4805c6c1daeSBarry Smith   Options Database Key:
481b665b14eSToby Isaac . -log_trace [filename] - Begins `PetscLogTraceBegin()`
4825c6c1daeSBarry Smith 
483d1f92df0SBarry Smith   Level: intermediate
484d1f92df0SBarry Smith 
4855c6c1daeSBarry Smith   Notes:
486811af0c4SBarry Smith   `PetscLogTraceBegin()` prints the processor number, the execution time (sec),
4875c6c1daeSBarry Smith   then "Event begin:" or "Event end:" followed by the event name.
4885c6c1daeSBarry Smith 
489811af0c4SBarry Smith   `PetscLogTraceBegin()` allows tracing of all PETSc calls, which is useful
4905c6c1daeSBarry Smith   to determine where a program is hanging without running in the
4915c6c1daeSBarry Smith   debugger.  Can be used in conjunction with the -info option.
4925c6c1daeSBarry Smith 
493b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogView()`, `PetscLogDefaultBegin()`
4945c6c1daeSBarry Smith @*/
495d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogTraceBegin(FILE *file)
496d71ae5a4SJacob Faibussowitsch {
497b665b14eSToby Isaac   PetscLogHandler handler;
4984d86920dSPierre Jolivet 
4995c6c1daeSBarry Smith   PetscFunctionBegin;
500294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERTRACE, &handler));
501b665b14eSToby Isaac   if (handler) PetscFunctionReturn(PETSC_SUCCESS);
502b665b14eSToby Isaac   PetscCall(PetscLogHandlerCreateTrace(PETSC_COMM_WORLD, file, &handler));
503b665b14eSToby Isaac   PetscCall(PetscLogHandlerStart(handler));
504b665b14eSToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
505b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
506b665b14eSToby Isaac }
507a297a907SKarl Rupp 
508b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerCreate_Nested(MPI_Comm, PetscLogHandler *);
509b665b14eSToby Isaac 
510cc4c1da9SBarry Smith /*@
511b665b14eSToby Isaac   PetscLogNestedBegin - Turns on nested logging of objects and events. This logs flop
512b665b14eSToby Isaac   rates and object creation and should not slow programs down too much.
513b665b14eSToby Isaac 
514cc4c1da9SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`, No Fortran Support
515b665b14eSToby Isaac 
516b665b14eSToby Isaac   Options Database Keys:
517b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
518b665b14eSToby Isaac 
519b665b14eSToby Isaac   Example Usage:
520b665b14eSToby Isaac .vb
521b665b14eSToby Isaac       PetscInitialize(...);
522b665b14eSToby Isaac       PetscLogNestedBegin();
523b665b14eSToby Isaac        ... code ...
524b665b14eSToby Isaac       PetscLogView(viewer);
525b665b14eSToby Isaac       PetscFinalize();
526b665b14eSToby Isaac .ve
527b665b14eSToby Isaac 
528b665b14eSToby Isaac   Level: advanced
529b665b14eSToby Isaac 
530b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`
531b665b14eSToby Isaac @*/
532b665b14eSToby Isaac PetscErrorCode PetscLogNestedBegin(void)
533b665b14eSToby Isaac {
534b665b14eSToby Isaac   PetscFunctionBegin;
535294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERNESTED));
5363ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5375c6c1daeSBarry Smith }
5385c6c1daeSBarry Smith 
53953e0a2f3SToby Isaac /*@C
54053e0a2f3SToby Isaac   PetscLogLegacyCallbacksBegin - Create and start a log handler from callbacks
54153e0a2f3SToby Isaac   matching the now deprecated function pointers `PetscLogPLB`, `PetscLogPLE`,
54253e0a2f3SToby Isaac   `PetscLogPHC`, `PetscLogPHD`.
54353e0a2f3SToby Isaac 
5448f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
54553e0a2f3SToby Isaac 
54653e0a2f3SToby Isaac   Input Parameters:
54753e0a2f3SToby Isaac + PetscLogPLB - A callback that will be executed by `PetscLogEventBegin()` (or `NULL`)
54853e0a2f3SToby Isaac . PetscLogPLE - A callback that will be executed by `PetscLogEventEnd()` (or `NULL`)
54953e0a2f3SToby Isaac . PetscLogPHC - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
55053e0a2f3SToby Isaac - PetscLogPHD - A callback that will be executed by `PetscLogObjectCreate()` (or `NULL`)
55153e0a2f3SToby Isaac 
55253e0a2f3SToby Isaac   Calling sequence of `PetscLogPLB`:
55353e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
55453e0a2f3SToby Isaac . _i - deprecated, unused
55553e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
55653e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
55753e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
55853e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
55953e0a2f3SToby Isaac 
56053e0a2f3SToby Isaac   Calling sequence of `PetscLogPLE`:
56153e0a2f3SToby Isaac + e  - a `PetscLogEvent` that is beginning
56253e0a2f3SToby Isaac . _i - deprecated, unused
56353e0a2f3SToby Isaac . o1 - a `PetscObject` associated with `e` (or `NULL`)
56453e0a2f3SToby Isaac . o2 - a `PetscObject` associated with `e` (or `NULL`)
56553e0a2f3SToby Isaac . o3 - a `PetscObject` associated with `e` (or `NULL`)
56653e0a2f3SToby Isaac - o4 - a `PetscObject` associated with `e` (or `NULL`)
56753e0a2f3SToby Isaac 
56853e0a2f3SToby Isaac   Calling sequence of `PetscLogPHC`:
56953e0a2f3SToby Isaac . o - a `PetscObject` that has just been created
57053e0a2f3SToby Isaac 
57153e0a2f3SToby Isaac   Calling sequence of `PetscLogPHD`:
57253e0a2f3SToby Isaac . o - a `PetscObject` that is about to be destroyed
57353e0a2f3SToby Isaac 
57453e0a2f3SToby Isaac   Level: advanced
57553e0a2f3SToby Isaac 
57653e0a2f3SToby Isaac   Notes:
57753e0a2f3SToby Isaac   This is for transitioning from the deprecated function `PetscLogSet()` and should not be used in new code.
57853e0a2f3SToby Isaac 
57953e0a2f3SToby Isaac   This should help migrate external log handlers to use `PetscLogHandler`, but
58053e0a2f3SToby Isaac   callbacks that depend on the deprecated `PetscLogStage` datatype will have to be
58153e0a2f3SToby Isaac   updated.
58253e0a2f3SToby Isaac 
58353e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogHandlerStart()`, `PetscLogState`
58453e0a2f3SToby Isaac @*/
58553e0a2f3SToby 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))
58653e0a2f3SToby Isaac {
58753e0a2f3SToby Isaac   PetscLogHandler handler;
58853e0a2f3SToby Isaac 
58953e0a2f3SToby Isaac   PetscFunctionBegin;
59053e0a2f3SToby Isaac   PetscCall(PetscLogHandlerCreateLegacy(PETSC_COMM_WORLD, PetscLogPLB, PetscLogPLE, PetscLogPHC, PetscLogPHD, &handler));
59153e0a2f3SToby Isaac   PetscCall(PetscLogHandlerStart(handler));
59253e0a2f3SToby Isaac   PetscCall(PetscLogHandlerDestroy(&handler));
59353e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
59453e0a2f3SToby Isaac }
59553e0a2f3SToby Isaac 
5962611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
5972611ad71SToby Isaac     #include <mpe.h>
5982611ad71SToby Isaac static PetscBool PetscBeganMPE = PETSC_FALSE;
5992611ad71SToby Isaac   #endif
6002611ad71SToby Isaac 
6012611ad71SToby Isaac /*@C
6022611ad71SToby Isaac   PetscLogMPEBegin - Turns on MPE logging of events. This creates large log files and slows the
6032611ad71SToby Isaac   program down.
6042611ad71SToby Isaac 
605cc4c1da9SBarry Smith   Collective on `PETSC_COMM_WORLD`, No Fortran Support
6062611ad71SToby Isaac 
6072611ad71SToby Isaac   Options Database Key:
6082611ad71SToby Isaac . -log_mpe - Prints extensive log information
6092611ad71SToby Isaac 
6102611ad71SToby Isaac   Level: advanced
6112611ad71SToby Isaac 
6122611ad71SToby Isaac   Note:
6132611ad71SToby Isaac   A related routine is `PetscLogDefaultBegin()` (with the options key `-log_view`), which is
6142611ad71SToby Isaac   intended for production runs since it logs only flop rates and object creation (and should
6152611ad71SToby Isaac   not significantly slow the programs).
6162611ad71SToby Isaac 
617b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogDefaultBegin()`, `PetscLogEventActivate()`,
6182611ad71SToby Isaac           `PetscLogEventDeactivate()`
6192611ad71SToby Isaac @*/
6202611ad71SToby Isaac PetscErrorCode PetscLogMPEBegin(void)
6212611ad71SToby Isaac {
6222611ad71SToby Isaac   PetscFunctionBegin;
6232611ad71SToby Isaac   #if defined(PETSC_HAVE_MPE)
6242611ad71SToby Isaac   /* Do MPE initialization */
6252611ad71SToby Isaac   if (!MPE_Initialized_logging()) { /* This function exists in mpich 1.1.2 and higher */
6262611ad71SToby Isaac     PetscCall(PetscInfo(0, "Initializing MPE.\n"));
6272611ad71SToby Isaac     PetscCall(MPE_Init_log());
6282611ad71SToby Isaac 
6292611ad71SToby Isaac     PetscBeganMPE = PETSC_TRUE;
6302611ad71SToby Isaac   } else {
6312611ad71SToby Isaac     PetscCall(PetscInfo(0, "MPE already initialized. Not attempting to reinitialize.\n"));
6322611ad71SToby Isaac   }
633294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERMPE));
6342611ad71SToby Isaac   #else
6352611ad71SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
6362611ad71SToby Isaac   #endif
6372611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
6382611ad71SToby Isaac }
6392611ad71SToby Isaac 
64053e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
64153e0a2f3SToby Isaac     #include <../src/sys/perfstubs/timer.h>
64253e0a2f3SToby Isaac   #endif
64353e0a2f3SToby Isaac 
64453e0a2f3SToby Isaac /*@C
64553e0a2f3SToby Isaac   PetscLogPerfstubsBegin - Turns on logging of events using the perfstubs interface.
64653e0a2f3SToby Isaac 
647cc4c1da9SBarry Smith   Collective on `PETSC_COMM_WORLD`, No Fortran Support
64853e0a2f3SToby Isaac 
64953e0a2f3SToby Isaac   Options Database Key:
65053e0a2f3SToby Isaac . -log_perfstubs - use an external log handler through the perfstubs interface
65153e0a2f3SToby Isaac 
65253e0a2f3SToby Isaac   Level: advanced
65353e0a2f3SToby Isaac 
65453e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogEventActivate()`
65553e0a2f3SToby Isaac @*/
65653e0a2f3SToby Isaac PetscErrorCode PetscLogPerfstubsBegin(void)
65753e0a2f3SToby Isaac {
65853e0a2f3SToby Isaac   PetscFunctionBegin;
65953e0a2f3SToby Isaac   #if defined(PETSC_HAVE_TAU_PERFSTUBS)
660294de794SToby Isaac   PetscCall(PetscLogTypeBegin(PETSCLOGHANDLERPERFSTUBS));
66153e0a2f3SToby Isaac   #else
66253e0a2f3SToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without perfstubs support, reconfigure with --with-tau-perfstubs");
66353e0a2f3SToby Isaac   #endif
66453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
66553e0a2f3SToby Isaac }
66653e0a2f3SToby Isaac 
6675c6c1daeSBarry Smith /*@
668b665b14eSToby Isaac   PetscLogActions - Determines whether actions are logged for the default log handler.
6695c6c1daeSBarry Smith 
6705c6c1daeSBarry Smith   Not Collective
6715c6c1daeSBarry Smith 
6725c6c1daeSBarry Smith   Input Parameter:
673811af0c4SBarry Smith . flag - `PETSC_TRUE` if actions are to be logged
674811af0c4SBarry Smith 
675811af0c4SBarry Smith   Options Database Key:
676b665b14eSToby Isaac + -log_exclude_actions - (deprecated) Does nothing
677b665b14eSToby Isaac - -log_include_actions - Turn on action logging
6785c6c1daeSBarry Smith 
6795c6c1daeSBarry Smith   Level: intermediate
6805c6c1daeSBarry Smith 
681811af0c4SBarry Smith   Note:
682811af0c4SBarry Smith   Logging of actions continues to consume more memory as the program
6835c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
684aec76313SJacob Faibussowitsch 
685b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
6865c6c1daeSBarry Smith @*/
687d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogActions(PetscBool flag)
688d71ae5a4SJacob Faibussowitsch {
6895c6c1daeSBarry Smith   PetscFunctionBegin;
690dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
691dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
692dff009beSToby Isaac 
693dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogActions(h, flag));
694dff009beSToby Isaac   }
6953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6965c6c1daeSBarry Smith }
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith /*@
6995c6c1daeSBarry Smith   PetscLogObjects - Determines whether objects are logged for the graphical viewer.
7005c6c1daeSBarry Smith 
7015c6c1daeSBarry Smith   Not Collective
7025c6c1daeSBarry Smith 
7035c6c1daeSBarry Smith   Input Parameter:
704811af0c4SBarry Smith . flag - `PETSC_TRUE` if objects are to be logged
705811af0c4SBarry Smith 
706811af0c4SBarry Smith   Options Database Key:
707b665b14eSToby Isaac + -log_exclude_objects - (deprecated) Does nothing
708b665b14eSToby Isaac - -log_include_objects - Turns on object logging
7095c6c1daeSBarry Smith 
7105c6c1daeSBarry Smith   Level: intermediate
7115c6c1daeSBarry Smith 
712811af0c4SBarry Smith   Note:
713811af0c4SBarry Smith   Logging of objects continues to consume more memory as the program
7145c6c1daeSBarry Smith   runs. Long running programs should consider turning this feature off.
7155c6c1daeSBarry Smith 
716b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogGetDefaultHandler()`
7175c6c1daeSBarry Smith @*/
718d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjects(PetscBool flag)
719d71ae5a4SJacob Faibussowitsch {
7205c6c1daeSBarry Smith   PetscFunctionBegin;
721dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
722dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
723dff009beSToby Isaac 
724dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerSetLogObjects(h, flag));
725dff009beSToby Isaac   }
7263ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7275c6c1daeSBarry Smith }
7285c6c1daeSBarry Smith 
7295c6c1daeSBarry Smith /*------------------------------------------------ Stage Functions --------------------------------------------------*/
730cc4c1da9SBarry Smith /*@
73174c0405dSRichard Tran Mills   PetscLogStageRegister - Attaches a character string name to a logging stage.
7325c6c1daeSBarry Smith 
7335c6c1daeSBarry Smith   Not Collective
7345c6c1daeSBarry Smith 
7355c6c1daeSBarry Smith   Input Parameter:
7365c6c1daeSBarry Smith . sname - The name to associate with that stage
7375c6c1daeSBarry Smith 
7385c6c1daeSBarry Smith   Output Parameter:
739b665b14eSToby Isaac . stage - The stage number or -1 if logging is not active (`PetscLogIsActive()`).
7405c6c1daeSBarry Smith 
7415c6c1daeSBarry Smith   Level: intermediate
7425c6c1daeSBarry Smith 
743d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStagePop()`
7445c6c1daeSBarry Smith @*/
745d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageRegister(const char sname[], PetscLogStage *stage)
746d71ae5a4SJacob Faibussowitsch {
747b665b14eSToby Isaac   PetscLogState state;
7485c6c1daeSBarry Smith 
7495c6c1daeSBarry Smith   PetscFunctionBegin;
750b665b14eSToby Isaac   *stage = -1;
751b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
752b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageRegister(state, sname, stage));
7533ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7545c6c1daeSBarry Smith }
7555c6c1daeSBarry Smith 
756cc4c1da9SBarry Smith /*@
757811af0c4SBarry Smith   PetscLogStagePush - This function pushes a stage on the logging stack. Events started and stopped until `PetscLogStagePop()` will be associated with the stage
7585c6c1daeSBarry Smith 
7595c6c1daeSBarry Smith   Not Collective
7605c6c1daeSBarry Smith 
7615c6c1daeSBarry Smith   Input Parameter:
7625c6c1daeSBarry Smith . stage - The stage on which to log
7635c6c1daeSBarry Smith 
76410450e9eSJacob Faibussowitsch   Example Usage:
765811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
7665c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
7675c6c1daeSBarry Smith   PetscFinalize().
7685c6c1daeSBarry Smith .vb
7695c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
7705c6c1daeSBarry Smith       [stage 0 of code]
7715c6c1daeSBarry Smith       PetscLogStagePush(1);
7725c6c1daeSBarry Smith       [stage 1 of code]
7735c6c1daeSBarry Smith       PetscLogStagePop();
7745c6c1daeSBarry Smith       PetscBarrier(...);
7755c6c1daeSBarry Smith       [more stage 0 of code]
7765c6c1daeSBarry Smith       PetscFinalize();
7775c6c1daeSBarry Smith .ve
7785c6c1daeSBarry Smith 
779d1f92df0SBarry Smith   Level: intermediate
780d1f92df0SBarry Smith 
781811af0c4SBarry Smith   Note:
782811af0c4SBarry Smith   Use `PetscLogStageRegister()` to register a stage.
7835c6c1daeSBarry Smith 
784d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePop()`, `PetscLogStageRegister()`, `PetscBarrier()`
7855c6c1daeSBarry Smith @*/
786d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePush(PetscLogStage stage)
787d71ae5a4SJacob Faibussowitsch {
788b665b14eSToby Isaac   PetscLogState state;
7895c6c1daeSBarry Smith 
7905c6c1daeSBarry Smith   PetscFunctionBegin;
791b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
792b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
793b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
794b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
795b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePush(h, stage));
796b665b14eSToby Isaac   }
797b665b14eSToby Isaac   PetscCall(PetscLogStateStagePush(state, stage));
7983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7995c6c1daeSBarry Smith }
8005c6c1daeSBarry Smith 
801cc4c1da9SBarry Smith /*@
802811af0c4SBarry Smith   PetscLogStagePop - This function pops a stage from the logging stack that was pushed with `PetscLogStagePush()`
8035c6c1daeSBarry Smith 
8045c6c1daeSBarry Smith   Not Collective
8055c6c1daeSBarry Smith 
80610450e9eSJacob Faibussowitsch   Example Usage:
807811af0c4SBarry Smith   If the option -log_view is used to run the program containing the
8085c6c1daeSBarry Smith   following code, then 2 sets of summary data will be printed during
8095c6c1daeSBarry Smith   PetscFinalize().
8105c6c1daeSBarry Smith .vb
8115c6c1daeSBarry Smith       PetscInitialize(int *argc,char ***args,0,0);
8125c6c1daeSBarry Smith       [stage 0 of code]
8135c6c1daeSBarry Smith       PetscLogStagePush(1);
8145c6c1daeSBarry Smith       [stage 1 of code]
8155c6c1daeSBarry Smith       PetscLogStagePop();
8165c6c1daeSBarry Smith       PetscBarrier(...);
8175c6c1daeSBarry Smith       [more stage 0 of code]
8185c6c1daeSBarry Smith       PetscFinalize();
8195c6c1daeSBarry Smith .ve
8205c6c1daeSBarry Smith 
8215c6c1daeSBarry Smith   Level: intermediate
8225c6c1daeSBarry Smith 
823d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStagePush()`, `PetscLogStageRegister()`, `PetscBarrier()`
8245c6c1daeSBarry Smith @*/
825d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStagePop(void)
826d71ae5a4SJacob Faibussowitsch {
827b665b14eSToby Isaac   PetscLogState state;
828b665b14eSToby Isaac   PetscLogStage current_stage;
8295c6c1daeSBarry Smith 
8305c6c1daeSBarry Smith   PetscFunctionBegin;
831b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
832b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
833b665b14eSToby Isaac   current_stage = state->current_stage;
834b665b14eSToby Isaac   PetscCall(PetscLogStateStagePop(state));
835b665b14eSToby Isaac   for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
836b665b14eSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
837b665b14eSToby Isaac     if (h) PetscCall(PetscLogHandlerStagePop(h, current_stage));
838b665b14eSToby Isaac   }
8393ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8405c6c1daeSBarry Smith }
8415c6c1daeSBarry Smith 
8425c6c1daeSBarry Smith /*@
843811af0c4SBarry Smith   PetscLogStageSetActive - Sets if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8445c6c1daeSBarry Smith 
8455c6c1daeSBarry Smith   Not Collective
8465c6c1daeSBarry Smith 
8475c6c1daeSBarry Smith   Input Parameters:
8485c6c1daeSBarry Smith + stage    - The stage
849811af0c4SBarry Smith - isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8505c6c1daeSBarry Smith 
8515c6c1daeSBarry Smith   Level: intermediate
8525c6c1daeSBarry Smith 
853811af0c4SBarry Smith   Note:
854811af0c4SBarry Smith   If this is set to `PETSC_FALSE` the logging acts as if the stage did not exist
855811af0c4SBarry Smith 
856d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8575c6c1daeSBarry Smith @*/
858d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetActive(PetscLogStage stage, PetscBool isActive)
859d71ae5a4SJacob Faibussowitsch {
860b665b14eSToby Isaac   PetscLogState state;
8615c6c1daeSBarry Smith 
8625c6c1daeSBarry Smith   PetscFunctionBegin;
863b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
864b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageSetActive(state, stage, isActive));
8653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8665c6c1daeSBarry Smith }
8675c6c1daeSBarry Smith 
8685c6c1daeSBarry Smith /*@
869811af0c4SBarry Smith   PetscLogStageGetActive - Checks if a stage is used for `PetscLogEventBegin()` and `PetscLogEventEnd()`.
8705c6c1daeSBarry Smith 
8715c6c1daeSBarry Smith   Not Collective
8725c6c1daeSBarry Smith 
8735c6c1daeSBarry Smith   Input Parameter:
8745c6c1daeSBarry Smith . stage - The stage
8755c6c1daeSBarry Smith 
8765c6c1daeSBarry Smith   Output Parameter:
877811af0c4SBarry Smith . isActive - The activity flag, `PETSC_TRUE` for logging, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
8785c6c1daeSBarry Smith 
8795c6c1daeSBarry Smith   Level: intermediate
8805c6c1daeSBarry Smith 
881d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
8825c6c1daeSBarry Smith @*/
883d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetActive(PetscLogStage stage, PetscBool *isActive)
884d71ae5a4SJacob Faibussowitsch {
885b665b14eSToby Isaac   PetscLogState state;
8865c6c1daeSBarry Smith 
8875c6c1daeSBarry Smith   PetscFunctionBegin;
888b665b14eSToby Isaac   *isActive = PETSC_FALSE;
889b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
890b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateStageGetActive(state, stage, isActive));
8913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8925c6c1daeSBarry Smith }
8935c6c1daeSBarry Smith 
8945c6c1daeSBarry Smith /*@
895811af0c4SBarry Smith   PetscLogStageSetVisible - Determines stage visibility in `PetscLogView()`
8965c6c1daeSBarry Smith 
8975c6c1daeSBarry Smith   Not Collective
8985c6c1daeSBarry Smith 
8995c6c1daeSBarry Smith   Input Parameters:
9005c6c1daeSBarry Smith + stage     - The stage
901811af0c4SBarry Smith - isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9025c6c1daeSBarry Smith 
9035c6c1daeSBarry Smith   Level: intermediate
9045c6c1daeSBarry Smith 
905aec76313SJacob Faibussowitsch   Developer Notes:
906b665b14eSToby Isaac   Visibility only affects the default log handler in `PetscLogView()`: stages that are
907b665b14eSToby Isaac   set to invisible are suppressed from output.
908811af0c4SBarry Smith 
909b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageGetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9105c6c1daeSBarry Smith @*/
911d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageSetVisible(PetscLogStage stage, PetscBool isVisible)
9125c6c1daeSBarry Smith 
913dff009beSToby Isaac {
9145c6c1daeSBarry Smith   PetscFunctionBegin;
915dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
916dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
917dff009beSToby Isaac 
918dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerStageSetVisible(h, stage, isVisible));
919dff009beSToby Isaac   }
9203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9215c6c1daeSBarry Smith }
9225c6c1daeSBarry Smith 
9235c6c1daeSBarry Smith /*@
924811af0c4SBarry Smith   PetscLogStageGetVisible - Returns stage visibility in `PetscLogView()`
9255c6c1daeSBarry Smith 
9265c6c1daeSBarry Smith   Not Collective
9275c6c1daeSBarry Smith 
9285c6c1daeSBarry Smith   Input Parameter:
9295c6c1daeSBarry Smith . stage - The stage
9305c6c1daeSBarry Smith 
9315c6c1daeSBarry Smith   Output Parameter:
932811af0c4SBarry Smith . isVisible - The visibility flag, `PETSC_TRUE` to print, else `PETSC_FALSE` (defaults to `PETSC_TRUE`)
9335c6c1daeSBarry Smith 
9345c6c1daeSBarry Smith   Level: intermediate
9355c6c1daeSBarry Smith 
936b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogStageSetVisible()`, `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
9375c6c1daeSBarry Smith @*/
938d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetVisible(PetscLogStage stage, PetscBool *isVisible)
939d71ae5a4SJacob Faibussowitsch {
940b665b14eSToby Isaac   PetscLogHandler handler;
9415c6c1daeSBarry Smith 
9425c6c1daeSBarry Smith   PetscFunctionBegin;
943b665b14eSToby Isaac   *isVisible = PETSC_FALSE;
944294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
9453a7d0413SPierre Jolivet   if (handler) PetscCall(PetscLogHandlerStageGetVisible(handler, stage, isVisible));
9463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9475c6c1daeSBarry Smith }
9485c6c1daeSBarry Smith 
949cc4c1da9SBarry Smith /*@
9505c6c1daeSBarry Smith   PetscLogStageGetId - Returns the stage id when given the stage name.
9515c6c1daeSBarry Smith 
9525c6c1daeSBarry Smith   Not Collective
9535c6c1daeSBarry Smith 
9545c6c1daeSBarry Smith   Input Parameter:
9555c6c1daeSBarry Smith . name - The stage name
9565c6c1daeSBarry Smith 
9575c6c1daeSBarry Smith   Output Parameter:
9585a4a3fabSBarry Smith . stage - The stage, , or -1 if no stage with that name exists
9595c6c1daeSBarry Smith 
9605c6c1daeSBarry Smith   Level: intermediate
9615c6c1daeSBarry Smith 
962d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
9635c6c1daeSBarry Smith @*/
964d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogStageGetId(const char name[], PetscLogStage *stage)
965d71ae5a4SJacob Faibussowitsch {
966b665b14eSToby Isaac   PetscLogState state;
9675c6c1daeSBarry Smith 
9685c6c1daeSBarry Smith   PetscFunctionBegin;
969b665b14eSToby Isaac   *stage = -1;
970b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
971b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetStageFromName(state, name, stage));
9723ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9735c6c1daeSBarry Smith }
9745c6c1daeSBarry Smith 
975cc4c1da9SBarry Smith /*@
97653e0a2f3SToby Isaac   PetscLogStageGetName - Returns the stage name when given the stage id.
97753e0a2f3SToby Isaac 
97853e0a2f3SToby Isaac   Not Collective
97953e0a2f3SToby Isaac 
98053e0a2f3SToby Isaac   Input Parameter:
98153e0a2f3SToby Isaac . stage - The stage
98253e0a2f3SToby Isaac 
98353e0a2f3SToby Isaac   Output Parameter:
98453e0a2f3SToby Isaac . name - The stage name
98553e0a2f3SToby Isaac 
98653e0a2f3SToby Isaac   Level: intermediate
98753e0a2f3SToby Isaac 
98853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogStagePush()`, `PetscLogStagePop()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
98953e0a2f3SToby Isaac @*/
990cc4c1da9SBarry Smith PetscErrorCode PetscLogStageGetName(PetscLogStage stage, const char *name[])
99153e0a2f3SToby Isaac {
99253e0a2f3SToby Isaac   PetscLogStageInfo stage_info;
99353e0a2f3SToby Isaac   PetscLogState     state;
99453e0a2f3SToby Isaac 
99553e0a2f3SToby Isaac   PetscFunctionBegin;
996b665b14eSToby Isaac   *name = NULL;
99753e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
998b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
99953e0a2f3SToby Isaac   PetscCall(PetscLogStateStageGetInfo(state, stage, &stage_info));
100053e0a2f3SToby Isaac   *name = stage_info.name;
100153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
100253e0a2f3SToby Isaac }
100353e0a2f3SToby Isaac 
10045c6c1daeSBarry Smith /*------------------------------------------------ Event Functions --------------------------------------------------*/
10057a101e5eSJacob Faibussowitsch 
1006cc4c1da9SBarry Smith /*@
1007811af0c4SBarry Smith   PetscLogEventRegister - Registers an event name for logging operations
10085c6c1daeSBarry Smith 
10095c6c1daeSBarry Smith   Not Collective
10105c6c1daeSBarry Smith 
1011d8d19677SJose E. Roman   Input Parameters:
10125c6c1daeSBarry Smith + name    - The name associated with the event
10135c6c1daeSBarry Smith - classid - The classid associated to the class for this event, obtain either with
1014811af0c4SBarry Smith            `PetscClassIdRegister()` or use a predefined one such as `KSP_CLASSID`, `SNES_CLASSID`, the predefined ones
10155c6c1daeSBarry Smith            are only available in C code
10165c6c1daeSBarry Smith 
10175c6c1daeSBarry Smith   Output Parameter:
1018811af0c4SBarry Smith . event - The event id for use with `PetscLogEventBegin()` and `PetscLogEventEnd()`.
10195c6c1daeSBarry Smith 
102010450e9eSJacob Faibussowitsch   Example Usage:
10215c6c1daeSBarry Smith .vb
10225c6c1daeSBarry Smith       PetscLogEvent USER_EVENT;
10235c6c1daeSBarry Smith       PetscClassId classid;
10245c6c1daeSBarry Smith       PetscLogDouble user_event_flops;
10255c6c1daeSBarry Smith       PetscClassIdRegister("class name",&classid);
10265c6c1daeSBarry Smith       PetscLogEventRegister("User event name",classid,&USER_EVENT);
10275c6c1daeSBarry Smith       PetscLogEventBegin(USER_EVENT,0,0,0,0);
10285c6c1daeSBarry Smith          [code segment to monitor]
10295c6c1daeSBarry Smith          PetscLogFlops(user_event_flops);
10305c6c1daeSBarry Smith       PetscLogEventEnd(USER_EVENT,0,0,0,0);
10315c6c1daeSBarry Smith .ve
10325c6c1daeSBarry Smith 
1033d1f92df0SBarry Smith   Level: intermediate
1034d1f92df0SBarry Smith 
10355c6c1daeSBarry Smith   Notes:
10365c6c1daeSBarry Smith   PETSc automatically logs library events if the code has been
1037a2553e36SBarry Smith   configured with --with-log (which is the default) and
1038811af0c4SBarry Smith   -log_view or -log_all is specified.  `PetscLogEventRegister()` is
10395c6c1daeSBarry Smith   intended for logging user events to supplement this PETSc
10405c6c1daeSBarry Smith   information.
10415c6c1daeSBarry Smith 
1042495fc317SBarry Smith   PETSc can gather data for use with the utilities Jumpshot
10435c6c1daeSBarry Smith   (part of the MPICH distribution).  If PETSc has been compiled
10445c6c1daeSBarry Smith   with flag -DPETSC_HAVE_MPE (MPE is an additional utility within
10455c6c1daeSBarry Smith   MPICH), the user can employ another command line option, -log_mpe,
10465c6c1daeSBarry Smith   to create a logfile, "mpe.log", which can be visualized
1047495fc317SBarry Smith   Jumpshot.
10485c6c1daeSBarry Smith 
10495c6c1daeSBarry Smith   The classid is associated with each event so that classes of events
10505c6c1daeSBarry Smith   can be disabled simultaneously, such as all matrix events. The user
1051811af0c4SBarry Smith   can either use an existing classid, such as `MAT_CLASSID`, or create
10525c6c1daeSBarry Smith   their own as shown in the example.
10535c6c1daeSBarry Smith 
1054c5deb1d5SJed Brown   If an existing event with the same name exists, its event handle is
1055c5deb1d5SJed Brown   returned instead of creating a new event.
1056c5deb1d5SJed Brown 
1057d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogStageRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogFlops()`,
1058db781477SPatrick Sanan           `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscClassIdRegister()`
10595c6c1daeSBarry Smith @*/
1060d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventRegister(const char name[], PetscClassId classid, PetscLogEvent *event)
1061d71ae5a4SJacob Faibussowitsch {
1062b665b14eSToby Isaac   PetscLogState state;
10635c6c1daeSBarry Smith 
10645c6c1daeSBarry Smith   PetscFunctionBegin;
1065b665b14eSToby Isaac   *event = -1;
1066b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1067b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventRegister(state, name, classid, event));
10683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
10695c6c1daeSBarry Smith }
10705c6c1daeSBarry Smith 
10715c6c1daeSBarry Smith /*@
1072217044c2SLisandro Dalcin   PetscLogEventSetCollective - Indicates that a particular event is collective.
1073217044c2SLisandro Dalcin 
10745aefd447SStefano Zampini   Logically Collective
1075217044c2SLisandro Dalcin 
1076d8d19677SJose E. Roman   Input Parameters:
1077217044c2SLisandro Dalcin + event      - The event id
1078ffbd2f08SBarry Smith - collective - `PetscBool` indicating whether a particular event is collective
1079217044c2SLisandro Dalcin 
1080d1f92df0SBarry Smith   Level: developer
1081d1f92df0SBarry Smith 
1082811af0c4SBarry Smith   Notes:
1083811af0c4SBarry Smith   New events returned from `PetscLogEventRegister()` are collective by default.
1084811af0c4SBarry Smith 
1085ffbd2f08SBarry Smith   Collective events are handled specially if the command line option `-log_sync` is used. In that case the logging saves information about
1086811af0c4SBarry Smith   two parts of the event; the time for all the MPI ranks to synchronize and then the time for the actual computation/communication
10875aefd447SStefano Zampini   to be performed. This option is useful to debug imbalance within the computations or communications.
1088217044c2SLisandro Dalcin 
1089d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventRegister()`
1090217044c2SLisandro Dalcin @*/
1091d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetCollective(PetscLogEvent event, PetscBool collective)
1092d71ae5a4SJacob Faibussowitsch {
1093b665b14eSToby Isaac   PetscLogState state;
1094217044c2SLisandro Dalcin 
1095217044c2SLisandro Dalcin   PetscFunctionBegin;
1096b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1097b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetCollective(state, event, collective));
1098b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1099b665b14eSToby Isaac }
1100b665b14eSToby Isaac 
1101b665b14eSToby Isaac /*
1102b665b14eSToby Isaac   PetscLogClassSetActiveAll - Activate or inactivate logging for all events associated with a PETSc object class in every stage.
1103b665b14eSToby Isaac 
1104b665b14eSToby Isaac   Not Collective
1105b665b14eSToby Isaac 
1106b665b14eSToby Isaac   Input Parameters:
1107b665b14eSToby Isaac + classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1108b665b14eSToby Isaac - isActive - if `PETSC_FALSE`, events associated with this class will not be send to log handlers.
1109b665b14eSToby Isaac 
1110b665b14eSToby Isaac   Level: developer
1111b665b14eSToby Isaac 
1112b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`, `PetscLogEventActivateClass()`
1113b665b14eSToby Isaac */
1114b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActiveAll(PetscClassId classid, PetscBool isActive)
1115b665b14eSToby Isaac {
1116b665b14eSToby Isaac   PetscLogState state;
1117b665b14eSToby Isaac 
1118b665b14eSToby Isaac   PetscFunctionBegin;
1119b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1120b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActiveAll(state, classid, isActive));
11213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1122217044c2SLisandro Dalcin }
1123217044c2SLisandro Dalcin 
1124217044c2SLisandro Dalcin /*@
1125fa2bb9feSLisandro Dalcin   PetscLogEventIncludeClass - Activates event logging for a PETSc object class in every stage.
1126fa2bb9feSLisandro Dalcin 
1127fa2bb9feSLisandro Dalcin   Not Collective
1128fa2bb9feSLisandro Dalcin 
1129fa2bb9feSLisandro Dalcin   Input Parameter:
1130811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1131fa2bb9feSLisandro Dalcin 
1132fa2bb9feSLisandro Dalcin   Level: developer
1133fa2bb9feSLisandro Dalcin 
1134d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivateClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
1135fa2bb9feSLisandro Dalcin @*/
1136d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventIncludeClass(PetscClassId classid)
1137d71ae5a4SJacob Faibussowitsch {
1138fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1139b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_TRUE));
11403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1141fa2bb9feSLisandro Dalcin }
1142fa2bb9feSLisandro Dalcin 
1143fa2bb9feSLisandro Dalcin /*@
1144fa2bb9feSLisandro Dalcin   PetscLogEventExcludeClass - Deactivates event logging for a PETSc object class in every stage.
1145fa2bb9feSLisandro Dalcin 
1146fa2bb9feSLisandro Dalcin   Not Collective
1147fa2bb9feSLisandro Dalcin 
1148fa2bb9feSLisandro Dalcin   Input Parameter:
1149811af0c4SBarry Smith . classid - The object class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1150fa2bb9feSLisandro Dalcin 
1151fa2bb9feSLisandro Dalcin   Level: developer
1152fa2bb9feSLisandro Dalcin 
1153811af0c4SBarry Smith   Note:
1154811af0c4SBarry Smith   If a class is excluded then events associated with that class are not logged.
1155811af0c4SBarry Smith 
1156d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventDeactivateClass()`, `PetscLogEventActivateClass()`, `PetscLogEventDeactivate()`, `PetscLogEventActivate()`
1157fa2bb9feSLisandro Dalcin @*/
1158d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventExcludeClass(PetscClassId classid)
1159d71ae5a4SJacob Faibussowitsch {
1160b665b14eSToby Isaac   PetscFunctionBegin;
1161b665b14eSToby Isaac   PetscCall(PetscLogClassSetActiveAll(classid, PETSC_FALSE));
1162b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1163b665b14eSToby Isaac }
1164b665b14eSToby Isaac 
1165b665b14eSToby Isaac /*
1166b665b14eSToby Isaac   PetscLogEventSetActive - Activate or inactivate logging for an event in a given stage
1167b665b14eSToby Isaac 
1168b665b14eSToby Isaac   Not Collective
1169b665b14eSToby Isaac 
1170b665b14eSToby Isaac   Input Parameters:
1171b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1172b665b14eSToby Isaac . event - A `PetscLogEvent`
1173b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, activity from this event (`PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogEventSync()`) will not be sent to log handlers during this stage
1174b665b14eSToby Isaac 
1175b665b14eSToby Isaac   Usage:
1176b665b14eSToby Isaac .vb
1177b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_FALSE);
1178b665b14eSToby Isaac         [code where you do not want to log VecSetValues()]
1179b665b14eSToby Isaac       PetscLogEventSetActive(VEC_SetValues, PETSC_TRUE);
1180b665b14eSToby Isaac         [code where you do want to log VecSetValues()]
1181b665b14eSToby Isaac .ve
1182b665b14eSToby Isaac 
1183b665b14eSToby Isaac   Level: advanced
1184b665b14eSToby Isaac 
1185b665b14eSToby Isaac   Note:
1186b665b14eSToby Isaac   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1187b665b14eSToby Isaac   or an event number obtained with `PetscLogEventRegister()`.
1188b665b14eSToby Isaac 
1189b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
1190b665b14eSToby Isaac */
1191b665b14eSToby Isaac static PetscErrorCode PetscLogEventSetActive(PetscLogStage stage, PetscLogEvent event, PetscBool isActive)
1192b665b14eSToby Isaac {
1193b665b14eSToby Isaac   PetscLogState state;
1194fa2bb9feSLisandro Dalcin 
1195fa2bb9feSLisandro Dalcin   PetscFunctionBegin;
1196b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1197b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActive(state, stage, event, isActive));
11983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1199fa2bb9feSLisandro Dalcin }
1200fa2bb9feSLisandro Dalcin 
1201fa2bb9feSLisandro Dalcin /*@
12025c6c1daeSBarry Smith   PetscLogEventActivate - Indicates that a particular event should be logged.
12035c6c1daeSBarry Smith 
12045c6c1daeSBarry Smith   Not Collective
12055c6c1daeSBarry Smith 
12065c6c1daeSBarry Smith   Input Parameter:
12075c6c1daeSBarry Smith . event - The event id
12085c6c1daeSBarry Smith 
120910450e9eSJacob Faibussowitsch   Example Usage:
12105c6c1daeSBarry Smith .vb
12115c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12125c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12135c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12145c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12155c6c1daeSBarry Smith .ve
12165c6c1daeSBarry Smith 
1217d1f92df0SBarry Smith   Level: advanced
1218d1f92df0SBarry Smith 
12195c6c1daeSBarry Smith   Note:
12205c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in include/petsclog.h)
1221811af0c4SBarry Smith   or an event number obtained with `PetscLogEventRegister()`.
12225c6c1daeSBarry Smith 
1223b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12245c6c1daeSBarry Smith @*/
1225d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivate(PetscLogEvent event)
1226d71ae5a4SJacob Faibussowitsch {
12275c6c1daeSBarry Smith   PetscFunctionBegin;
1228b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_TRUE));
12293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12305c6c1daeSBarry Smith }
12315c6c1daeSBarry Smith 
12325c6c1daeSBarry Smith /*@
12335c6c1daeSBarry Smith   PetscLogEventDeactivate - Indicates that a particular event should not be logged.
12345c6c1daeSBarry Smith 
12355c6c1daeSBarry Smith   Not Collective
12365c6c1daeSBarry Smith 
12375c6c1daeSBarry Smith   Input Parameter:
12385c6c1daeSBarry Smith . event - The event id
12395c6c1daeSBarry Smith 
124010450e9eSJacob Faibussowitsch   Example Usage:
12415c6c1daeSBarry Smith .vb
12425c6c1daeSBarry Smith       PetscLogEventDeactivate(VEC_SetValues);
12435c6c1daeSBarry Smith         [code where you do not want to log VecSetValues()]
12445c6c1daeSBarry Smith       PetscLogEventActivate(VEC_SetValues);
12455c6c1daeSBarry Smith         [code where you do want to log VecSetValues()]
12465c6c1daeSBarry Smith .ve
12475c6c1daeSBarry Smith 
1248d1f92df0SBarry Smith   Level: advanced
1249d1f92df0SBarry Smith 
12505c6c1daeSBarry Smith   Note:
12515c6c1daeSBarry Smith   The event may be either a pre-defined PETSc event (found in
1252811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
12535c6c1daeSBarry Smith 
1254d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`
12555c6c1daeSBarry Smith @*/
1256d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivate(PetscLogEvent event)
1257d71ae5a4SJacob Faibussowitsch {
12585c6c1daeSBarry Smith   PetscFunctionBegin;
1259b665b14eSToby Isaac   PetscCall(PetscLogEventSetActive(PETSC_DEFAULT, event, PETSC_FALSE));
12603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12615c6c1daeSBarry Smith }
12625c6c1daeSBarry Smith 
12635c6c1daeSBarry Smith /*@
1264811af0c4SBarry Smith   PetscLogEventDeactivatePush - Indicates that a particular event should not be logged until `PetscLogEventDeactivatePop()` is called
1265c00cb57fSBarry Smith 
1266c00cb57fSBarry Smith   Not Collective
1267c00cb57fSBarry Smith 
1268c00cb57fSBarry Smith   Input Parameter:
1269c00cb57fSBarry Smith . event - The event id
1270c00cb57fSBarry Smith 
127110450e9eSJacob Faibussowitsch   Example Usage:
1272c00cb57fSBarry Smith .vb
1273c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1274c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1275c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1276c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1277c00cb57fSBarry Smith .ve
1278c00cb57fSBarry Smith 
1279d1f92df0SBarry Smith   Level: advanced
1280d1f92df0SBarry Smith 
1281c00cb57fSBarry Smith   Note:
1282c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1283811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1284c00cb57fSBarry Smith 
1285baca6076SPierre 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.
1286b665b14eSToby Isaac 
12874b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`, `PetscLogEventDeactivatePop()`
1288c00cb57fSBarry Smith @*/
1289d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent event)
1290d71ae5a4SJacob Faibussowitsch {
1291c00cb57fSBarry Smith   PetscFunctionBegin;
1292dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1293dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1294dff009beSToby Isaac 
1295dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePush(h, PETSC_DEFAULT, event));
1296dff009beSToby Isaac   }
12973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1298c00cb57fSBarry Smith }
1299c00cb57fSBarry Smith 
1300c00cb57fSBarry Smith /*@
1301811af0c4SBarry Smith   PetscLogEventDeactivatePop - Indicates that a particular event should again be logged after the logging was turned off with `PetscLogEventDeactivatePush()`
1302c00cb57fSBarry Smith 
1303c00cb57fSBarry Smith   Not Collective
1304c00cb57fSBarry Smith 
1305c00cb57fSBarry Smith   Input Parameter:
1306c00cb57fSBarry Smith . event - The event id
1307c00cb57fSBarry Smith 
130810450e9eSJacob Faibussowitsch   Example Usage:
1309c00cb57fSBarry Smith .vb
1310c00cb57fSBarry Smith       PetscLogEventDeactivatePush(VEC_SetValues);
1311c00cb57fSBarry Smith         [code where you do not want to log VecSetValues()]
1312c00cb57fSBarry Smith       PetscLogEventDeactivatePop(VEC_SetValues);
1313c00cb57fSBarry Smith         [code where you do want to log VecSetValues()]
1314c00cb57fSBarry Smith .ve
1315c00cb57fSBarry Smith 
1316d1f92df0SBarry Smith   Level: advanced
1317d1f92df0SBarry Smith 
1318c00cb57fSBarry Smith   Note:
1319c00cb57fSBarry Smith   The event may be either a pre-defined PETSc event (found in
1320811af0c4SBarry Smith   include/petsclog.h) or an event number obtained with `PetscLogEventRegister()`).
1321c00cb57fSBarry Smith 
1322d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivatePush()`
1323c00cb57fSBarry Smith @*/
1324d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent event)
1325d71ae5a4SJacob Faibussowitsch {
1326c00cb57fSBarry Smith   PetscFunctionBegin;
1327dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1328dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1329dff009beSToby Isaac 
1330dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventDeactivatePop(h, PETSC_DEFAULT, event));
1331dff009beSToby Isaac   }
13323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1333c00cb57fSBarry Smith }
1334c00cb57fSBarry Smith 
1335c00cb57fSBarry Smith /*@
1336811af0c4SBarry Smith   PetscLogEventSetActiveAll - Turns on logging of all events
13375c6c1daeSBarry Smith 
13385c6c1daeSBarry Smith   Not Collective
13395c6c1daeSBarry Smith 
13405c6c1daeSBarry Smith   Input Parameters:
13415c6c1daeSBarry Smith + event    - The event id
13425c6c1daeSBarry Smith - isActive - The activity flag determining whether the event is logged
13435c6c1daeSBarry Smith 
13445c6c1daeSBarry Smith   Level: advanced
13455c6c1daeSBarry Smith 
1346b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13475c6c1daeSBarry Smith @*/
1348d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent event, PetscBool isActive)
1349d71ae5a4SJacob Faibussowitsch {
1350b665b14eSToby Isaac   PetscLogState state;
13515c6c1daeSBarry Smith 
13525c6c1daeSBarry Smith   PetscFunctionBegin;
1353b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1354b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateEventSetActiveAll(state, event, isActive));
1355b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
13565c6c1daeSBarry Smith }
1357b665b14eSToby Isaac 
1358b665b14eSToby Isaac /*
1359b665b14eSToby Isaac   PetscLogClassSetActive - Activates event logging for a PETSc object class for the current stage
1360b665b14eSToby Isaac 
1361b665b14eSToby Isaac   Not Collective
1362b665b14eSToby Isaac 
1363b665b14eSToby Isaac   Input Parameters:
1364b665b14eSToby Isaac + stage - A registered `PetscLogStage` (or `PETSC_DEFAULT` for the current stage)
1365b665b14eSToby Isaac . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
1366b665b14eSToby Isaac - isActive - If `PETSC_FALSE`, events associated with this class are not sent to log handlers.
1367b665b14eSToby Isaac 
1368b665b14eSToby Isaac   Level: developer
1369b665b14eSToby Isaac 
1370b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventActivate()`, `PetscLogEventActivateAll()`, `PetscLogStageSetActive()`
1371b665b14eSToby Isaac */
1372b665b14eSToby Isaac static PetscErrorCode PetscLogClassSetActive(PetscLogStage stage, PetscClassId classid, PetscBool isActive)
1373b665b14eSToby Isaac {
1374b665b14eSToby Isaac   PetscLogState state;
1375b665b14eSToby Isaac 
1376b665b14eSToby Isaac   PetscFunctionBegin;
1377b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1378b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateClassSetActive(state, stage, classid, isActive));
13793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13805c6c1daeSBarry Smith }
13815c6c1daeSBarry Smith 
13825c6c1daeSBarry Smith /*@
1383811af0c4SBarry Smith   PetscLogEventActivateClass - Activates event logging for a PETSc object class for the current stage
13845c6c1daeSBarry Smith 
13855c6c1daeSBarry Smith   Not Collective
13865c6c1daeSBarry Smith 
13875c6c1daeSBarry Smith   Input Parameter:
1388811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
13895c6c1daeSBarry Smith 
13905c6c1daeSBarry Smith   Level: developer
13915c6c1daeSBarry Smith 
1392d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventDeactivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
13935c6c1daeSBarry Smith @*/
1394d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventActivateClass(PetscClassId classid)
1395d71ae5a4SJacob Faibussowitsch {
13965c6c1daeSBarry Smith   PetscFunctionBegin;
1397b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_TRUE));
13983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
13995c6c1daeSBarry Smith }
14005c6c1daeSBarry Smith 
14015c6c1daeSBarry Smith /*@
1402811af0c4SBarry Smith   PetscLogEventDeactivateClass - Deactivates event logging for a PETSc object class for the current stage
14035c6c1daeSBarry Smith 
14045c6c1daeSBarry Smith   Not Collective
14055c6c1daeSBarry Smith 
14065c6c1daeSBarry Smith   Input Parameter:
1407811af0c4SBarry Smith . classid - The event class, for example `MAT_CLASSID`, `SNES_CLASSID`, etc.
14085c6c1daeSBarry Smith 
14095c6c1daeSBarry Smith   Level: developer
14105c6c1daeSBarry Smith 
1411d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventIncludeClass()`, `PetscLogEventExcludeClass()`, `PetscLogEventActivateClass()`, `PetscLogEventActivate()`, `PetscLogEventDeactivate()`
14125c6c1daeSBarry Smith @*/
1413d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventDeactivateClass(PetscClassId classid)
1414d71ae5a4SJacob Faibussowitsch {
14155c6c1daeSBarry Smith   PetscFunctionBegin;
1416b665b14eSToby Isaac   PetscCall(PetscLogClassSetActive(PETSC_DEFAULT, classid, PETSC_FALSE));
14173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
14185c6c1daeSBarry Smith }
14195c6c1daeSBarry Smith 
14205c6c1daeSBarry Smith /*MC
142162872c28SLisandro Dalcin   PetscLogEventSync - Synchronizes the beginning of a user event.
142262872c28SLisandro Dalcin 
142362872c28SLisandro Dalcin   Synopsis:
142462872c28SLisandro Dalcin   #include <petsclog.h>
1425b665b14eSToby Isaac   PetscErrorCode PetscLogEventSync(PetscLogEvent e, MPI_Comm comm)
142662872c28SLisandro Dalcin 
142762872c28SLisandro Dalcin   Collective
142862872c28SLisandro Dalcin 
142962872c28SLisandro Dalcin   Input Parameters:
1430b665b14eSToby Isaac + e    - `PetscLogEvent` obtained from `PetscLogEventRegister()`
143162872c28SLisandro Dalcin - comm - an MPI communicator
143262872c28SLisandro Dalcin 
143310450e9eSJacob Faibussowitsch   Example Usage:
143462872c28SLisandro Dalcin .vb
143562872c28SLisandro Dalcin   PetscLogEvent USER_EVENT;
143610450e9eSJacob Faibussowitsch 
143762872c28SLisandro Dalcin   PetscLogEventRegister("User event", 0, &USER_EVENT);
143862872c28SLisandro Dalcin   PetscLogEventSync(USER_EVENT, PETSC_COMM_WORLD);
143962872c28SLisandro Dalcin   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
144062872c28SLisandro Dalcin   [code segment to monitor]
144162872c28SLisandro Dalcin   PetscLogEventEnd(USER_EVENT, 0, 0, 0 , 0);
144262872c28SLisandro Dalcin .ve
144362872c28SLisandro Dalcin 
1444d1f92df0SBarry Smith   Level: developer
1445d1f92df0SBarry Smith 
1446811af0c4SBarry Smith   Note:
144710450e9eSJacob Faibussowitsch   This routine should be called only if there is not a `PetscObject` available to pass to
144810450e9eSJacob Faibussowitsch   `PetscLogEventBegin()`.
144962872c28SLisandro Dalcin 
1450d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`
145162872c28SLisandro Dalcin M*/
145262872c28SLisandro Dalcin 
145362872c28SLisandro Dalcin /*MC
14545c6c1daeSBarry Smith   PetscLogEventBegin - Logs the beginning of a user event.
14555c6c1daeSBarry Smith 
14565c6c1daeSBarry Smith   Synopsis:
1457aaa7dc30SBarry Smith   #include <petsclog.h>
1458b665b14eSToby Isaac   PetscErrorCode PetscLogEventBegin(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
14595c6c1daeSBarry Smith 
14605c6c1daeSBarry Smith   Not Collective
14615c6c1daeSBarry Smith 
14625c6c1daeSBarry Smith   Input Parameters:
1463b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1464baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1465baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1466baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1467baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
14685c6c1daeSBarry Smith 
14695c6c1daeSBarry Smith   Fortran Synopsis:
14705c6c1daeSBarry Smith   void PetscLogEventBegin(int e, PetscErrorCode ierr)
14715c6c1daeSBarry Smith 
147210450e9eSJacob Faibussowitsch   Example Usage:
14735c6c1daeSBarry Smith .vb
14745c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
147510450e9eSJacob Faibussowitsch 
14765c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
14775c6c1daeSBarry Smith   PetscLogEventRegister("User event",0, &USER_EVENT);
14785c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
14795c6c1daeSBarry Smith   [code segment to monitor]
14805c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
14815c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
14825c6c1daeSBarry Smith .ve
14835c6c1daeSBarry Smith 
1484d1f92df0SBarry Smith   Level: intermediate
1485d1f92df0SBarry Smith 
1486811af0c4SBarry Smith   Developer Note:
148710450e9eSJacob Faibussowitsch   `PetscLogEventBegin()` and `PetscLogEventBegin()` return error codes instead of explicitly
148810450e9eSJacob Faibussowitsch   handling the errors that occur in the macro directly because other packages that use this
148910450e9eSJacob Faibussowitsch   macros have used them in their own functions or methods that do not return error codes and it
149010450e9eSJacob Faibussowitsch   would be disruptive to change the current behavior.
1491d0609cedSBarry Smith 
1492d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventEnd()`, `PetscLogFlops()`
14935c6c1daeSBarry Smith M*/
14945c6c1daeSBarry Smith 
14955c6c1daeSBarry Smith /*MC
14965c6c1daeSBarry Smith   PetscLogEventEnd - Log the end of a user event.
14975c6c1daeSBarry Smith 
14985c6c1daeSBarry Smith   Synopsis:
1499aaa7dc30SBarry Smith   #include <petsclog.h>
1500b665b14eSToby Isaac   PetscErrorCode PetscLogEventEnd(PetscLogEvent e, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
15015c6c1daeSBarry Smith 
15025c6c1daeSBarry Smith   Not Collective
15035c6c1daeSBarry Smith 
15045c6c1daeSBarry Smith   Input Parameters:
1505b665b14eSToby Isaac + e  - `PetscLogEvent` obtained from `PetscLogEventRegister()`
1506baca6076SPierre Jolivet . o1 - object associated with the event, or `NULL`
1507baca6076SPierre Jolivet . o2 - object associated with the event, or `NULL`
1508baca6076SPierre Jolivet . o3 - object associated with the event, or `NULL`
1509baca6076SPierre Jolivet - o4 - object associated with the event, or `NULL`
15105c6c1daeSBarry Smith 
15115c6c1daeSBarry Smith   Fortran Synopsis:
15125c6c1daeSBarry Smith   void PetscLogEventEnd(int e, PetscErrorCode ierr)
15135c6c1daeSBarry Smith 
151410450e9eSJacob Faibussowitsch   Example Usage:
15155c6c1daeSBarry Smith .vb
15165c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
151710450e9eSJacob Faibussowitsch 
15185c6c1daeSBarry Smith   PetscLogDouble user_event_flops;
151910450e9eSJacob Faibussowitsch   PetscLogEventRegister("User event", 0, &USER_EVENT);
15205c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
15215c6c1daeSBarry Smith   [code segment to monitor]
15225c6c1daeSBarry Smith   PetscLogFlops(user_event_flops);
15235c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
15245c6c1daeSBarry Smith .ve
15255c6c1daeSBarry Smith 
15265c6c1daeSBarry Smith   Level: intermediate
15275c6c1daeSBarry Smith 
1528d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogFlops()`
15295c6c1daeSBarry Smith M*/
15305c6c1daeSBarry Smith 
15315c6c1daeSBarry Smith /*@C
15328b08f494SToby Isaac   PetscLogStageGetPerfInfo - Return the performance information about the given stage
15338b08f494SToby Isaac 
1534cc4c1da9SBarry Smith   No Fortran Support
1535cc4c1da9SBarry Smith 
15368b08f494SToby Isaac   Input Parameters:
15378b08f494SToby Isaac . stage - The stage number or `PETSC_DETERMINE` for the current stage
15388b08f494SToby Isaac 
15398b08f494SToby Isaac   Output Parameter:
15408b08f494SToby Isaac . info - This structure is filled with the performance information
15418b08f494SToby Isaac 
15428b08f494SToby Isaac   Level: intermediate
15438b08f494SToby Isaac 
15448b08f494SToby Isaac   Notes:
15458b08f494SToby Isaac   This is a low level routine used by the logging functions in PETSc.
15468b08f494SToby Isaac 
15478b08f494SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15485804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15490ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15508b08f494SToby Isaac 
15518b08f494SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
15528b08f494SToby Isaac @*/
15538b08f494SToby Isaac PetscErrorCode PetscLogStageGetPerfInfo(PetscLogStage stage, PetscEventPerfInfo *info)
15548b08f494SToby Isaac {
15558b08f494SToby Isaac   PetscLogHandler     handler;
15568b08f494SToby Isaac   PetscEventPerfInfo *event_info;
15578b08f494SToby Isaac 
15588b08f494SToby Isaac   PetscFunctionBegin;
15598b08f494SToby Isaac   PetscAssertPointer(info, 2);
15600ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
15610ba5dad9SToby Isaac   if (handler) {
15628b08f494SToby Isaac     PetscCall(PetscLogHandlerGetStagePerfInfo(handler, stage, &event_info));
15638b08f494SToby Isaac     *info = *event_info;
15640ba5dad9SToby Isaac   } else {
15650ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogStageGetPerfInfo() returning zeros\n"));
15660ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
15670ba5dad9SToby Isaac   }
15688b08f494SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
15698b08f494SToby Isaac }
15708b08f494SToby Isaac 
15718b08f494SToby Isaac /*@C
1572b665b14eSToby Isaac   PetscLogEventGetPerfInfo - Return the performance information about the given event in the given stage
1573b665b14eSToby Isaac 
1574cc4c1da9SBarry Smith   No Fortran Support
1575cc4c1da9SBarry Smith 
1576b665b14eSToby Isaac   Input Parameters:
1577b665b14eSToby Isaac + stage - The stage number or `PETSC_DETERMINE` for the current stage
1578b665b14eSToby Isaac - event - The event number
1579b665b14eSToby Isaac 
1580b665b14eSToby Isaac   Output Parameter:
1581b665b14eSToby Isaac . info - This structure is filled with the performance information
1582b665b14eSToby Isaac 
1583b665b14eSToby Isaac   Level: intermediate
1584b665b14eSToby Isaac 
1585b665b14eSToby Isaac   Note:
1586b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1587b665b14eSToby Isaac 
15880ba5dad9SToby Isaac   A `PETSCLOGHANDLERDEFAULT` must be running for this to work, having been started either with
15895804573cSPierre Jolivet   `PetscLogDefaultBegin()` or from the command line with `-log_view`.  If it was not started,
15900ba5dad9SToby Isaac   all performance statistics in `info` will be zeroed.
15910ba5dad9SToby Isaac 
1592b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogGetDefaultHandler()`
1593b665b14eSToby Isaac @*/
1594b665b14eSToby Isaac PetscErrorCode PetscLogEventGetPerfInfo(PetscLogStage stage, PetscLogEvent event, PetscEventPerfInfo *info)
1595b665b14eSToby Isaac {
1596b665b14eSToby Isaac   PetscLogHandler     handler;
1597b665b14eSToby Isaac   PetscEventPerfInfo *event_info;
1598b665b14eSToby Isaac 
1599b665b14eSToby Isaac   PetscFunctionBegin;
1600b665b14eSToby Isaac   PetscAssertPointer(info, 3);
16010ba5dad9SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
16020ba5dad9SToby Isaac   if (handler) {
1603dff009beSToby Isaac     PetscCall(PetscLogHandlerGetEventPerfInfo(handler, stage, event, &event_info));
1604b665b14eSToby Isaac     *info = *event_info;
16050ba5dad9SToby Isaac   } else {
16060ba5dad9SToby Isaac     PetscCall(PetscInfo(NULL, "Default log handler is not running, PetscLogEventGetPerfInfo() returning zeros\n"));
16070ba5dad9SToby Isaac     PetscCall(PetscMemzero(info, sizeof(*info)));
16080ba5dad9SToby Isaac   }
1609b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1610b665b14eSToby Isaac }
1611b665b14eSToby Isaac 
1612cc4c1da9SBarry Smith /*@
1613b665b14eSToby Isaac   PetscLogEventSetDof - Set the nth number of degrees of freedom of a numerical problem associated with this event
1614b665b14eSToby Isaac 
1615b665b14eSToby Isaac   Not Collective
1616b665b14eSToby Isaac 
1617b665b14eSToby Isaac   Input Parameters:
1618b665b14eSToby Isaac + event - The event id to log
1619b665b14eSToby Isaac . n     - The dof index, in [0, 8)
1620b665b14eSToby Isaac - dof   - The number of dofs
1621b665b14eSToby Isaac 
1622b665b14eSToby Isaac   Options Database Key:
1623b665b14eSToby Isaac . -log_view - Activates log summary
1624b665b14eSToby Isaac 
1625b665b14eSToby Isaac   Level: developer
1626b665b14eSToby Isaac 
1627b665b14eSToby Isaac   Note:
1628b665b14eSToby Isaac   This is to enable logging of convergence
1629b665b14eSToby Isaac 
1630b665b14eSToby Isaac .seealso: `PetscLogEventSetError()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1631b665b14eSToby Isaac @*/
1632b665b14eSToby Isaac PetscErrorCode PetscLogEventSetDof(PetscLogEvent event, PetscInt n, PetscLogDouble dof)
1633b665b14eSToby Isaac {
1634b665b14eSToby Isaac   PetscFunctionBegin;
1635b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1636dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1637dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1638dff009beSToby Isaac 
1639dff009beSToby Isaac     if (h) {
1640dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1641dff009beSToby Isaac 
1642dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1643dff009beSToby Isaac       if (event_info) event_info->dof[n] = dof;
1644dff009beSToby Isaac     }
1645b665b14eSToby Isaac   }
1646b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1647b665b14eSToby Isaac }
1648b665b14eSToby Isaac 
1649cc4c1da9SBarry Smith /*@
1650b665b14eSToby Isaac   PetscLogEventSetError - Set the nth error associated with a numerical problem associated with this event
1651b665b14eSToby Isaac 
1652b665b14eSToby Isaac   Not Collective
1653b665b14eSToby Isaac 
1654b665b14eSToby Isaac   Input Parameters:
1655b665b14eSToby Isaac + event - The event id to log
1656b665b14eSToby Isaac . n     - The error index, in [0, 8)
1657b665b14eSToby Isaac - error - The error
1658b665b14eSToby Isaac 
1659b665b14eSToby Isaac   Options Database Key:
1660b665b14eSToby Isaac . -log_view - Activates log summary
1661b665b14eSToby Isaac 
1662b665b14eSToby Isaac   Level: developer
1663b665b14eSToby Isaac 
1664b665b14eSToby Isaac   Notes:
1665b665b14eSToby Isaac   This is to enable logging of convergence, and enable users to interpret the errors as they wish. For example,
1666b665b14eSToby Isaac   as different norms, or as errors for different fields
1667b665b14eSToby Isaac 
1668b665b14eSToby Isaac   This is a low level routine used by the logging functions in PETSc
1669b665b14eSToby Isaac 
1670b665b14eSToby Isaac .seealso: `PetscLogEventSetDof()`, `PetscLogEventRegister()`, `PetscLogGetDefaultHandler()`
1671b665b14eSToby Isaac @*/
1672b665b14eSToby Isaac PetscErrorCode PetscLogEventSetError(PetscLogEvent event, PetscInt n, PetscLogDouble error)
1673b665b14eSToby Isaac {
1674b665b14eSToby Isaac   PetscFunctionBegin;
1675b665b14eSToby Isaac   PetscCheck(!(n < 0) && !(n > 7), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Error index %" PetscInt_FMT " is not in [0, 8)", n);
1676dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1677dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1678dff009beSToby Isaac 
1679dff009beSToby Isaac     if (h) {
1680dff009beSToby Isaac       PetscEventPerfInfo *event_info;
1681dff009beSToby Isaac 
1682dff009beSToby Isaac       PetscCall(PetscLogHandlerGetEventPerfInfo(h, PETSC_DEFAULT, event, &event_info));
1683dff009beSToby Isaac       if (event_info) event_info->errors[n] = error;
1684dff009beSToby Isaac     }
1685b665b14eSToby Isaac   }
1686b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
1687b665b14eSToby Isaac }
1688b665b14eSToby Isaac 
1689cc4c1da9SBarry Smith /*@
16905c6c1daeSBarry Smith   PetscLogEventGetId - Returns the event id when given the event name.
16915c6c1daeSBarry Smith 
16925c6c1daeSBarry Smith   Not Collective
16935c6c1daeSBarry Smith 
16945c6c1daeSBarry Smith   Input Parameter:
16955c6c1daeSBarry Smith . name - The event name
16965c6c1daeSBarry Smith 
16975c6c1daeSBarry Smith   Output Parameter:
1698c5deb1d5SJed Brown . event - The event, or -1 if no event with that name exists
16995c6c1daeSBarry Smith 
17005c6c1daeSBarry Smith   Level: intermediate
17015c6c1daeSBarry Smith 
1702d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
17035c6c1daeSBarry Smith @*/
1704d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogEventGetId(const char name[], PetscLogEvent *event)
1705d71ae5a4SJacob Faibussowitsch {
1706b665b14eSToby Isaac   PetscLogState state;
17075c6c1daeSBarry Smith 
17085c6c1daeSBarry Smith   PetscFunctionBegin;
1709b665b14eSToby Isaac   *event = -1;
1710b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
1711b665b14eSToby Isaac   if (state) PetscCall(PetscLogStateGetEventFromName(state, name, event));
17123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
17135c6c1daeSBarry Smith }
17145c6c1daeSBarry Smith 
1715cc4c1da9SBarry Smith /*@
171653e0a2f3SToby Isaac   PetscLogEventGetName - Returns the event name when given the event id.
171753e0a2f3SToby Isaac 
171853e0a2f3SToby Isaac   Not Collective
171953e0a2f3SToby Isaac 
172053e0a2f3SToby Isaac   Input Parameter:
172153e0a2f3SToby Isaac . event - The event
172253e0a2f3SToby Isaac 
172353e0a2f3SToby Isaac   Output Parameter:
172453e0a2f3SToby Isaac . name - The event name
172553e0a2f3SToby Isaac 
172653e0a2f3SToby Isaac   Level: intermediate
172753e0a2f3SToby Isaac 
172853e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
172953e0a2f3SToby Isaac @*/
1730cc4c1da9SBarry Smith PetscErrorCode PetscLogEventGetName(PetscLogEvent event, const char *name[])
173153e0a2f3SToby Isaac {
173253e0a2f3SToby Isaac   PetscLogEventInfo event_info;
173353e0a2f3SToby Isaac   PetscLogState     state;
173453e0a2f3SToby Isaac 
173553e0a2f3SToby Isaac   PetscFunctionBegin;
1736b665b14eSToby Isaac   *name = NULL;
173753e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1738b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
173953e0a2f3SToby Isaac   PetscCall(PetscLogStateEventGetInfo(state, event, &event_info));
174053e0a2f3SToby Isaac   *name = event_info.name;
174153e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
174253e0a2f3SToby Isaac }
174353e0a2f3SToby Isaac 
174453e0a2f3SToby Isaac /*@
174553e0a2f3SToby 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.
174653e0a2f3SToby Isaac 
174753e0a2f3SToby Isaac   Not collective
174853e0a2f3SToby Isaac 
174953e0a2f3SToby Isaac   Level: advanced
175053e0a2f3SToby Isaac 
175153e0a2f3SToby Isaac   Notes:
175253e0a2f3SToby 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()`).
175353e0a2f3SToby Isaac 
175453e0a2f3SToby Isaac   Other log handlers (such as the nested handler, `PetscLogNestedBegin()`) will ignore this function.
175553e0a2f3SToby Isaac 
1756b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsResume()`, `PetscLogGetDefaultHandler()`
175753e0a2f3SToby Isaac @*/
175853e0a2f3SToby Isaac PetscErrorCode PetscLogEventsPause(void)
175953e0a2f3SToby Isaac {
176053e0a2f3SToby Isaac   PetscFunctionBegin;
1761dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1762dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1763dff009beSToby Isaac 
1764dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsPause(h));
1765dff009beSToby Isaac   }
176653e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
176753e0a2f3SToby Isaac }
176853e0a2f3SToby Isaac 
176953e0a2f3SToby Isaac /*@
177053e0a2f3SToby Isaac   PetscLogEventsResume - Return logging to normal behavior after it was paused with `PetscLogEventsPause()`.
177153e0a2f3SToby Isaac 
177253e0a2f3SToby Isaac   Not collective
177353e0a2f3SToby Isaac 
177453e0a2f3SToby Isaac   Level: advanced
177553e0a2f3SToby Isaac 
1776b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogEventDeactivatePush()`, `PetscLogEventDeactivatePop()`, `PetscLogEventsPause()`, `PetscLogGetDefaultHandler()`
177753e0a2f3SToby Isaac @*/
177853e0a2f3SToby Isaac PetscErrorCode PetscLogEventsResume(void)
177953e0a2f3SToby Isaac {
178053e0a2f3SToby Isaac   PetscFunctionBegin;
1781dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
1782dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
1783dff009beSToby Isaac 
1784dff009beSToby Isaac     if (h) PetscCall(PetscLogHandlerEventsResume(h));
1785dff009beSToby Isaac   }
178653e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
178753e0a2f3SToby Isaac }
178853e0a2f3SToby Isaac 
17891c1ad86eSToby Isaac /*------------------------------------------------ Class Functions --------------------------------------------------*/
17901c1ad86eSToby Isaac 
17911c1ad86eSToby Isaac /*MC
17921c1ad86eSToby Isaac    PetscLogObjectCreate - Log the creation of a `PetscObject`
17931c1ad86eSToby Isaac 
17941c1ad86eSToby Isaac    Synopsis:
17951c1ad86eSToby Isaac    #include <petsclog.h>
17961c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectCreate(PetscObject h)
17971c1ad86eSToby Isaac 
17981c1ad86eSToby Isaac    Not Collective
17991c1ad86eSToby Isaac 
18001c1ad86eSToby Isaac    Input Parameters:
18011c1ad86eSToby Isaac .  h - A `PetscObject`
18021c1ad86eSToby Isaac 
18031c1ad86eSToby Isaac    Level: developer
18041c1ad86eSToby Isaac 
18051c1ad86eSToby Isaac    Developer Note:
18061c1ad86eSToby Isaac      Called internally by PETSc when creating objects: users do not need to call this directly.
1807b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18081c1ad86eSToby Isaac 
1809b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectDestroy()`
18101c1ad86eSToby Isaac M*/
18111c1ad86eSToby Isaac 
18121c1ad86eSToby Isaac /*MC
18131c1ad86eSToby Isaac    PetscLogObjectDestroy - Logs the destruction of a `PetscObject`
18141c1ad86eSToby Isaac 
18151c1ad86eSToby Isaac    Synopsis:
18161c1ad86eSToby Isaac    #include <petsclog.h>
18171c1ad86eSToby Isaac    PetscErrorCode PetscLogObjectDestroy(PetscObject h)
18181c1ad86eSToby Isaac 
18191c1ad86eSToby Isaac    Not Collective
18201c1ad86eSToby Isaac 
18211c1ad86eSToby Isaac    Input Parameters:
18221c1ad86eSToby Isaac .  h - A `PetscObject`
18231c1ad86eSToby Isaac 
18241c1ad86eSToby Isaac    Level: developer
18251c1ad86eSToby Isaac 
18261c1ad86eSToby Isaac    Developer Note:
18271c1ad86eSToby Isaac      Called internally by PETSc when destroying objects: users do not need to call this directly.
1828b665b14eSToby Isaac      Notification of the object creation is sent to each `PetscLogHandler` that is running.
18291c1ad86eSToby Isaac 
1830b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogHandler`, `PetscLogObjectCreate()`
18311c1ad86eSToby Isaac M*/
18321c1ad86eSToby Isaac 
1833cc4c1da9SBarry Smith /*@
183453e0a2f3SToby Isaac   PetscLogClassGetClassId - Returns the `PetscClassId` when given the class name.
183553e0a2f3SToby Isaac 
183653e0a2f3SToby Isaac   Not Collective
183753e0a2f3SToby Isaac 
183853e0a2f3SToby Isaac   Input Parameter:
183953e0a2f3SToby Isaac . name - The class name
184053e0a2f3SToby Isaac 
184153e0a2f3SToby Isaac   Output Parameter:
184253e0a2f3SToby Isaac . classid - The `PetscClassId` id, or -1 if no class with that name exists
184353e0a2f3SToby Isaac 
184453e0a2f3SToby Isaac   Level: intermediate
184553e0a2f3SToby Isaac 
184653e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscLogStageGetId()`
184753e0a2f3SToby Isaac @*/
184853e0a2f3SToby Isaac PetscErrorCode PetscLogClassGetClassId(const char name[], PetscClassId *classid)
184953e0a2f3SToby Isaac {
185053e0a2f3SToby Isaac   PetscLogClass     log_class;
185153e0a2f3SToby Isaac   PetscLogClassInfo class_info;
185253e0a2f3SToby Isaac   PetscLogState     state;
185353e0a2f3SToby Isaac 
185453e0a2f3SToby Isaac   PetscFunctionBegin;
1855b665b14eSToby Isaac   *classid = -1;
185653e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
1857b665b14eSToby Isaac   if (!state) PetscFunctionReturn(PETSC_SUCCESS);
185853e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromName(state, name, &log_class));
185953e0a2f3SToby Isaac   if (log_class < 0) {
186053e0a2f3SToby Isaac     *classid = -1;
186153e0a2f3SToby Isaac     PetscFunctionReturn(PETSC_SUCCESS);
186253e0a2f3SToby Isaac   }
186353e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
186453e0a2f3SToby Isaac   *classid = class_info.classid;
186553e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
186653e0a2f3SToby Isaac }
186753e0a2f3SToby Isaac 
186853e0a2f3SToby Isaac /*@C
186953e0a2f3SToby Isaac   PetscLogClassIdGetName - Returns a `PetscClassId`'s name.
187053e0a2f3SToby Isaac 
187153e0a2f3SToby Isaac   Not Collective
187253e0a2f3SToby Isaac 
187353e0a2f3SToby Isaac   Input Parameter:
187453e0a2f3SToby Isaac . classid - A `PetscClassId`
187553e0a2f3SToby Isaac 
187653e0a2f3SToby Isaac   Output Parameter:
187753e0a2f3SToby Isaac . name - The class name
187853e0a2f3SToby Isaac 
187953e0a2f3SToby Isaac   Level: intermediate
188053e0a2f3SToby Isaac 
188153e0a2f3SToby Isaac .seealso: [](ch_profiling), `PetscLogClassRegister()`, `PetscLogClassBegin()`, `PetscLogClassEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`, `PetscPreLoadClass()`
188253e0a2f3SToby Isaac @*/
188353e0a2f3SToby Isaac PetscErrorCode PetscLogClassIdGetName(PetscClassId classid, const char **name)
188453e0a2f3SToby Isaac {
188553e0a2f3SToby Isaac   PetscLogClass     log_class;
188653e0a2f3SToby Isaac   PetscLogClassInfo class_info;
188753e0a2f3SToby Isaac   PetscLogState     state;
188853e0a2f3SToby Isaac 
188953e0a2f3SToby Isaac   PetscFunctionBegin;
189053e0a2f3SToby Isaac   PetscCall(PetscLogGetState(&state));
189153e0a2f3SToby Isaac   PetscCall(PetscLogStateGetClassFromClassId(state, classid, &log_class));
189253e0a2f3SToby Isaac   PetscCall(PetscLogStateClassGetInfo(state, log_class, &class_info));
189353e0a2f3SToby Isaac   *name = class_info.name;
189453e0a2f3SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
189553e0a2f3SToby Isaac }
189653e0a2f3SToby Isaac 
18975c6c1daeSBarry Smith /*------------------------------------------------ Output Functions -------------------------------------------------*/
1898cc4c1da9SBarry Smith /*@
18995c6c1daeSBarry Smith   PetscLogDump - Dumps logs of objects to a file. This file is intended to
19005c6c1daeSBarry Smith   be read by bin/petscview. This program no longer exists.
19015c6c1daeSBarry Smith 
1902811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
19035c6c1daeSBarry Smith 
19045c6c1daeSBarry Smith   Input Parameter:
1905aec76313SJacob Faibussowitsch . sname - an optional file name
19065c6c1daeSBarry Smith 
190710450e9eSJacob Faibussowitsch   Example Usage:
19085c6c1daeSBarry Smith .vb
19095c6c1daeSBarry Smith   PetscInitialize(...);
1910b665b14eSToby Isaac   PetscLogDefaultBegin();
1911b665b14eSToby Isaac   // ... code ...
19125c6c1daeSBarry Smith   PetscLogDump(filename);
19135c6c1daeSBarry Smith   PetscFinalize();
19145c6c1daeSBarry Smith .ve
19155c6c1daeSBarry Smith 
1916d1f92df0SBarry Smith   Level: advanced
1917d1f92df0SBarry Smith 
1918811af0c4SBarry Smith   Note:
191937fdd005SBarry Smith   The default file name is Log.<rank> where <rank> is the MPI process rank. If no name is specified,
19205c6c1daeSBarry Smith   this file will be used.
19215c6c1daeSBarry Smith 
1922b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogView()`, `PetscLogGetDefaultHandler()`
19235c6c1daeSBarry Smith @*/
1924d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogDump(const char sname[])
1925d71ae5a4SJacob Faibussowitsch {
1926b665b14eSToby Isaac   PetscLogHandler handler;
19275c6c1daeSBarry Smith 
19285c6c1daeSBarry Smith   PetscFunctionBegin;
1929294de794SToby Isaac   PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
1930dff009beSToby Isaac   PetscCall(PetscLogHandlerDump(handler, sname));
1931b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
19325c6c1daeSBarry Smith }
1933b665b14eSToby Isaac 
1934cc4c1da9SBarry Smith /*@
1935b665b14eSToby Isaac   PetscLogMPEDump - Dumps the MPE logging info to file for later use with Jumpshot.
1936b665b14eSToby Isaac 
19378f14a041SBarry Smith   Collective on `PETSC_COMM_WORLD`
1938b665b14eSToby Isaac 
1939b665b14eSToby Isaac   Input Parameter:
1940b665b14eSToby Isaac . sname - filename for the MPE logfile
1941b665b14eSToby Isaac 
1942b665b14eSToby Isaac   Level: advanced
1943b665b14eSToby Isaac 
1944b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogDump()`, `PetscLogMPEBegin()`
1945b665b14eSToby Isaac @*/
1946b665b14eSToby Isaac PetscErrorCode PetscLogMPEDump(const char sname[])
1947b665b14eSToby Isaac {
1948b665b14eSToby Isaac   PetscFunctionBegin;
1949b665b14eSToby Isaac   #if defined(PETSC_HAVE_MPE)
1950b665b14eSToby Isaac   if (PetscBeganMPE) {
1951b665b14eSToby Isaac     char name[PETSC_MAX_PATH_LEN];
1952b665b14eSToby Isaac 
1953b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Finalizing MPE.\n"));
1954b665b14eSToby Isaac     if (sname) {
1955b665b14eSToby Isaac       PetscCall(PetscStrncpy(name, sname, sizeof(name)));
19565c6c1daeSBarry Smith     } else {
1957b665b14eSToby Isaac       PetscCall(PetscGetProgramName(name, sizeof(name)));
19585c6c1daeSBarry Smith     }
1959b665b14eSToby Isaac     PetscCall(MPE_Finish_log(name));
19605c6c1daeSBarry Smith   } else {
1961b665b14eSToby Isaac     PetscCall(PetscInfo(0, "Not finalizing MPE (not started by PETSc).\n"));
19625c6c1daeSBarry Smith   }
1963c2a741eeSJunchao Zhang   #else
1964b665b14eSToby Isaac   SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_SUP_SYS, "PETSc was configured without MPE support, reconfigure with --with-mpe or --download-mpe");
1965c2a741eeSJunchao Zhang   #endif
19663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
19675c6c1daeSBarry Smith }
19685c6c1daeSBarry Smith 
1969ffeef943SBarry Smith /*@
19707d6c928cSSatish Balay   PetscLogView - Prints a summary of the logging.
19715c6c1daeSBarry Smith 
19728f14a041SBarry Smith   Collective
19735c6c1daeSBarry Smith 
19745c6c1daeSBarry Smith   Input Parameter:
1975f14045dbSBarry Smith . viewer - an ASCII viewer
19765c6c1daeSBarry Smith 
19775c6c1daeSBarry Smith   Options Database Keys:
1978bb1d7374SBarry Smith + -log_view [:filename]                    - Prints summary of log information
1979bb1d7374SBarry Smith . -log_view :filename.py:ascii_info_detail - Saves logging information from each process as a Python file
1980607d249eSBarry 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)
1981d0a29bd7SConnor 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)
1982156b51fbSBarry Smith . -log_view_memory                         - Also display memory usage in each event
1983156b51fbSBarry Smith . -log_view_gpu_time                       - Also display time in each event for GPU kernels (Note this may slow the computation)
1984811af0c4SBarry Smith . -log_all                                 - Saves a file Log.rank for each MPI rank with details of each step of the computation
1985bb1d7374SBarry Smith - -log_trace [filename]                    - Displays a trace of what each process is doing
19865c6c1daeSBarry Smith 
1987d1f92df0SBarry Smith   Level: beginner
1988d1f92df0SBarry Smith 
19895c6c1daeSBarry Smith   Notes:
1990da81f932SPierre Jolivet   It is possible to control the logging programmatically but we recommend using the options database approach whenever possible
19915c6c1daeSBarry Smith   By default the summary is printed to stdout.
19925c6c1daeSBarry Smith 
1993bb1d7374SBarry Smith   Before calling this routine you must have called either PetscLogDefaultBegin() or PetscLogNestedBegin()
1994bb1d7374SBarry Smith 
1995bb1d7374SBarry Smith   If PETSc is configured with --with-logging=0 then this functionality is not available
1996bb1d7374SBarry Smith 
1997607d249eSBarry Smith   To view the nested XML format filename.xml first copy  ${PETSC_DIR}/share/petsc/xml/performance_xml2html.xsl to the current
1998607d249eSBarry Smith   directory then open filename.xml with your browser. Specific notes for certain browsers
19991d27aa22SBarry Smith .vb
20001d27aa22SBarry Smith     Firefox and Internet explorer - simply open the file
20011d27aa22SBarry Smith     Google Chrome - you must start up Chrome with the option --allow-file-access-from-files
20021d27aa22SBarry Smith     Safari - see https://ccm.net/faq/36342-safari-how-to-enable-local-file-access
20031d27aa22SBarry Smith .ve
20041d27aa22SBarry 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
2005607d249eSBarry Smith   your browser.
20062add09c0SLisandro Dalcin   Alternatively, use the script ${PETSC_DIR}/lib/petsc/bin/petsc-performance-view to automatically open a new browser
20072add09c0SLisandro Dalcin   window and render the XML log file contents.
2008607d249eSBarry Smith 
2009bb1d7374SBarry Smith   The nested XML format was kindly donated by Koos Huijssen and Christiaan M. Klaij  MARITIME  RESEARCH  INSTITUTE  NETHERLANDS
2010bb1d7374SBarry Smith 
20111d27aa22SBarry Smith   The Flame Graph output can be visualised using either the original Flame Graph script <https://github.com/brendangregg/FlameGraph>
20121d27aa22SBarry Smith   or using speedscope <https://www.speedscope.app>.
2013d0a29bd7SConnor Ward   Old XML profiles may be converted into this format using the script ${PETSC_DIR}/lib/petsc/bin/xml2flamegraph.py.
2014d0a29bd7SConnor Ward 
2015d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogDefaultBegin()`, `PetscLogDump()`
20165c6c1daeSBarry Smith @*/
2017d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogView(PetscViewer viewer)
2018d71ae5a4SJacob Faibussowitsch {
2019f14045dbSBarry Smith   PetscBool         isascii;
2020f14045dbSBarry Smith   PetscViewerFormat format;
2021b665b14eSToby Isaac   int               stage;
2022b665b14eSToby Isaac   PetscLogState     state;
2023b665b14eSToby Isaac   PetscIntStack     temp_stack;
2024b665b14eSToby Isaac   PetscLogHandler   handler;
2025b665b14eSToby Isaac   PetscBool         is_empty;
20265c6c1daeSBarry Smith 
20275c6c1daeSBarry Smith   PetscFunctionBegin;
2028b665b14eSToby Isaac   PetscCall(PetscLogGetState(&state));
202937b78d16SBarry Smith   /* Pop off any stages the user forgot to remove */
2030b665b14eSToby Isaac   PetscCall(PetscIntStackCreate(&temp_stack));
2031b665b14eSToby Isaac   PetscCall(PetscLogStateGetCurrentStage(state, &stage));
203237b78d16SBarry Smith   while (stage >= 0) {
2033b665b14eSToby Isaac     PetscCall(PetscLogStagePop());
2034b665b14eSToby Isaac     PetscCall(PetscIntStackPush(temp_stack, stage));
2035b665b14eSToby Isaac     PetscCall(PetscLogStateGetCurrentStage(state, &stage));
203637b78d16SBarry Smith   }
20379566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
203828b400f6SJacob Faibussowitsch   PetscCheck(isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Currently can only view logging to ASCII");
20399566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
2040b665b14eSToby Isaac   if (format == PETSC_VIEWER_ASCII_XML || format == PETSC_VIEWER_ASCII_FLAMEGRAPH) {
2041294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERNESTED, &handler));
2042b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
2043b665b14eSToby Isaac   } else {
2044294de794SToby Isaac     PetscCall(PetscLogGetHandler(PETSCLOGHANDLERDEFAULT, &handler));
2045b665b14eSToby Isaac     PetscCall(PetscLogHandlerView(handler, viewer));
20465c6c1daeSBarry Smith   }
2047b665b14eSToby Isaac   PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2048b665b14eSToby Isaac   while (!is_empty) {
2049b665b14eSToby Isaac     PetscCall(PetscIntStackPop(temp_stack, &stage));
2050b665b14eSToby Isaac     PetscCall(PetscLogStagePush(stage));
2051b665b14eSToby Isaac     PetscCall(PetscIntStackEmpty(temp_stack, &is_empty));
2052b665b14eSToby Isaac   }
2053b665b14eSToby Isaac   PetscCall(PetscIntStackDestroy(temp_stack));
20543ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
20555c6c1daeSBarry Smith }
20565c6c1daeSBarry Smith 
2057f14045dbSBarry Smith /*@C
2058811af0c4SBarry Smith   PetscLogViewFromOptions - Processes command line options to determine if/how a `PetscLog` is to be viewed.
2059f14045dbSBarry Smith 
2060811af0c4SBarry Smith   Collective on `PETSC_COMM_WORLD`
2061f14045dbSBarry Smith 
2062811af0c4SBarry Smith   Level: developer
2063f14045dbSBarry Smith 
2064d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`
2065f14045dbSBarry Smith @*/
2066d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogViewFromOptions(void)
2067d71ae5a4SJacob Faibussowitsch {
2068ad2e3d55SToby Isaac   PetscInt          n_max = PETSC_LOG_VIEW_FROM_OPTIONS_MAX;
2069ad2e3d55SToby Isaac   PetscViewer       viewers[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2070ad2e3d55SToby Isaac   PetscViewerFormat formats[PETSC_LOG_VIEW_FROM_OPTIONS_MAX];
2071f14045dbSBarry Smith   PetscBool         flg;
2072f14045dbSBarry Smith 
2073f14045dbSBarry Smith   PetscFunctionBegin;
2074648c30bcSBarry Smith   PetscCall(PetscOptionsCreateViewers(PETSC_COMM_WORLD, NULL, NULL, "-log_view", &n_max, viewers, formats, &flg));
20750bc1c2e8SToby Isaac   /*
20760bc1c2e8SToby Isaac      PetscLogHandlerView_Default_Info() wants to be sure that the only objects still around are these viewers, so keep track of how many there are
20770bc1c2e8SToby Isaac    */
20780bc1c2e8SToby Isaac   PetscLogNumViewersCreated = n_max;
2079ad2e3d55SToby Isaac   for (PetscInt i = 0; i < n_max; i++) {
20800bc1c2e8SToby Isaac     PetscInt refct;
20810bc1c2e8SToby Isaac 
2082ad2e3d55SToby Isaac     PetscCall(PetscViewerPushFormat(viewers[i], formats[i]));
2083ad2e3d55SToby Isaac     PetscCall(PetscLogView(viewers[i]));
2084ad2e3d55SToby Isaac     PetscCall(PetscViewerPopFormat(viewers[i]));
20850bc1c2e8SToby Isaac     PetscCall(PetscObjectGetReference((PetscObject)viewers[i], &refct));
2086648c30bcSBarry Smith     PetscCall(PetscViewerDestroy(&viewers[i]));
20870bc1c2e8SToby Isaac     if (refct == 1) PetscLogNumViewersDestroyed++;
2088f14045dbSBarry Smith   }
2089a0449d98SPierre Jolivet   PetscLogNumViewersDestroyed = 0;
20903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2091f14045dbSBarry Smith }
2092f14045dbSBarry Smith 
2093b665b14eSToby Isaac PETSC_INTERN PetscErrorCode PetscLogHandlerNestedSetThreshold(PetscLogHandler, PetscLogDouble, PetscLogDouble *);
2094b665b14eSToby Isaac 
2095b665b14eSToby Isaac /*@
2096b665b14eSToby Isaac   PetscLogSetThreshold - Set the threshold time for logging the events; this is a percentage out of 100, so 1. means any event
2097b665b14eSToby Isaac   that takes 1 or more percent of the time.
2098b665b14eSToby Isaac 
20998f14a041SBarry Smith   Logically Collective on `PETSC_COMM_WORLD`
2100b665b14eSToby Isaac 
2101b665b14eSToby Isaac   Input Parameter:
2102b665b14eSToby Isaac . newThresh - the threshold to use
2103b665b14eSToby Isaac 
2104b665b14eSToby Isaac   Output Parameter:
2105b665b14eSToby Isaac . oldThresh - the previously set threshold value
2106b665b14eSToby Isaac 
2107b665b14eSToby Isaac   Options Database Keys:
2108b665b14eSToby Isaac . -log_view :filename.xml:ascii_xml - Prints an XML summary of flop and timing information to the file
2109b665b14eSToby Isaac 
2110b665b14eSToby Isaac   Example Usage:
2111b665b14eSToby Isaac .vb
2112b665b14eSToby Isaac   PetscInitialize(...);
2113b665b14eSToby Isaac   PetscLogNestedBegin();
2114b665b14eSToby Isaac   PetscLogSetThreshold(0.1,&oldthresh);
2115b665b14eSToby Isaac   // ... code ...
2116b665b14eSToby Isaac   PetscLogView(viewer);
2117b665b14eSToby Isaac   PetscFinalize();
2118b665b14eSToby Isaac .ve
2119b665b14eSToby Isaac 
2120b665b14eSToby Isaac   Level: advanced
2121b665b14eSToby Isaac 
2122b665b14eSToby Isaac   Note:
2123b665b14eSToby Isaac   This threshold is only used by the nested log handler
2124b665b14eSToby Isaac 
2125b665b14eSToby Isaac .seealso: `PetscLogDump()`, `PetscLogView()`, `PetscLogTraceBegin()`, `PetscLogDefaultBegin()`,
2126b665b14eSToby Isaac           `PetscLogNestedBegin()`
2127b665b14eSToby Isaac @*/
2128b665b14eSToby Isaac PetscErrorCode PetscLogSetThreshold(PetscLogDouble newThresh, PetscLogDouble *oldThresh)
2129b665b14eSToby Isaac {
2130b665b14eSToby Isaac   PetscLogHandler handler;
2131b665b14eSToby Isaac 
2132b665b14eSToby Isaac   PetscFunctionBegin;
2133294de794SToby Isaac   PetscCall(PetscLogTryGetHandler(PETSCLOGHANDLERNESTED, &handler));
2134b665b14eSToby Isaac   PetscCall(PetscLogHandlerNestedSetThreshold(handler, newThresh, oldThresh));
2135b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2136b665b14eSToby Isaac }
2137b665b14eSToby Isaac 
21385c6c1daeSBarry Smith /*----------------------------------------------- Counter Functions -------------------------------------------------*/
2139cc4c1da9SBarry Smith /*@
21405c6c1daeSBarry Smith   PetscGetFlops - Returns the number of flops used on this processor
21415c6c1daeSBarry Smith   since the program began.
21425c6c1daeSBarry Smith 
21435c6c1daeSBarry Smith   Not Collective
21445c6c1daeSBarry Smith 
21455c6c1daeSBarry Smith   Output Parameter:
214610450e9eSJacob Faibussowitsch . flops - number of floating point operations
21475c6c1daeSBarry Smith 
2148d1f92df0SBarry Smith   Level: intermediate
2149d1f92df0SBarry Smith 
21505c6c1daeSBarry Smith   Notes:
21515c6c1daeSBarry Smith   A global counter logs all PETSc flop counts.  The user can use
2152811af0c4SBarry Smith   `PetscLogFlops()` to increment this counter to include flops for the
21535c6c1daeSBarry Smith   application code.
21545c6c1daeSBarry Smith 
21554b7c4d4dSPierre Jolivet   A separate counter `PetscLogGpuFlops()` logs the flops that occur on any GPU associated with this MPI rank
2156811af0c4SBarry Smith 
21574b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscTime()`, `PetscLogFlops()`
21585c6c1daeSBarry Smith @*/
2159d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscGetFlops(PetscLogDouble *flops)
2160d71ae5a4SJacob Faibussowitsch {
21615c6c1daeSBarry Smith   PetscFunctionBegin;
21625c6c1daeSBarry Smith   *flops = petsc_TotalFlops;
21633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21645c6c1daeSBarry Smith }
21655c6c1daeSBarry Smith 
21661c1ad86eSToby Isaac /*@C
21671c1ad86eSToby Isaac   PetscLogObjectState - Record information about an object with the default log handler
21681c1ad86eSToby Isaac 
21691c1ad86eSToby Isaac   Not Collective
21701c1ad86eSToby Isaac 
21711c1ad86eSToby Isaac   Input Parameters:
21721c1ad86eSToby Isaac + obj    - the `PetscObject`
21731c1ad86eSToby Isaac . format - a printf-style format string
21741c1ad86eSToby Isaac - ...    - printf arguments to format
21751c1ad86eSToby Isaac 
21761c1ad86eSToby Isaac   Level: developer
21771c1ad86eSToby Isaac 
2178b665b14eSToby Isaac .seealso: [](ch_profiling), `PetscLogObjectCreate()`, `PetscLogObjectDestroy()`, `PetscLogGetDefaultHandler()`
21791c1ad86eSToby Isaac @*/
2180d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogObjectState(PetscObject obj, const char format[], ...)
2181d71ae5a4SJacob Faibussowitsch {
21825c6c1daeSBarry Smith   PetscFunctionBegin;
2183dff009beSToby Isaac   for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
2184dff009beSToby Isaac     PetscLogHandler h = PetscLogHandlers[i].handler;
2185dff009beSToby Isaac 
2186dff009beSToby Isaac     if (h) {
2187dff009beSToby Isaac       va_list Argp;
21885c6c1daeSBarry Smith       va_start(Argp, format);
2189dff009beSToby Isaac       PetscCall(PetscLogHandlerLogObjectState_Internal(h, obj, format, Argp));
21905c6c1daeSBarry Smith       va_end(Argp);
2191b665b14eSToby Isaac     }
2192dff009beSToby Isaac   }
21933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21945c6c1daeSBarry Smith }
21955c6c1daeSBarry Smith 
21965c6c1daeSBarry Smith /*MC
21975c6c1daeSBarry Smith   PetscLogFlops - Adds floating point operations to the global counter.
21985c6c1daeSBarry Smith 
21995c6c1daeSBarry Smith   Synopsis:
2200aaa7dc30SBarry Smith   #include <petsclog.h>
22015c6c1daeSBarry Smith   PetscErrorCode PetscLogFlops(PetscLogDouble f)
22025c6c1daeSBarry Smith 
22035c6c1daeSBarry Smith   Not Collective
22045c6c1daeSBarry Smith 
22055c6c1daeSBarry Smith   Input Parameter:
22065c6c1daeSBarry Smith . f - flop counter
22075c6c1daeSBarry Smith 
220810450e9eSJacob Faibussowitsch   Example Usage:
22095c6c1daeSBarry Smith .vb
22105c6c1daeSBarry Smith   PetscLogEvent USER_EVENT;
221110450e9eSJacob Faibussowitsch 
22125c6c1daeSBarry Smith   PetscLogEventRegister("User event", 0, &USER_EVENT);
22135c6c1daeSBarry Smith   PetscLogEventBegin(USER_EVENT, 0, 0, 0, 0);
22145c6c1daeSBarry Smith   [code segment to monitor]
22155c6c1daeSBarry Smith   PetscLogFlops(user_flops)
22165c6c1daeSBarry Smith   PetscLogEventEnd(USER_EVENT, 0, 0, 0, 0);
22175c6c1daeSBarry Smith .ve
22185c6c1daeSBarry Smith 
2219d1f92df0SBarry Smith   Level: intermediate
2220d1f92df0SBarry Smith 
2221811af0c4SBarry Smith   Note:
222210450e9eSJacob Faibussowitsch    A global counter logs all PETSc flop counts. The user can use PetscLogFlops() to increment
222310450e9eSJacob Faibussowitsch    this counter to include flops for the application code.
22245c6c1daeSBarry Smith 
22254b7c4d4dSPierre Jolivet .seealso: [](ch_profiling), `PetscLogGpuFlops()`, `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscGetFlops()`
22265c6c1daeSBarry Smith M*/
22275c6c1daeSBarry Smith 
22285c6c1daeSBarry Smith /*MC
222910450e9eSJacob Faibussowitsch   PetscPreLoadBegin - Begin a segment of code that may be preloaded (run twice) to get accurate
223010450e9eSJacob Faibussowitsch   timings
22315c6c1daeSBarry Smith 
22325c6c1daeSBarry Smith   Synopsis:
2233aaa7dc30SBarry Smith   #include <petsclog.h>
22345c6c1daeSBarry Smith   void PetscPreLoadBegin(PetscBool flag, char *name);
22355c6c1daeSBarry Smith 
22365c6c1daeSBarry Smith   Not Collective
22375c6c1daeSBarry Smith 
2238d8d19677SJose E. Roman   Input Parameters:
223910450e9eSJacob Faibussowitsch + flag - `PETSC_TRUE` to run twice, `PETSC_FALSE` to run once, may be overridden with command
224010450e9eSJacob Faibussowitsch          line option `-preload true|false`
224110450e9eSJacob Faibussowitsch - name - name of first stage (lines of code timed separately with `-log_view`) to be preloaded
22425c6c1daeSBarry Smith 
224310450e9eSJacob Faibussowitsch   Example Usage:
22445c6c1daeSBarry Smith .vb
224510450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
224610450e9eSJacob Faibussowitsch   // lines of code
22475c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
224810450e9eSJacob Faibussowitsch   // lines of code
22495c6c1daeSBarry Smith   PetscPreLoadEnd();
22505c6c1daeSBarry Smith .ve
22515c6c1daeSBarry Smith 
2252d1f92df0SBarry Smith   Level: intermediate
2253d1f92df0SBarry Smith 
2254811af0c4SBarry Smith   Note:
225595452b02SPatrick Sanan   Only works in C/C++, not Fortran
22565c6c1daeSBarry Smith 
225710450e9eSJacob Faibussowitsch   Flags available within the macro\:
225810450e9eSJacob Faibussowitsch + PetscPreLoadingUsed - `PETSC_TRUE` if we are or have done preloading
225910450e9eSJacob Faibussowitsch . PetscPreLoadingOn   - `PETSC_TRUE` if it is CURRENTLY doing preload
226010450e9eSJacob Faibussowitsch . PetscPreLoadIt      - `0` for the first computation (with preloading turned off it is only
226110450e9eSJacob Faibussowitsch                         `0`) `1`  for the second
226210450e9eSJacob Faibussowitsch - PetscPreLoadMax     - number of times it will do the computation, only one when preloading is
226310450e9eSJacob Faibussowitsch                         turned on
226410450e9eSJacob Faibussowitsch 
226510450e9eSJacob Faibussowitsch   The first two variables are available throughout the program, the second two only between the
226610450e9eSJacob Faibussowitsch   `PetscPreLoadBegin()` and `PetscPreLoadEnd()`
22675c6c1daeSBarry Smith 
2268d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadEnd()`, `PetscPreLoadStage()`
22695c6c1daeSBarry Smith M*/
22705c6c1daeSBarry Smith 
22715c6c1daeSBarry Smith /*MC
227210450e9eSJacob Faibussowitsch   PetscPreLoadEnd - End a segment of code that may be preloaded (run twice) to get accurate
227310450e9eSJacob Faibussowitsch   timings
22745c6c1daeSBarry Smith 
22755c6c1daeSBarry Smith   Synopsis:
2276aaa7dc30SBarry Smith   #include <petsclog.h>
22775c6c1daeSBarry Smith   void PetscPreLoadEnd(void);
22785c6c1daeSBarry Smith 
22795c6c1daeSBarry Smith   Not Collective
22805c6c1daeSBarry Smith 
228110450e9eSJacob Faibussowitsch   Example Usage:
22825c6c1daeSBarry Smith .vb
228310450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE, "first stage");
228410450e9eSJacob Faibussowitsch   // lines of code
22855c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
228610450e9eSJacob Faibussowitsch   // lines of code
22875c6c1daeSBarry Smith   PetscPreLoadEnd();
22885c6c1daeSBarry Smith .ve
22895c6c1daeSBarry Smith 
2290d1f92df0SBarry Smith   Level: intermediate
2291d1f92df0SBarry Smith 
2292811af0c4SBarry Smith   Note:
2293dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
22945c6c1daeSBarry Smith 
2295d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadStage()`
22965c6c1daeSBarry Smith M*/
22975c6c1daeSBarry Smith 
22985c6c1daeSBarry Smith /*MC
229910450e9eSJacob Faibussowitsch   PetscPreLoadStage - Start a new segment of code to be timed separately to get accurate timings
23005c6c1daeSBarry Smith 
23015c6c1daeSBarry Smith   Synopsis:
2302aaa7dc30SBarry Smith   #include <petsclog.h>
23035c6c1daeSBarry Smith   void PetscPreLoadStage(char *name);
23045c6c1daeSBarry Smith 
23055c6c1daeSBarry Smith   Not Collective
23065c6c1daeSBarry Smith 
230710450e9eSJacob Faibussowitsch   Example Usage:
23085c6c1daeSBarry Smith .vb
230910450e9eSJacob Faibussowitsch   PetscPreLoadBegin(PETSC_TRUE,"first stage");
231010450e9eSJacob Faibussowitsch   // lines of code
23115c6c1daeSBarry Smith   PetscPreLoadStage("second stage");
231210450e9eSJacob Faibussowitsch   // lines of code
23135c6c1daeSBarry Smith   PetscPreLoadEnd();
23145c6c1daeSBarry Smith .ve
23155c6c1daeSBarry Smith 
2316d1f92df0SBarry Smith   Level: intermediate
2317d1f92df0SBarry Smith 
2318811af0c4SBarry Smith   Note:
2319dd01b7e5SBarry Smith   Only works in C/C++ not Fortran
23205c6c1daeSBarry Smith 
2321d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`, `PetscLogEventBegin()`, `PetscLogEventEnd()`, `PetscPreLoadBegin()`, `PetscPreLoadEnd()`
23225c6c1daeSBarry Smith M*/
23235c6c1daeSBarry Smith 
2324a4af0ceeSJacob Faibussowitsch   #if PetscDefined(HAVE_DEVICE)
2325a4af0ceeSJacob Faibussowitsch     #include <petsc/private/deviceimpl.h>
23269ffd0706SHong Zhang 
2327cc4c1da9SBarry Smith /*@
2328156b51fbSBarry Smith   PetscLogGpuTime - turn on the logging of GPU time for GPU kernels
2329156b51fbSBarry Smith 
2330811af0c4SBarry Smith   Options Database Key:
2331efa05fe8SBarry Smith . -log_view_gpu_time - provide the GPU times for all events in the `-log_view` output
2332156b51fbSBarry Smith 
2333d1f92df0SBarry Smith   Level: advanced
2334d1f92df0SBarry Smith 
2335156b51fbSBarry Smith   Notes:
233610450e9eSJacob Faibussowitsch   Turning on the timing of the GPU kernels can slow down the entire computation and should only
2337efa05fe8SBarry Smith   be used when studying the performance of individual operations on GPU such as vector operations and
233810450e9eSJacob Faibussowitsch   matrix-vector operations.
2339156b51fbSBarry Smith 
2340efa05fe8SBarry 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
2341efa05fe8SBarry Smith 
234210450e9eSJacob Faibussowitsch   This routine should only be called once near the beginning of the program. Once it is started
234310450e9eSJacob Faibussowitsch   it cannot be turned off.
2344156b51fbSBarry Smith 
2345d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTimeBegin()`
2346156b51fbSBarry Smith @*/
2347d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTime(void)
2348d71ae5a4SJacob Faibussowitsch {
2349473903fcSJunchao Zhang   PetscFunctionBegin;
2350473903fcSJunchao Zhang   PetscCheck(petsc_gtime == 0.0, PETSC_COMM_SELF, PETSC_ERR_SUP, "GPU logging has already been turned on");
2351156b51fbSBarry Smith   PetscLogGpuTimeFlag = PETSC_TRUE;
2352473903fcSJunchao Zhang   PetscFunctionReturn(PETSC_SUCCESS);
2353156b51fbSBarry Smith }
2354156b51fbSBarry Smith 
2355cc4c1da9SBarry Smith /*@
23569ffd0706SHong Zhang   PetscLogGpuTimeBegin - Start timer for device
23579ffd0706SHong Zhang 
2358d1f92df0SBarry Smith   Level: intermediate
2359d1f92df0SBarry Smith 
23609ffd0706SHong Zhang   Notes:
23617d766218SJunchao Zhang   When GPU is enabled, the timer is run on the GPU, it is a separate logging of time
236210450e9eSJacob Faibussowitsch   devoted to GPU computations (excluding kernel launch times).
2363811af0c4SBarry Smith 
23647d766218SJunchao Zhang   When GPU is not available, the timer is run on the CPU, it is a separate logging of
236510450e9eSJacob Faibussowitsch   time devoted to GPU computations (including kernel launch times).
2366811af0c4SBarry Smith 
236710450e9eSJacob Faibussowitsch   There is no need to call WaitForCUDA() or WaitForHIP() between `PetscLogGpuTimeBegin()` and
236810450e9eSJacob Faibussowitsch   `PetscLogGpuTimeEnd()`
2369811af0c4SBarry Smith 
237010450e9eSJacob Faibussowitsch   This timer should NOT include times for data transfers between the GPU and CPU, nor setup
237110450e9eSJacob Faibussowitsch   actions such as allocating space.
2372811af0c4SBarry Smith 
237310450e9eSJacob Faibussowitsch   The regular logging captures the time for data transfers and any CPU activities during the
237410450e9eSJacob Faibussowitsch   event. It is used to compute the flop rate on the GPU as it is actively engaged in running a
237510450e9eSJacob Faibussowitsch   kernel.
23769ffd0706SHong Zhang 
23779ffd0706SHong Zhang   Developer Notes:
237810450e9eSJacob Faibussowitsch   The GPU event timer captures the execution time of all the kernels launched in the default
237954c05997SPierre Jolivet   stream by the CPU between `PetscLogGpuTimeBegin()` and `PetscLogGpuTimeEnd()`.
2380811af0c4SBarry Smith 
238154c05997SPierre Jolivet   `PetscLogGpuTimeBegin()` and `PetscLogGpuTimeEnd()` insert the begin and end events into the
238210450e9eSJacob Faibussowitsch   default stream (stream 0). The device will record a time stamp for the event when it reaches
238310450e9eSJacob Faibussowitsch   that event in the stream. The function xxxEventSynchronize() is called in
238454c05997SPierre Jolivet   `PetscLogGpuTimeEnd()` to block CPU execution, but not continued GPU execution, until the
238510450e9eSJacob Faibussowitsch   timer event is recorded.
23869ffd0706SHong Zhang 
2387d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeEnd()`, `PetscLogGpuTime()`
23889ffd0706SHong Zhang @*/
2389d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeBegin(void)
2390d71ae5a4SJacob Faibussowitsch {
2391b665b14eSToby Isaac   PetscBool isActive;
2392b665b14eSToby Isaac 
23939ffd0706SHong Zhang   PetscFunctionBegin;
2394b665b14eSToby Isaac   PetscCall(PetscLogEventBeginIsActive(&isActive));
2395b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
23967d766218SJunchao Zhang     #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
23977d766218SJunchao Zhang   {
2398a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2399a4af0ceeSJacob Faibussowitsch 
24009566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
24019566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextBeginTimer_Internal(dctx));
2402a4af0ceeSJacob Faibussowitsch   }
24037d766218SJunchao Zhang     #else
24047d766218SJunchao Zhang   PetscCall(PetscTimeSubtract(&petsc_gtime));
24057d766218SJunchao Zhang     #endif
24063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24079ffd0706SHong Zhang }
24089ffd0706SHong Zhang 
2409cc4c1da9SBarry Smith /*@
24109ffd0706SHong Zhang   PetscLogGpuTimeEnd - Stop timer for device
24119ffd0706SHong Zhang 
24129ffd0706SHong Zhang   Level: intermediate
24139ffd0706SHong Zhang 
2414d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogView()`, `PetscLogGpuFlops()`, `PetscLogGpuTimeBegin()`
24159ffd0706SHong Zhang @*/
2416d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscLogGpuTimeEnd(void)
2417d71ae5a4SJacob Faibussowitsch {
2418b665b14eSToby Isaac   PetscBool isActive;
2419b665b14eSToby Isaac 
24209ffd0706SHong Zhang   PetscFunctionBegin;
2421b665b14eSToby Isaac   PetscCall(PetscLogEventEndIsActive(&isActive));
2422b665b14eSToby Isaac   if (!isActive || !PetscLogGpuTimeFlag) PetscFunctionReturn(PETSC_SUCCESS);
24237d766218SJunchao Zhang     #if defined(PETSC_HAVE_DEVICE) && !defined(PETSC_HAVE_KOKKOS_WITHOUT_GPU)
24247d766218SJunchao Zhang   {
2425a4af0ceeSJacob Faibussowitsch     PetscDeviceContext dctx;
2426a4af0ceeSJacob Faibussowitsch     PetscLogDouble     elapsed;
2427a4af0ceeSJacob Faibussowitsch 
24289566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextGetCurrentContext(&dctx));
24299566063dSJacob Faibussowitsch     PetscCall(PetscDeviceContextEndTimer_Internal(dctx, &elapsed));
2430a4af0ceeSJacob Faibussowitsch     petsc_gtime += (elapsed / 1000.0);
2431a4af0ceeSJacob Faibussowitsch   }
24327d766218SJunchao Zhang     #else
24337d766218SJunchao Zhang   PetscCall(PetscTimeAdd(&petsc_gtime));
24347d766218SJunchao Zhang     #endif
24353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24369ffd0706SHong Zhang }
2437c708d6e3SStefano Zampini 
24389ffd0706SHong Zhang   #endif /* end of PETSC_HAVE_DEVICE */
24399ffd0706SHong Zhang 
2440cb9ef012SToby Isaac #endif /* PETSC_USE_LOG*/
2441cb9ef012SToby Isaac 
2442dd01b7e5SBarry Smith /* -- Utility functions for logging from Fortran -- */
2443b665b14eSToby Isaac 
2444b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscASend(int count, int datatype)
2445b665b14eSToby Isaac {
2446b665b14eSToby Isaac   PetscFunctionBegin;
2447cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2448b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_send_ct, &petsc_send_ct_th, 1));
2449b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2450b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_send_len, &petsc_send_len_th));
2451b665b14eSToby Isaac   #endif
2452cb9ef012SToby Isaac #endif
2453b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2454b665b14eSToby Isaac }
2455b665b14eSToby Isaac 
2456b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscARecv(int count, int datatype)
2457b665b14eSToby Isaac {
2458b665b14eSToby Isaac   PetscFunctionBegin;
2459cb9ef012SToby Isaac #if PetscDefined(USE_LOG)
2460b665b14eSToby Isaac   PetscCall(PetscAddLogDouble(&petsc_recv_ct, &petsc_recv_ct_th, 1));
2461b665b14eSToby Isaac   #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO)
2462b665b14eSToby Isaac   PetscCall(PetscMPITypeSize(count, MPI_Type_f2c((MPI_Fint)datatype), &petsc_recv_len, &petsc_recv_len_th));
2463b665b14eSToby Isaac   #endif
2464cb9ef012SToby Isaac #endif
2465b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2466b665b14eSToby Isaac }
2467b665b14eSToby Isaac 
2468b665b14eSToby Isaac PETSC_EXTERN PetscErrorCode PetscAReduce(void)
2469b665b14eSToby Isaac {
2470b665b14eSToby Isaac   PetscFunctionBegin;
2471cb9ef012SToby Isaac   if (PetscDefined(USE_LOG)) PetscCall(PetscAddLogDouble(&petsc_allreduce_ct, &petsc_allreduce_ct_th, 1));
2472b665b14eSToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
2473b665b14eSToby Isaac }
2474b665b14eSToby Isaac 
24755c6c1daeSBarry Smith PetscClassId PETSC_LARGEST_CLASSID = PETSC_SMALLEST_CLASSID;
24765c6c1daeSBarry Smith PetscClassId PETSC_OBJECT_CLASSID  = 0;
24775c6c1daeSBarry Smith 
24782611ad71SToby Isaac static PetscBool PetscLogInitializeCalled = PETSC_FALSE;
24792611ad71SToby Isaac 
24802611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogInitialize(void)
24812611ad71SToby Isaac {
24822611ad71SToby Isaac   int stage;
24832611ad71SToby Isaac 
24842611ad71SToby Isaac   PetscFunctionBegin;
24852611ad71SToby Isaac   if (PetscLogInitializeCalled) PetscFunctionReturn(PETSC_SUCCESS);
24862611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_TRUE;
24872611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
24882611ad71SToby Isaac     /* Setup default logging structures */
24892611ad71SToby Isaac     PetscCall(PetscLogStateCreate(&petsc_log_state));
24902611ad71SToby Isaac     for (PetscInt i = 0; i < PETSC_LOG_HANDLER_MAX; i++) {
24912611ad71SToby Isaac       if (PetscLogHandlers[i].handler) PetscCall(PetscLogHandlerSetState(PetscLogHandlers[i].handler, petsc_log_state));
24922611ad71SToby Isaac     }
24932611ad71SToby Isaac     PetscCall(PetscLogStateStageRegister(petsc_log_state, "Main Stage", &stage));
24942611ad71SToby Isaac     PetscCall(PetscSpinlockCreate(&PetscLogSpinLock));
24952611ad71SToby Isaac #if defined(PETSC_HAVE_THREADSAFETY)
24962611ad71SToby Isaac     petsc_log_tid = 0;
24972611ad71SToby Isaac     petsc_log_gid = 0;
24982611ad71SToby Isaac #endif
24992611ad71SToby Isaac 
25002611ad71SToby Isaac     /* All processors sync here for more consistent logging */
25012611ad71SToby Isaac     PetscCallMPI(MPI_Barrier(PETSC_COMM_WORLD));
25022611ad71SToby Isaac     PetscCall(PetscTime(&petsc_BaseTime));
25032611ad71SToby Isaac     PetscCall(PetscLogStagePush(stage));
25042611ad71SToby Isaac   }
25052611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25062611ad71SToby Isaac }
25072611ad71SToby Isaac 
25082611ad71SToby Isaac PETSC_INTERN PetscErrorCode PetscLogFinalize(void)
25092611ad71SToby Isaac {
25102611ad71SToby Isaac   PetscFunctionBegin;
25112611ad71SToby Isaac   if (PetscDefined(USE_LOG)) {
2512b665b14eSToby Isaac     /* Resetting phase */
2513b665b14eSToby Isaac     // pop remaining stages
2514b665b14eSToby Isaac     if (petsc_log_state) {
25153a7d0413SPierre Jolivet       while (petsc_log_state->current_stage >= 0) PetscCall(PetscLogStagePop());
2516b665b14eSToby Isaac     }
25172611ad71SToby Isaac     for (int i = 0; i < PETSC_LOG_HANDLER_MAX; i++) PetscCall(PetscLogHandlerDestroy(&PetscLogHandlers[i].handler));
25182611ad71SToby Isaac     PetscCall(PetscArrayzero(PetscLogHandlers, PETSC_LOG_HANDLER_MAX));
25192611ad71SToby Isaac     PetscCall(PetscLogStateDestroy(&petsc_log_state));
25202611ad71SToby Isaac 
25212611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25222611ad71SToby Isaac     petsc_BaseTime           = 0.0;
25232611ad71SToby Isaac     petsc_TotalFlops         = 0.0;
25242611ad71SToby Isaac     petsc_send_ct            = 0.0;
25252611ad71SToby Isaac     petsc_recv_ct            = 0.0;
25262611ad71SToby Isaac     petsc_send_len           = 0.0;
25272611ad71SToby Isaac     petsc_recv_len           = 0.0;
25282611ad71SToby Isaac     petsc_isend_ct           = 0.0;
25292611ad71SToby Isaac     petsc_irecv_ct           = 0.0;
25302611ad71SToby Isaac     petsc_isend_len          = 0.0;
25312611ad71SToby Isaac     petsc_irecv_len          = 0.0;
25322611ad71SToby Isaac     petsc_wait_ct            = 0.0;
25332611ad71SToby Isaac     petsc_wait_any_ct        = 0.0;
25342611ad71SToby Isaac     petsc_wait_all_ct        = 0.0;
25352611ad71SToby Isaac     petsc_sum_of_waits_ct    = 0.0;
25362611ad71SToby Isaac     petsc_allreduce_ct       = 0.0;
25372611ad71SToby Isaac     petsc_gather_ct          = 0.0;
25382611ad71SToby Isaac     petsc_scatter_ct         = 0.0;
25392611ad71SToby Isaac     petsc_TotalFlops_th      = 0.0;
25402611ad71SToby Isaac     petsc_send_ct_th         = 0.0;
25412611ad71SToby Isaac     petsc_recv_ct_th         = 0.0;
25422611ad71SToby Isaac     petsc_send_len_th        = 0.0;
25432611ad71SToby Isaac     petsc_recv_len_th        = 0.0;
25442611ad71SToby Isaac     petsc_isend_ct_th        = 0.0;
25452611ad71SToby Isaac     petsc_irecv_ct_th        = 0.0;
25462611ad71SToby Isaac     petsc_isend_len_th       = 0.0;
25472611ad71SToby Isaac     petsc_irecv_len_th       = 0.0;
25482611ad71SToby Isaac     petsc_wait_ct_th         = 0.0;
25492611ad71SToby Isaac     petsc_wait_any_ct_th     = 0.0;
25502611ad71SToby Isaac     petsc_wait_all_ct_th     = 0.0;
25512611ad71SToby Isaac     petsc_sum_of_waits_ct_th = 0.0;
25522611ad71SToby Isaac     petsc_allreduce_ct_th    = 0.0;
25532611ad71SToby Isaac     petsc_gather_ct_th       = 0.0;
25542611ad71SToby Isaac     petsc_scatter_ct_th      = 0.0;
25552611ad71SToby Isaac 
25562611ad71SToby Isaac     petsc_ctog_ct    = 0.0;
25572611ad71SToby Isaac     petsc_gtoc_ct    = 0.0;
25582611ad71SToby Isaac     petsc_ctog_sz    = 0.0;
25592611ad71SToby Isaac     petsc_gtoc_sz    = 0.0;
25602611ad71SToby Isaac     petsc_gflops     = 0.0;
25612611ad71SToby Isaac     petsc_gtime      = 0.0;
25622611ad71SToby Isaac     petsc_ctog_ct_th = 0.0;
25632611ad71SToby Isaac     petsc_gtoc_ct_th = 0.0;
25642611ad71SToby Isaac     petsc_ctog_sz_th = 0.0;
25652611ad71SToby Isaac     petsc_gtoc_sz_th = 0.0;
25662611ad71SToby Isaac     petsc_gflops_th  = 0.0;
25672611ad71SToby Isaac     petsc_gtime_th   = 0.0;
25682611ad71SToby Isaac   }
25692611ad71SToby Isaac   PETSC_LARGEST_CLASSID    = PETSC_SMALLEST_CLASSID;
25702611ad71SToby Isaac   PETSC_OBJECT_CLASSID     = 0;
25712611ad71SToby Isaac   PetscLogInitializeCalled = PETSC_FALSE;
25722611ad71SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
25732611ad71SToby Isaac }
25742611ad71SToby Isaac 
2575cc4c1da9SBarry Smith /*@
25765c6c1daeSBarry Smith   PetscClassIdRegister - Registers a new class name for objects and logging operations in an application code.
25775c6c1daeSBarry Smith 
25785c6c1daeSBarry Smith   Not Collective
25795c6c1daeSBarry Smith 
25805c6c1daeSBarry Smith   Input Parameter:
25815c6c1daeSBarry Smith . name - The class name
25825c6c1daeSBarry Smith 
25835c6c1daeSBarry Smith   Output Parameter:
25845c6c1daeSBarry Smith . oclass - The class id or classid
25855c6c1daeSBarry Smith 
25865c6c1daeSBarry Smith   Level: developer
25875c6c1daeSBarry Smith 
2588d1f92df0SBarry Smith .seealso: [](ch_profiling), `PetscLogEventRegister()`
25895c6c1daeSBarry Smith @*/
2590d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscClassIdRegister(const char name[], PetscClassId *oclass)
2591d71ae5a4SJacob Faibussowitsch {
25925c6c1daeSBarry Smith   PetscFunctionBegin;
25935c6c1daeSBarry Smith   *oclass = ++PETSC_LARGEST_CLASSID;
25945c6c1daeSBarry Smith #if defined(PETSC_USE_LOG)
2595b665b14eSToby Isaac   {
2596b665b14eSToby Isaac     PetscLogState state;
2597b665b14eSToby Isaac     PetscLogClass logclass;
2598b665b14eSToby Isaac 
2599b665b14eSToby Isaac     PetscCall(PetscLogGetState(&state));
2600b665b14eSToby Isaac     if (state) PetscCall(PetscLogStateClassRegister(state, name, *oclass, &logclass));
2601b665b14eSToby Isaac   }
26025c6c1daeSBarry Smith #endif
26033ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
26045c6c1daeSBarry Smith }
2605