197bb86f7SLois Curfman McInnes /* 27588ac45SBarry Smith Defines profile/logging in PETSc. 397bb86f7SLois Curfman McInnes */ 497bb86f7SLois Curfman McInnes 5*26bd1501SBarry Smith #if !defined(PETSCLOG_H) 6*26bd1501SBarry Smith #define PETSCLOG_H 7aaa7dc30SBarry Smith #include <petscsys.h> 8c8d78d4dSSatish Balay 9fa2bb9feSLisandro Dalcin /* General logging of information; different from event logging */ 10fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfo_Private(const char[],void*,const char[],...); 11fa2bb9feSLisandro Dalcin #if defined(PETSC_USE_INFO) 12fa2bb9feSLisandro Dalcin #define PetscInfo(A,S) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S) 13fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1) 14fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2) 15fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3) 16fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4) 17fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5) 18fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6) 19fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(PETSC_FUNCTION_NAME,A,S,a1,a2,a3,a4,a5,a6,a7) 20fa2bb9feSLisandro Dalcin #else 21fa2bb9feSLisandro Dalcin #define PetscInfo(A,S) 0 22fa2bb9feSLisandro Dalcin #define PetscInfo1(A,S,a1) 0 23fa2bb9feSLisandro Dalcin #define PetscInfo2(A,S,a1,a2) 0 24fa2bb9feSLisandro Dalcin #define PetscInfo3(A,S,a1,a2,a3) 0 25fa2bb9feSLisandro Dalcin #define PetscInfo4(A,S,a1,a2,a3,a4) 0 26fa2bb9feSLisandro Dalcin #define PetscInfo5(A,S,a1,a2,a3,a4,a5) 0 27fa2bb9feSLisandro Dalcin #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) 0 28fa2bb9feSLisandro Dalcin #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0 29fa2bb9feSLisandro Dalcin #endif 30fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoDeactivateClass(PetscClassId); 31fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscInfoActivateClass(PetscClassId); 32fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 33fa2bb9feSLisandro Dalcin 34b859824cSBarry Smith /*MC 35b859824cSBarry Smith PetscLogEvent - id used to identify PETSc or user events which timed portions (blocks of executable) 36b859824cSBarry Smith code. 37b859824cSBarry Smith 38b859824cSBarry Smith Level: intermediate 39b859824cSBarry Smith 40b859824cSBarry Smith .seealso: PetscLogEventRegister(), PetscLogEventBegin(), PetscLogEventEnd(), PetscLogStage 41b859824cSBarry Smith M*/ 42b859824cSBarry Smith typedef int PetscLogEvent; 43b859824cSBarry Smith 44b859824cSBarry Smith /*MC 45b859824cSBarry Smith PetscLogStage - id used to identify user stages (phases, sections) of runs - for logging 46b859824cSBarry Smith 47b859824cSBarry Smith Level: intermediate 48b859824cSBarry Smith 49522ce795SJed Brown .seealso: PetscLogStageRegister(), PetscLogStagePush(), PetscLogStagePop(), PetscLogEvent 50b859824cSBarry Smith M*/ 51b859824cSBarry Smith typedef int PetscLogStage; 52b859824cSBarry Smith 538ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 54014dd563SJed Brown PETSC_EXTERN PetscLogEvent PETSC_LARGEST_EVENT; 5597bb86f7SLois Curfman McInnes 5619b02663SBarry Smith /* Global flop counter */ 57014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_TotalFlops; 58014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_tmp_flops; 5919b02663SBarry Smith 6031d06abdSBarry Smith /* We must make the following structures available to access the event 6131d06abdSBarry Smith activation flags in the PetscLogEventBegin/End() macros. These are not part of the PETSc public 6231d06abdSBarry Smith API and are not intended to be used by other parts of PETSc or by users. 63d49d4b11SBarry Smith 64fa2bb9feSLisandro Dalcin The code that manipulates these structures is in src/sys/logging/utils. 6531d06abdSBarry Smith */ 66aa213bdcSJed Brown typedef struct _n_PetscIntStack *PetscIntStack; 676a6a9b46SSatish Balay 68217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 69c60ec953SBarry Smith /* 70aa213bdcSJed Brown PetscClassRegInfo, PetscClassPerfInfo - Each class has two data structures associated with it. The first has 71c60ec953SBarry Smith static information about it, the second collects statistics on how many objects of the class are created, 72c60ec953SBarry Smith how much memory they use, etc. 73c60ec953SBarry Smith 74aa213bdcSJed Brown PetscClassRegLog, PetscClassPerfLog - arrays of the PetscClassRegInfo and PetscClassPerfInfo for all classes. 75c60ec953SBarry Smith */ 766a6a9b46SSatish Balay typedef struct { 77c60ec953SBarry Smith char *name; /* The class name */ 78c60ec953SBarry Smith PetscClassId classid; /* The integer identifying this class */ 79aa213bdcSJed Brown } PetscClassRegInfo; 806a6a9b46SSatish Balay 816a6a9b46SSatish Balay typedef struct { 820700a824SBarry Smith PetscClassId id; /* The integer identifying this class */ 836a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 846a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 856a6a9b46SSatish Balay PetscLogDouble mem; /* The total memory allocated by objects of this class */ 866a6a9b46SSatish Balay PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 87aa213bdcSJed Brown } PetscClassPerfInfo; 886a6a9b46SSatish Balay 89aa213bdcSJed Brown typedef struct _n_PetscClassRegLog *PetscClassRegLog; 90aa213bdcSJed Brown struct _n_PetscClassRegLog { 91c60ec953SBarry Smith int numClasses; /* The number of classes registered */ 92c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 93aa213bdcSJed Brown PetscClassRegInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 94c60ec953SBarry Smith }; 956a6a9b46SSatish Balay 96aa213bdcSJed Brown typedef struct _n_PetscClassPerfLog *PetscClassPerfLog; 97aa213bdcSJed Brown struct _n_PetscClassPerfLog { 98c60ec953SBarry Smith int numClasses; /* The number of logging classes */ 99c60ec953SBarry Smith int maxClasses; /* The maximum number of classes */ 100aa213bdcSJed Brown PetscClassPerfInfo *classInfo; /* The structure for class information (classids are monotonicly increasing) */ 101c60ec953SBarry Smith }; 102c60ec953SBarry Smith /* -----------------------------------------------------------------------------------------------------*/ 103c60ec953SBarry Smith /* 104aa213bdcSJed Brown PetscEventRegInfo, PetscEventPerfInfo - Each event has two data structures associated with it. The first has 105c60ec953SBarry Smith static information about it, the second collects statistics on how many times the event is used, how 106c60ec953SBarry Smith much time it takes, etc. 107c60ec953SBarry Smith 108aa213bdcSJed Brown PetscEventRegLog, PetscEventPerfLog - an array of all PetscEventRegInfo and PetscEventPerfInfo for all events. There is one 109c60ec953SBarry Smith of these for each stage. 110c60ec953SBarry Smith 111c60ec953SBarry Smith */ 1126a6a9b46SSatish Balay typedef struct { 1136a6a9b46SSatish Balay char *name; /* The name of this event */ 114c60ec953SBarry Smith PetscClassId classid; /* The class the event is associated with */ 115217044c2SLisandro Dalcin PetscBool collective; /* Flag this event as collective */ 1166a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE) 1176a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1186a6a9b46SSatish Balay int mpe_id_end; 1196a6a9b46SSatish Balay #endif 120aa213bdcSJed Brown } PetscEventRegInfo; 1216a6a9b46SSatish Balay 122c60ec953SBarry Smith typedef struct { 123c60ec953SBarry Smith int id; /* The integer identifying this event */ 124ace3abfcSBarry Smith PetscBool active; /* The flag to activate logging */ 125ace3abfcSBarry Smith PetscBool visible; /* The flag to print info in summary */ 126c60ec953SBarry Smith int depth; /* The nesting depth of the event call */ 127c60ec953SBarry Smith int count; /* The number of times this event was executed */ 128a42e5b54SMatthew G Knepley PetscLogDouble flops, flops2, flopsTmp; /* The flops and flops^2 used in this event */ 129a42e5b54SMatthew G Knepley PetscLogDouble time, time2, timeTmp; /* The time and time^2 taken for this event */ 130217044c2SLisandro Dalcin PetscLogDouble syncTime; /* The synchronization barrier time */ 131891e75beSMatthew G. Knepley PetscLogDouble dof[8]; /* The number of degrees of freedom associated with this event */ 1325d68e14cSMatthew G. Knepley PetscLogDouble errors[8]; /* The errors (user-defined) associated with this event */ 133c60ec953SBarry Smith PetscLogDouble numMessages; /* The number of messages in this event */ 134c60ec953SBarry Smith PetscLogDouble messageLength; /* The total message lengths in this event */ 135c60ec953SBarry Smith PetscLogDouble numReductions; /* The number of reductions in this event */ 136aa213bdcSJed Brown } PetscEventPerfInfo; 137c60ec953SBarry Smith 138aa213bdcSJed Brown typedef struct _n_PetscEventRegLog *PetscEventRegLog; 139aa213bdcSJed Brown struct _n_PetscEventRegLog { 1406a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1416a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 142aa213bdcSJed Brown PetscEventRegInfo *eventInfo; /* The registration information for each event */ 1436a6a9b46SSatish Balay }; 1446a6a9b46SSatish Balay 145aa213bdcSJed Brown typedef struct _n_PetscEventPerfLog *PetscEventPerfLog; 146aa213bdcSJed Brown struct _n_PetscEventPerfLog { 1476a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1486a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 149aa213bdcSJed Brown PetscEventPerfInfo *eventInfo; /* The performance information for each event */ 1506a6a9b46SSatish Balay }; 151c60ec953SBarry Smith /* ------------------------------------------------------------------------------------------------------------*/ 152c60ec953SBarry Smith /* 153aa213bdcSJed Brown PetscStageInfo - Contains all the information about a particular stage. 1546a6a9b46SSatish Balay 155aa213bdcSJed Brown PetscStageLog - An array of PetscStageInfo for each registered stage. There is a single one of these in the code. 156c60ec953SBarry Smith */ 157aa213bdcSJed Brown typedef struct _PetscStageInfo { 1586a6a9b46SSatish Balay char *name; /* The stage name */ 159ace3abfcSBarry Smith PetscBool used; /* The stage was pushed on this processor */ 160aa213bdcSJed Brown PetscEventPerfInfo perfInfo; /* The stage performance information */ 161aa213bdcSJed Brown PetscEventPerfLog eventLog; /* The event information for this stage */ 162aa213bdcSJed Brown PetscClassPerfLog classLog; /* The class information for this stage */ 163aa213bdcSJed Brown } PetscStageInfo; 1646a6a9b46SSatish Balay 165aa213bdcSJed Brown typedef struct _n_PetscStageLog *PetscStageLog; 166aa213bdcSJed Brown struct _n_PetscStageLog { 1676a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 1686a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 169aa213bdcSJed Brown PetscIntStack stack; /* The stack for active stages */ 170aa213bdcSJed Brown int curStage; /* The current stage (only used in macros so we don't call PetscIntStackTop) */ 171aa213bdcSJed Brown PetscStageInfo *stageInfo; /* The information for each stage */ 172aa213bdcSJed Brown PetscEventRegLog eventLog; /* The registered events */ 173aa213bdcSJed Brown PetscClassRegLog classLog; /* The registered classes */ 1746a6a9b46SSatish Balay }; 175217044c2SLisandro Dalcin /* -----------------------------------------------------------------------------------------------------*/ 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; 182f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogGetStageLog(PetscStageLog*); 183f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetCurrent(PetscStageLog,int*); 184f5d6ab90SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscStageLogGetEventPerfLog(PetscStageLog,int,PetscEventPerfLog*); 185614700edSBarry Smith 186da63de55SLois Curfman McInnes /* 187da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 188da63de55SLois Curfman McInnes 189da63de55SLois Curfman McInnes For the complex numbers version, note that 190da63de55SLois Curfman McInnes 1 complex addition = 2 flops 191da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 192da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 193da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 194da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 195da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 196da63de55SLois Curfman McInnes among the various arithmetic operations. 197da63de55SLois Curfman McInnes */ 198da63de55SLois Curfman McInnes 199aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 200542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0 201da63de55SLois Curfman McInnes #else 202542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0 203bf3909cdSBarry Smith #endif 204bf3909cdSBarry Smith 205dd19b90bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode PetscLogFlops(PetscLogDouble n) 206dd19b90bSBarry Smith { 207dd19b90bSBarry Smith PetscFunctionBegin; 208bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG) 209dd19b90bSBarry Smith if (n < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Cannot log negative flops"); 210da63de55SLois Curfman McInnes #endif 211dd19b90bSBarry Smith petsc_TotalFlops += PETSC_FLOPS_PER_OP*n; 212dd19b90bSBarry Smith PetscFunctionReturn(0); 213dd19b90bSBarry Smith } 214fa2bb9feSLisandro Dalcin 215fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscGetFlops(PetscLogDouble *); 21677c4ece6SBarry Smith 217aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 218014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEBegin(void); 219014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogMPEDump(const char[]); 22077c4ece6SBarry Smith #endif 22177c4ece6SBarry Smith 222014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 223014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 224014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHC)(PetscObject); 225014dd563SJed Brown PETSC_EXTERN PetscErrorCode (*PetscLogPHD)(PetscObject); 22677c4ece6SBarry Smith 227fa2bb9feSLisandro Dalcin #define PetscLogObjectParents(p,n,d) 0;{int _i; for (_i=0; _i<(n); _i++) {ierr = PetscLogObjectParent((PetscObject)(p),(PetscObject)(d)[_i]);CHKERRQ(ierr);}} 228fa2bb9feSLisandro Dalcin #define PetscLogObjectCreate(h) ((PetscLogPHC) ? (*PetscLogPHC)((PetscObject)(h)) : 0) 229fa2bb9feSLisandro Dalcin #define PetscLogObjectDestroy(h) ((PetscLogPHD) ? (*PetscLogPHD)((PetscObject)(h)) : 0) 230fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject, const char[], ...); 231fa2bb9feSLisandro Dalcin 2328ba1e511SMatthew Knepley /* Initialization functions */ 233bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogDefaultBegin(void); 234014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogAllBegin(void); 235bb1d7374SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogNestedBegin(void); 236014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogTraceBegin(FILE *); 237014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogActions(PetscBool); 238014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogObjects(PetscBool); 239fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogSetThreshold(PetscLogDouble,PetscLogDouble*); 240014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 2416849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 242fa2bb9feSLisandro Dalcin 2438ba1e511SMatthew Knepley /* Output functions */ 244014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogView(PetscViewer); 245f14045dbSBarry Smith PETSC_EXTERN PetscErrorCode PetscLogViewFromOptions(void); 246014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogDump(const char[]); 24731d06abdSBarry Smith 248fa2bb9feSLisandro Dalcin /* Stage functions */ 249014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageRegister(const char[],PetscLogStage*); 250014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePush(PetscLogStage); 251014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStagePop(void); 252014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetActive(PetscLogStage,PetscBool); 253014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetActive(PetscLogStage,PetscBool*); 254014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageSetVisible(PetscLogStage,PetscBool); 255014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetVisible(PetscLogStage,PetscBool*); 256014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogStageGetId(const char[],PetscLogStage*); 257f5d6ab90SLisandro Dalcin 2588ba1e511SMatthew Knepley /* Event functions */ 259014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventRegister(const char[],PetscClassId,PetscLogEvent*); 260217044c2SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSetCollective(PetscLogEvent,PetscBool); 261fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventIncludeClass(PetscClassId); 262fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventExcludeClass(PetscClassId); 263014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivate(PetscLogEvent); 264014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivate(PetscLogEvent); 265014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventSetActiveAll(PetscLogEvent,PetscBool); 266014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventActivateClass(PetscClassId); 267014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventDeactivateClass(PetscClassId); 2688c49a8d9SBarry Smith PETSC_EXTERN PetscErrorCode PetscLogEventGetId(const char[],PetscLogEvent*); 26913230571SMichael Lange PETSC_EXTERN PetscErrorCode PetscLogEventGetPerfInfo(int,PetscLogEvent,PetscEventPerfInfo*); 270891e75beSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetDof(PetscLogEvent, PetscInt, PetscLogDouble); 2715d68e14cSMatthew G. Knepley PETSC_EXTERN PetscErrorCode PetscLogEventSetError(PetscLogEvent, PetscInt, PetscLogDouble); 2728ba1e511SMatthew Knepley 2738ba1e511SMatthew Knepley /* Global counters */ 274014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_ct; 275014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_ct; 276014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_ct; 277014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_ct; 278014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_irecv_len; 279014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_isend_len; 280014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_recv_len; 281014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_send_len; 282014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_allreduce_ct; 283014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_gather_ct; 284014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_scatter_ct; 285014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_ct; 286014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_any_ct; 287014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_wait_all_ct; 288014dd563SJed Brown PETSC_EXTERN PetscLogDouble petsc_sum_of_waits_ct; 2898ba1e511SMatthew Knepley 290fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscBool PetscLogSyncOn; /* true if logging synchronization is enabled */ 29162872c28SLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogEventSynchronize(PetscLogEvent, MPI_Comm); 29262872c28SLisandro Dalcin 29362872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) \ 29462872c28SLisandro Dalcin (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 29562872c28SLisandro Dalcin PetscLogEventSynchronize((e),(comm)) : 0 )) 29677c4ece6SBarry Smith 29752e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 2988b5db460SBarry Smith (((PetscLogPLB && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 299495fc317SBarry Smith (*PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 )) 300043328b6SSatish Balay 30152e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 3028b5db460SBarry Smith (((PetscLogPLE && petsc_stageLog->stageInfo[petsc_stageLog->curStage].perfInfo.active && petsc_stageLog->stageInfo[petsc_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 303495fc317SBarry Smith (*PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 )) 30477c4ece6SBarry Smith 305014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent,PetscLogDouble*); 306014dd563SJed Brown PETSC_EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 307003131ecSBarry Smith 308ce85283eSBarry Smith /* 309f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 310f621e05eSBarry Smith their sizes. 311f621e05eSBarry Smith 312af0996ceSBarry Smith This does not work for MPI-Uni because our include/petsc/mpiuni/mpi.h file 313ce85283eSBarry Smith uses macros to defined the MPI operations. 31415308354SBarry Smith 31515308354SBarry Smith It does not work correctly from HP-UX because it processes the 316bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 317b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 3187c1e34a4SSatish Balay 319f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 320ce85283eSBarry Smith */ 321c8217ed5SSatish Balay #if !defined(__MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 32277a39924SBarry Smith /* 32377a39924SBarry Smith Logging of MPI activities 32477a39924SBarry Smith */ 325ad39c06fSJed Brown PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSize(PetscLogDouble *buff,PetscMPIInt count,MPI_Datatype type) 326f95db71bSBarry Smith { 3277d30fa4aSBarry Smith PetscMPIInt mysize; 3289c72ff1eSSatish Balay PetscErrorCode _myierr; 3297d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 3309c72ff1eSSatish Balay _myierr = MPI_Type_size(type,&mysize);CHKERRQ(_myierr); 3319c72ff1eSSatish Balay *buff += (PetscLogDouble) (count*mysize); 3329c72ff1eSSatish Balay return 0; 333f95db71bSBarry Smith } 33477a39924SBarry Smith 335ad39c06fSJed Brown PETSC_STATIC_INLINE PetscErrorCode PetscMPITypeSizeComm(MPI_Comm comm, PetscLogDouble *buff,PetscMPIInt *counts,MPI_Datatype type) 3363b9284c0SMatthew G Knepley { 3373b9284c0SMatthew G Knepley PetscMPIInt mysize, commsize, p; 3383b9284c0SMatthew G Knepley PetscErrorCode _myierr; 3393b9284c0SMatthew G Knepley 3407d30fa4aSBarry Smith if (type == MPI_DATATYPE_NULL) return 0; 3413b9284c0SMatthew G Knepley _myierr = MPI_Comm_size(comm,&commsize);CHKERRQ(_myierr); 3423b9284c0SMatthew G Knepley _myierr = MPI_Type_size(type,&mysize);CHKERRQ(_myierr); 3433b9284c0SMatthew G Knepley for (p = 0; p < commsize; ++p) { 3443b9284c0SMatthew G Knepley *buff += (PetscLogDouble) (counts[p]*mysize); 3453b9284c0SMatthew G Knepley } 3463b9284c0SMatthew G Knepley return 0; 3473b9284c0SMatthew G Knepley } 3483b9284c0SMatthew G Knepley 34972b11a25SBarry Smith /* 35072b11a25SBarry Smith Returns 1 if the communicator is parallel else zero 35172b11a25SBarry Smith */ 35272b11a25SBarry Smith PETSC_STATIC_INLINE int PetscMPIParallelComm(MPI_Comm comm) 35372b11a25SBarry Smith { 35472b11a25SBarry Smith PetscMPIInt size; MPI_Comm_size(comm,&size); return size > 1; 35572b11a25SBarry Smith } 35672b11a25SBarry Smith 35777a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 3585fa69175SJed Brown ((petsc_irecv_ct++,0) || PetscMPITypeSize(&(petsc_irecv_len),(count),(datatype)) || MPI_Irecv((buf),(count),(datatype),(source),(tag),(comm),(request))) 35915308354SBarry Smith 36077a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 3615fa69175SJed Brown ((petsc_isend_ct++,0) || PetscMPITypeSize(&(petsc_isend_len),(count),(datatype)) || MPI_Isend((buf),(count),(datatype),(dest),(tag),(comm),(request))) 36215308354SBarry Smith 363457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 364ea1c87f7SJunchao Zhang ((petsc_irecv_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize(&(petsc_irecv_len),(count),(datatype)) || ((number) && MPI_Startall((number),(requests)))) 3650d4b0b6cSBarry Smith 366457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 367ea1c87f7SJunchao Zhang ((petsc_isend_ct += (PetscLogDouble)(number),0) || PetscMPITypeSize(&(petsc_isend_len),(count),(datatype)) || ((number) && MPI_Startall((number),(requests)))) 3680d4b0b6cSBarry Smith 369457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 370457b14b1SJunchao Zhang ((petsc_isend_ct++,0) || PetscMPITypeSize((&petsc_isend_len),(count),(datatype)) || MPI_Start((requests))) 3710d4b0b6cSBarry Smith 372ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 3735fa69175SJed Brown ((petsc_recv_ct++,0) || PetscMPITypeSize((&petsc_recv_len),(count),(datatype)) || MPI_Recv((buf),(count),(datatype),(source),(tag),(comm),(status))) 37415308354SBarry Smith 37577a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 3765fa69175SJed Brown ((petsc_send_ct++,0) || PetscMPITypeSize((&petsc_send_len),(count),(datatype)) || MPI_Send((buf),(count),(datatype),(dest),(tag),(comm))) 37777a39924SBarry Smith 37877a39924SBarry Smith #define MPI_Wait(request,status) \ 3795fa69175SJed Brown ((petsc_wait_ct++,petsc_sum_of_waits_ct++,0) || MPI_Wait((request),(status))) 38077a39924SBarry Smith 38177a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 3825fa69175SJed Brown ((petsc_wait_any_ct++,petsc_sum_of_waits_ct++,0) || MPI_Waitany((a),(b),(c),(d))) 38377a39924SBarry Smith 38477a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 3855fa69175SJed Brown ((petsc_wait_all_ct++,petsc_sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall((count),(array_of_requests),(array_of_statuses))) 38677a39924SBarry Smith 38777a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 3885fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Allreduce((sendbuf),(recvbuf),(count),(datatype),(op),(comm))) 3893914022bSBarry Smith 39054fe5c21SBarry Smith #define MPI_Bcast(buffer,count,datatype,root,comm) \ 3915fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Bcast((buffer),(count),(datatype),(root),(comm))) 39254fe5c21SBarry Smith 393d6e4c47cSJed Brown #define MPI_Reduce_scatter_block(sendbuf,recvbuf,recvcount,datatype,op,comm) \ 3945fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || MPI_Reduce_scatter_block((sendbuf),(recvbuf),(recvcount),(datatype),(op),(comm))) 395d6e4c47cSJed Brown 3963b9284c0SMatthew G Knepley #define MPI_Alltoall(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 3975fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSize((&petsc_send_len),(sendcount),(sendtype)) || MPI_Alltoall((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 3983b9284c0SMatthew G Knepley 3993b9284c0SMatthew G Knepley #define MPI_Alltoallv(sendbuf,sendcnts,sdispls,sendtype,recvbuf,recvcnts,rdispls,recvtype,comm) \ 4005fa69175SJed Brown ((petsc_allreduce_ct += PetscMPIParallelComm((comm)),0) || PetscMPITypeSizeComm((comm),(&petsc_send_len),(sendcnts),(sendtype)) || MPI_Alltoallv((sendbuf),(sendcnts),(sdispls),(sendtype),(recvbuf),(recvcnts),(rdispls),(recvtype),(comm))) 4013b9284c0SMatthew G Knepley 40201faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 4035fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(comm))) 40401faf4e4SMatthew Knepley 40501faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \ 4065fa69175SJed Brown ((petsc_gather_ct += PetscMPIParallelComm((comm)),0) || MPI_Allgatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(comm))) 40701faf4e4SMatthew Knepley 40801faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 4095fa69175SJed Brown ((petsc_gather_ct++,0) || PetscMPITypeSize((&petsc_send_len),(sendcount),(sendtype)) || MPI_Gather((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 41001faf4e4SMatthew Knepley 41101faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \ 4125fa69175SJed Brown ((petsc_gather_ct++,0) || PetscMPITypeSize((&petsc_send_len),(sendcount),(sendtype)) || MPI_Gatherv((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(displs),(recvtype),(root),(comm))) 41301faf4e4SMatthew Knepley 41401faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 4155fa69175SJed Brown ((petsc_scatter_ct++,0) || PetscMPITypeSize((&petsc_recv_len),(recvcount),(recvtype)) || MPI_Scatter((sendbuf),(sendcount),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 41601faf4e4SMatthew Knepley 41701faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 4185fa69175SJed Brown ((petsc_scatter_ct++,0) || PetscMPITypeSize((&petsc_recv_len),(recvcount),(recvtype)) || MPI_Scatterv((sendbuf),(sendcount),(displs),(sendtype),(recvbuf),(recvcount),(recvtype),(root),(comm))) 41901faf4e4SMatthew Knepley 4200d4b0b6cSBarry Smith #else 4210d4b0b6cSBarry Smith 422457b14b1SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) \ 423ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 4240d4b0b6cSBarry Smith 425457b14b1SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) \ 426ea1c87f7SJunchao Zhang ((number) && MPI_Startall((number),(requests))) 4270d4b0b6cSBarry Smith 428457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) \ 4295fa69175SJed Brown (MPI_Start((requests))) 4300d4b0b6cSBarry Smith 431c8217ed5SSatish Balay #endif /* !__MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 432614700edSBarry Smith 433df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 434614700edSBarry Smith 435b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 436fa2bb9feSLisandro Dalcin #define PetscGetFlops(a) (*(a) = 0.0,0) 437614700edSBarry Smith 438fa2bb9feSLisandro Dalcin #define PetscLogStageRegister(a,b) 0 439fa2bb9feSLisandro Dalcin #define PetscLogStagePush(a) 0 440fa2bb9feSLisandro Dalcin #define PetscLogStagePop() 0 441f5d6ab90SLisandro Dalcin #define PetscLogStageSetActive(a,b) 0 442f5d6ab90SLisandro Dalcin #define PetscLogStageGetActive(a,b) 0 443f5d6ab90SLisandro Dalcin #define PetscLogStageGetVisible(a,b) 0 444f5d6ab90SLisandro Dalcin #define PetscLogStageSetVisible(a,b) 0 445f5d6ab90SLisandro Dalcin #define PetscLogStageGetId(a,b) (*(b)=0,0) 446f5d6ab90SLisandro Dalcin 447fa2bb9feSLisandro Dalcin #define PetscLogEventRegister(a,b,c) 0 448fa2bb9feSLisandro Dalcin #define PetscLogEventSetCollective(a,b) 0 449fa2bb9feSLisandro Dalcin #define PetscLogEventIncludeClass(a) 0 450fa2bb9feSLisandro Dalcin #define PetscLogEventExcludeClass(a) 0 451b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 452b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 453b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 454b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 455e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 45646eb3cd7SSatish Balay #define PetscLogEventGetId(a,b) (*(b)=0,0) 457561b2a67SSatish Balay #define PetscLogEventGetPerfInfo(a,b,c) 0 4589c702cfcSMatthew G. Knepley #define PetscLogEventSetDof(a,b,c) 0 4599c702cfcSMatthew G. Knepley #define PetscLogEventSetError(a,b,c) 0 46077c4ece6SBarry Smith 4618b5db460SBarry Smith #define PetscLogPLB 0 4628b5db460SBarry Smith #define PetscLogPLE 0 4638b5db460SBarry Smith #define PetscLogPHC 0 4648b5db460SBarry Smith #define PetscLogPHD 0 465f5d6ab90SLisandro Dalcin 466efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 46752e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 46852e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 469fa2bb9feSLisandro Dalcin PETSC_EXTERN PetscErrorCode PetscLogObjectState(PetscObject,const char[],...); 470fa2bb9feSLisandro Dalcin 471bb1d7374SBarry Smith #define PetscLogDefaultBegin() 0 472b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 473bb1d7374SBarry Smith #define PetscLogNestedBegin() 0 474fa2bb9feSLisandro Dalcin #define PetscLogTraceBegin(file) 0 47573fda44aSBarry Smith #define PetscLogActions(a) 0 476fa2bb9feSLisandro Dalcin #define PetscLogObjects(a) 0 477fa2bb9feSLisandro Dalcin #define PetscLogSetThreshold(a,b) 0 478fa2bb9feSLisandro Dalcin #define PetscLogSet(lb,le) 0 479fa2bb9feSLisandro Dalcin 480fa2bb9feSLisandro Dalcin #define PetscLogView(viewer) 0 481fa2bb9feSLisandro Dalcin #define PetscLogViewFromOptions() 0 482fa2bb9feSLisandro Dalcin #define PetscLogDump(c) 0 483fa2bb9feSLisandro Dalcin 48462872c28SLisandro Dalcin #define PetscLogEventSync(e,comm) 0 485fa2bb9feSLisandro Dalcin #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 486fa2bb9feSLisandro Dalcin #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 487ce6058e1SBarry Smith 488aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 489ea1c87f7SJunchao Zhang #define MPI_Startall_irecv(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 490ea1c87f7SJunchao Zhang #define MPI_Startall_isend(count,datatype,number,requests) ((number) && MPI_Startall(number,requests)) 491457b14b1SJunchao Zhang #define MPI_Start_isend(count,datatype,requests) MPI_Start(requests) 492f141ce34SMatthew Knepley 493aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 4946daaf66cSBarry Smith 495204a6943SJed Brown #define PetscPreLoadBegin(flag,name) \ 496204a6943SJed Brown do {\ 497204a6943SJed Brown PetscBool PetscPreLoading = flag;\ 498204a6943SJed Brown int PetscPreLoadMax,PetscPreLoadIt;\ 499166c7f25SBarry Smith PetscLogStage _stageNum;\ 5008cbcd9ccSBarry Smith PetscErrorCode _3_ierr; \ 501c5929fdfSBarry Smith _3_ierr = PetscOptionsGetBool(NULL,NULL,"-preload",&PetscPreLoading,NULL);CHKERRQ(_3_ierr); \ 502204a6943SJed Brown PetscPreLoadMax = (int)(PetscPreLoading);\ 503204a6943SJed Brown PetscPreLoadingUsed = PetscPreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 504204a6943SJed Brown for (PetscPreLoadIt=0; PetscPreLoadIt<=PetscPreLoadMax; PetscPreLoadIt++) {\ 505204a6943SJed Brown PetscPreLoadingOn = PetscPreLoading;\ 5060298fd71SBarry Smith _3_ierr = PetscBarrier(NULL);CHKERRQ(_3_ierr);\ 507204a6943SJed Brown if (PetscPreLoadIt>0) {\ 5088e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 5098e58c17dSMatthew Knepley } else {\ 510a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 5118e58c17dSMatthew Knepley }\ 512204a6943SJed Brown _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt));\ 5138e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 5148e58c17dSMatthew Knepley 515204a6943SJed Brown #define PetscPreLoadEnd() \ 516043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 517204a6943SJed Brown PetscPreLoading = PETSC_FALSE;\ 518043328b6SSatish Balay }\ 519204a6943SJed Brown } while (0) 5208e58c17dSMatthew Knepley 521204a6943SJed Brown #define PetscPreLoadStage(name) do { \ 522043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr); \ 523204a6943SJed Brown if (PetscPreLoadIt>0) { \ 5248e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr); \ 5258e58c17dSMatthew Knepley } else { \ 526a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 5278e58c17dSMatthew Knepley } \ 528204a6943SJed Brown _3_ierr = PetscLogStageSetActive(_stageNum,(PetscBool)(!PetscPreLoadMax || PetscPreLoadIt)); \ 529204a6943SJed Brown _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); \ 530204a6943SJed Brown } while (0) 531e9fa29b7SSatish Balay 532ad14c47eSJed Brown /* some vars for logging */ 533ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingUsed; /* true if we are or have done preloading */ 534ad14c47eSJed Brown PETSC_EXTERN PetscBool PetscPreLoadingOn; /* true if we are currently in a preloading calculation */ 535ad14c47eSJed Brown 53697bb86f7SLois Curfman McInnes #endif 537