xref: /petsc/include/petsclog.h (revision c00cb57f5940c39b3204dc31afc73698b59112d7)
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)
21fa2bb9feSLisandro Dalcin #else
22fa2bb9feSLisandro Dalcin #define PetscInfo(A,S)                       0
23fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1)                   0
24fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2)                0
25fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3)             0
26fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4)          0
27fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       0
28fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    0
29fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0
30fa2bb9feSLisandro Dalcin #endif
31e94e781bSJacob Faibussowitsch 
32e94e781bSJacob Faibussowitsch /*E
33e94e781bSJacob Faibussowitsch     PetscInfoCommFlag - Describes the method by which to filter PetscInfo() by communicator size
34e94e781bSJacob Faibussowitsch 
35e94e781bSJacob Faibussowitsch     Used as an input for PetscInfoSetFilterCommSelf()
36e94e781bSJacob Faibussowitsch 
37e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ALL - Default uninitialized value. PetscInfo() will not filter based on communicator size (i.e. will
38e94e781bSJacob Faibussowitsch print for all communicators)
39e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_NO_SELF - PetscInfo() will NOT print for communicators with size = 1 (i.e. *_COMM_SELF)
40e94e781bSJacob Faibussowitsch $   PETSC_INFO_COMM_ONLY_SELF - PetscInfo will ONLY print for communicators with size = 1
41e94e781bSJacob Faibussowitsch 
42e94e781bSJacob Faibussowitsch     Level: intermediate
43e94e781bSJacob Faibussowitsch 
44e94e781bSJacob Faibussowitsch .seealso: PetscInfo(), PetscInfoSetFromOptions(), PetscInfoSetFilterCommSelf()
45e94e781bSJacob Faibussowitsch E*/
46e94e781bSJacob Faibussowitsch typedef enum {
47e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ALL = -1,
48e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_NO_SELF = 0,
49e94e781bSJacob Faibussowitsch   PETSC_INFO_COMM_ONLY_SELF = 1
50e94e781bSJacob Faibussowitsch } PetscInfoCommFlag;
51e94e781bSJacob Faibussowitsch 
52e94e781bSJacob Faibussowitsch PETSC_EXTERN const char * const PetscInfoCommFlags[];
53fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId);
54fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId);
55e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoEnabled(PetscClassId, PetscBool *);
56e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoAllow(PetscBool);
57e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFile(const char[],const char[]);
58e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetFile(char **,FILE **);
59e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetClasses(PetscBool,PetscInt,const char *const *);
60e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetClass(const char *, PetscBool *);
61e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoGetInfo(PetscBool *,PetscBool *,PetscBool *,PetscBool *,PetscInfoCommFlag *);
62e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoProcessClass(const char[],PetscInt,PetscClassId[]);
63e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFilterCommSelf(PetscInfoCommFlag);
64e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoSetFromOptions(PetscOptions);
65e94e781bSJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscInfoDestroy(void);
66fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool      PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
67fa2bb9feSLisandro Dalcin 
68b859824cSBarry Smith /*MC
69b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
70b859824cSBarry Smith      code.
71b859824cSBarry Smith 
72b859824cSBarry Smith     Level: intermediate
73b859824cSBarry Smith 
74b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
75b859824cSBarry Smith M*/
76b859824cSBarry Smith typedef int PetscLogEvent;
77b859824cSBarry Smith 
78b859824cSBarry Smith /*MC
79b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
80b859824cSBarry Smith 
81b859824cSBarry Smith     Level: intermediate
82b859824cSBarry Smith 
83522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent
84b859824cSBarry Smith M*/
85b859824cSBarry Smith typedef int PetscLogStage;
86b859824cSBarry Smith 
878ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
88014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
8997bb86f7SLois Curfman McInnes 
9019b02663SBarry Smith /* Global flop counter */
91014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
92014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
9319b02663SBarry Smith 
9431d06abdSBarry Smith /* We must make the following structures available to access the event
9531d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
9631d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
97d49d4b11SBarry Smith 
98fa2bb9feSLisandro Dalcin      The code that manipulates these structures is in src/sys/logging/utils.
9931d06abdSBarry Smith */
100aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
1016a6a9b46SSatish Balay 
102217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
103c60ec953SBarry Smith /*
104aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
105c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
106c60ec953SBarry Smith        how much memory they use, etc.
107c60ec953SBarry Smith 
108aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
109c60ec953SBarry Smith */
1106a6a9b46SSatish Balay typedef struct  {
111c60ec953SBarry Smith   char           *name;   /* The class name */
112c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
113aa213bdcSJed Brown } PetscClassRegInfo;
1146a6a9b46SSatish Balay 
1156a6a9b46SSatish Balay typedef struct {
1160700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
1176a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
1186a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
1196a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
1206a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
121aa213bdcSJed Brown } PetscClassPerfInfo;
1226a6a9b46SSatish Balay 
123aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
124aa213bdcSJed Brown struct _n_PetscClassRegLog {
125c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
126c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
127aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
128c60ec953SBarry Smith };
1296a6a9b46SSatish Balay 
130aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
131aa213bdcSJed Brown struct _n_PetscClassPerfLog {
132c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
133c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
134aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
135c60ec953SBarry Smith };
136c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
137c60ec953SBarry Smith /*
138aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
139c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
140c60ec953SBarry Smith        much time it takes, etc.
141c60ec953SBarry Smith 
142aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
143c60ec953SBarry Smith       of these for each stage.
144c60ec953SBarry Smith 
145c60ec953SBarry Smith */
1466a6a9b46SSatish Balay typedef struct {
1476a6a9b46SSatish Balay   char         *name;         /* The name of this event */
148c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
149217044c2SLisandro Dalcin   PetscBool    collective;    /* Flag this event as collective */
1506a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1516a6a9b46SSatish Balay   int          mpe_id_begin;  /* MPE IDs that define the event */
1526a6a9b46SSatish Balay   int          mpe_id_end;
1536a6a9b46SSatish Balay #endif
154aa213bdcSJed Brown } PetscEventRegInfo;
1556a6a9b46SSatish Balay 
156c60ec953SBarry Smith typedef struct {
157c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
158ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
159ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
160c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
161c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
162a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */
163a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;    /* The time and time^2 taken for this event */
164217044c2SLisandro Dalcin   PetscLogDouble syncTime;                /* The synchronization barrier time */
165891e75beSMatthew G. Knepley   PetscLogDouble dof[8];        /* The number of degrees of freedom associated with this event */
1665d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
167c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
168c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
169c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
170e3ed9ee7SBarry Smith   PetscLogDouble memIncrease;   /* How much the resident memory has increased in this event */
171e3ed9ee7SBarry Smith   PetscLogDouble mallocIncrease;/* How much the maximum malloced space has increased in this event */
172e3ed9ee7SBarry Smith   PetscLogDouble mallocSpace;   /* How much the space was malloced and kept during this event */
173e3ed9ee7SBarry Smith   PetscLogDouble mallocIncreaseEvent;  /* Maximum of the high water mark with in event minus memory available at the end of the event */
174091bc5acSJunchao Zhang   #if defined(PETSC_HAVE_DEVICE)
175bec0b493Shannah_mairs   PetscLogDouble CpuToGpuCount; /* The total number of CPU to GPU copies */
176bec0b493Shannah_mairs   PetscLogDouble GpuToCpuCount; /* The total number of GPU to CPU copies */
177bec0b493Shannah_mairs   PetscLogDouble CpuToGpuSize;  /* The total size of CPU to GPU copies */
178bec0b493Shannah_mairs   PetscLogDouble GpuToCpuSize;  /* The total size of GPU to CPU copies */
179958c4211Shannah_mairs   PetscLogDouble GpuFlops;      /* The flops done on a GPU in this event */
180958c4211Shannah_mairs   PetscLogDouble GpuTime;       /* The time spent on a GPU in this event */
181bec0b493Shannah_mairs   #endif
182aa213bdcSJed Brown } PetscEventPerfInfo;
183c60ec953SBarry Smith 
184aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
185aa213bdcSJed Brown struct _n_PetscEventRegLog {
1866a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1876a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
188aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1896a6a9b46SSatish Balay };
1906a6a9b46SSatish Balay 
191aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
192aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1936a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1946a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
195aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1966a6a9b46SSatish Balay };
197c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
198c60ec953SBarry Smith /*
199aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
2006a6a9b46SSatish Balay 
201aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
202c60ec953SBarry Smith */
203aa213bdcSJed Brown typedef struct _PetscStageInfo {
2046a6a9b46SSatish Balay   char               *name;     /* The stage name */
205ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
206aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
207aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
208aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
209aa213bdcSJed Brown } PetscStageInfo;
2106a6a9b46SSatish Balay 
211aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
212aa213bdcSJed Brown struct _n_PetscStageLog {
2136a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
2146a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
215aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
216aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
217aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
218aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
219aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
2206a6a9b46SSatish Balay };
221217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/
222fee518ebSJed Brown 
2233bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
2243bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
2253bb1ff40SBarry Smith 
226aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
227aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
228f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
229f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
230f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
231614700edSBarry Smith 
232da63de55SLois Curfman McInnes /*
233da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
234da63de55SLois Curfman McInnes 
235da63de55SLois Curfman McInnes    For the complex numbers version, note that
236da63de55SLois Curfman McInnes        1 complex addition = 2 flops
237da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
238da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
239da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
240da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
241da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
242da63de55SLois Curfman McInnes    among the various arithmetic operations.
243da63de55SLois Curfman McInnes  */
244da63de55SLois Curfman McInnes 
245aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
246542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
247da63de55SLois Curfman McInnes #else
248542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
249bf3909cdSBarry Smith #endif
250bf3909cdSBarry Smith 
251ca0c957dSBarry Smith /*@
252ca0c957dSBarry Smith        PetscLogFlops - Log how many flops are performed in a calculation
253ca0c957dSBarry Smith 
254ca0c957dSBarry Smith    Input Paramters:
255ca0c957dSBarry Smith     flops - the number of flops
256ca0c957dSBarry Smith 
257ca0c957dSBarry Smith    Notes:
258ca0c957dSBarry Smith      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
259ca0c957dSBarry Smith      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
260ca0c957dSBarry Smith 
261ca0c957dSBarry Smith    Level: intermediate
262ca0c957dSBarry Smith 
26368481988SMark .seealso: PetscLogView(), PetscLogGpuFlops()
264ca0c957dSBarry Smith @*/
265ca0c957dSBarry Smith 
266dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n)
267dd19b90bSBarry Smith {
268dd19b90bSBarry Smith   PetscFunctionBegin;
269bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
270dd19b90bSBarry Smith   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
271da63de55SLois Curfman McInnes #endif
272dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
273dd19b90bSBarry Smith   PetscFunctionReturn(0);
274dd19b90bSBarry Smith }
275fa2bb9feSLisandro Dalcin 
276091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
2778df2f0b1SJunchao Zhang /* Global GPU counters */
2788df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_ct;
2798df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_ct;
2808df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_ctog_sz;
2818df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtoc_sz;
2828df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gflops;
2838df2f0b1SJunchao Zhang PETSC_EXTERN PetscLogDouble petsc_gtime;
2848df2f0b1SJunchao Zhang #if defined(PETSC_USE_DEBUG)
2858df2f0b1SJunchao Zhang PETSC_EXTERN PetscBool      petsc_gtime_inuse;
2868df2f0b1SJunchao Zhang #endif
2878df2f0b1SJunchao Zhang 
2884db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogCpuToGpu(PetscLogDouble size)
2894db21f4bSStefano Zampini {
290958c4211Shannah_mairs   PetscFunctionBegin;
291bec0b493Shannah_mairs   petsc_ctog_ct += 1;
292bec0b493Shannah_mairs   petsc_ctog_sz += size;
293bec0b493Shannah_mairs   PetscFunctionReturn(0);
294bec0b493Shannah_mairs }
2954db21f4bSStefano Zampini 
2964db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuToCpu(PetscLogDouble size)
2974db21f4bSStefano Zampini {
298958c4211Shannah_mairs   PetscFunctionBegin;
299bec0b493Shannah_mairs   petsc_gtoc_ct += 1;
300bec0b493Shannah_mairs   petsc_gtoc_sz += size;
301bec0b493Shannah_mairs   PetscFunctionReturn(0);
302bec0b493Shannah_mairs }
3034db21f4bSStefano Zampini 
30468481988SMark /*@
30568481988SMark        PetscLogGpuFlops - Log how many flops are performed in a calculation on the device
30668481988SMark 
30768481988SMark    Input Paramters:
30868481988SMark     flops - the number of flops
30968481988SMark 
31068481988SMark    Notes:
31168481988SMark      To limit the chance of integer overflow when multiplying by a constant, represent the constant as a double,
31268481988SMark      not an integer. Use PetscLogFlops(4.0*n) not PetscLogFlops(4*n)
31368481988SMark 
31468481988SMark    Level: intermediate
31568481988SMark 
31668481988SMark .seealso: PetscLogView(), PetscLogFlops(), PetscLogGpuTimeBegin(), PetscLogGpuTimeEnd()
31768481988SMark @*/
3184db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuFlops(PetscLogDouble n)
3194db21f4bSStefano Zampini {
320958c4211Shannah_mairs   PetscFunctionBegin;
321958c4211Shannah_mairs #if defined(PETSC_USE_DEBUG)
322958c4211Shannah_mairs   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
323958c4211Shannah_mairs #endif
324958c4211Shannah_mairs   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
325958c4211Shannah_mairs   petsc_gflops += PETSC_FLOPS_PER_OP*n;
326958c4211Shannah_mairs   PetscFunctionReturn(0);
327958c4211Shannah_mairs }
3284db21f4bSStefano Zampini 
32968481988SMark /*@
33068481988SMark        PetscLogGpuTimeBegin - Start timer for device
33168481988SMark 
33268481988SMark    Level: intermediate
33368481988SMark 
33468481988SMark       Notes:
3359f25ba38SBarry Smith         The timer is run on the CPU, it is a separate logging of time devoted to GPU computations (including kernel launch times).
3369f25ba38SBarry Smith         This timer should NOT include times for data transfers between the GPU and CPU, nor setup actions such as allocating space.
3379f25ba38SBarry Smith         The regular logging captures the time for data transfers and any CPU activites during the event
3389f25ba38SBarry Smith         It is used to compute the flop rate on the GPU as it is actively engaged in running a kernel.
3399f25ba38SBarry Smith 
3409f25ba38SBarry Smith 
34168481988SMark .seealso:  PetscLogView(), PetscLogGpuFlops(), PetscLogGpuTimeEnd()
34268481988SMark @*/
3434db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeBegin()
3444db21f4bSStefano Zampini {
345958c4211Shannah_mairs   PetscErrorCode ierr;
346958c4211Shannah_mairs   PetscFunctionBegin;
347703ce11fSStefano Zampini #if defined(PETSC_USE_DEBUG)
348703ce11fSStefano Zampini   if (petsc_gtime_inuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Forgot to call PetscLogGpuTimeEnd()?");
349703ce11fSStefano Zampini   petsc_gtime_inuse = PETSC_TRUE;
350703ce11fSStefano Zampini #endif
351958c4211Shannah_mairs   ierr = PetscTimeSubtract(&petsc_gtime);CHKERRQ(ierr);
352958c4211Shannah_mairs   PetscFunctionReturn(0);
353958c4211Shannah_mairs }
35468481988SMark /*@
35568481988SMark        PetscLogGpuTimeEnd - Stop timer for device
3564db21f4bSStefano Zampini 
35768481988SMark    Level: intermediate
35868481988SMark 
35968481988SMark .seealso:  PetscLogView(), PetscLogGpuFlops(), PetscLogGpuTimeBegin()
36068481988SMark @*/
3614db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeEnd()
3624db21f4bSStefano Zampini {
363958c4211Shannah_mairs   PetscErrorCode ierr;
364958c4211Shannah_mairs   PetscFunctionBegin;
365703ce11fSStefano Zampini #if defined(PETSC_USE_DEBUG)
366703ce11fSStefano Zampini   if (!petsc_gtime_inuse) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_PLIB,"Forgot to call PetscLogGpuTimeBegin()?");
367703ce11fSStefano Zampini   petsc_gtime_inuse = PETSC_FALSE;
368703ce11fSStefano Zampini #endif
369958c4211Shannah_mairs   ierr = PetscTimeAdd(&petsc_gtime);CHKERRQ(ierr);
370958c4211Shannah_mairs   PetscFunctionReturn(0);
371958c4211Shannah_mairs }
3724db21f4bSStefano Zampini 
3734db21f4bSStefano Zampini PETSC_STATIC_INLINE PetscErrorCode PetscLogGpuTimeAdd(PetscLogDouble t)
3744db21f4bSStefano Zampini {
3754db21f4bSStefano Zampini   PetscFunctionBegin;
3764db21f4bSStefano Zampini   petsc_gtime += t;
3774db21f4bSStefano Zampini   PetscFunctionReturn(0);
3784db21f4bSStefano Zampini }
379bec0b493Shannah_mairs #endif
380bec0b493Shannah_mairs 
381fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
38277c4ece6SBarry Smith 
383aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
384014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
385014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
38677c4ece6SBarry Smith #endif
38777c4ece6SBarry Smith 
388014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
389014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
390014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
391014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
39277c4ece6SBarry Smith 
393e83a5d19SLisandro 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)
394fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0)
395fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0)
396fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...);
397fa2bb9feSLisandro Dalcin 
3988ba1e511SMatthew Knepley /* Initialization functions */
399bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
400014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
401bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
402014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
403014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
404014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
405fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*);
406014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
4076849ba73SBarry Smith                                         PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
408fa2bb9feSLisandro Dalcin 
4098ba1e511SMatthew Knepley /* Output functions */
410014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
411f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
412014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
41331d06abdSBarry Smith 
414fa2bb9feSLisandro Dalcin /* Stage functions */
415014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
416014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
417014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
418014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool);
419014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*);
420014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool);
421014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*);
422014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*);
423f5d6ab90SLisandro Dalcin 
4248ba1e511SMatthew Knepley /* Event functions */
425014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*);
426217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool);
427fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId);
428fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId);
429014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
430014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
431*c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePush(PetscLogEvent);
432*c00cb57fSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventDeactivatePop(PetscLogEvent);
433014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool);
434014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
435014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
4368c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
43713230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*);
438891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble);
4395d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
4408ba1e511SMatthew Knepley 
4418ba1e511SMatthew Knepley /* Global counters */
442014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
443014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
444014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
445014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
446014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
447014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
448014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
449014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
450014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
451014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
452014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
453014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
454014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
455014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
456014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
4578ba1e511SMatthew Knepley 
458e3ed9ee7SBarry Smith PETSC_EXTERN PetscBool      PetscLogMemory;
459e3ed9ee7SBarry Smith 
460fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn;  /* true if logging synchronization is enabled */
46162872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm);
46262872c28SLisandro Dalcin 
46362872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \
46462872c28SLisandro Dalcin   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
46562872c28SLisandro Dalcin     PetscLogEventSynchronize((e),(comm)) : 0))
46677c4ece6SBarry Smith 
46752e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
4688b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
469495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
470043328b6SSatish Balay 
47152e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
4728b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
473495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0))
47477c4ece6SBarry Smith 
475014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*);
476014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
477003131ecSBarry Smith 
478ce85283eSBarry Smith /*
479f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
480f621e05eSBarry Smith    their sizes.
481f621e05eSBarry Smith 
482af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
483ce85283eSBarry Smith    uses macros to defined the MPI operations.
48415308354SBarry Smith 
48515308354SBarry Smith      It does not work correctly from HP-UX because it processes the
486bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
487b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
4887c1e34a4SSatish Balay 
489f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
490ce85283eSBarry Smith */
491c9b973beSBarry Smith #if !defined(MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
49277a39924SBarry Smith /*
49377a39924SBarry Smith    Logging of MPI activities
49477a39924SBarry Smith */
495b23bfdefSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscInt count,MPI_Datatype type,PetscLogDouble *length)
496f95db71bSBarry Smith {
497f12d10ccSJunchao Zhang   PetscMPIInt    typesize;
498f12d10ccSJunchao Zhang   PetscErrorCode ierr;
4997d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
500f12d10ccSJunchao Zhang   ierr     = MPI_Type_size(type,&typesize);CHKERRQ(ierr);
501f12d10ccSJunchao Zhang   *length += (PetscLogDouble) (count*typesize);
5029c72ff1eSSatish Balay   return 0;
503f95db71bSBarry Smith }
50477a39924SBarry Smith 
505f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
5063b9284c0SMatthew G Knepley {
507f12d10ccSJunchao Zhang   PetscMPIInt    typesize,size,p;
508f12d10ccSJunchao Zhang   PetscErrorCode ierr;
5093b9284c0SMatthew G Knepley 
5107d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
511f12d10ccSJunchao Zhang   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
512f12d10ccSJunchao Zhang   ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr);
513f12d10ccSJunchao Zhang   for (p=0; p<size; ++p) {
514f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
515f12d10ccSJunchao Zhang   }
516f12d10ccSJunchao Zhang   return 0;
517f12d10ccSJunchao Zhang }
518f12d10ccSJunchao Zhang 
519f12d10ccSJunchao Zhang PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeCount(PetscInt n,const PetscMPIInt *counts,MPI_Datatype type,PetscLogDouble *length)
520f12d10ccSJunchao Zhang {
521f12d10ccSJunchao Zhang   PetscMPIInt    typesize,p;
522f12d10ccSJunchao Zhang   PetscErrorCode ierr;
523f12d10ccSJunchao Zhang 
524f12d10ccSJunchao Zhang   if (type == MPI_DATATYPE_NULL) return 0;
525f12d10ccSJunchao Zhang   ierr = MPI_Type_size(type,&typesize);CHKERRQ(ierr);
526f12d10ccSJunchao Zhang   for (p=0; p<n; ++p) {
527f12d10ccSJunchao Zhang     *length += (PetscLogDouble) (counts[p]*typesize);
5283b9284c0SMatthew G Knepley   }
5293b9284c0SMatthew G Knepley   return 0;
5303b9284c0SMatthew G Knepley }
5313b9284c0SMatthew G Knepley 
53272b11a25SBarry Smith /*
53372b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
53472b11a25SBarry Smith */
53572b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm)
53672b11a25SBarry Smith {
53772b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
53872b11a25SBarry Smith }
53972b11a25SBarry Smith 
54077a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
541f12d10ccSJunchao Zhang   ((petsc_irecv_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request)))
54215308354SBarry Smith 
54377a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
544f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request)))
54515308354SBarry Smith 
546457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
547f12d10ccSJunchao Zhang   ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_irecv_len)) || ((number) && MPI_Startall((number),(requests))))
5480d4b0b6cSBarry Smith 
549457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
550f12d10ccSJunchao Zhang   ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize((count),(datatype),&(petsc_isend_len)) || ((number) && MPI_Startall((number),(requests))))
5510d4b0b6cSBarry Smith 
552457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
553f12d10ccSJunchao Zhang   ((petsc_isend_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_isend_len)) || MPI_Start((requests)))
5540d4b0b6cSBarry Smith 
555ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
556f12d10ccSJunchao Zhang   ((petsc_recv_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_recv_len)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status)))
55715308354SBarry Smith 
55877a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
559f12d10ccSJunchao Zhang   ((petsc_send_ct++,0) || PetscMPITypeSize((count),(datatype),(&petsc_send_len)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm)))
56077a39924SBarry Smith 
56177a39924SBarry Smith #define MPI_Wait(request,status) \
5625fa69175SJed Brown   ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status)))
56377a39924SBarry Smith 
56477a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
5655fa69175SJed Brown   ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d)))
56677a39924SBarry Smith 
56777a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
5685fa69175SJed Brown   ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses)))
56977a39924SBarry Smith 
57077a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
5715fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm)))
5723914022bSBarry Smith 
57354fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
5745fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm)))
57554fe5c21SBarry Smith 
576d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
5775fa69175SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm)))
578d6e4c47cSJed Brown 
5793b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
580f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
5813b9284c0SMatthew G Knepley 
5823b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
583f12d10ccSJunchao 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)))
5843b9284c0SMatthew G Knepley 
58501faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
5865fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm)))
58701faf4e4SMatthew Knepley 
58801faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
5895fa69175SJed Brown   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm)))
59001faf4e4SMatthew Knepley 
59101faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
592f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
59301faf4e4SMatthew Knepley 
59401faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
595f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm)))
59601faf4e4SMatthew Knepley 
59701faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
598f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
59901faf4e4SMatthew Knepley 
60001faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
601f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm)))
602f12d10ccSJunchao Zhang 
603f12d10ccSJunchao Zhang #define MPI_Ialltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
604f12d10ccSJunchao Zhang   ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Ialltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
605f12d10ccSJunchao Zhang 
606f12d10ccSJunchao Zhang #define MPI_Ialltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
607f12d10ccSJunchao 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)))
608f12d10ccSJunchao Zhang 
609f12d10ccSJunchao Zhang #define MPI_Iallgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm,request) \
610f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm),(request)))
611f12d10ccSJunchao Zhang 
612f12d10ccSJunchao Zhang #define MPI_Iallgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm,request) \
613f12d10ccSJunchao Zhang   ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Iallgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm),(request)))
614f12d10ccSJunchao Zhang 
615f12d10ccSJunchao Zhang #define MPI_Igather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
616f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
617f12d10ccSJunchao Zhang 
618f12d10ccSJunchao Zhang #define MPI_Igatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm,request) \
619f12d10ccSJunchao Zhang   ((petsc_gather_ct++,0) || PetscMPITypeSize((sendcount),(sendtype),(&petsc_send_len)) || MPI_Igatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm),(request)))
620f12d10ccSJunchao Zhang 
621f12d10ccSJunchao Zhang #define MPI_Iscatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
622f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
623f12d10ccSJunchao Zhang 
624f12d10ccSJunchao Zhang #define MPI_Iscatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm,request) \
625f12d10ccSJunchao Zhang   ((petsc_scatter_ct++,0) || PetscMPITypeSize((recvcount),(recvtype),(&petsc_recv_len)) || MPI_Iscatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm),(request)))
626f12d10ccSJunchao Zhang 
627f12d10ccSJunchao Zhang /* We treat MPI_Ineighbor_alltoallv as a set of isend/irecv instead of a traditional MPI collective.
628f12d10ccSJunchao Zhang    OpenMPI-3.0 ran into error with outdegree = indegree = 0, so we use ((outdegree) || (indegree)) as a workaround.
629f12d10ccSJunchao Zhang  */
630f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
631f12d10ccSJunchao 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))))
632f12d10ccSJunchao Zhang 
633f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
634f12d10ccSJunchao 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))))
63501faf4e4SMatthew Knepley 
6360d4b0b6cSBarry Smith #else
6370d4b0b6cSBarry Smith 
638457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \
639ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
6400d4b0b6cSBarry Smith 
641457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \
642ea1c87f7SJunchao Zhang   ((number) && MPI_Startall((number),(requests)))
6430d4b0b6cSBarry Smith 
644457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \
6455fa69175SJed Brown   (MPI_Start((requests)))
6460d4b0b6cSBarry Smith 
647f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
648f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
649f12d10ccSJunchao Zhang 
650f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
651f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
652c9b973beSBarry Smith #endif /* !MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
653614700edSBarry Smith 
654df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
655614700edSBarry Smith 
656e3ed9ee7SBarry Smith #define PetscLogMemory                     PETSC_FALSE
657e3ed9ee7SBarry Smith 
658b0a32e0cSBarry Smith #define PetscLogFlops(n)                   0
659fa2bb9feSLisandro Dalcin #define PetscGetFlops(a)                   (*(a) = 0.0,0)
660614700edSBarry Smith 
661fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b)         0
662fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a)               0
663fa2bb9feSLisandro Dalcin #define PetscLogStagePop()                 0
664f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b)        0
665f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b)        0
666f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b)       0
667f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b)       0
668f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b)            (*(b)=0,0)
669f5d6ab90SLisandro Dalcin 
670fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c)       0
671fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b)    0
672fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a)       0
673fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a)       0
674b0a32e0cSBarry Smith #define PetscLogEventActivate(a)           0
675b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a)         0
676*c00cb57fSBarry Smith #define PetscLogEventDeactivatePush(a)     0
677*c00cb57fSBarry Smith #define PetscLogEventDeactivatePop(a)      0
678b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)      0
679b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a)    0
680e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)     0
68146eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)            (*(b)=0,0)
682561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c)    0
6839c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c)         0
6849c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)       0
68577c4ece6SBarry Smith 
6868b5db460SBarry Smith #define PetscLogPLB                        0
6878b5db460SBarry Smith #define PetscLogPLE                        0
6888b5db460SBarry Smith #define PetscLogPHC                        0
6898b5db460SBarry Smith #define PetscLogPHD                        0
690f5d6ab90SLisandro Dalcin 
691efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)       0
69252e6d16bSBarry Smith #define PetscLogObjectCreate(h)            0
69352e6d16bSBarry Smith #define PetscLogObjectDestroy(h)           0
694fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...);
695fa2bb9feSLisandro Dalcin 
696bb1d7374SBarry Smith #define PetscLogDefaultBegin()             0
697b0a32e0cSBarry Smith #define PetscLogAllBegin()                 0
698bb1d7374SBarry Smith #define PetscLogNestedBegin()              0
699fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file)           0
70073fda44aSBarry Smith #define PetscLogActions(a)                 0
701fa2bb9feSLisandro Dalcin #define PetscLogObjects(a)                 0
702fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b)          0
703fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le)                 0
704fa2bb9feSLisandro Dalcin 
705fa2bb9feSLisandro Dalcin #define PetscLogView(viewer)               0
706fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions()          0
707fa2bb9feSLisandro Dalcin #define PetscLogDump(c)                    0
708fa2bb9feSLisandro Dalcin 
70962872c28SLisandro Dalcin #define PetscLogEventSync(e,comm)          0
710fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4)  0
711fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4)    0
712ce6058e1SBarry Smith 
713091bc5acSJunchao Zhang #if defined(PETSC_HAVE_DEVICE)
7148157aad8SJunchao Zhang #define PetscLogCpuToGpu(a)                0
7158157aad8SJunchao Zhang #define PetscLogGpuToCpu(a)                0
7168157aad8SJunchao Zhang #define PetscLogGpuFlops(a)                0
7178157aad8SJunchao Zhang #define PetscLogGpuTimeBegin()             0
7188157aad8SJunchao Zhang #define PetscLogGpuTimeEnd()               0
7198157aad8SJunchao Zhang #define PetscLogGpuTimeAdd(a)              0
7208df2f0b1SJunchao Zhang #endif
7218157aad8SJunchao Zhang 
722aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
723ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
724ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests))
725457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests)           MPI_Start(requests)
726f12d10ccSJunchao Zhang #define MPI_Start_ineighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm,request) \
727f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Ineighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm),(request)))
728f12d10ccSJunchao Zhang #define MPI_Start_neighbor_alltoallv(outdegree,indegree,sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
729f12d10ccSJunchao Zhang   (((outdegree) || (indegree)) && MPI_Neighbor_alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm)))
730f141ce34SMatthew Knepley 
731aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
7326daaf66cSBarry Smith 
733204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
734204a6943SJed Brown do {\
735204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
736204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
737166c7f25SBarry Smith   PetscLogStage  _stageNum;\
7388cbcd9ccSBarry Smith   PetscErrorCode _3_ierr; \
739c5929fdfSBarry Smith   _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \
740204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
741204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
742204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
743204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
7440298fd71SBarry Smith     _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\
745204a6943SJed Brown     if (PetscPreLoadIt>0) {\
7468e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
7478e58c17dSMatthew Knepley     } else {\
748a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
7498e58c17dSMatthew Knepley     }\
750204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\
7518e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
7528e58c17dSMatthew Knepley 
753204a6943SJed Brown #define PetscPreLoadEnd() \
754043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
755204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
756043328b6SSatish Balay   }\
757204a6943SJed Brown } while (0)
7588e58c17dSMatthew Knepley 
759204a6943SJed Brown #define PetscPreLoadStage(name) do {                                         \
760043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);                      \
761204a6943SJed Brown     if (PetscPreLoadIt>0) {                                                  \
7628e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);   \
7638e58c17dSMatthew Knepley     } else {                                                            \
764a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
7658e58c17dSMatthew Knepley     }                                                                   \
766204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \
767204a6943SJed Brown     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);            \
768204a6943SJed Brown   } while (0)
769e9fa29b7SSatish Balay 
770ad14c47eSJed Brown /* some vars for logging */
771ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
772ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
773ad14c47eSJed Brown 
77497bb86f7SLois Curfman McInnes #endif
775