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 7d382aafbSBarry Smith #include "petscsys.h" 8e9fa29b7SSatish Balay PETSC_EXTERN_CXX_BEGIN 9c8d78d4dSSatish Balay 108ba1e511SMatthew Knepley #define PETSC_EVENT 1311311 11166c7f25SBarry Smith extern PetscLogEvent PETSC_LARGEST_EVENT; 1297bb86f7SLois Curfman McInnes 1319b02663SBarry Smith /* Global flop counter */ 14ff73aad6SKris Buschelman extern PetscLogDouble PETSC_DLLEXPORT _TotalFlops; 1590fdf44cSMatthew Knepley extern PetscLogDouble petsc_tmp_flops; 1619b02663SBarry Smith 17edde42fcSLois Curfman McInnes /* General logging of information; different from event logging */ 18ae15b995SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfo_Private(const char[],void*,const char[],...) PETSC_PRINTF_FORMAT_CHECK(3,4); 196cf91177SBarry Smith #if defined(PETSC_USE_INFO) 20ae15b995SBarry Smith #define PetscInfo(A,S) PetscInfo_Private(__FUNCT__,A,S) 21ae15b995SBarry Smith #define PetscInfo1(A,S,a1) PetscInfo_Private(__FUNCT__,A,S,a1) 22ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2) PetscInfo_Private(__FUNCT__,A,S,a1,a2) 23ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3) 24ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4) 25ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5) 26ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6) 27ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) PetscInfo_Private(__FUNCT__,A,S,a1,a2,a3,a4,a5,a6,a7) 2863ba0a88SBarry Smith #else 29ae15b995SBarry Smith #define PetscInfo(A,S) 0 30ae15b995SBarry Smith #define PetscInfo1(A,S,a1) 0 31ae15b995SBarry Smith #define PetscInfo2(A,S,a1,a2) 0 32ae15b995SBarry Smith #define PetscInfo3(A,S,a1,a2,a3) 0 33ae15b995SBarry Smith #define PetscInfo4(A,S,a1,a2,a3,a4) 0 34ae15b995SBarry Smith #define PetscInfo5(A,S,a1,a2,a3,a4,a5) 0 35ae15b995SBarry Smith #define PetscInfo6(A,S,a1,a2,a3,a4,a5,a6) 0 36ae15b995SBarry Smith #define PetscInfo7(A,S,a1,a2,a3,a4,a5,a6,a7) 0 3763ba0a88SBarry Smith #endif 386cf91177SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoDeactivateClass(PetscCookie); 396cf91177SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoActivateClass(PetscCookie); 406cf91177SBarry Smith extern PetscTruth PETSC_DLLEXPORT PetscLogPrintInfo; /* if true, indicates PetscInfo() is turned on */ 41614700edSBarry Smith 426a6a9b46SSatish Balay /* We must make these structures available if we are to access the event 436a6a9b46SSatish Balay activation flags in the PetscLogEventBegin/End() macros. If we forced a 446a6a9b46SSatish Balay function call each time, we could make these private. 456a6a9b46SSatish Balay */ 46*d49d4b11SBarry Smith 47*d49d4b11SBarry Smith /* The class naming scheme procedes as follows: 48*d49d4b11SBarry Smith 49*d49d4b11SBarry Smith Event: 50*d49d4b11SBarry Smith Events are a class which describes certain blocks of executable 51*d49d4b11SBarry Smith code. The corresponding instantiations of events are Actions. 52*d49d4b11SBarry Smith 53*d49d4b11SBarry Smith Class: 54*d49d4b11SBarry Smith Classes are the classes representing Petsc structures. The 55*d49d4b11SBarry Smith corresponding instantiations are called Objects. 56*d49d4b11SBarry Smith 57*d49d4b11SBarry Smith StageLog: 58*d49d4b11SBarry Smith This type holds information about stages of computation. These 59*d49d4b11SBarry Smith are understood to be chunks encompassing several events, or 60*d49d4b11SBarry Smith alternatively, as a covering (possibly nested) of the timeline. 61*d49d4b11SBarry Smith 62*d49d4b11SBarry Smith StageInfo: 63*d49d4b11SBarry Smith The information about each stage. This log contains an 64*d49d4b11SBarry Smith EventPerfLog and a ClassPerfLog. 65*d49d4b11SBarry Smith 66*d49d4b11SBarry Smith EventRegLog: 67*d49d4b11SBarry Smith This type holds the information generated for each event as 68*d49d4b11SBarry Smith it is registered. This information does not change and thus is 69*d49d4b11SBarry Smith stored separately from performance information. 70*d49d4b11SBarry Smith 71*d49d4b11SBarry Smith EventPerfLog: 72*d49d4b11SBarry Smith This type holds the performance information logged for each 73*d49d4b11SBarry Smith event. Usually this information is logged for only one stage. 74*d49d4b11SBarry Smith 75*d49d4b11SBarry Smith ClassRegLog: 76*d49d4b11SBarry Smith This type holds the information generated for each class as 77*d49d4b11SBarry Smith it is registered. This information does not change and thus is 78*d49d4b11SBarry Smith stored separately from performance information. 79*d49d4b11SBarry Smith 80*d49d4b11SBarry Smith ClassPerfLog: 81*d49d4b11SBarry Smith This class holds information describing class/object usage during 82*d49d4b11SBarry Smith a run. Usually this information is logged for only one stage. 83*d49d4b11SBarry Smith */ 84*d49d4b11SBarry Smith 856a6a9b46SSatish Balay /* Default log */ 866a6a9b46SSatish Balay typedef struct _n_StageLog *StageLog; 876a6a9b46SSatish Balay extern PETSC_DLLEXPORT StageLog _stageLog; 886a6a9b46SSatish Balay 896a6a9b46SSatish Balay /* A simple stack (should replace) */ 906a6a9b46SSatish Balay typedef struct _n_IntStack *IntStack; 916a6a9b46SSatish Balay 926a6a9b46SSatish Balay /* The structures for logging performance */ 936a6a9b46SSatish Balay typedef struct { 946a6a9b46SSatish Balay int id; /* The integer identifying this section */ 956a6a9b46SSatish Balay PetscTruth active; /* The flag to activate logging */ 966a6a9b46SSatish Balay PetscTruth visible; /* The flag to print info in summary */ 976a6a9b46SSatish Balay int depth; /* The nesting depth of the event call */ 986a6a9b46SSatish Balay int count; /* The number of times this section was executed */ 996a6a9b46SSatish Balay PetscLogDouble flops; /* The flops used in this section */ 1006a6a9b46SSatish Balay PetscLogDouble time; /* The time taken for this section */ 1016a6a9b46SSatish Balay PetscLogDouble numMessages; /* The number of messages in this section */ 1026a6a9b46SSatish Balay PetscLogDouble messageLength; /* The total message lengths in this section */ 1036a6a9b46SSatish Balay PetscLogDouble numReductions; /* The number of reductions in this section */ 1046a6a9b46SSatish Balay } EventPerfInfo; 1056a6a9b46SSatish Balay 1066a6a9b46SSatish Balay typedef struct { 107*d49d4b11SBarry Smith PetscCookie id; /* The integer identifying this class */ 1086a6a9b46SSatish Balay int creations; /* The number of objects of this class created */ 1096a6a9b46SSatish Balay int destructions; /* The number of objects of this class destroyed */ 1106a6a9b46SSatish Balay PetscLogDouble mem; /* The total memory allocated by objects of this class */ 1116a6a9b46SSatish Balay PetscLogDouble descMem; /* The total memory allocated by descendents of these objects */ 1126a6a9b46SSatish Balay } ClassPerfInfo; 1136a6a9b46SSatish Balay 1146a6a9b46SSatish Balay /* The structures for logging registration */ 1156a6a9b46SSatish Balay typedef struct { 1166a6a9b46SSatish Balay char *name; /* The class name */ 1176a6a9b46SSatish Balay PetscCookie cookie; /* The integer identifying this class */ 1186a6a9b46SSatish Balay } ClassRegInfo; 1196a6a9b46SSatish Balay 1206a6a9b46SSatish Balay typedef struct { 1216a6a9b46SSatish Balay char *name; /* The name of this event */ 1226a6a9b46SSatish Balay PetscCookie cookie; /* The class id for this event (should maybe give class ID instead) */ 1236a6a9b46SSatish Balay #if defined (PETSC_HAVE_MPE) 1246a6a9b46SSatish Balay int mpe_id_begin; /* MPE IDs that define the event */ 1256a6a9b46SSatish Balay int mpe_id_end; 1266a6a9b46SSatish Balay #endif 1276a6a9b46SSatish Balay } EventRegInfo; 1286a6a9b46SSatish Balay 1296a6a9b46SSatish Balay typedef struct _n_EventRegLog *EventRegLog; 1306a6a9b46SSatish Balay struct _n_EventRegLog { 1316a6a9b46SSatish Balay int numEvents; /* The number of registered events */ 1326a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 1336a6a9b46SSatish Balay EventRegInfo *eventInfo; /* The registration information for each event */ 1346a6a9b46SSatish Balay }; 1356a6a9b46SSatish Balay 1366a6a9b46SSatish Balay typedef struct _n_EventPerfLog *EventPerfLog; 1376a6a9b46SSatish Balay struct _n_EventPerfLog { 1386a6a9b46SSatish Balay int numEvents; /* The number of logging events */ 1396a6a9b46SSatish Balay int maxEvents; /* The maximum number of events */ 1406a6a9b46SSatish Balay EventPerfInfo *eventInfo; /* The performance information for each event */ 1416a6a9b46SSatish Balay }; 1426a6a9b46SSatish Balay 1436a6a9b46SSatish Balay /* The structure for logging class information */ 1446a6a9b46SSatish Balay typedef struct _n_ClassRegLog *ClassRegLog; 1456a6a9b46SSatish Balay struct _n_ClassRegLog { 1466a6a9b46SSatish Balay int numClasses; /* The number of classes registered */ 1476a6a9b46SSatish Balay int maxClasses; /* The maximum number of classes */ 1486a6a9b46SSatish Balay ClassRegInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 1496a6a9b46SSatish Balay }; 1506a6a9b46SSatish Balay 1516a6a9b46SSatish Balay typedef struct _n_ClassPerfLog *ClassPerfLog; 1526a6a9b46SSatish Balay struct _n_ClassPerfLog { 1536a6a9b46SSatish Balay int numClasses; /* The number of logging classes */ 1546a6a9b46SSatish Balay int maxClasses; /* The maximum number of classes */ 1556a6a9b46SSatish Balay ClassPerfInfo *classInfo; /* The structure for class information (cookies are monotonicly increasing) */ 1566a6a9b46SSatish Balay }; 1576a6a9b46SSatish Balay 1586a6a9b46SSatish Balay /* The structures for logging in stages */ 1596a6a9b46SSatish Balay typedef struct _StageInfo { 1606a6a9b46SSatish Balay char *name; /* The stage name */ 1616a6a9b46SSatish Balay PetscTruth used; /* The stage was pushed on this processor */ 1626a6a9b46SSatish Balay EventPerfInfo perfInfo; /* The stage performance information */ 1636a6a9b46SSatish Balay EventPerfLog eventLog; /* The event information for this stage */ 1646a6a9b46SSatish Balay ClassPerfLog classLog; /* The class information for this stage */ 1656a6a9b46SSatish Balay } StageInfo; 1666a6a9b46SSatish Balay 1676a6a9b46SSatish Balay struct _n_StageLog { 1686a6a9b46SSatish Balay /* Size information */ 1696a6a9b46SSatish Balay int numStages; /* The number of registered stages */ 1706a6a9b46SSatish Balay int maxStages; /* The maximum number of stages */ 1716a6a9b46SSatish Balay /* Runtime information */ 1726a6a9b46SSatish Balay IntStack stack; /* The stack for active stages */ 1736a6a9b46SSatish Balay int curStage; /* The current stage (only used in macros so we don't call StackTop) */ 1746a6a9b46SSatish Balay /* Stage specific information */ 1756a6a9b46SSatish Balay StageInfo *stageInfo; /* The information for each stage */ 1766a6a9b46SSatish Balay EventRegLog eventLog; /* The registered events */ 1776a6a9b46SSatish Balay ClassRegLog classLog; /* The registered classes */ 1786a6a9b46SSatish Balay }; 1796a6a9b46SSatish Balay 180aa482453SBarry Smith #if defined(PETSC_USE_LOG) /* --- Logging is turned on --------------------------------*/ 181614700edSBarry Smith 182da63de55SLois Curfman McInnes /* 183da63de55SLois Curfman McInnes Flop counting: We count each arithmetic operation (e.g., addition, multiplication) separately. 184da63de55SLois Curfman McInnes 185da63de55SLois Curfman McInnes For the complex numbers version, note that 186da63de55SLois Curfman McInnes 1 complex addition = 2 flops 187da63de55SLois Curfman McInnes 1 complex multiplication = 6 flops, 188da63de55SLois Curfman McInnes where we define 1 flop as that for a double precision scalar. We roughly approximate 189da63de55SLois Curfman McInnes flop counting for complex numbers by multiplying the total flops by 4; this corresponds 190da63de55SLois Curfman McInnes to the assumption that we're counting mostly additions and multiplications -- and 191da63de55SLois Curfman McInnes roughly the same number of each. More accurate counting could be done by distinguishing 192da63de55SLois Curfman McInnes among the various arithmetic operations. 193da63de55SLois Curfman McInnes */ 194da63de55SLois Curfman McInnes 195aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 196542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 4.0 197da63de55SLois Curfman McInnes #else 198542d4b3fSSatish Balay #define PETSC_FLOPS_PER_OP 1.0 199bf3909cdSBarry Smith #endif 200bf3909cdSBarry Smith 201bf3909cdSBarry Smith #if defined(PETSC_USE_DEBUG) 202542d4b3fSSatish Balay #define PetscLogFlops(n) (petsc_tmp_flops = (PETSC_FLOPS_PER_OP*((PetscLogDouble)n)), ((petsc_tmp_flops < 0) ? PETSC_ERR_FLOP_COUNT : (_TotalFlops += petsc_tmp_flops,0))) 203542d4b3fSSatish Balay #define PetscLogFlopsNoError(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n)) 204bf3909cdSBarry Smith #else 205542d4b3fSSatish Balay #define PetscLogFlops(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n),0) 206542d4b3fSSatish Balay #define PetscLogFlopsNoError(n) (_TotalFlops += PETSC_FLOPS_PER_OP*((PetscLogDouble)n)) 207da63de55SLois Curfman McInnes #endif 20877c4ece6SBarry Smith 209aa482453SBarry Smith #if defined (PETSC_HAVE_MPE) 21077c4ece6SBarry Smith #include "mpe.h" 211ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEBegin(void); 212ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogMPEDump(const char[]); 21335d8aa7fSBarry Smith extern PetscTruth UseMPE; 214043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_BEGIN(e) \ 215335e4f37SSatish Balay ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 216a1b71033SSatish Balay MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_begin,0,NULL) : 0) 217043328b6SSatish Balay 218043328b6SSatish Balay #define PETSC_LOG_EVENT_MPE_END(e) \ 219335e4f37SSatish Balay ((UseMPE && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 220a1b71033SSatish Balay MPE_Log_event(_stageLog->eventLog->eventInfo[e].mpe_id_end,0,NULL) : 0) 221043328b6SSatish Balay 222614700edSBarry Smith #else 22352e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_BEGIN(e) 0 22452e6d16bSBarry Smith #define PETSC_LOG_EVENT_MPE_END(e) 0 22577c4ece6SBarry Smith #endif 22677c4ece6SBarry Smith 227166c7f25SBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLB)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 228166c7f25SBarry Smith EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPLE)(PetscLogEvent,int,PetscObject,PetscObject,PetscObject,PetscObject); 229ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHC)(PetscObject); 230ff73aad6SKris Buschelman EXTERN PETSC_DLLEXPORT PetscErrorCode (*_PetscLogPHD)(PetscObject); 23177c4ece6SBarry Smith 232043328b6SSatish Balay #define PetscLogObjectParent(p,c) \ 23352e6d16bSBarry Smith ((c && p) ? ((PetscObject)(c))->parent = (PetscObject)(p),((PetscObject)(c))->parentid = ((PetscObject)p)->id : 0, 0) 23452e6d16bSBarry Smith 235efee365bSSatish Balay #define PetscLogObjectParents(p,n,d) 0;{int _i; for (_i=0; _i<n; _i++) {ierr = PetscLogObjectParent(p,(d)[_i]);CHKERRQ(ierr);}} 236d38fa0fbSBarry Smith #define PetscLogObjectCreate(h) ((_PetscLogPHC) ? (*_PetscLogPHC)((PetscObject)h) : 0) 237d38fa0fbSBarry Smith #define PetscLogObjectDestroy(h) ((_PetscLogPHD) ? (*_PetscLogPHD)((PetscObject)h) : 0) 23852e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) (((PetscObject)(p))->mem += (m),0) 2398ba1e511SMatthew Knepley /* Initialization functions */ 240ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogBegin(void); 241ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogAllBegin(void); 242ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogTraceBegin(FILE *); 243ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogActions(PetscTruth); 244ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjects(PetscTruth); 2458ba1e511SMatthew Knepley /* General functions */ 246ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetRGBColor(const char*[]); 247ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDestroy(void); 248ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogSet(PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject), 2496849ba73SBarry Smith PetscErrorCode (*)(int, int, PetscObject, PetscObject, PetscObject, PetscObject)); 250ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject, const char[], ...) PETSC_PRINTF_FORMAT_CHECK(2,3); 2518ba1e511SMatthew Knepley /* Output functions */ 252ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintSummary(MPI_Comm, const char[]); 25378392ef1SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogPrintDetailed(MPI_Comm, const char[]); 254ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogDump(const char[]); 2558ba1e511SMatthew Knepley /* Counter functions */ 256ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscGetFlops(PetscLogDouble *); 2578ba1e511SMatthew Knepley /* Stage functions */ 258166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageRegister(const char[],PetscLogStage*); 259166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePush(PetscLogStage); 260ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStagePop(void); 261166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetActive(PetscLogStage, PetscTruth); 262166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetActive(PetscLogStage, PetscTruth *); 263166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageSetVisible(PetscLogStage, PetscTruth); 264166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetVisible(PetscLogStage, PetscTruth *); 265166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogStageGetId(const char [], PetscLogStage *); 2668ba1e511SMatthew Knepley /* Event functions */ 267166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(const char[], PetscCookie,PetscLogEvent*); 268166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivate(PetscLogEvent); 269166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivate(PetscLogEvent); 270166c7f25SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventSetActiveAll(PetscLogEvent, PetscTruth); 271ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscCookie); 272ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscCookie); 2739afaeae2SBarry Smith 2748ba1e511SMatthew Knepley 2758ba1e511SMatthew Knepley /* Global counters */ 276ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_ct; 277ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_ct; 278ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_ct; 279ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_ct; 280ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble irecv_len; 281ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble isend_len; 282ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble recv_len; 283ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble send_len; 284ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble allreduce_ct; 28501faf4e4SMatthew Knepley extern PETSC_DLLEXPORT PetscLogDouble gather_ct; 28601faf4e4SMatthew Knepley extern PETSC_DLLEXPORT PetscLogDouble scatter_ct; 287ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_ct; 288ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_any_ct; 289ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble wait_all_ct; 290ff73aad6SKris Buschelman extern PETSC_DLLEXPORT PetscLogDouble sum_of_waits_ct; 2918ba1e511SMatthew Knepley 29252e6d16bSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) \ 29352e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 29452e6d16bSBarry Smith (PetscLogEventBegin((e),o1,o2,o3,o4) || MPI_Barrier(cm) || PetscLogEventEnd((e),o1,o2,o3,o4)) : 0 ) || \ 29552e6d16bSBarry Smith PetscLogEventBegin((e)+1,o1,o2,o3,o4)) 29677c4ece6SBarry Smith 29752e6d16bSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) \ 29852e6d16bSBarry Smith (((_PetscLogPLB && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 29952e6d16bSBarry Smith (*_PetscLogPLB)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 30052e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_BEGIN(e)) 301043328b6SSatish Balay 302b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) PetscLogEventEnd(e+1,o1,o2,o3,o4) 303043328b6SSatish Balay 30452e6d16bSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) \ 30552e6d16bSBarry Smith (((_PetscLogPLE && _stageLog->stageInfo[_stageLog->curStage].perfInfo.active && _stageLog->stageInfo[_stageLog->curStage].eventLog->eventInfo[e].active) ? \ 30652e6d16bSBarry Smith (*_PetscLogPLE)((e),0,(PetscObject)(o1),(PetscObject)(o2),(PetscObject)(o3),(PetscObject)(o4)) : 0 ) || \ 30752e6d16bSBarry Smith PETSC_LOG_EVENT_MPE_END(e)) 30877c4ece6SBarry Smith 309f141ce34SMatthew Knepley /* Creation and destruction functions */ 310ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogCreate(StageLog *); 311ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogDestroy(StageLog); 312f141ce34SMatthew Knepley /* Registration functions */ 313ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogRegister(StageLog, const char [], int *); 314f141ce34SMatthew Knepley /* Runtime functions */ 315ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogGetStageLog(StageLog *); 316ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPush(StageLog, int); 317ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogPop(StageLog); 318ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetCurrent(StageLog, int *); 319ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetActive(StageLog, int, PetscTruth); 320ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetActive(StageLog, int, PetscTruth *); 321ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogSetVisible(StageLog, int, PetscTruth); 322ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetVisible(StageLog, int, PetscTruth *); 323ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetStage(StageLog, const char [], int *); 324ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassRegLog(StageLog, ClassRegLog *); 325ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventRegLog(StageLog, EventRegLog *); 326ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetClassPerfLog(StageLog, int, ClassPerfLog *); 327ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT StageLogGetEventPerfLog(StageLog, int, EventPerfLog *); 328f141ce34SMatthew Knepley 329e630d40cSMatthew Knepley EXTERN PetscErrorCode PETSC_DLLEXPORT EventRegLogGetEvent(EventRegLog, const char [], PetscLogEvent *); 330e630d40cSMatthew Knepley 331003131ecSBarry Smith EXTERN PetscErrorCode PetscLogEventGetFlops(PetscLogEvent, PetscLogDouble*); 332003131ecSBarry Smith EXTERN PetscErrorCode PetscLogEventZeroFlops(PetscLogEvent); 333003131ecSBarry Smith 334ce85283eSBarry Smith /* 335f621e05eSBarry Smith These are used internally in the PETSc routines to keep a count of MPI messages and 336f621e05eSBarry Smith their sizes. 337f621e05eSBarry Smith 3383c94ec11SBarry Smith This does not work for MPI-Uni because our include/mpiuni/mpi.h file 339ce85283eSBarry Smith uses macros to defined the MPI operations. 34015308354SBarry Smith 34115308354SBarry Smith It does not work correctly from HP-UX because it processes the 342bb4af37aSBarry Smith macros in a way that sometimes it double counts, hence 343b6410449SSatish Balay PETSC_HAVE_BROKEN_RECURSIVE_MACRO 3447c1e34a4SSatish Balay 345f569fd43SBarry Smith It does not work with Windows because winmpich lacks MPI_Type_size() 346ce85283eSBarry Smith */ 347c8217ed5SSatish Balay #if !defined(__MPIUNI_H) && !defined(PETSC_HAVE_BROKEN_RECURSIVE_MACRO) && !defined (PETSC_HAVE_MPI_MISSING_TYPESIZE) 34877a39924SBarry Smith /* 34977a39924SBarry Smith Logging of MPI activities 35077a39924SBarry Smith */ 351f95db71bSBarry Smith PETSC_STATIC_INLINE PetscErrorCode TypeSize(PetscLogDouble *buff,PetscMPIInt count,MPI_Datatype type) 352f95db71bSBarry Smith { 353618e35e3SBarry Smith PetscMPIInt mysize; return (MPI_Type_size(type,&mysize) || ((*buff += (PetscLogDouble) (count*mysize)),0)); 354f95db71bSBarry Smith } 35577a39924SBarry Smith 35677a39924SBarry Smith #define MPI_Irecv(buf,count,datatype,source,tag,comm,request) \ 357f95db71bSBarry Smith ((irecv_ct++,0) || TypeSize(&irecv_len,count,datatype) || MPI_Irecv(buf,count,datatype,source,tag,comm,request)) 35815308354SBarry Smith 35977a39924SBarry Smith #define MPI_Isend(buf,count,datatype,dest,tag,comm,request) \ 360f95db71bSBarry Smith ((isend_ct++,0) || TypeSize(&isend_len,count,datatype) || MPI_Isend(buf,count,datatype,dest,tag,comm,request)) 36115308354SBarry Smith 3620d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 363f95db71bSBarry Smith ((irecv_ct += (PetscLogDouble)(number),0) || TypeSize(&irecv_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 3640d4b0b6cSBarry Smith 3650d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 366f95db71bSBarry Smith ((isend_ct += (PetscLogDouble)(number),0) || TypeSize(&isend_len,count,MPIU_SCALAR) || MPI_Startall(number,requests)) 3670d4b0b6cSBarry Smith 3680d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 369f95db71bSBarry Smith ((isend_ct++,0) || TypeSize(&isend_len,count,MPIU_SCALAR) || MPI_Start(requests)) 3700d4b0b6cSBarry Smith 371ce85283eSBarry Smith #define MPI_Recv(buf,count,datatype,source,tag,comm,status) \ 372f95db71bSBarry Smith ((recv_ct++,0) || TypeSize(&recv_len,count,datatype) || MPI_Recv(buf,count,datatype,source,tag,comm,status)) 37315308354SBarry Smith 37477a39924SBarry Smith #define MPI_Send(buf,count,datatype,dest,tag,comm) \ 375f95db71bSBarry Smith ((send_ct++,0) || TypeSize(&send_len,count,datatype) || MPI_Send(buf,count,datatype,dest,tag,comm)) 37677a39924SBarry Smith 37777a39924SBarry Smith #define MPI_Wait(request,status) \ 3785e3723c6SSatish Balay ((wait_ct++,sum_of_waits_ct++,0) || MPI_Wait(request,status)) 37977a39924SBarry Smith 38077a39924SBarry Smith #define MPI_Waitany(a,b,c,d) \ 3815e3723c6SSatish Balay ((wait_any_ct++,sum_of_waits_ct++,0) || MPI_Waitany(a,b,c,d)) 38277a39924SBarry Smith 38377a39924SBarry Smith #define MPI_Waitall(count,array_of_requests,array_of_statuses) \ 384f95db71bSBarry Smith ((wait_all_ct++,sum_of_waits_ct += (PetscLogDouble) (count),0) || MPI_Waitall(count,array_of_requests,array_of_statuses)) 38577a39924SBarry Smith 38677a39924SBarry Smith #define MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm) \ 3875e3723c6SSatish Balay ((allreduce_ct++,0) || MPI_Allreduce(sendbuf,recvbuf,count,datatype,op,comm)) 3883914022bSBarry Smith 38901faf4e4SMatthew Knepley #define MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm) \ 39001faf4e4SMatthew Knepley ((gather_ct++,0) || MPI_Allgather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,comm)) 39101faf4e4SMatthew Knepley 39201faf4e4SMatthew Knepley #define MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm) \ 39301faf4e4SMatthew Knepley ((gather_ct++,0) || MPI_Allgatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,comm)) 39401faf4e4SMatthew Knepley 39501faf4e4SMatthew Knepley #define MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 396f95db71bSBarry Smith ((gather_ct++,0) || TypeSize(&send_len,sendcount,sendtype) || MPI_Gather(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm)) 39701faf4e4SMatthew Knepley 39801faf4e4SMatthew Knepley #define MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm) \ 399f95db71bSBarry Smith ((gather_ct++,0) || TypeSize(&send_len,sendcount,sendtype) || MPI_Gatherv(sendbuf,sendcount,sendtype,recvbuf,recvcount,displs,recvtype,root,comm)) 40001faf4e4SMatthew Knepley 40101faf4e4SMatthew Knepley #define MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 402f95db71bSBarry Smith ((scatter_ct++,0) || TypeSize(&recv_len,recvcount,recvtype) || MPI_Scatter(sendbuf,sendcount,sendtype,recvbuf,recvcount,recvtype,root,comm)) 40301faf4e4SMatthew Knepley 40401faf4e4SMatthew Knepley #define MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm) \ 405f95db71bSBarry Smith ((scatter_ct++,0) || TypeSize(&recv_len,recvcount,recvtype) || MPI_Scatterv(sendbuf,sendcount,displs,sendtype,recvbuf,recvcount,recvtype,root,comm)) 40601faf4e4SMatthew Knepley 4070d4b0b6cSBarry Smith #else 4080d4b0b6cSBarry Smith 4090d4b0b6cSBarry Smith #define MPI_Startall_irecv(count,number,requests) \ 4105e3723c6SSatish Balay (MPI_Startall(number,requests)) 4110d4b0b6cSBarry Smith 4120d4b0b6cSBarry Smith #define MPI_Startall_isend(count,number,requests) \ 4135e3723c6SSatish Balay (MPI_Startall(number,requests)) 4140d4b0b6cSBarry Smith 4150d4b0b6cSBarry Smith #define MPI_Start_isend(count,requests) \ 4165e3723c6SSatish Balay (MPI_Start(requests)) 4170d4b0b6cSBarry Smith 418c8217ed5SSatish Balay #endif /* !__MPIUNI_H && ! PETSC_HAVE_BROKEN_RECURSIVE_MACRO */ 419614700edSBarry Smith 420df8cf0b5SBarry Smith #else /* ---Logging is turned off --------------------------------------------*/ 421614700edSBarry Smith 422b0a32e0cSBarry Smith #define PetscLogFlops(n) 0 423d854a674SSatish Balay #define PetscLogFlopsNoError(n) 424614700edSBarry Smith 425df8cf0b5SBarry Smith /* 426df8cf0b5SBarry Smith With logging turned off, then MPE has to be turned off 427df8cf0b5SBarry Smith */ 428b0a32e0cSBarry Smith #define PetscLogMPEBegin() 0 429b0a32e0cSBarry Smith #define PetscLogMPEDump(a) 0 430614700edSBarry Smith 431b0a32e0cSBarry Smith #define PetscLogEventActivate(a) 0 432b0a32e0cSBarry Smith #define PetscLogEventDeactivate(a) 0 433614700edSBarry Smith 434b0a32e0cSBarry Smith #define PetscLogEventActivateClass(a) 0 435b0a32e0cSBarry Smith #define PetscLogEventDeactivateClass(a) 0 436e8e7597cSSatish Balay #define PetscLogEventSetActiveAll(a,b) 0 43777c4ece6SBarry Smith 438b0a32e0cSBarry Smith #define _PetscLogPLB 0 439b0a32e0cSBarry Smith #define _PetscLogPLE 0 440b0a32e0cSBarry Smith #define _PetscLogPHC 0 441b0a32e0cSBarry Smith #define _PetscLogPHD 0 44299de4ba8SSatish Balay #define PetscGetFlops(a) (*(a) = 0.0,0) 443b0a32e0cSBarry Smith #define PetscLogEventBegin(e,o1,o2,o3,o4) 0 444b0a32e0cSBarry Smith #define PetscLogEventEnd(e,o1,o2,o3,o4) 0 445b0a32e0cSBarry Smith #define PetscLogEventBarrierBegin(e,o1,o2,o3,o4,cm) 0 446b0a32e0cSBarry Smith #define PetscLogEventBarrierEnd(e,o1,o2,o3,o4,cm) 0 44752e6d16bSBarry Smith #define PetscLogObjectParent(p,c) 0 448efee365bSSatish Balay #define PetscLogObjectParents(p,n,c) 0 44952e6d16bSBarry Smith #define PetscLogObjectCreate(h) 0 45052e6d16bSBarry Smith #define PetscLogObjectDestroy(h) 0 45152e6d16bSBarry Smith #define PetscLogObjectMemory(p,m) 0 452b0a32e0cSBarry Smith #define PetscLogDestroy() 0 453b0a32e0cSBarry Smith #define PetscLogStagePush(a) 0 454b0a32e0cSBarry Smith #define PetscLogStagePop() 0 455b0a32e0cSBarry Smith #define PetscLogStageRegister(a,b) 0 456b0a32e0cSBarry Smith #define PetscLogStagePrint(a,flg) 0 457b0a32e0cSBarry Smith #define PetscLogPrintSummary(comm,file) 0 45878392ef1SBarry Smith #define PetscLogPrintDetailed(comm,file) 0 459b0a32e0cSBarry Smith #define PetscLogBegin() 0 460b0a32e0cSBarry Smith #define PetscLogTraceBegin(file) 0 461b0a32e0cSBarry Smith #define PetscLogSet(lb,le) 0 462b0a32e0cSBarry Smith #define PetscLogAllBegin() 0 463b0a32e0cSBarry Smith #define PetscLogDump(c) 0 464043328b6SSatish Balay #define PetscLogEventRegister(a,b,c) 0 46573fda44aSBarry Smith #define PetscLogObjects(a) 0 46673fda44aSBarry Smith #define PetscLogActions(a) 0 467ff73aad6SKris Buschelman EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogObjectState(PetscObject,const char[],...) PETSC_PRINTF_FORMAT_CHECK(2,3); 468ce6058e1SBarry Smith 469aa482453SBarry Smith /* If PETSC_USE_LOG is NOT defined, these still need to be! */ 470ca161407SBarry Smith #define MPI_Startall_irecv(count,number,requests) MPI_Startall(number,requests) 471ca161407SBarry Smith #define MPI_Startall_isend(count,number,requests) MPI_Startall(number,requests) 472ca161407SBarry Smith #define MPI_Start_isend(count,requests) MPI_Start(requests) 473ca161407SBarry Smith 474f141ce34SMatthew Knepley /* Creation and destruction functions */ 475f141ce34SMatthew Knepley #define StageLogCreate(stageLog) 0 476f141ce34SMatthew Knepley #define StageLogDestroy(stageLog) 0 477f141ce34SMatthew Knepley /* Registration functions */ 478f141ce34SMatthew Knepley #define StageLogRegister(stageLog, name, stage) 0 479f141ce34SMatthew Knepley /* Runtime functions */ 480f141ce34SMatthew Knepley #define PetscLogGetStageLog(stageLog) 0 481f141ce34SMatthew Knepley #define StageLogPush(stageLog, stage) 0 482f141ce34SMatthew Knepley #define StageLogPop(stageLog) 0 483f141ce34SMatthew Knepley #define StageLogGetCurrent(stageLog, stage) 0 484f141ce34SMatthew Knepley #define StageLogSetActive(stageLog, stage, active) 0 485f141ce34SMatthew Knepley #define StageLogGetActive(stageLog, stage, active) 0 486f141ce34SMatthew Knepley #define StageLogSetVisible(stageLog, stage, visible) 0 487f141ce34SMatthew Knepley #define StageLogGetVisible(stageLog, stage, visible) 0 488f141ce34SMatthew Knepley #define StageLogGetStage(stageLog, name, stage) 0 489fad68dfaSSatish Balay #define PetscLogStageGetId(a,b) (*(b)=0,0) 490fad68dfaSSatish Balay #define PetscLogStageSetActive(a,b) 0 4916a6a9b46SSatish Balay #define PetscLogStageGetActive(a,b) 0 4926a6a9b46SSatish Balay #define PetscLogStageGetVisible(a,b) 0 4936a6a9b46SSatish Balay #define PetscLogStageSetVisible(a,b) 0 494f141ce34SMatthew Knepley 495aa482453SBarry Smith #endif /* PETSC_USE_LOG */ 4966daaf66cSBarry Smith 497bf5c43c7SMatthew Knepley /* Special support for C++ */ 498bf5c43c7SMatthew Knepley #include "petsclog.hh" 499bf5c43c7SMatthew Knepley 500043328b6SSatish Balay #define PreLoadBegin(flag,name) \ 501043328b6SSatish Balay {\ 502c4411e17SBarry Smith PetscTruth PreLoading = flag;\ 5038cbcd9ccSBarry Smith int PreLoadMax,PreLoadIt;\ 504166c7f25SBarry Smith PetscLogStage _stageNum;\ 5058cbcd9ccSBarry Smith PetscErrorCode _3_ierr; \ 5064dc4c822SBarry Smith _3_ierr = PetscOptionsGetTruth(PETSC_NULL,"-preload",&PreLoading,PETSC_NULL);CHKERRQ(_3_ierr);\ 507043328b6SSatish Balay PreLoadMax = (int)(PreLoading);\ 508043328b6SSatish Balay PetscPreLoadingUsed = PreLoading ? PETSC_TRUE : PetscPreLoadingUsed;\ 509e7592fafSBarry Smith for (PreLoadIt=0; PreLoadIt<=PreLoadMax; PreLoadIt++) {\ 510435da068SBarry Smith PetscPreLoadingOn = PreLoading;\ 5116e491fe6SBarry Smith _3_ierr = PetscBarrier(PETSC_NULL);CHKERRQ(_3_ierr);\ 5128e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 5138e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 5148e58c17dSMatthew Knepley } else {\ 515a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 5168e58c17dSMatthew Knepley }\ 517773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 5188e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 5198e58c17dSMatthew Knepley 520043328b6SSatish Balay #define PreLoadEnd() \ 521043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 522043328b6SSatish Balay PreLoading = PETSC_FALSE;\ 523043328b6SSatish Balay }\ 524043328b6SSatish Balay } 5258e58c17dSMatthew Knepley 526043328b6SSatish Balay #define PreLoadStage(name) \ 527043328b6SSatish Balay _3_ierr = PetscLogStagePop();CHKERRQ(_3_ierr);\ 5288e58c17dSMatthew Knepley if (PreLoadIt>0) {\ 5298e58c17dSMatthew Knepley _3_ierr = PetscLogStageGetId(name,&_stageNum);CHKERRQ(_3_ierr);\ 5308e58c17dSMatthew Knepley } else {\ 531a3bc4eb9SBarry Smith _3_ierr = PetscLogStageRegister(name,&_stageNum);CHKERRQ(_3_ierr); \ 5328e58c17dSMatthew Knepley }\ 533773a6509SMatthew Knepley _3_ierr = PetscLogStageSetActive(_stageNum,(PetscTruth)(!PreLoadMax || PreLoadIt));\ 5348e58c17dSMatthew Knepley _3_ierr = PetscLogStagePush(_stageNum);CHKERRQ(_3_ierr); 535e9fa29b7SSatish Balay 536e9fa29b7SSatish Balay PETSC_EXTERN_CXX_END 53797bb86f7SLois Curfman McInnes #endif 538