xref: /petsc/include/petsclog.h (revision df05ca09ada1073c1e2976e208ee5956c8ec380e)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
497bb86f7SLois Curfman McInnes 
526bd1501SBarry Smith #if !defined(PETSCLOG_H)
626bd1501SBarry Smith #define PETSCLOG_H
7aaa7dc30SBarry Smith #include <petscsys.h>
8958c4211Shannah_mairs #include <petsctime.h>
9c8d78d4dSSatish Balay 
10fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */
11fe9b927eSVaclav Hapla PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],PetscObject,const char[],...);
12fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO)
13fe9b927eSVaclav Hapla #define PetscInfo(A,S)                             PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S)
14fe9b927eSVaclav Hapla #define PetscInfo1(A,S,a1)                         PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1)
15fe9b927eSVaclav Hapla #define PetscInfo2(A,S,a1,a2)                      PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2)
16fe9b927eSVaclav Hapla #define PetscInfo3(A,S,a1,a2,a3)                   PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3)
17fe9b927eSVaclav Hapla #define PetscInfo4(A,S,a1,a2,a3,a4)                PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4)
18fe9b927eSVaclav Hapla #define PetscInfo5(A,S,a1,a2,a3,a4,a5)             PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5)
19fe9b927eSVaclav Hapla #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)          PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6)
20fe9b927eSVaclav Hapla #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7)       PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6,a7)
2100702c57SStefano Zampini #define PetscInfo8(A,S,a1,a2,a3,a4,a5,a6,a7,a8)    PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6,a7,a8)
2200702c57SStefano Zampini #define PetscInfo9(A,S,a1,a2,a3,a4,a5,a6,a7,a8,a9) PetscInfo_Private(PETSC_FUNCTION_NAME,((PetscObject)A),S,a1,a2,a3,a4,a5,a6,a7,a8,a9)
23fa2bb9feSLisandro Dalcin #else
24fa2bb9feSLisandro Dalcin #define PetscInfo(A,S)                             0
25fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1)                         0
26fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2)                      0
27fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3)                   0
28fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4)                0
29fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5)             0
30fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)          0
31fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7)       0
3200702c57SStefano Zampini #define PetscInfo8(A,S,a1,a2,a3,a4,a5,a6,a7,a8)    0
3300702c57SStefano Zampini #define PetscInfo9(A,S,a1,a2,a3,a4,a5,a6,a7,a8,a9) 0
34fa2bb9feSLisandro Dalcin #endif
35e94e781bSJacob Faibussowitsch 
36e94e781bSJacob Faibussowitsch /*E
37e94e781bSJacob Faibussowitsch     PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size
38e94e781bSJacob Faibussowitsch 
39e94e781bSJacob Faibussowitsch     Used as an input for PetscInfoSetFilterCommSelf()
40e94e781bSJacob Faibussowitsch 
41e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will
42e94e781bSJacob Faibussowitsch print for all communicators)
43e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF)
44e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ONLY_SELF - PetscInfo will ONLY print for communicators with size = 1
45e94e781bSJacob Faibussowitsch 
46e94e781bSJacob Faibussowitsch     Level: intermediate
47e94e781bSJacob Faibussowitsch 
48e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions(), PetscInfoSetFilterCommSelf()
49e94e781bSJacob Faibussowitsch E*/
50e94e781bSJacob Faibussowitsch typedef enum {
51e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ALL = -1,
52e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_NO_SELF = 0,
53e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ONLY_SELF = 1
54e94e781bSJacob Faibussowitsch } PetscInfoCommFlag;
55e94e781bSJacob Faibussowitsch 
56e94e781bSJacob Faibussowitsch PETSC_EXTERN const char * const PetscInfoCommFlags[];
57fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId);
58fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId);
59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *);
60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool);
61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[],const char[]);
62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **,FILE **);
63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool,PetscInt,const char *const *);
64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *);
65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *,PetscBool *,PetscBool *,PetscBool *,PetscInfoCommFlag *);
66e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,PetscClassId[]);
67e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag);
68e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions);
69e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void);
70fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool      PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
71fa2bb9feSLisandro Dalcin 
72b859824cSBarry Smith /*MC
73b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
74b859824cSBarry Smith      code.
75b859824cSBarry Smith 
76b859824cSBarry Smith     Level: intermediate
77b859824cSBarry Smith 
78b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
79b859824cSBarry Smith M*/
80b859824cSBarry Smith typedef int PetscLogEvent;
81b859824cSBarry Smith 
82b859824cSBarry Smith /*MC
83b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
84b859824cSBarry Smith 
85b859824cSBarry Smith     Level: intermediate
86b859824cSBarry Smith 
87522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent
88b859824cSBarry Smith M*/
89b859824cSBarry Smith typedef int PetscLogStage;
90b859824cSBarry Smith 
918ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
92014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
9397bb86f7SLois Curfman McInnes 
9419b02663SBarry Smith /* Global flop counter */
95014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
96014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
9719b02663SBarry Smith 
9831d06abdSBarry Smith /* We must make the following structures available to access the event
9931d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
10031d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
101d49d4b11SBarry Smith 
102fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
10331d06abdSBarry Smith */
104aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
1056a6a9b46SSatish Balay 
106217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
107c60ec953SBarry Smith /*
108aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
109c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
110c60ec953SBarry Smith        how much memory they use, etc.
111c60ec953SBarry Smith 
112aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
113c60ec953SBarry Smith */
1146a6a9b46SSatish Balay typedef struct  {
115c60ec953SBarry Smith   char           *name;   /* The class name */
116c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
117aa213bdcSJed Brown } PetscClassRegInfo;
1186a6a9b46SSatish Balay 
1196a6a9b46SSatish Balay typedef struct {
1200700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1216a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1226a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1236a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1246a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
125aa213bdcSJed Brown } PetscClassPerfInfo;
1266a6a9b46SSatish Balay 
127aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
128aa213bdcSJed Brown struct _n_PetscClassRegLog {
129c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
130c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
131aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
132c60ec953SBarry Smith };
1336a6a9b46SSatish Balay 
134aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
135aa213bdcSJed Brown struct _n_PetscClassPerfLog {
136c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
137c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
138aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
139c60ec953SBarry Smith };
140c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
141c60ec953SBarry Smith /*
142aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
143c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
144c60ec953SBarry Smith        much time it takes, etc.
145c60ec953SBarry Smith 
146aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
147c60ec953SBarry Smith       of these for each stage.
148c60ec953SBarry Smith 
149c60ec953SBarry Smith */
1506a6a9b46SSatish Balay typedef struct {
1516a6a9b46SSatish Balay   char         *name;         /* The name of this event */
152c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
153217044c2SLisandro Dalcin   PetscBool    collective;    /* Flag this event as collective */
1546a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1556a6a9b46SSatish Balay   int          mpe_id_begin;  /* MPE IDs that define the event */
1566a6a9b46SSatish Balay   int          mpe_id_end;
1576a6a9b46SSatish Balay #endif
158aa213bdcSJed Brown } PetscEventRegInfo;
1596a6a9b46SSatish Balay 
160c60ec953SBarry Smith typedef struct {
161c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
162ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
163ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
164c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
165c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
166a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */
167a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;    /* The time and time^2 taken for this event */
168217044c2SLisandro Dalcin   PetscLogDouble syncTime;                /* The synchronization barrier time */
169891e75beSMatthew G. Knepley   PetscLogDouble dof[8];        /* The number of degrees of freedom associated with this event */
1705d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
171c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
172c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
173c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
174e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;   /* How much the resident memory has increased in this event */
175e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */
176e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;   /* How much the space was malloced and kept during this event */
177e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent;  /* Maximum of the high water mark with in event minus memory available at the end of the event */
178091bc5acSJunchao Zhang   #if defined(PETSC_HAVE_DEVICE)
179bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
180bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
181bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
182bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
183958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
184958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
185bec0b493Shannah_mairs   #endif
186aa213bdcSJed Brown } PetscEventPerfInfo;
187c60ec953SBarry Smith 
188aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
189aa213bdcSJed Brown struct _n_PetscEventRegLog {
1906a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1916a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
192aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1936a6a9b46SSatish Balay };
1946a6a9b46SSatish Balay 
195aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
196aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1976a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1986a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
199aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
2006a6a9b46SSatish Balay };
201c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
202c60ec953SBarry Smith /*
203aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
2046a6a9b46SSatish Balay 
205aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
206c60ec953SBarry Smith */
207aa213bdcSJed Brown typedef struct _PetscStageInfo {
2086a6a9b46SSatish Balay   char               *name;     /* The stage name */
209ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
210aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
211aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
212aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
213aa213bdcSJed Brown } PetscStageInfo;
2146a6a9b46SSatish Balay 
215aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
216aa213bdcSJed Brown struct _n_PetscStageLog {
2176a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
2186a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
219aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
220aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
221aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
222aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
223aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
2246a6a9b46SSatish Balay };
225217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
226fee518ebSJed Brown 
2273bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
2283bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
2293bb1ff40SBarry Smith 
230aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
231aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
232f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
233f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
234f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
235614700edSBarry Smith 
236da63de55SLois Curfman McInnes /*
237da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
238da63de55SLois Curfman McInnes 
239da63de55SLois Curfman McInnes    For the complex numbers version, note that
240da63de55SLois Curfman McInnes        1 complex addition = 2 flops
241da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
242da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
243da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
244da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
245da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
246da63de55SLois Curfman McInnes    among the various arithmetic operations.
247da63de55SLois Curfman McInnes  */
248da63de55SLois Curfman McInnes 
249aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
250542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
251da63de55SLois Curfman McInnes #else
252542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
253bf3909cdSBarry Smith #endif
254bf3909cdSBarry Smith 
255ca0c957dSBarry Smith /*@
256ca0c957dSBarry Smith        PetscLogFlops - Log how many flops are performed in a calculation
257ca0c957dSBarry Smith 
258ca0c957dSBarry Smith    Input Paramters:
259ca0c957dSBarry Smith     flops - the number of flops
260ca0c957dSBarry Smith 
261ca0c957dSBarry Smith    Notes:
262ca0c957dSBarry Smith      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
263ca0c957dSBarry Smith      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
264ca0c957dSBarry Smith 
265ca0c957dSBarry Smith    Level: intermediate
266ca0c957dSBarry Smith 
26768481988SMark .seealso: PetscLogView(), PetscLogGpuFlops()
268ca0c957dSBarry Smith @*/
269ca0c957dSBarry Smith 
270dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n)
271dd19b90bSBarry Smith {
272dd19b90bSBarry Smith   PetscFunctionBegin;
273bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
274dd19b90bSBarry Smith   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
275da63de55SLois Curfman McInnes #endif
276dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
277dd19b90bSBarry Smith   PetscFunctionReturn(0);
278dd19b90bSBarry Smith }
279fa2bb9feSLisandro Dalcin 
280091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
2818df2f0b1SJunchao Zhang /* Global GPU counters */
2828df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
2838df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
2848df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
2858df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
2868df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gflops;
2878df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtime;
2888df2f0b1SJunchao Zhang #if defined(PETSC_USE_DEBUG)
2898df2f0b1SJunchao Zhang PETSC_EXTERN PetscBool      petsc_gtime_inuse;
2908df2f0b1SJunchao Zhang #endif
2918df2f0b1SJunchao Zhang 
2924db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
2934db21f4bSStefano Zampini {
294958c4211Shannah_mairs   PetscFunctionBegin;
295bec0b493Shannah_mairs   petsc_ctog_ct += 1;
296bec0b493Shannah_mairs   petsc_ctog_sz += size;
297bec0b493Shannah_mairs   PetscFunctionReturn(0);
298bec0b493Shannah_mairs }
2994db21f4bSStefano Zampini 
3004db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
3014db21f4bSStefano Zampini {
302958c4211Shannah_mairs   PetscFunctionBegin;
303bec0b493Shannah_mairs   petsc_gtoc_ct += 1;
304bec0b493Shannah_mairs   petsc_gtoc_sz += size;
305bec0b493Shannah_mairs   PetscFunctionReturn(0);
306bec0b493Shannah_mairs }
3074db21f4bSStefano Zampini 
30868481988SMark /*@
30968481988SMark        PetscLogGpuFlops - Log how many flops are performed in a calculation on the device
31068481988SMark 
31168481988SMark    Input Paramters:
31268481988SMark     flops - the number of flops
31368481988SMark 
31468481988SMark    Notes:
31568481988SMark      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
31668481988SMark      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
31768481988SMark 
31868481988SMark    Level: intermediate
31968481988SMark 
32068481988SMark .seealso: PetscLogView(), PetscLogFlops(), PetscLogGpuTimeBegin(), PetscLogGpuTimeEnd()
32168481988SMark @*/
3224db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
3234db21f4bSStefano Zampini {
324958c4211Shannah_mairs   PetscFunctionBegin;
325958c4211Shannah_mairs #if defined(PETSC_USE_DEBUG)
326958c4211Shannah_mairs   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
327958c4211Shannah_mairs #endif
328958c4211Shannah_mairs   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
329958c4211Shannah_mairs   petsc_gflops += PETSC_FLOPS_PER_OP*n;
330958c4211Shannah_mairs   PetscFunctionReturn(0);
331958c4211Shannah_mairs }
3324db21f4bSStefano Zampini 
33368481988SMark /*@
33468481988SMark        PetscLogGpuTimeBegin - Start timer for device
33568481988SMark 
33668481988SMark    Level: intermediate
33768481988SMark 
33868481988SMark       Notes:
3399f25ba38SBarry Smith         The timer is run on the CPU, it is a separate logging of time devoted to GPU computations (including kernel launch times).
3409f25ba38SBarry Smith         This timer should NOT include times for data transfers between the GPU and CPU, nor setup actions such as allocating space.
3419f25ba38SBarry Smith         The regular logging captures the time for data transfers and any CPU activites during the event
3429f25ba38SBarry Smith         It is used to compute the flop rate on the GPU as it is actively engaged in running a kernel.
3439f25ba38SBarry Smith 
3449f25ba38SBarry Smith 
34568481988SMark .seealso:  PetscLogView(), PetscLogGpuFlops(), PetscLogGpuTimeEnd()
34668481988SMark @*/
3474db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeBegin()
3484db21f4bSStefano Zampini {
349958c4211Shannah_mairs   PetscErrorCode ierr;
350958c4211Shannah_mairs   PetscFunctionBegin;
351703ce11fSStefano Zampini #if defined(PETSC_USE_DEBUG)
352703ce11fSStefano Zampini   if (petsc_gtime_inuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Forgot to call PetscLogGpuTimeEnd()?");
353703ce11fSStefano Zampini   petsc_gtime_inuse = PETSC_TRUE;
354703ce11fSStefano Zampini #endif
355958c4211Shannah_mairs   ierr = PetscTimeSubtract(&petsc_gtime);CHKERRQ(ierr);
356958c4211Shannah_mairs   PetscFunctionReturn(0);
357958c4211Shannah_mairs }
35868481988SMark /*@
35968481988SMark        PetscLogGpuTimeEnd - Stop timer for device
3604db21f4bSStefano Zampini 
36168481988SMark    Level: intermediate
36268481988SMark 
36368481988SMark .seealso:  PetscLogView(), PetscLogGpuFlops(), PetscLogGpuTimeBegin()
36468481988SMark @*/
3654db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeEnd()
3664db21f4bSStefano Zampini {
367958c4211Shannah_mairs   PetscErrorCode ierr;
368958c4211Shannah_mairs   PetscFunctionBegin;
369703ce11fSStefano Zampini #if defined(PETSC_USE_DEBUG)
370703ce11fSStefano Zampini   if (!petsc_gtime_inuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Forgot to call PetscLogGpuTimeBegin()?");
371703ce11fSStefano Zampini   petsc_gtime_inuse = PETSC_FALSE;
372703ce11fSStefano Zampini #endif
373958c4211Shannah_mairs   ierr = PetscTimeAdd(&petsc_gtime);CHKERRQ(ierr);
374958c4211Shannah_mairs   PetscFunctionReturn(0);
375958c4211Shannah_mairs }
3764db21f4bSStefano Zampini 
3774db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
3784db21f4bSStefano Zampini {
3794db21f4bSStefano Zampini   PetscFunctionBegin;
3804db21f4bSStefano Zampini   petsc_gtime += t;
3814db21f4bSStefano Zampini   PetscFunctionReturn(0);
3824db21f4bSStefano Zampini }
383bec0b493Shannah_mairs #endif
384bec0b493Shannah_mairs 
385fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
38677c4ece6SBarry Smith 
387aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
388014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
389014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
39077c4ece6SBarry Smith #endif
39177c4ece6SBarry Smith 
392014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
393014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
394014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
395014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
39677c4ece6SBarry Smith 
397e83a5d19SLisandro Dalcin #define PetscLogObjectParents(p,n,d)  0;do{int _i; for (_i=0; _i<(n); _i++) {ierr = PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]);CHKERRQ(ierr);}}while (0)
398fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
399fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
400fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...);
401fa2bb9feSLisandro Dalcin 
4028ba1e511SMatthew Knepley /* Initialization functions */
403bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
404014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
405bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
406014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
407014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
408014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
409fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*);
410014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
4116849ba73SBarry Smith                                         PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
412fa2bb9feSLisandro Dalcin 
4138ba1e511SMatthew Knepley /* Output functions */
414014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
415f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
416014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
41731d06abdSBarry Smith 
418fa2bb9feSLisandro Dalcin /* Stage functions */
419014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
420014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
421014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
422014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool);
423014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*);
424014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool);
425014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*);
426014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*);
427f5d6ab90SLisandro Dalcin 
4288ba1e511SMatthew Knepley /* Event functions */
429014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*);
430217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool);
431fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
432fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
433014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
434014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
435c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
436c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
437014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool);
438014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
439014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
4408c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
44113230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*);
442891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
4435d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
4448ba1e511SMatthew Knepley 
4458ba1e511SMatthew Knepley /* Global counters */
446014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
447014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
448014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
449014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
450014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
451014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
452014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
453014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
454014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
455014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
456014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
457014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
458014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
459014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
460014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
4618ba1e511SMatthew Knepley 
462e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool      PetscLogMemory;
463e3ed9ee7SBarry Smith 
464fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn;  /* true if logging synchronization is enabled */
46562872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
46662872c28SLisandro Dalcin 
46762872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \
46862872c28SLisandro Dalcin   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
46962872c28SLisandro Dalcin     PetscLogEventSynchronize((e),(comm)) : 0))
47077c4ece6SBarry Smith 
47152e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
4728b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
473495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
474043328b6SSatish Balay 
47552e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
4768b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
477495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
47877c4ece6SBarry Smith 
479014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*);
480014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
481003131ecSBarry Smith 
482ce85283eSBarry Smith /*
483f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
484f621e05eSBarry Smith    their sizes.
485f621e05eSBarry Smith 
486af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
487ce85283eSBarry Smith    uses macros to defined the MPI operations.
48815308354SBarry Smith 
48915308354SBarry Smith      It does not work correctly from HP-UX because it processes the
490bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
491b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
4927c1e34a4SSatish Balay 
493f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
494ce85283eSBarry Smith */
495c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
49677a39924SBarry Smith /*
49777a39924SBarry Smith    Logging of MPI activities
49877a39924SBarry Smith */
499b23bfdefSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length)
500f95db71bSBarry Smith {
501f12d10ccSJunchao Zhang   PetscMPIInt    typesize;
502f12d10ccSJunchao Zhang   PetscErrorCode ierr;
5037d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
50455b25c41SPierre Jolivet   ierr     = MPI_Type_size(type,&typesize);CHKERRMPI(ierr);
505f12d10ccSJunchao Zhang   *length += (PetscLogDouble) (count*typesize);
5069c72ff1eSSatish Balay   return 0;
507f95db71bSBarry Smith }
50877a39924SBarry Smith 
509f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
5103b9284c0SMatthew G Knepley {
511f12d10ccSJunchao Zhang   PetscMPIInt    typesize,size,p;
512f12d10ccSJunchao Zhang   PetscErrorCode ierr;
5133b9284c0SMatthew G Knepley 
5147d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
515ffc4695bSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr);
516ffc4695bSBarry Smith   ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr);
517f12d10ccSJunchao Zhang   for (p=0; p<size; ++p) {
518f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
519f12d10ccSJunchao Zhang   }
520f12d10ccSJunchao Zhang   return 0;
521f12d10ccSJunchao Zhang }
522f12d10ccSJunchao Zhang 
523f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
524f12d10ccSJunchao Zhang {
525f12d10ccSJunchao Zhang   PetscMPIInt    typesize,p;
526f12d10ccSJunchao Zhang   PetscErrorCode ierr;
527f12d10ccSJunchao Zhang 
528f12d10ccSJunchao Zhang   if (type == MPI_DATATYPE_NULL) return 0;
529ffc4695bSBarry Smith   ierr = MPI_Type_size(type,&typesize);CHKERRMPI(ierr);
530f12d10ccSJunchao Zhang   for (p=0; p<n; ++p) {
531f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
5323b9284c0SMatthew G Knepley   }
5333b9284c0SMatthew G Knepley   return 0;
5343b9284c0SMatthew G Knepley }
5353b9284c0SMatthew G Knepley 
53672b11a25SBarry Smith /*
53772b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
53872b11a25SBarry Smith */
53972b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm)
54072b11a25SBarry Smith {
54172b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
54272b11a25SBarry Smith }
54372b11a25SBarry Smith 
54477a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
545f12d10ccSJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request)))
54615308354SBarry Smith 
54777a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
548f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request)))
54915308354SBarry Smith 
550457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
551f12d10ccSJunchao Zhang   ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests))))
5520d4b0b6cSBarry Smith 
553457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
554f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests))))
5550d4b0b6cSBarry Smith 
556457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
557f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests)))
5580d4b0b6cSBarry Smith 
559ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
560f12d10ccSJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status)))
56115308354SBarry Smith 
56277a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
563f12d10ccSJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm)))
56477a39924SBarry Smith 
56577a39924SBarry Smith #define MPI_Wait(request,status) \
5665fa69175SJed Brown   ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status)))
56777a39924SBarry Smith 
56877a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
5695fa69175SJed Brown   ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d)))
57077a39924SBarry Smith 
57177a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
5725fa69175SJed Brown   ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses)))
57377a39924SBarry Smith 
57477a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
575*df05ca09SBarry Smith   (petsc_allreduce_ct += PetscMPIParallelComm((comm)),MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm)))
5763914022bSBarry Smith 
57754fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
5785fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm)))
57954fe5c21SBarry Smith 
580d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
5815fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm)))
582d6e4c47cSJed Brown 
5833b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
584f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
5853b9284c0SMatthew G Knepley 
5863b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
587f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(sendcnts),(sendtype),(&petsc_send_len)) || MPI_Alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
5883b9284c0SMatthew G Knepley 
58901faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
5905fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
59101faf4e4SMatthew Knepley 
59201faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
5935fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm)))
59401faf4e4SMatthew Knepley 
59501faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
596f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
59701faf4e4SMatthew Knepley 
59801faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
599f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm)))
60001faf4e4SMatthew Knepley 
60101faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
602f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
60301faf4e4SMatthew Knepley 
60401faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
605f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
606f12d10ccSJunchao Zhang 
607f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
608f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
609f12d10ccSJunchao Zhang 
610f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
611f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(sendcnts),(sendtype),(&petsc_send_len)) || MPI_Ialltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
612f12d10ccSJunchao Zhang 
613f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
614f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
615f12d10ccSJunchao Zhang 
616f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \
617f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request)))
618f12d10ccSJunchao Zhang 
619f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
620f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
621f12d10ccSJunchao Zhang 
622f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \
623f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request)))
624f12d10ccSJunchao Zhang 
625f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
626f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
627f12d10ccSJunchao Zhang 
628f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
629f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
630f12d10ccSJunchao Zhang 
631f12d10ccSJunchao Zhang /* We treat MPI_Ineighbor_alltoallv as a set of isend/irecv instead of a traditional MPI collective.
632f12d10ccSJunchao Zhang    OpenMPI-3.0 ran into error with outdegree = indegree = 0, so we use ((outdegree) || (indegree)) as a workaround.
633f12d10ccSJunchao Zhang  */
634f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
635f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(outdegree),0) || (petsc_irecv_ct += (PetscLogDouble)(indegree),0) || PetscMPITypeSizeCount((outdegree),(sendcnts),(sendtype),(&petsc_isend_len)) || PetscMPITypeSizeCount((indegree),(recvcnts),(recvtype),(&petsc_irecv_len)) || (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request))))
636f12d10ccSJunchao Zhang 
637f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
638f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(outdegree),0) || (petsc_irecv_ct += (PetscLogDouble)(indegree),0) || PetscMPITypeSizeCount((outdegree),(sendcnts),(sendtype),(&petsc_isend_len)) || PetscMPITypeSizeCount((indegree),(recvcnts),(recvtype),(&petsc_irecv_len)) || (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))))
63901faf4e4SMatthew Knepley 
6400d4b0b6cSBarry Smith #else
6410d4b0b6cSBarry Smith 
642457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
643ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
6440d4b0b6cSBarry Smith 
645457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
646ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
6470d4b0b6cSBarry Smith 
648457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
6495fa69175SJed Brown   (MPI_Start((requests)))
6500d4b0b6cSBarry Smith 
651f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
652f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
653f12d10ccSJunchao Zhang 
654f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
655f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
656*df05ca09SBarry Smith 
657c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
658614700edSBarry Smith 
659df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
660614700edSBarry Smith 
661e3ed9ee7SBarry Smith #define PetscLogMemory                     PETSC_FALSE
662e3ed9ee7SBarry Smith 
663b0a32e0cSBarry Smith #define PetscLogFlops(n)                   0
664fa2bb9feSLisandro Dalcin #define PetscGetFlops(a)                   (*(a) = 0.0,0)
665614700edSBarry Smith 
666fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b)         0
667fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a)               0
668fa2bb9feSLisandro Dalcin #define PetscLogStagePop()                 0
669f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b)        0
670f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b)        0
671f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b)       0
672f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b)       0
673f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b)            (*(b)=0,0)
674f5d6ab90SLisandro Dalcin 
675fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c)       0
676fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b)    0
677fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a)       0
678fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a)       0
679b0a32e0cSBarry Smith #define PetscLogEventActivate(a)           0
680b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a)         0
681c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a)     0
682c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a)      0
683b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)      0
684b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a)    0
685e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)     0
68646eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)            (*(b)=0,0)
687561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c)    0
6889c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c)         0
6899c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)       0
69077c4ece6SBarry Smith 
6918b5db460SBarry Smith #define PetscLogPLB                        0
6928b5db460SBarry Smith #define PetscLogPLE                        0
6938b5db460SBarry Smith #define PetscLogPHC                        0
6948b5db460SBarry Smith #define PetscLogPHD                        0
695f5d6ab90SLisandro Dalcin 
696efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)       0
69752e6d16bSBarry Smith #define PetscLogObjectCreate(h)            0
69852e6d16bSBarry Smith #define PetscLogObjectDestroy(h)           0
699fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...);
700fa2bb9feSLisandro Dalcin 
701bb1d7374SBarry Smith #define PetscLogDefaultBegin()             0
702b0a32e0cSBarry Smith #define PetscLogAllBegin()                 0
703bb1d7374SBarry Smith #define PetscLogNestedBegin()              0
704fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file)           0
70573fda44aSBarry Smith #define PetscLogActions(a)                 0
706fa2bb9feSLisandro Dalcin #define PetscLogObjects(a)                 0
707fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b)          0
708fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le)                 0
709fa2bb9feSLisandro Dalcin 
710fa2bb9feSLisandro Dalcin #define PetscLogView(viewer)               0
711fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions()          0
712fa2bb9feSLisandro Dalcin #define PetscLogDump(c)                    0
713fa2bb9feSLisandro Dalcin 
71462872c28SLisandro Dalcin #define PetscLogEventSync(e,comm)          0
715fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4)  0
716fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4)    0
717ce6058e1SBarry Smith 
718091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
7198157aad8SJunchao Zhang #define PetscLogCpuToGpu(a)                0
7208157aad8SJunchao Zhang #define PetscLogGpuToCpu(a)                0
7218157aad8SJunchao Zhang #define PetscLogGpuFlops(a)                0
7228157aad8SJunchao Zhang #define PetscLogGpuTimeBegin()             0
7238157aad8SJunchao Zhang #define PetscLogGpuTimeEnd()               0
7248157aad8SJunchao Zhang #define PetscLogGpuTimeAdd(a)              0
7258df2f0b1SJunchao Zhang #endif
7268157aad8SJunchao Zhang 
727aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
728ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
729ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
730457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests)           MPI_Start(requests)
731f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
732f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
733f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
734f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
735f141ce34SMatthew Knepley 
736aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
7376daaf66cSBarry Smith 
738204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
739204a6943SJed Brown do {\
740204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
741204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
742166c7f25SBarry Smith   PetscLogStage  _stageNum;\
7438cbcd9ccSBarry Smith   PetscErrorCode _3_ierr; \
744c5929fdfSBarry Smith   _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \
745204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
746204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
747204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
748204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
7490298fd71SBarry Smith     _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\
750204a6943SJed Brown     if (PetscPreLoadIt>0) {\
7518e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
7528e58c17dSMatthew Knepley     } else {\
753a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
7548e58c17dSMatthew Knepley     }\
755204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\
7568e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
7578e58c17dSMatthew Knepley 
758204a6943SJed Brown #define PetscPreLoadEnd() \
759043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
760204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
761043328b6SSatish Balay   }\
762204a6943SJed Brown } while (0)
7638e58c17dSMatthew Knepley 
764204a6943SJed Brown #define PetscPreLoadStage(name) do {                                         \
765043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);                      \
766204a6943SJed Brown     if (PetscPreLoadIt>0) {                                                  \
7678e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);   \
7688e58c17dSMatthew Knepley     } else {                                                            \
769a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
7708e58c17dSMatthew Knepley     }                                                                   \
771204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \
772204a6943SJed Brown     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);            \
773204a6943SJed Brown   } while (0)
774e9fa29b7SSatish Balay 
775ad14c47eSJed Brown /* some vars for logging */
776ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
777ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
778ad14c47eSJed Brown 
77997bb86f7SLois Curfman McInnes #endif
780