Actual source code: nt_time.c

  1: #define PETSC_DLL

  3: #include <petsc.h>
  4: #if defined (PETSC_USE_NT_TIME)
  5: #include <Windows.h>
  6: #define FACTOR   4294967296.0 /* pow(2,32) */


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

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

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

 59:   PetscFunctionReturn(ptime);
 60: }


 64: #endif