1891da655SBarry Smith #include <petscsys.h>
2*beceaeb6SBarry 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
921789920SBarry Smith /*
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
MPI_Wtime(void)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);
297de69702SBarry 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;
594ad8454bSPierre Jolivet return ptime;
606a2f88bbSSatish Balay }
616a2f88bbSSatish Balay
6221789920SBarry Smith /*
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
71d71ae5a4SJacob Faibussowitsch double MPI_Wtime(void)
72d71ae5a4SJacob Faibussowitsch {
736a2f88bbSSatish Balay static struct timeval _tp;
74c8025a54SPierre Jolivet gettimeofday(&_tp, NULL);
756a2f88bbSSatish Balay return ((double)_tp.tv_sec) + (1.0e-6) * (_tp.tv_usec);
766a2f88bbSSatish Balay }
776a2f88bbSSatish Balay #endif
786a2f88bbSSatish Balay
796a2f88bbSSatish Balay #if defined(__cplusplus)
806a2f88bbSSatish Balay }
816a2f88bbSSatish Balay #endif
82