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 16*d71ae5a4SJacob Faibussowitsch double MPI_Wtime(void) 17*d71ae5a4SJacob 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); 296a2f88bbSSatish Balay /* 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 496a2f88bbSSatish Balay #if defined(PETSC_HAVE_LARGE_INTEGER_U) 506a2f88bbSSatish Balay dTime = dHigh * (double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart; 516a2f88bbSSatish Balay #else 526a2f88bbSSatish Balay dTime = dHigh * (double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart; 536a2f88bbSSatish Balay #endif 546a2f88bbSSatish Balay /* Use the following with older versions of the Borland compiler 556a2f88bbSSatish Balay dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart; 566a2f88bbSSatish Balay */ 576a2f88bbSSatish Balay ptime = (double)SecInTick * dTime; 586a2f88bbSSatish Balay return (ptime); 596a2f88bbSSatish Balay } 606a2f88bbSSatish Balay 616a2f88bbSSatish Balay /* ------------------------------------------------------------------ 626a2f88bbSSatish Balay The usual Unix time routines. 636a2f88bbSSatish Balay */ 646a2f88bbSSatish Balay #else 656a2f88bbSSatish Balay 666a2f88bbSSatish Balay #if defined(PETSC_HAVE_SYS_TIME_H) 676a2f88bbSSatish Balay #include <sys/time.h> 686a2f88bbSSatish Balay #endif 696a2f88bbSSatish Balay 706a2f88bbSSatish Balay #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO) 716a2f88bbSSatish Balay extern int gettimeofday(struct timeval *, struct timezone *); 726a2f88bbSSatish Balay #endif 736a2f88bbSSatish Balay 74*d71ae5a4SJacob Faibussowitsch double MPI_Wtime(void) 75*d71ae5a4SJacob Faibussowitsch { 766a2f88bbSSatish Balay static struct timeval _tp; 776a2f88bbSSatish Balay gettimeofday(&_tp, (struct timezone *)0); 786a2f88bbSSatish Balay return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec); 796a2f88bbSSatish Balay } 806a2f88bbSSatish Balay #endif 816a2f88bbSSatish Balay 826a2f88bbSSatish Balay #if defined(__cplusplus) 836a2f88bbSSatish Balay } 846a2f88bbSSatish Balay #endif 85