1891da655SBarry Smith #include <petscsys.h> 26524c165SJacob Faibussowitsch #ifndef 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 16d71ae5a4SJacob Faibussowitsch double MPI_Wtime(void) 17d71ae5a4SJacob Faibussowitsch { 186a2f88bbSSatish Balay static int flag = 1; 196a2f88bbSSatish Balay static LARGE_INTEGER StartTime, PerfFreq, CurTime; 206a2f88bbSSatish Balay static double SecInTick = 0.0; 216a2f88bbSSatish Balay 226a2f88bbSSatish Balay DWORD dwStartHigh, dwCurHigh; 236a2f88bbSSatish Balay double dTime, dHigh; 246a2f88bbSSatish Balay double ptime; 256a2f88bbSSatish Balay 266a2f88bbSSatish Balay if (flag) { 2741e02c4dSJunchao Zhang if (!QueryPerformanceCounter(&StartTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB); 2841e02c4dSJunchao Zhang if (!QueryPerformanceFrequency(&PerfFreq)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB); 29*7de69702SBarry Smith /* Explicitly convert the higher 32-bits, and add the lower 32-bits from the counter */ 306a2f88bbSSatish Balay /* works on non-pentium CPUs ? */ 316a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 326a2f88bbSSatish Balay SecInTick = 1.0 / ((double)PerfFreq.u.HighPart * FACTOR + (double)PerfFreq.u.LowPart); 336a2f88bbSSatish Balay #else 346a2f88bbSSatish Balay SecInTick = 1.0 / ((double)PerfFreq.HighPart * FACTOR + (double)PerfFreq.LowPart); 356a2f88bbSSatish Balay #endif 366a2f88bbSSatish Balay flag = 0; 376a2f88bbSSatish Balay } 386a2f88bbSSatish Balay 3941e02c4dSJunchao Zhang if (!QueryPerformanceCounter(&CurTime)) PETSCABORT(MPI_COMM_WORLD, PETSC_ERR_LIB); 406a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 416a2f88bbSSatish Balay dwCurHigh = (DWORD)CurTime.u.HighPart; 426a2f88bbSSatish Balay dwStartHigh = (DWORD)StartTime.u.HighPart; 436a2f88bbSSatish Balay #else 446a2f88bbSSatish Balay dwCurHigh = (DWORD)CurTime.HighPart; 456a2f88bbSSatish Balay dwStartHigh = (DWORD)StartTime.HighPart; 466a2f88bbSSatish Balay #endif 476a2f88bbSSatish Balay dHigh = (signed)(dwCurHigh - dwStartHigh); 486a2f88bbSSatish Balay 498ca48ce9SPierre Jolivet dTime = dHigh * (double)FACTOR; 506a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 518ca48ce9SPierre Jolivet dTime += (double)CurTime.u.LowPart - (double)StartTime.u.LowPart; 526a2f88bbSSatish Balay #else 538ca48ce9SPierre Jolivet dTime += (double)CurTime.LowPart - (double)StartTime.LowPart; 546a2f88bbSSatish Balay #endif 556a2f88bbSSatish Balay /* Use the following with older versions of the Borland compiler 566a2f88bbSSatish Balay dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart; 576a2f88bbSSatish Balay */ 586a2f88bbSSatish Balay ptime = (double)SecInTick * dTime; 596a2f88bbSSatish Balay return (ptime); 606a2f88bbSSatish Balay } 616a2f88bbSSatish Balay 626a2f88bbSSatish Balay /* ------------------------------------------------------------------ 636a2f88bbSSatish Balay The usual Unix time routines. 646a2f88bbSSatish Balay */ 656a2f88bbSSatish Balay #else 666a2f88bbSSatish Balay 676a2f88bbSSatish Balay #if defined(PETSC_HAVE_SYS_TIME_H) 686a2f88bbSSatish Balay #include <sys/time.h> 696a2f88bbSSatish Balay #endif 706a2f88bbSSatish Balay 716a2f88bbSSatish Balay #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO) 726a2f88bbSSatish Balay extern int gettimeofday(struct timeval *, struct timezone *); 736a2f88bbSSatish Balay #endif 746a2f88bbSSatish Balay 75d71ae5a4SJacob Faibussowitsch double MPI_Wtime(void) 76d71ae5a4SJacob Faibussowitsch { 776a2f88bbSSatish Balay static struct timeval _tp; 786a2f88bbSSatish Balay gettimeofday(&_tp, (struct timezone *)0); 796a2f88bbSSatish Balay return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec); 806a2f88bbSSatish Balay } 816a2f88bbSSatish Balay #endif 826a2f88bbSSatish Balay 836a2f88bbSSatish Balay #if defined(__cplusplus) 846a2f88bbSSatish Balay } 856a2f88bbSSatish Balay #endif 86