Actual source code: nt_time.c

  1: #define PETSC_DLL

  3: #include <petscsys.h>
  4: #include <Windows.h>
  5: #define FACTOR   4294967296.0 /* pow(2,32) */


 11: PetscLogDouble  nt_time(void)
 12: {
 13:   static PetscTruth     flag = PETSC_TRUE;

 16:   static LARGE_INTEGER  StartTime,PerfFreq,CurTime;
 17:   static PetscLogDouble SecInTick=0.0;
 18: 
 19:   DWORD                 dwStartHigh,dwCurHigh;
 20:   PetscLogDouble        dTime,dHigh;
 21:   PetscLogDouble        ptime;
 22: 
 23: 
 25:   if (flag) {
 26:     QueryPerformanceCounter(&StartTime);CHKERRQ(!ierr);
 27:     QueryPerformanceFrequency(&PerfFreq);CHKERRQ(!ierr);
 28:     /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
 29:     /* works on non-pentium CPUs ? */
 30: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
 31:     SecInTick = 1.0/((double)PerfFreq.u.HighPart*FACTOR+(double)PerfFreq.u.LowPart);
 32: #else
 33:     SecInTick = 1.0/((double)PerfFreq.HighPart*FACTOR+(double)PerfFreq.LowPart);
 34: #endif
 35:     flag = PETSC_FALSE;
 36:   }
 37: 
 38:   QueryPerformanceCounter(&CurTime);CHKERRQ(!ierr);
 39: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
 40:   dwCurHigh   = (DWORD)CurTime.u.HighPart;
 41:   dwStartHigh = (DWORD)StartTime.u.HighPart;
 42: #else
 43:   dwCurHigh   = (DWORD)CurTime.HighPart;
 44:   dwStartHigh = (DWORD)StartTime.HighPart;
 45: #endif
 46:   dHigh       = (signed)(dwCurHigh - dwStartHigh);

 48: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
 49:   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
 50: #else
 51:   dTime = dHigh*(double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
 52: #endif
 53:   /* Use the following with older versions of the Borland compiler
 54:   dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
 55:   */
 56:   ptime = (double)SecInTick*dTime;

 58:   PetscFunctionReturn(ptime);
 59: }