xref: /petsc/src/sys/mpiuni/mpitime.c (revision 4e8afd12df985612b40e26aef947da2f566aee4e)
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