xref: /petsc/include/petsclog.h (revision e3ed9ee741a88589f5afab2bd2b2738386c1608b)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
497bb86f7SLois Curfman McInnes 
5b0a32e0cSBarry Smith #if !defined(__PetscLog_H)
6b0a32e0cSBarry Smith #define __PetscLog_H
7aaa7dc30SBarry Smith #include <petscsys.h>
8c8d78d4dSSatish Balay 
9fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */
10fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],void*,const char[],...);
11fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO)
12fa2bb9feSLisandro Dalcin #define PetscInfo(A,S)                       PetscInfo_Private(PETSC_FUNCTION_NAME,A,S)
13fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1)                   PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1)
14fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2)                PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2)
15fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3)             PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3)
16fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4)          PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4)
17fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5)
18fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6)
19fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6,a7)
20fa2bb9feSLisandro Dalcin #else
21fa2bb9feSLisandro Dalcin #define PetscInfo(A,S)                       0
22fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1)                   0
23fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2)                0
24fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3)             0
25fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4)          0
26fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       0
27fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    0
28fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0
29fa2bb9feSLisandro Dalcin #endif
30fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId);
31fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId);
32fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
33fa2bb9feSLisandro Dalcin 
34b859824cSBarry Smith /*MC
35b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
36b859824cSBarry Smith      code.
37b859824cSBarry Smith 
38b859824cSBarry Smith     Level: intermediate
39b859824cSBarry Smith 
40b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
41b859824cSBarry Smith M*/
42b859824cSBarry Smith typedef int PetscLogEvent;
43b859824cSBarry Smith 
44b859824cSBarry Smith /*MC
45b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
46b859824cSBarry Smith 
47b859824cSBarry Smith     Level: intermediate
48b859824cSBarry Smith 
49522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent
50b859824cSBarry Smith M*/
51b859824cSBarry Smith typedef int PetscLogStage;
52b859824cSBarry Smith 
538ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
54014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
5597bb86f7SLois Curfman McInnes 
5619b02663SBarry Smith /* Global flop counter */
57014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
58014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
5919b02663SBarry Smith 
6031d06abdSBarry Smith /* We must make the following structures available to access the event
6131d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
6231d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
63d49d4b11SBarry Smith 
64fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
6531d06abdSBarry Smith */
66aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
676a6a9b46SSatish Balay 
68217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
69c60ec953SBarry Smith /*
70aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
71c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
72c60ec953SBarry Smith        how much memory they use, etc.
73c60ec953SBarry Smith 
74aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
75c60ec953SBarry Smith */
766a6a9b46SSatish Balay typedef struct  {
77c60ec953SBarry Smith   char           *name;   /* The class name */
78c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
79aa213bdcSJed Brown } PetscClassRegInfo;
806a6a9b46SSatish Balay 
816a6a9b46SSatish Balay typedef struct {
820700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
836a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
846a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
856a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
866a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
87aa213bdcSJed Brown } PetscClassPerfInfo;
886a6a9b46SSatish Balay 
89aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
90aa213bdcSJed Brown struct _n_PetscClassRegLog {
91c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
92c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
93aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
94c60ec953SBarry Smith };
956a6a9b46SSatish Balay 
96aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
97aa213bdcSJed Brown struct _n_PetscClassPerfLog {
98c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
99c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
100aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
101c60ec953SBarry Smith };
102c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
103c60ec953SBarry Smith /*
104aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
105c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
106c60ec953SBarry Smith        much time it takes, etc.
107c60ec953SBarry Smith 
108aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
109c60ec953SBarry Smith       of these for each stage.
110c60ec953SBarry Smith 
111c60ec953SBarry Smith */
1126a6a9b46SSatish Balay typedef struct {
1136a6a9b46SSatish Balay   char         *name;         /* The name of this event */
114c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
115217044c2SLisandro Dalcin   PetscBool    collective;    /* Flag this event as collective */
1166a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1176a6a9b46SSatish Balay   int          mpe_id_begin;  /* MPE IDs that define the event */
1186a6a9b46SSatish Balay   int          mpe_id_end;
1196a6a9b46SSatish Balay #endif
120aa213bdcSJed Brown } PetscEventRegInfo;
1216a6a9b46SSatish Balay 
122c60ec953SBarry Smith typedef struct {
123c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
124ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
125ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
126c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
127c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
128a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */
129a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;    /* The time and time^2 taken for this event */
130217044c2SLisandro Dalcin   PetscLogDouble syncTime;                /* The synchronization barrier time */
131891e75beSMatthew G. Knepley   PetscLogDouble dof[8];        /* The number of degrees of freedom associated with this event */
1325d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
133c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
134c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
135c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
136*e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;   /* How much the resident memory has increased in this event */
137*e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */
138*e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;   /* How much the space was malloced and kept during this event */
139*e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent;  /* Maximum of the high water mark with in event minus memory available at the end of the event */
140aa213bdcSJed Brown } PetscEventPerfInfo;
141c60ec953SBarry Smith 
142aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
143aa213bdcSJed Brown struct _n_PetscEventRegLog {
1446a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1456a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
146aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1476a6a9b46SSatish Balay };
1486a6a9b46SSatish Balay 
149aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
150aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1516a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1526a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
153aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1546a6a9b46SSatish Balay };
155c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
156c60ec953SBarry Smith /*
157aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
1586a6a9b46SSatish Balay 
159aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
160c60ec953SBarry Smith */
161aa213bdcSJed Brown typedef struct _PetscStageInfo {
1626a6a9b46SSatish Balay   char               *name;     /* The stage name */
163ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
164aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
165aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
166aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
167aa213bdcSJed Brown } PetscStageInfo;
1686a6a9b46SSatish Balay 
169aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
170aa213bdcSJed Brown struct _n_PetscStageLog {
1716a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
1726a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
173aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
174aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
175aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
176aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
177aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
1786a6a9b46SSatish Balay };
179217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
180fee518ebSJed Brown 
1813bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
1823bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
1833bb1ff40SBarry Smith 
184aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
185aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
186f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
187f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
188f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
189614700edSBarry Smith 
190da63de55SLois Curfman McInnes /*
191da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
192da63de55SLois Curfman McInnes 
193da63de55SLois Curfman McInnes    For the complex numbers version, note that
194da63de55SLois Curfman McInnes        1 complex addition = 2 flops
195da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
196da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
197da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
198da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
199da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
200da63de55SLois Curfman McInnes    among the various arithmetic operations.
201da63de55SLois Curfman McInnes  */
202da63de55SLois Curfman McInnes 
203aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
204542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
205da63de55SLois Curfman McInnes #else
206542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
207bf3909cdSBarry Smith #endif
208bf3909cdSBarry Smith 
209dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n)
210dd19b90bSBarry Smith {
211dd19b90bSBarry Smith   PetscFunctionBegin;
212bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
213dd19b90bSBarry Smith   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
214da63de55SLois Curfman McInnes #endif
215dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
216dd19b90bSBarry Smith   PetscFunctionReturn(0);
217dd19b90bSBarry Smith }
218fa2bb9feSLisandro Dalcin 
219fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
22077c4ece6SBarry Smith 
221aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
222014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
223014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
22477c4ece6SBarry Smith #endif
22577c4ece6SBarry Smith 
226014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
227014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
228014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
229014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
23077c4ece6SBarry Smith 
231fa2bb9feSLisandro Dalcin #define PetscLogObjectParents(p,n,d)  0;{int _i; for (_i=0; _i<(n); _i++) {ierr = PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]);CHKERRQ(ierr);}}
232fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
233fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
234fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...);
235fa2bb9feSLisandro Dalcin 
2368ba1e511SMatthew Knepley /* Initialization functions */
237bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
238014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
239bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
240014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
241014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
242014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
243fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*);
244014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
2456849ba73SBarry Smith                                         PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
246fa2bb9feSLisandro Dalcin 
2478ba1e511SMatthew Knepley /* Output functions */
248014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
249f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
25131d06abdSBarry Smith 
252fa2bb9feSLisandro Dalcin /* Stage functions */
253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
254014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
255014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
256014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool);
257014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*);
258014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool);
259014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*);
260014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*);
261f5d6ab90SLisandro Dalcin 
2628ba1e511SMatthew Knepley /* Event functions */
263014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*);
264217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool);
265fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
266fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
268014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
269014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool);
270014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
271014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
2728c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
27313230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*);
274891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
2755d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
2768ba1e511SMatthew Knepley 
2778ba1e511SMatthew Knepley /* Global counters */
278014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
279014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
280014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
281014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
282014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
283014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
284014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
285014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
286014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
287014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
288014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
289014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
290014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
291014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
292014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
2938ba1e511SMatthew Knepley 
294*e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool      PetscLogMemory;
295*e3ed9ee7SBarry Smith 
296fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn;  /* true if logging synchronization is enabled */
29762872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
29862872c28SLisandro Dalcin 
29962872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \
30062872c28SLisandro Dalcin   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
30162872c28SLisandro Dalcin     PetscLogEventSynchronize((e),(comm)) : 0 ))
30277c4ece6SBarry Smith 
30352e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
3048b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
305495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ))
306043328b6SSatish Balay 
30752e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
3088b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
309495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ))
31077c4ece6SBarry Smith 
311014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*);
312014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
313003131ecSBarry Smith 
314ce85283eSBarry Smith /*
315f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
316f621e05eSBarry Smith    their sizes.
317f621e05eSBarry Smith 
318af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
319ce85283eSBarry Smith    uses macros to defined the MPI operations.
32015308354SBarry Smith 
32115308354SBarry Smith      It does not work correctly from HP-UX because it processes the
322bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
323b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
3247c1e34a4SSatish Balay 
325f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
326ce85283eSBarry Smith */
327c8217ed5SSatish Balay #if !defined(__MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
32877a39924SBarry Smith /*
32977a39924SBarry Smith    Logging of MPI activities
33077a39924SBarry Smith */
331ad39c06fSJed Brown PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscLogDouble *buff,PetscMPIInt count,MPI_Datatype type)
332f95db71bSBarry Smith {
3337d30fa4aSBarry Smith   PetscMPIInt mysize;
3349c72ff1eSSatish Balay   PetscErrorCode _myierr;
3357d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
3369c72ff1eSSatish Balay   _myierr = MPI_Type_size(type,&mysize);CHKERRQ(_myierr);
3379c72ff1eSSatish Balay   *buff += (PetscLogDouble) (count*mysize);
3389c72ff1eSSatish Balay   return 0;
339f95db71bSBarry Smith }
34077a39924SBarry Smith 
341ad39c06fSJed Brown PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, PetscLogDouble *buff,PetscMPIInt *counts,MPI_Datatype type)
3423b9284c0SMatthew G Knepley {
3433b9284c0SMatthew G Knepley   PetscMPIInt mysize, commsize, p;
3443b9284c0SMatthew G Knepley   PetscErrorCode _myierr;
3453b9284c0SMatthew G Knepley 
3467d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
3473b9284c0SMatthew G Knepley   _myierr = MPI_Comm_size(comm,&commsize);CHKERRQ(_myierr);
3483b9284c0SMatthew G Knepley   _myierr = MPI_Type_size(type,&mysize);CHKERRQ(_myierr);
3493b9284c0SMatthew G Knepley   for (p = 0; p < commsize; ++p) {
3503b9284c0SMatthew G Knepley     *buff += (PetscLogDouble) (counts[p]*mysize);
3513b9284c0SMatthew G Knepley   }
3523b9284c0SMatthew G Knepley   return 0;
3533b9284c0SMatthew G Knepley }
3543b9284c0SMatthew G Knepley 
35572b11a25SBarry Smith /*
35672b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
35772b11a25SBarry Smith */
35872b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm)
35972b11a25SBarry Smith {
36072b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
36172b11a25SBarry Smith }
36272b11a25SBarry Smith 
36377a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
3645fa69175SJed Brown   ((petsc_irecv_ct++,0) || PetscMPITypeSize(&(petsc_irecv_len),(count),(datatype)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request)))
36515308354SBarry Smith 
36677a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
3675fa69175SJed Brown   ((petsc_isend_ct++,0) || PetscMPITypeSize(&(petsc_isend_len),(count),(datatype)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request)))
36815308354SBarry Smith 
369457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
370ea1c87f7SJunchao Zhang   ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize(&(petsc_irecv_len),(count),(datatype)) || ((number) && MPI_Startall((number),(requests))))
3710d4b0b6cSBarry Smith 
372457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
373ea1c87f7SJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize(&(petsc_isend_len),(count),(datatype)) || ((number) && MPI_Startall((number),(requests))))
3740d4b0b6cSBarry Smith 
375457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
376457b14b1SJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((&petsc_isend_len),(count),(datatype)) || MPI_Start((requests)))
3770d4b0b6cSBarry Smith 
378ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
3795fa69175SJed Brown   ((petsc_recv_ct++,0) || PetscMPITypeSize((&petsc_recv_len),(count),(datatype)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status)))
38015308354SBarry Smith 
38177a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
3825fa69175SJed Brown   ((petsc_send_ct++,0) || PetscMPITypeSize((&petsc_send_len),(count),(datatype)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm)))
38377a39924SBarry Smith 
38477a39924SBarry Smith #define MPI_Wait(request,status) \
3855fa69175SJed Brown   ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status)))
38677a39924SBarry Smith 
38777a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
3885fa69175SJed Brown   ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d)))
38977a39924SBarry Smith 
39077a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
3915fa69175SJed Brown   ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses)))
39277a39924SBarry Smith 
39377a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
3945fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm)))
3953914022bSBarry Smith 
39654fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
3975fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm)))
39854fe5c21SBarry Smith 
399d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
4005fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm)))
401d6e4c47cSJed Brown 
4023b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
4035fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((&petsc_send_len),(sendcount),(sendtype)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
4043b9284c0SMatthew G Knepley 
4053b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
4065fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(&petsc_send_len),(sendcnts),(sendtype)) || MPI_Alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
4073b9284c0SMatthew G Knepley 
40801faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
4095fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
41001faf4e4SMatthew Knepley 
41101faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
4125fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm)))
41301faf4e4SMatthew Knepley 
41401faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
4155fa69175SJed Brown   ((petsc_gather_ct++,0) || PetscMPITypeSize((&petsc_send_len),(sendcount),(sendtype)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
41601faf4e4SMatthew Knepley 
41701faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
4185fa69175SJed Brown   ((petsc_gather_ct++,0) || PetscMPITypeSize((&petsc_send_len),(sendcount),(sendtype)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm)))
41901faf4e4SMatthew Knepley 
42001faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
4215fa69175SJed Brown   ((petsc_scatter_ct++,0) || PetscMPITypeSize((&petsc_recv_len),(recvcount),(recvtype)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
42201faf4e4SMatthew Knepley 
42301faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
4245fa69175SJed Brown   ((petsc_scatter_ct++,0) || PetscMPITypeSize((&petsc_recv_len),(recvcount),(recvtype)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
42501faf4e4SMatthew Knepley 
4260d4b0b6cSBarry Smith #else
4270d4b0b6cSBarry Smith 
428457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
429ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
4300d4b0b6cSBarry Smith 
431457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
432ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
4330d4b0b6cSBarry Smith 
434457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
4355fa69175SJed Brown   (MPI_Start((requests)))
4360d4b0b6cSBarry Smith 
437c8217ed5SSatish Balay #endif /* !__MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
438614700edSBarry Smith 
439df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
440614700edSBarry Smith 
441*e3ed9ee7SBarry Smith #define PetscLogMemory                     PETSC_FALSE
442*e3ed9ee7SBarry Smith 
443b0a32e0cSBarry Smith #define PetscLogFlops(n)                   0
444fa2bb9feSLisandro Dalcin #define PetscGetFlops(a)                   (*(a) = 0.0,0)
445614700edSBarry Smith 
446fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b)         0
447fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a)               0
448fa2bb9feSLisandro Dalcin #define PetscLogStagePop()                 0
449f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b)        0
450f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b)        0
451f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b)       0
452f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b)       0
453f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b)            (*(b)=0,0)
454f5d6ab90SLisandro Dalcin 
455fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c)       0
456fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b)    0
457fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a)       0
458fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a)       0
459b0a32e0cSBarry Smith #define PetscLogEventActivate(a)           0
460b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a)         0
461b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)      0
462b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a)    0
463e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)     0
46446eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)            (*(b)=0,0)
465561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c)    0
4669c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c)         0
4679c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)       0
46877c4ece6SBarry Smith 
4698b5db460SBarry Smith #define PetscLogPLB                        0
4708b5db460SBarry Smith #define PetscLogPLE                        0
4718b5db460SBarry Smith #define PetscLogPHC                        0
4728b5db460SBarry Smith #define PetscLogPHD                        0
473f5d6ab90SLisandro Dalcin 
474efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)       0
47552e6d16bSBarry Smith #define PetscLogObjectCreate(h)            0
47652e6d16bSBarry Smith #define PetscLogObjectDestroy(h)           0
477fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...);
478fa2bb9feSLisandro Dalcin 
479bb1d7374SBarry Smith #define PetscLogDefaultBegin()             0
480b0a32e0cSBarry Smith #define PetscLogAllBegin()                 0
481bb1d7374SBarry Smith #define PetscLogNestedBegin()              0
482fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file)           0
48373fda44aSBarry Smith #define PetscLogActions(a)                 0
484fa2bb9feSLisandro Dalcin #define PetscLogObjects(a)                 0
485fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b)          0
486fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le)                 0
487fa2bb9feSLisandro Dalcin 
488fa2bb9feSLisandro Dalcin #define PetscLogView(viewer)               0
489fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions()          0
490fa2bb9feSLisandro Dalcin #define PetscLogDump(c)                    0
491fa2bb9feSLisandro Dalcin 
49262872c28SLisandro Dalcin #define PetscLogEventSync(e,comm)          0
493fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4)  0
494fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4)    0
495ce6058e1SBarry Smith 
496aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
497ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
498ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
499457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests)           MPI_Start(requests)
500f141ce34SMatthew Knepley 
501aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
5026daaf66cSBarry Smith 
503204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
504204a6943SJed Brown do {\
505204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
506204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
507166c7f25SBarry Smith   PetscLogStage  _stageNum;\
5088cbcd9ccSBarry Smith   PetscErrorCode _3_ierr; \
509c5929fdfSBarry Smith   _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \
510204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
511204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
512204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
513204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
5140298fd71SBarry Smith     _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\
515204a6943SJed Brown     if (PetscPreLoadIt>0) {\
5168e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
5178e58c17dSMatthew Knepley     } else {\
518a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
5198e58c17dSMatthew Knepley     }\
520204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\
5218e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
5228e58c17dSMatthew Knepley 
523204a6943SJed Brown #define PetscPreLoadEnd() \
524043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
525204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
526043328b6SSatish Balay   }\
527204a6943SJed Brown } while (0)
5288e58c17dSMatthew Knepley 
529204a6943SJed Brown #define PetscPreLoadStage(name) do {                                         \
530043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);                      \
531204a6943SJed Brown     if (PetscPreLoadIt>0) {                                                  \
5328e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);   \
5338e58c17dSMatthew Knepley     } else {                                                            \
534a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
5358e58c17dSMatthew Knepley     }                                                                   \
536204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \
537204a6943SJed Brown     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);            \
538204a6943SJed Brown   } while (0)
539e9fa29b7SSatish Balay 
540ad14c47eSJed Brown /* some vars for logging */
541ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
542ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
543ad14c47eSJed Brown 
54497bb86f7SLois Curfman McInnes #endif
545