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