Actual source code: nt_time.c
2: #include <petsc.h>
3: #if defined (PETSC_USE_NT_TIME)
4: #include <Windows.h>
5: #define FACTOR 4294967296.0 /* pow(2,32) */
9: PetscLogDouble nt_time(void)
10: {
11: static PetscTruth flag = PETSC_TRUE;
14: static LARGE_INTEGER StartTime,PerfFreq,CurTime;
15: static PetscLogDouble SecInTick=0.0;
16:
17: DWORD dwStartHigh,dwCurHigh;
18: PetscLogDouble dTime,dHigh;
19: PetscLogDouble ptime;
20:
21:
23: if (flag) {
24: QueryPerformanceCounter(&StartTime);CHKERRQ(!ierr);
25: QueryPerformanceFrequency(&PerfFreq);CHKERRQ(!ierr);
26: /* Explicitly convert the higher 32 bits, and add the lower 32 bits from the counter */
27: /* works on non-pentium CPUs ? */
28: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
29: SecInTick = 1.0/((double)PerfFreq.u.HighPart*FACTOR+(double)PerfFreq.u.LowPart);
30: #else
31: SecInTick = 1.0/((double)PerfFreq.HighPart*FACTOR+(double)PerfFreq.LowPart);
32: #endif
33: flag = PETSC_FALSE;
34: }
35:
36: QueryPerformanceCounter(&CurTime);CHKERRQ(!ierr);
37: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
38: dwCurHigh = (DWORD)CurTime.u.HighPart;
39: dwStartHigh = (DWORD)StartTime.u.HighPart;
40: #else
41: dwCurHigh = (DWORD)CurTime.HighPart;
42: dwStartHigh = (DWORD)StartTime.HighPart;
43: #endif
44: dHigh = (signed)(dwCurHigh - dwStartHigh);
46: #if defined(PETSC_HAVE_LARGE_INTEGER_U)
47: dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
48: #else
49: dTime = dHigh*(double)FACTOR + (double)CurTime.LowPart - (double)StartTime.LowPart;
50: #endif
51: /* Use the following with older versions of the Borland compiler
52: dTime = dHigh*(double)FACTOR + (double)CurTime.u.LowPart - (double)StartTime.u.LowPart;
53: */
54: ptime = (double)SecInTick*dTime;
56: PetscFunctionReturn(ptime);
57: }
58: #endif