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) 13*4e8afd12SMosè Giordano #include <windows.h> 146a2f88bbSSatish Balay #define FACTOR 4294967296.0 /* pow(2,32) */ 156a2f88bbSSatish Balay 166a2f88bbSSatish Balay double MPI_Wtime(void) 176a2f88bbSSatish Balay { 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 /* ------------------------------------------------------------------ 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 756a2f88bbSSatish Balay double MPI_Wtime(void) 766a2f88bbSSatish Balay { 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