Actual source code: petsctime.h

  1: /*
  2:        Low cost access to system time. This, in general, should not
  3:      be included in user programs.
  4: */


 9:  #include petsc.h
 10: #if defined(PETSC_HAVE_SYS_TIME_H)
 11: #include <sys/types.h>
 12: #include <sys/time.h>
 13: #endif
 14: #if defined(PETSC_NEEDS_GETTIMEOFDAY_PROTO)
 16: EXTERN int gettimeofday(struct timeval *,struct timezone *);
 18: #endif

 20: /*
 21:    PetscTime - Returns the current time of day in seconds.  

 23:    Output Parameter:
 24: .  v - time counter

 26:    Synopsis:
 27:    PetscTime(PetscLogDouble v)

 29:    Usage: 
 30:      PetscLogDouble v;
 31:      PetscTime(v);
 32:      .... perform some calculation ...
 33:      printf("Time for operation %g\n",v);

 35:    Notes:
 36:    Since the PETSc libraries incorporate timing of phases and operations, 
 37:    PetscTime() is intended only for timing of application codes.  
 38:    The options database commands -log, -log_summary, and -log_all activate
 39:    PETSc library timing.  See the users manual for further details.

 41: .seealso:  PetscTimeSubtract(), PetscTimeAdd()

 43: .keywords:  Petsc, time
 44: */

 46: /*
 47:    PetscTimeSubtract - Subtracts the current time of day (in seconds) from
 48:    the value v.  

 50:    Input Parameter:
 51: .  v - time counter

 53:    Output Parameter:
 54: .  v - time counter (v = v - current time)

 56:    Synopsis:
 57:    PetscTimeSubtract(PetscLogDouble v)

 59:    Notes:
 60:    Since the PETSc libraries incorporate timing of phases and operations, 
 61:    PetscTimeSubtract() is intended only for timing of application codes.  
 62:    The options database commands -log, -log_summary, and -log_all activate
 63:    PETSc library timing.  See the users manual for further details.

 65: .seealso:  PetscTime(), PetscTimeAdd()

 67: .keywords:  Petsc, time, subtract
 68: */

 70: /*
 71:    PetscTimeAdd - Adds the current time of day (in seconds) to the value v.  

 73:    Input Parameter:
 74: .  v - time counter

 76:    Output Parameter:
 77: .  v - time counter (v = v + current time)

 79:    Synopsis:
 80:    PetscTimeAdd(PetscLogDouble v)

 82:    Notes:
 83:    Since the PETSc libraries incorporate timing of phases and operations, 
 84:    PetscTimeAdd() is intended only for timing of application codes.  
 85:    The options database commands -log, -log_summary, and -log_all activate
 86:    PETSc library timing.  See the users manual for further details.

 88: .seealso:  PetscTime(), PetscTimeSubtract()

 90: .keywords:  Petsc, time, add
 91: */

 93: /* ------------------------------------------------------------------
 94:     Some machines have very fast MPI_Wtime()
 95: */
 96: #if (defined(PETSC_HAVE_FAST_MPI_WTIME) && !defined(_petsc_mpi_uni))
 97: #define PetscTime(v)         (v)=MPI_Wtime();

 99: #define PetscTimeSubtract(v) (v)-=MPI_Wtime();

101: #define PetscTimeAdd(v)      (v)+=MPI_Wtime();

103: /* ------------------------------------------------------------------
104:    Power1,2,3,PC machines have a fast clock read_real_time()
105: */
106: #elif defined(PETSC_USE_READ_REAL_TIME)
107: EXTERN PetscLogDouble rs6000_time(void);
108: #define PetscTime(v)         (v)=rs6000_time();

110: #define PetscTimeSubtract(v) (v)-=rs6000_time();

112: #define PetscTimeAdd(v)      (v)+=rs6000_time();

114: /* ------------------------------------------------------------------
115:     Dec Alpha has a very fast system clock accessible through getclock()
116:     getclock() doesn't seem to have a prototype for C++
117: */
118: #elif defined(PETSC_USE_GETCLOCK)
120: EXTERN int getclock(int clock_type,struct timespec *tp);


124: #define PetscTime(v)         {static struct  timespec _tp; \
125:                              getclock(TIMEOFDAY,&_tp); \
126:                              (v)=((PetscLogDouble)_tp.tv_sec)+(1.0e-9)*(_tp.tv_nsec);}

128: #define PetscTimeSubtract(v) {static struct timespec  _tp; \
129:                              getclock(TIMEOFDAY,&_tp); \
130:                              (v)-=((PetscLogDouble)_tp.tv_sec)+(1.0e-9)*(_tp.tv_nsec);}

132: #define PetscTimeAdd(v)      {static struct timespec  _tp; \
133:                              getclock(TIMEOFDAY,&_tp); \
134:                              (v)+=((PetscLogDouble)_tp.tv_sec)+(1.0e-9)*(_tp.tv_nsec);}

136: /* ------------------------------------------------------------------
137:    ASCI RED machine has a fast clock accessiable through dclock() 
138: */
139: #elif defined (PETSC_USE_DCLOCK)
141: EXTERN PetscLogDouble dclock();

144: #define PetscTime(v)         (v)=dclock();

146: #define PetscTimeSubtract(v) (v)-=dclock();

148: #define PetscTimeAdd(v)      (v)+=dclock();


151: /* ------------------------------------------------------------------
152:    Windows uses a special time code
153: */
154: #elif defined (PETSC_USE_NT_TIME)
155: #include <time.h>
156: EXTERN PetscLogDouble nt_time(void);
157: #define PetscTime(v)         (v)=nt_time();

159: #define PetscTimeSubtract(v) (v)-=nt_time();

161: #define PetscTimeAdd(v)      (v)+=nt_time();

163: /* ------------------------------------------------------------------
164:     The usual Unix time routines.
165: */
166: #else
167: #define PetscTime(v)         {static struct timeval _tp; \
168:                              gettimeofday(&_tp,(struct timezone *)0);\
169:                              (v)=((PetscLogDouble)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);}

171: #define PetscTimeSubtract(v) {static struct timeval _tp; \
172:                              gettimeofday(&_tp,(struct timezone *)0);\
173:                              (v)-=((PetscLogDouble)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);}

175: #define PetscTimeAdd(v)      {static struct timeval _tp; \
176:                              gettimeofday(&_tp,(struct timezone *)0);\
177:                              (v)+=((PetscLogDouble)_tp.tv_sec)+(1.0e-6)*(_tp.tv_usec);}
178: #endif

180: #endif