xref: /petsc/include/petsclog.h (revision 5d68e14c6e3ff869ac6d1cb8e0b8267390fbf19a)
197bb86f7SLois Curfman McInnes /*
27588ac45SBarry Smith     Defines profile/logging in PETSc.
397bb86f7SLois Curfman McInnes */
497bb86f7SLois Curfman McInnes 
5b0a32e0cSBarry Smith #if !defined(__PetscLog_H)
6b0a32e0cSBarry Smith #define __PetscLog_H
7aaa7dc30SBarry Smith #include <petscsys.h>
8c8d78d4dSSatish Balay 
9b859824cSBarry Smith /*MC
10b859824cSBarry Smith     PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable)
11b859824cSBarry Smith      code.
12b859824cSBarry Smith 
13b859824cSBarry Smith     Level: intermediate
14b859824cSBarry Smith 
15b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage
16b859824cSBarry Smith M*/
17b859824cSBarry Smith typedef int PetscLogEvent;
18b859824cSBarry Smith 
19b859824cSBarry Smith /*MC
20b859824cSBarry Smith     PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging
21b859824cSBarry Smith 
22b859824cSBarry Smith     Level: intermediate
23b859824cSBarry Smith 
24522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent
25b859824cSBarry Smith M*/
26b859824cSBarry Smith typedef int PetscLogStage;
27b859824cSBarry Smith 
288ba1e511SMatthew Knepley #define PETSC_EVENT  1311311
29014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT;
3097bb86f7SLois Curfman McInnes 
3119b02663SBarry Smith /* Global flop counter */
32014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops;
33014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops;
3419b02663SBarry Smith 
35edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */
36014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],void*,const char[],...);
376cf91177SBarry Smith #if defined(PETSC_USE_INFO)
382714b66aSJed Brown #define PetscInfo(A,S)                       PetscInfo_Private(PETSC_FUNCTION_NAME,A,S)
392714b66aSJed Brown #define PetscInfo1(A,S,a1)                   PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1)
402714b66aSJed Brown #define PetscInfo2(A,S,a1,a2)                PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2)
412714b66aSJed Brown #define PetscInfo3(A,S,a1,a2,a3)             PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3)
422714b66aSJed Brown #define PetscInfo4(A,S,a1,a2,a3,a4)          PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4)
432714b66aSJed Brown #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5)
442714b66aSJed Brown #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6)
452714b66aSJed Brown #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6,a7)
4663ba0a88SBarry Smith #else
47ae15b995SBarry Smith #define PetscInfo(A,S)                       0
48ae15b995SBarry Smith #define PetscInfo1(A,S,a1)                   0
49ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2)                0
50ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3)             0
51ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4)          0
52ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5)       0
53ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6)    0
54ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0
5563ba0a88SBarry Smith #endif
56014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId);
57014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId);
58014dd563SJed Brown PETSC_EXTERN PetscBool PetscLogPrintInfo;  /* if true, indicates PetscInfo() is turned on */
59614700edSBarry Smith 
6031d06abdSBarry Smith /* We must make the following structures available to access the event
6131d06abdSBarry Smith      activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public
6231d06abdSBarry Smith      API and are not intended to be used by other parts of PETSc or by users.
63d49d4b11SBarry Smith 
6431d06abdSBarry Smith      The code that manipulates these structures is in src/sys/plog/utils.
6531d06abdSBarry Smith */
66aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack;
676a6a9b46SSatish Balay 
68c60ec953SBarry Smith /*
69aa213bdcSJed Brown     PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has
70c60ec953SBarry Smith        static information about it, the second collects statistics on how many objects of the class are created,
71c60ec953SBarry Smith        how much memory they use, etc.
72c60ec953SBarry Smith 
73aa213bdcSJed Brown     PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes.
74c60ec953SBarry Smith */
756a6a9b46SSatish Balay typedef struct  {
76c60ec953SBarry Smith   char           *name;   /* The class name */
77c60ec953SBarry Smith   PetscClassId   classid; /* The integer identifying this class */
78aa213bdcSJed Brown } PetscClassRegInfo;
796a6a9b46SSatish Balay 
806a6a9b46SSatish Balay typedef struct {
810700a824SBarry Smith   PetscClassId   id;           /* The integer identifying this class */
826a6a9b46SSatish Balay   int            creations;    /* The number of objects of this class created */
836a6a9b46SSatish Balay   int            destructions; /* The number of objects of this class destroyed */
846a6a9b46SSatish Balay   PetscLogDouble mem;          /* The total memory allocated by objects of this class */
856a6a9b46SSatish Balay   PetscLogDouble descMem;      /* The total memory allocated by descendents of these objects */
86aa213bdcSJed Brown } PetscClassPerfInfo;
876a6a9b46SSatish Balay 
88aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog;
89aa213bdcSJed Brown struct _n_PetscClassRegLog {
90c60ec953SBarry Smith   int               numClasses; /* The number of classes registered */
91c60ec953SBarry Smith   int               maxClasses; /* The maximum number of classes */
92aa213bdcSJed Brown   PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
93c60ec953SBarry Smith };
946a6a9b46SSatish Balay 
95aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog;
96aa213bdcSJed Brown struct _n_PetscClassPerfLog {
97c60ec953SBarry Smith   int                numClasses; /* The number of logging classes */
98c60ec953SBarry Smith   int                maxClasses; /* The maximum number of classes */
99aa213bdcSJed Brown   PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */
100c60ec953SBarry Smith };
101c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/
102c60ec953SBarry Smith /*
103aa213bdcSJed Brown     PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has
104c60ec953SBarry Smith        static information about it, the second collects statistics on how many times the event is used, how
105c60ec953SBarry Smith        much time it takes, etc.
106c60ec953SBarry Smith 
107aa213bdcSJed Brown     PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one
108c60ec953SBarry Smith       of these for each stage.
109c60ec953SBarry Smith 
110c60ec953SBarry Smith */
1116a6a9b46SSatish Balay typedef struct {
1126a6a9b46SSatish Balay   char         *name;         /* The name of this event */
113c60ec953SBarry Smith   PetscClassId classid;       /* The class the event is associated with */
1146a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE)
1156a6a9b46SSatish Balay   int          mpe_id_begin; /* MPE IDs that define the event */
1166a6a9b46SSatish Balay   int          mpe_id_end;
1176a6a9b46SSatish Balay #endif
118aa213bdcSJed Brown } PetscEventRegInfo;
1196a6a9b46SSatish Balay 
120c60ec953SBarry Smith typedef struct {
121c60ec953SBarry Smith   int            id;            /* The integer identifying this event */
122ace3abfcSBarry Smith   PetscBool      active;        /* The flag to activate logging */
123ace3abfcSBarry Smith   PetscBool      visible;       /* The flag to print info in summary */
124c60ec953SBarry Smith   int            depth;         /* The nesting depth of the event call */
125c60ec953SBarry Smith   int            count;         /* The number of times this event was executed */
126a42e5b54SMatthew G Knepley   PetscLogDouble flops, flops2,flopsTmp; /* The flops and flops^2 used in this event */
127a42e5b54SMatthew G Knepley   PetscLogDouble time, time2, timeTmp;   /* The time and time^2 taken for this event */
128*5d68e14cSMatthew G. Knepley   PetscLogDouble dof;           /* The number of degrees of freedom associated with this event */
129*5d68e14cSMatthew G. Knepley   PetscLogDouble errors[8];     /* The errors (user-defined) associated with this event */
130c60ec953SBarry Smith   PetscLogDouble numMessages;   /* The number of messages in this event */
131c60ec953SBarry Smith   PetscLogDouble messageLength; /* The total message lengths in this event */
132c60ec953SBarry Smith   PetscLogDouble numReductions; /* The number of reductions in this event */
133aa213bdcSJed Brown } PetscEventPerfInfo;
134c60ec953SBarry Smith 
135aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog;
136aa213bdcSJed Brown struct _n_PetscEventRegLog {
1376a6a9b46SSatish Balay   int               numEvents;  /* The number of registered events */
1386a6a9b46SSatish Balay   int               maxEvents;  /* The maximum number of events */
139aa213bdcSJed Brown   PetscEventRegInfo *eventInfo; /* The registration information for each event */
1406a6a9b46SSatish Balay };
1416a6a9b46SSatish Balay 
142aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog;
143aa213bdcSJed Brown struct _n_PetscEventPerfLog {
1446a6a9b46SSatish Balay   int                numEvents;  /* The number of logging events */
1456a6a9b46SSatish Balay   int                maxEvents;  /* The maximum number of events */
146aa213bdcSJed Brown   PetscEventPerfInfo *eventInfo; /* The performance information for each event */
1476a6a9b46SSatish Balay };
148c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/
149c60ec953SBarry Smith /*
150aa213bdcSJed Brown    PetscStageInfo - Contains all the information about a particular stage.
1516a6a9b46SSatish Balay 
152aa213bdcSJed Brown    PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code.
153c60ec953SBarry Smith */
154aa213bdcSJed Brown typedef struct _PetscStageInfo {
1556a6a9b46SSatish Balay   char               *name;     /* The stage name */
156ace3abfcSBarry Smith   PetscBool          used;      /* The stage was pushed on this processor */
157aa213bdcSJed Brown   PetscEventPerfInfo perfInfo;  /* The stage performance information */
158aa213bdcSJed Brown   PetscEventPerfLog  eventLog;  /* The event information for this stage */
159aa213bdcSJed Brown   PetscClassPerfLog  classLog;  /* The class information for this stage */
160aa213bdcSJed Brown } PetscStageInfo;
1616a6a9b46SSatish Balay 
162aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog;
163aa213bdcSJed Brown struct _n_PetscStageLog {
1646a6a9b46SSatish Balay   int              numStages;   /* The number of registered stages */
1656a6a9b46SSatish Balay   int              maxStages;   /* The maximum number of stages */
166aa213bdcSJed Brown   PetscIntStack    stack;       /* The stack for active stages */
167aa213bdcSJed Brown   int              curStage;    /* The current stage (only used in macros so we don't call PetscIntStackTop) */
168aa213bdcSJed Brown   PetscStageInfo   *stageInfo;  /* The information for each stage */
169aa213bdcSJed Brown   PetscEventRegLog eventLog;    /* The registered events */
170aa213bdcSJed Brown   PetscClassRegLog classLog;    /* The registered classes */
1716a6a9b46SSatish Balay };
1726a6a9b46SSatish Balay 
173fee518ebSJed Brown PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*);
174fee518ebSJed Brown PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*);
175fee518ebSJed Brown PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*);
176fee518ebSJed Brown 
1773bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectParent(PetscObject,PetscObject);
1783bb1ff40SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogObjectMemory(PetscObject,PetscLogDouble);
1793bb1ff40SBarry Smith 
180aa482453SBarry Smith #if defined(PETSC_USE_LOG)  /* --- Logging is turned on --------------------------------*/
181aeeda9f6SJohn Fettig PETSC_EXTERN PetscStageLog petsc_stageLog;
182614700edSBarry Smith 
183da63de55SLois Curfman McInnes /*
184da63de55SLois Curfman McInnes    Flop counting:  We count each arithmetic operation (e.g., addition, multiplication) separately.
185da63de55SLois Curfman McInnes 
186da63de55SLois Curfman McInnes    For the complex numbers version, note that
187da63de55SLois Curfman McInnes        1 complex addition = 2 flops
188da63de55SLois Curfman McInnes        1 complex multiplication = 6 flops,
189da63de55SLois Curfman McInnes    where we define 1 flop as that for a double precision scalar.  We roughly approximate
190da63de55SLois Curfman McInnes    flop counting for complex numbers by multiplying the total flops by 4; this corresponds
191da63de55SLois Curfman McInnes    to the assumption that we're counting mostly additions and multiplications -- and
192da63de55SLois Curfman McInnes    roughly the same number of each.  More accurate counting could be done by distinguishing
193da63de55SLois Curfman McInnes    among the various arithmetic operations.
194da63de55SLois Curfman McInnes  */
195da63de55SLois Curfman McInnes 
196aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
197542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0
198da63de55SLois Curfman McInnes #else
199542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0
200bf3909cdSBarry Smith #endif
201bf3909cdSBarry Smith 
202dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n)
203dd19b90bSBarry Smith {
204dd19b90bSBarry Smith   PetscFunctionBegin;
205bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG)
206dd19b90bSBarry Smith   if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops");
207da63de55SLois Curfman McInnes #endif
208dd19b90bSBarry Smith   petsc_TotalFlops += PETSC_FLOPS_PER_OP*n;
209dd19b90bSBarry Smith   PetscFunctionReturn(0);
210dd19b90bSBarry Smith }
21177c4ece6SBarry Smith 
212aa482453SBarry Smith #if defined (PETSC_HAVE_MPE)
213014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void);
214014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]);
21577c4ece6SBarry Smith #endif
21677c4ece6SBarry Smith 
217014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
218014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject);
219014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject);
220014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject);
22177c4ece6SBarry Smith 
2223bb1ff40SBarry Smith #define PetscLogObjectParents(p,n,d)  0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent((PetscObject)p,(PetscObject)(d)[_i]);CHKERRQ(ierr);}}
2238b5db460SBarry Smith #define PetscLogObjectCreate(h)      ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)h) : 0)
2248b5db460SBarry Smith #define PetscLogObjectDestroy(h)     ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)h) : 0)
2258ba1e511SMatthew Knepley /* Initialization functions */
226bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void);
227014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void);
228bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void);
229014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *);
230014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool);
231014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool);
2328ba1e511SMatthew Knepley /* General functions */
233014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDestroy(void);
234014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject),
2356849ba73SBarry Smith                                    PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject));
236014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...);
2378ba1e511SMatthew Knepley /* Output functions */
238014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer);
239f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void);
240014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]);
24131d06abdSBarry Smith 
242014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *);
24331d06abdSBarry Smith 
244014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*);
245014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage);
246014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void);
247014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage, PetscBool );
248014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage, PetscBool  *);
249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage, PetscBool );
250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage, PetscBool  *);
251014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char [], PetscLogStage *);
2528ba1e511SMatthew Knepley /* Event functions */
253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[], PetscClassId,PetscLogEvent*);
254014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent);
255014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent);
256014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent, PetscBool );
257014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId);
258014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId);
2598c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*);
26013230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int, PetscLogEvent, PetscEventPerfInfo *);
261*5d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscLogDouble);
262*5d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble);
2638ba1e511SMatthew Knepley 
2648ba1e511SMatthew Knepley /* Global counters */
265014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct;
266014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct;
267014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct;
268014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct;
269014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len;
270014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len;
271014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len;
272014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len;
273014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct;
274014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct;
275014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct;
276014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct;
277014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct;
278014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct;
279014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct;
2808ba1e511SMatthew Knepley 
28152e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \
2828b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active &&  petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
28352e6d16bSBarry Smith     (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \
28452e6d16bSBarry Smith    PetscLogEventBegin((e)+1,o1,o2,o3,o4))
28577c4ece6SBarry Smith 
28652e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \
2878b5db460SBarry Smith   (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
288495fc317SBarry Smith     (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ))
289043328b6SSatish Balay 
290b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4)
291043328b6SSatish Balay 
29252e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \
2938b5db460SBarry Smith   (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \
294495fc317SBarry Smith     (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ))
29577c4ece6SBarry Smith 
296014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble*);
297014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent);
298003131ecSBarry Smith 
299ce85283eSBarry Smith /*
300f621e05eSBarry Smith      These are used internally in the PETSc routines to keep a count of MPI messages and
301f621e05eSBarry Smith    their sizes.
302f621e05eSBarry Smith 
303af0996ceSBarry Smith      This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file
304ce85283eSBarry Smith    uses macros to defined the MPI operations.
30515308354SBarry Smith 
30615308354SBarry Smith      It does not work correctly from HP-UX because it processes the
307bb4af37aSBarry Smith    macros in a way that sometimes it double counts, hence
308b6410449SSatish Balay    PETSC_HAVE_BROKEN_RECURSIVE_MACRO
3097c1e34a4SSatish Balay 
310f569fd43SBarry Smith      It does not work with Windows because winmpich lacks MPI_Type_size()
311ce85283eSBarry Smith */
312c8217ed5SSatish Balay #if !defined(__MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE)
31377a39924SBarry Smith /*
31477a39924SBarry Smith    Logging of MPI activities
31577a39924SBarry Smith */
316ad39c06fSJed Brown PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscLogDouble *buff,PetscMPIInt count,MPI_Datatype type)
317f95db71bSBarry Smith {
3187d30fa4aSBarry Smith   PetscMPIInt mysize;
3199c72ff1eSSatish Balay   PetscErrorCode _myierr;
3207d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
3219c72ff1eSSatish Balay   _myierr = MPI_Type_size(type,&mysize);CHKERRQ(_myierr);
3229c72ff1eSSatish Balay   *buff += (PetscLogDouble) (count*mysize);
3239c72ff1eSSatish Balay   return 0;
324f95db71bSBarry Smith }
32577a39924SBarry Smith 
326ad39c06fSJed Brown PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, PetscLogDouble *buff,PetscMPIInt *counts,MPI_Datatype type)
3273b9284c0SMatthew G Knepley {
3283b9284c0SMatthew G Knepley   PetscMPIInt mysize, commsize, p;
3293b9284c0SMatthew G Knepley   PetscErrorCode _myierr;
3303b9284c0SMatthew G Knepley 
3317d30fa4aSBarry Smith   if (type == MPI_DATATYPE_NULL) return 0;
3323b9284c0SMatthew G Knepley   _myierr = MPI_Comm_size(comm,&commsize);CHKERRQ(_myierr);
3333b9284c0SMatthew G Knepley   _myierr = MPI_Type_size(type,&mysize);CHKERRQ(_myierr);
3343b9284c0SMatthew G Knepley   for (p = 0; p < commsize; ++p) {
3353b9284c0SMatthew G Knepley     *buff += (PetscLogDouble) (counts[p]*mysize);
3363b9284c0SMatthew G Knepley   }
3373b9284c0SMatthew G Knepley   return 0;
3383b9284c0SMatthew G Knepley }
3393b9284c0SMatthew G Knepley 
34072b11a25SBarry Smith /*
34172b11a25SBarry Smith     Returns 1 if the communicator is parallel else zero
34272b11a25SBarry Smith */
34372b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm)
34472b11a25SBarry Smith {
34572b11a25SBarry Smith   PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1;
34672b11a25SBarry Smith }
34772b11a25SBarry Smith 
34877a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \
349ad39c06fSJed Brown  ((petsc_irecv_ct++,0) || PetscMPITypeSize(&petsc_irecv_len,count,datatype) || MPI_Irecv(buf,count,datatype,source,tag,comm,request))
35015308354SBarry Smith 
35177a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \
352ad39c06fSJed Brown  ((petsc_isend_ct++,0) || PetscMPITypeSize(&petsc_isend_len,count,datatype) || MPI_Isend(buf,count,datatype,dest,tag,comm,request))
35315308354SBarry Smith 
3540d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
355ad39c06fSJed Brown  ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize(&petsc_irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3560d4b0b6cSBarry Smith 
3570d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
358ad39c06fSJed Brown  ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize(&petsc_isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests))
3590d4b0b6cSBarry Smith 
3600d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
361ad39c06fSJed Brown  ((petsc_isend_ct++,0) || PetscMPITypeSize(&petsc_isend_len,count,MPIU_SCALAR) || MPI_Start(requests))
3620d4b0b6cSBarry Smith 
363ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \
364ad39c06fSJed Brown  ((petsc_recv_ct++,0) || PetscMPITypeSize(&petsc_recv_len,count,datatype) || MPI_Recv(buf,count,datatype,source,tag,comm,status))
36515308354SBarry Smith 
36677a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \
367ad39c06fSJed Brown  ((petsc_send_ct++,0) || PetscMPITypeSize(&petsc_send_len,count,datatype) || MPI_Send(buf,count,datatype,dest,tag,comm))
36877a39924SBarry Smith 
36977a39924SBarry Smith #define MPI_Wait(request,status) \
370ad39c06fSJed Brown  ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait(request,status))
37177a39924SBarry Smith 
37277a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \
373ad39c06fSJed Brown  ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d))
37477a39924SBarry Smith 
37577a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \
376ad39c06fSJed Brown  ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall(count,array_of_requests,array_of_statuses))
37777a39924SBarry Smith 
37877a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \
37972b11a25SBarry Smith   ((petsc_allreduce_ct += PetscMPIParallelComm(comm),0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm))
3803914022bSBarry Smith 
38154fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \
38254fe5c21SBarry Smith   ((petsc_allreduce_ct += PetscMPIParallelComm(comm),0) || MPI_Bcast(buffer,count,datatype,root,comm))
38354fe5c21SBarry Smith 
384d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \
38576f543a4SJed Brown   ((petsc_allreduce_ct += PetscMPIParallelComm(comm),0) || MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm))
386d6e4c47cSJed Brown 
3873b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
38872b11a25SBarry Smith  ((petsc_allreduce_ct += PetscMPIParallelComm(comm),0) || PetscMPITypeSize(&petsc_send_len,sendcount,sendtype) || MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm))
3893b9284c0SMatthew G Knepley 
3903b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \
39172b11a25SBarry Smith  ((petsc_allreduce_ct += PetscMPIParallelComm(comm),0) || PetscMPITypeSizeComm(comm,&petsc_send_len,sendcnts,sendtype) || MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm))
3923b9284c0SMatthew G Knepley 
39301faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \
39472b11a25SBarry Smith  ((petsc_gather_ct += PetscMPIParallelComm(comm),0) || MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm))
39501faf4e4SMatthew Knepley 
39601faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \
39772b11a25SBarry Smith  ((petsc_gather_ct += PetscMPIParallelComm(comm),0) || MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm))
39801faf4e4SMatthew Knepley 
39901faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
400ad39c06fSJed Brown  ((petsc_gather_ct++,0) || PetscMPITypeSize(&petsc_send_len,sendcount,sendtype) || MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm))
40101faf4e4SMatthew Knepley 
40201faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \
403ad39c06fSJed Brown  ((petsc_gather_ct++,0) || PetscMPITypeSize(&petsc_send_len,sendcount,sendtype) || MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm))
40401faf4e4SMatthew Knepley 
40501faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \
406ad39c06fSJed Brown  ((petsc_scatter_ct++,0) || PetscMPITypeSize(&petsc_recv_len,recvcount,recvtype) || MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm))
40701faf4e4SMatthew Knepley 
40801faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \
409ad39c06fSJed Brown   ((petsc_scatter_ct++,0) || PetscMPITypeSize(&petsc_recv_len,recvcount,recvtype) || MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm))
41001faf4e4SMatthew Knepley 
4110d4b0b6cSBarry Smith #else
4120d4b0b6cSBarry Smith 
4130d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \
4145e3723c6SSatish Balay  (MPI_Startall(number,requests))
4150d4b0b6cSBarry Smith 
4160d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \
4175e3723c6SSatish Balay  (MPI_Startall(number,requests))
4180d4b0b6cSBarry Smith 
4190d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \
4205e3723c6SSatish Balay  (MPI_Start(requests))
4210d4b0b6cSBarry Smith 
422c8217ed5SSatish Balay #endif /* !__MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */
423614700edSBarry Smith 
424df8cf0b5SBarry Smith #else  /* ---Logging is turned off --------------------------------------------*/
425614700edSBarry Smith 
426b0a32e0cSBarry Smith #define PetscLogFlops(n) 0
427*5d68e14cSMatthew G. Knepley #define PetscLogDof(n) 0
428*5d68e14cSMatthew G. Knepley #define PetscLogError(n) 0
429614700edSBarry Smith 
430b0a32e0cSBarry Smith #define PetscLogEventActivate(a)   0
431b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0
432614700edSBarry Smith 
433b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a)   0
434b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0
435e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b)  0
43646eb3cd7SSatish Balay #define PetscLogEventGetId(a,b)         (*(b)=0,0)
437561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c) 0
438*5d68e14cSMatthew G. Knepley #define PetscLogEventSetDof(a,c)        0
439*5d68e14cSMatthew G. Knepley #define PetscLogEventSetError(a,b,c)    0
44077c4ece6SBarry Smith 
4418b5db460SBarry Smith #define PetscLogPLB                        0
4428b5db460SBarry Smith #define PetscLogPLE                        0
4438b5db460SBarry Smith #define PetscLogPHC                        0
4448b5db460SBarry Smith #define PetscLogPHD                        0
44599de4ba8SSatish Balay #define PetscGetFlops(a)                (*(a) = 0.0,0)
446b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4)   0
447b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4)     0
448b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0
449b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm)   0
450efee365bSSatish Balay #define PetscLogObjectParents(p,n,c)        0
45152e6d16bSBarry Smith #define PetscLogObjectCreate(h)             0
45252e6d16bSBarry Smith #define PetscLogObjectDestroy(h)            0
453b0a32e0cSBarry Smith #define PetscLogDestroy()                   0
454b0a32e0cSBarry Smith #define PetscLogStagePush(a)                0
455b0a32e0cSBarry Smith #define PetscLogStagePop()                  0
456b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b)          0
457b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg)           0
45891eabc43SBarry Smith #define PetscLogView(viewer)                0
459f14045dbSBarry Smith #define PetscLogViewFromOptions()           0
460bb1d7374SBarry Smith #define PetscLogDefaultBegin()                     0
461b0a32e0cSBarry Smith #define PetscLogTraceBegin(file)            0
462b0a32e0cSBarry Smith #define PetscLogSet(lb,le)                  0
463b0a32e0cSBarry Smith #define PetscLogAllBegin()                  0
464bb1d7374SBarry Smith #define PetscLogNestedBegin()               0
465b0a32e0cSBarry Smith #define PetscLogDump(c)                     0
466043328b6SSatish Balay #define PetscLogEventRegister(a,b,c)        0
46773fda44aSBarry Smith #define PetscLogObjects(a)                  0
46873fda44aSBarry Smith #define PetscLogActions(a)                  0
469014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...);
470ce6058e1SBarry Smith 
471aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */
472ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests)
473ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests)
474ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests)
475fad68dfaSSatish Balay #define PetscLogStageGetId(a,b)                      (*(b)=0,0)
476fad68dfaSSatish Balay #define PetscLogStageSetActive(a,b)                  0
4776a6a9b46SSatish Balay #define PetscLogStageGetActive(a,b)                  0
4786a6a9b46SSatish Balay #define PetscLogStageGetVisible(a,b)                 0
4796a6a9b46SSatish Balay #define PetscLogStageSetVisible(a,b)                 0
480f141ce34SMatthew Knepley 
481aa482453SBarry Smith #endif   /* PETSC_USE_LOG */
4826daaf66cSBarry Smith 
483014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntStackCreate(PetscIntStack *);
484014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntStackDestroy(PetscIntStack);
485014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntStackPush(PetscIntStack, int);
486014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntStackPop(PetscIntStack, int *);
487014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntStackTop(PetscIntStack, int *);
488014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscIntStackEmpty(PetscIntStack, PetscBool  *);
489fcfd50ebSBarry Smith 
490204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \
491204a6943SJed Brown do {\
492204a6943SJed Brown   PetscBool      PetscPreLoading = flag;\
493204a6943SJed Brown   int            PetscPreLoadMax,PetscPreLoadIt;\
494166c7f25SBarry Smith   PetscLogStage  _stageNum;\
4958cbcd9ccSBarry Smith   PetscErrorCode _3_ierr; \
496c5929fdfSBarry Smith   _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \
497204a6943SJed Brown   PetscPreLoadMax = (int)(PetscPreLoading);\
498204a6943SJed Brown   PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\
499204a6943SJed Brown   for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\
500204a6943SJed Brown     PetscPreLoadingOn = PetscPreLoading;\
5010298fd71SBarry Smith     _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\
502204a6943SJed Brown     if (PetscPreLoadIt>0) {\
5038e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\
5048e58c17dSMatthew Knepley     } else {\
505a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
5068e58c17dSMatthew Knepley     }\
507204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\
5088e58c17dSMatthew Knepley     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);
5098e58c17dSMatthew Knepley 
510204a6943SJed Brown #define PetscPreLoadEnd() \
511043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\
512204a6943SJed Brown     PetscPreLoading = PETSC_FALSE;\
513043328b6SSatish Balay   }\
514204a6943SJed Brown } while (0)
5158e58c17dSMatthew Knepley 
516204a6943SJed Brown #define PetscPreLoadStage(name) do {                                         \
517043328b6SSatish Balay     _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);                      \
518204a6943SJed Brown     if (PetscPreLoadIt>0) {                                                  \
5198e58c17dSMatthew Knepley       _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);   \
5208e58c17dSMatthew Knepley     } else {                                                            \
521a3bc4eb9SBarry Smith       _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \
5228e58c17dSMatthew Knepley     }                                                                   \
523204a6943SJed Brown     _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \
524204a6943SJed Brown     _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr);            \
525204a6943SJed Brown   } while (0)
526e9fa29b7SSatish Balay 
527ad14c47eSJed Brown /* some vars for logging */
528ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed;       /* true if we are or have done preloading */
529ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn;         /* true if we are currently in a preloading calculation */
530ad14c47eSJed Brown 
53197bb86f7SLois Curfman McInnes #endif
532