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 38*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoDeactivateClass(PetscClassId); 39*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscInfoActivateClass(PetscClassId); 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 */ 46d49d4b11SBarry Smith 47d49d4b11SBarry Smith /* The class naming scheme procedes as follows: 48d49d4b11SBarry Smith 49d49d4b11SBarry Smith Event: 50d49d4b11SBarry Smith Events are a class which describes certain blocks of executable 51d49d4b11SBarry Smith code. The corresponding instantiations of events are Actions. 52d49d4b11SBarry Smith 53d49d4b11SBarry Smith Class: 54d49d4b11SBarry Smith Classes are the classes representing Petsc structures. The 55d49d4b11SBarry Smith corresponding instantiations are called Objects. 56d49d4b11SBarry Smith 57d49d4b11SBarry Smith StageLog: 58d49d4b11SBarry Smith This type holds information about stages of computation. These 59d49d4b11SBarry Smith are understood to be chunks encompassing several events, or 60d49d4b11SBarry Smith alternatively, as a covering (possibly nested) of the timeline. 61d49d4b11SBarry Smith 62d49d4b11SBarry Smith StageInfo: 63d49d4b11SBarry Smith The information about each stage. This log contains an 64d49d4b11SBarry Smith EventPerfLog and a ClassPerfLog. 65d49d4b11SBarry Smith 66d49d4b11SBarry Smith EventRegLog: 67d49d4b11SBarry Smith This type holds the information generated for each event as 68d49d4b11SBarry Smith it is registered. This information does not change and thus is 69d49d4b11SBarry Smith stored separately from performance information. 70d49d4b11SBarry Smith 71d49d4b11SBarry Smith EventPerfLog: 72d49d4b11SBarry Smith This type holds the performance information logged for each 73d49d4b11SBarry Smith event. Usually this information is logged for only one stage. 74d49d4b11SBarry Smith 75d49d4b11SBarry Smith ClassRegLog: 76d49d4b11SBarry Smith This type holds the information generated for each class as 77d49d4b11SBarry Smith it is registered. This information does not change and thus is 78d49d4b11SBarry Smith stored separately from performance information. 79d49d4b11SBarry Smith 80d49d4b11SBarry Smith ClassPerfLog: 81d49d4b11SBarry Smith This class holds information describing class/object usage during 82d49d4b11SBarry Smith a run. Usually this information is logged for only one stage. 83d49d4b11SBarry Smith */ 84d49d4b11SBarry 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*0700a824SBarry Smith PetscClassId 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 */ 117*0700a824SBarry Smith PetscClassId classid; /* The integer identifying this class */ 1186a6a9b46SSatish Balay } ClassRegInfo; 1196a6a9b46SSatish Balay 1206a6a9b46SSatish Balay typedef struct { 1216a6a9b46SSatish Balay char *name; /* The name of this event */ 122*0700a824SBarry Smith PetscClassId classid; /* 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 */ 148*0700a824SBarry Smith ClassRegInfo *classInfo; /* The structure for class information (classids 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 */ 155*0700a824SBarry Smith ClassPerfInfo *classInfo; /* The structure for class information (classids 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 */ 267*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventRegister(const char[], PetscClassId,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); 271*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventActivateClass(PetscClassId); 272*0700a824SBarry Smith EXTERN PetscErrorCode PETSC_DLLEXPORT PetscLogEventDeactivateClass(PetscClassId); 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