1891da655SBarry Smith #include <petscsys.h> 2c9b973beSBarry Smith #if !defined(MPIUNI_H) 36a2f88bbSSatish Balay #error "Wrong mpi.h included! require mpi.h from MPIUNI" 46a2f88bbSSatish Balay #endif 56a2f88bbSSatish Balay 66a2f88bbSSatish Balay #if defined(__cplusplus) 76a2f88bbSSatish Balay extern "C" { 86a2f88bbSSatish Balay #endif 96a2f88bbSSatish Balay /* ------------------------------------------------------------------ 106a2f88bbSSatish Balay Microsoft Windows has its own time routines 116a2f88bbSSatish Balay */ 126a2f88bbSSatish Balay #if defined(PETSC_USE_MICROSOFT_TIME) 134e8afd12SMosè Giordano #include <windows.h> 146a2f88bbSSatish Balay #define FACTOR 4294967296.0 /* pow(2,32) */ 156a2f88bbSSatish Balay 16*9371c9d4SSatish Balay double MPI_Wtime(void) { 176a2f88bbSSatish Balay static int flag = 1; 186a2f88bbSSatish Balay static LARGE_INTEGER StartTime, PerfFreq, CurTime; 196a2f88bbSSatish Balay static double SecInTick = 0.0; 206a2f88bbSSatish Balay 216a2f88bbSSatish Balay DWORD dwStartHigh, dwCurHigh; 226a2f88bbSSatish Balay double dTime, dHigh; 236a2f88bbSSatish Balay double ptime; 246a2f88bbSSatish Balay 256a2f88bbSSatish Balay if (flag) { 2641e02c4dSJunchao Zhang if (!QueryPerformanceCounter(&StartTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB); 2741e02c4dSJunchao Zhang if (!QueryPerformanceFrequency(&PerfFreq)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB); 286a2f88bbSSatish Balay /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */ 296a2f88bbSSatish Balay /* works on non-pentium CPUs ? */ 306a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 316a2f88bbSSatish Balay SecInTick = 1.0 / ((double)PerfFreq.u.HighPart * FACTOR + (double)PerfFreq.u.LowPart); 326a2f88bbSSatish Balay #else 336a2f88bbSSatish Balay SecInTick = 1.0 / ((double)PerfFreq.HighPart * FACTOR + (double)PerfFreq.LowPart); 346a2f88bbSSatish Balay #endif 356a2f88bbSSatish Balay flag = 0; 366a2f88bbSSatish Balay } 376a2f88bbSSatish Balay 3841e02c4dSJunchao Zhang if (!QueryPerformanceCounter(&CurTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB); 396a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 406a2f88bbSSatish Balay dwCurHigh = (DWORD)CurTime.u.HighPart; 416a2f88bbSSatish Balay dwStartHigh = (DWORD)StartTime.u.HighPart; 426a2f88bbSSatish Balay #else 436a2f88bbSSatish Balay dwCurHigh = (DWORD)CurTime.HighPart; 446a2f88bbSSatish Balay dwStartHigh = (DWORD)StartTime.HighPart; 456a2f88bbSSatish Balay #endif 466a2f88bbSSatish Balay dHigh = (signed)(dwCurHigh - dwStartHigh); 476a2f88bbSSatish Balay 486a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 496a2f88bbSSatish Balay dTime = dHigh * (double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart; 506a2f88bbSSatish Balay #else 516a2f88bbSSatish Balay dTime = dHigh * (double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart; 526a2f88bbSSatish Balay #endif 536a2f88bbSSatish Balay /* Use the following with older versions of the Borland compiler 546a2f88bbSSatish Balay dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart; 556a2f88bbSSatish Balay */ 566a2f88bbSSatish Balay ptime = (double)SecInTick * dTime; 576a2f88bbSSatish Balay return (ptime); 586a2f88bbSSatish Balay } 596a2f88bbSSatish Balay 606a2f88bbSSatish Balay /* ------------------------------------------------------------------ 616a2f88bbSSatish Balay The usual Unix time routines. 626a2f88bbSSatish Balay */ 636a2f88bbSSatish Balay #else 646a2f88bbSSatish Balay 656a2f88bbSSatish Balay #if defined(PETSC_HAVE_SYS_TIME_H) 666a2f88bbSSatish Balay #include <sys/time.h> 676a2f88bbSSatish Balay #endif 686a2f88bbSSatish Balay 696a2f88bbSSatish Balay #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO) 706a2f88bbSSatish Balay extern int gettimeofday(struct timeval *, struct timezone *); 716a2f88bbSSatish Balay #endif 726a2f88bbSSatish Balay 73*9371c9d4SSatish Balay double MPI_Wtime(void) { 746a2f88bbSSatish Balay static struct timeval _tp; 756a2f88bbSSatish Balay gettimeofday(&_tp, (struct timezone *)0); 766a2f88bbSSatish Balay return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec); 776a2f88bbSSatish Balay } 786a2f88bbSSatish Balay #endif 796a2f88bbSSatish Balay 806a2f88bbSSatish Balay #if defined(__cplusplus) 816a2f88bbSSatish Balay } 826a2f88bbSSatish Balay #endif 83