Go to the documentation of this file.00001
00003
00016 module mod_times
00017 #include "fml_constants.h"
00018 implicit none
00028 type t_timeval
00029 integer tv_sec;
00030 integer tv_msec;
00031 integer tv_usec;
00032 integer tv_nsec;
00033 end type t_timeval
00034
00053 type t_time
00054 type(t_timeval) t_start;
00055 type(t_timeval) t_end;
00056 type_precision t_elapsed;
00057 type_precision t_t;
00058 type_precision t_t1;
00059 type_precision t_t2;
00060 type_precision t_scale;
00061 character(len=30) t_name
00062 character(len=2) t_unit
00063 integer t_icount;
00064 integer t_inbcalls;
00065 integer t_ioffset;
00066 end type t_time
00067
00068
00069 CONTAINS
00070
00078 subroutine ft_gettimeofday(t_timeval_)
00079 implicit none
00080 type(t_timeval) :: t_timeval_;
00081
00082
00083 call SYSTEM_CLOCK(t_timeval_%tv_sec);
00084
00085 t_timeval_%tv_msec = t_timeval_%tv_sec / 1000;
00086 t_timeval_%tv_usec = t_timeval_%tv_sec / 1000;
00087 t_timeval_%tv_nsec = t_timeval_%tv_sec / 1000000;
00088
00089 end subroutine ft_gettimeofday
00090
00097 subroutine ft_create_time_init(timing_)
00098 implicit none
00099 type(t_time) :: timing_;
00100
00101 timing_%t_elapsed=0.0;
00102 timing_%t_t=0.0;
00103 timing_%t_t1=0.0;
00104 timing_%t_t2=0.0;
00105 timing_%t_scale=0;
00106 timing_%t_name="";
00107 timing_%t_unit="ms";
00108 timing_%t_icount=0;
00109 timing_%t_inbcalls=0;
00110 timing_%t_ioffset=0;
00111 call ft_reset(timing_);
00112 end subroutine ft_create_time_init
00113
00124 subroutine ft_create_time(timing_,name_,inbcalls_,ioffset_)
00125 implicit none
00126 type(t_time) :: timing_;
00127 character*(*) name_;
00128 integer inbcalls_;
00129 integer ioffset_;
00130
00131 select case(CLOCKS_PER_SEC)
00132 case(1000000)
00133 timing_%t_scale=1000.0/CLOCKS_PER_SEC
00134 case(1000)
00135 timing_%t_scale=1.0/CLOCKS_PER_SEC
00136 case default
00137 print*, "Time does handle this case"
00138 print*, "CLOCKS_PER_SEC=", CLOCKS_PER_SEC
00139 return
00140 end select
00141
00142 timing_%t_elapsed=0.0;
00143 timing_%t_t=0.0;
00144 timing_%t_t1=0.0;
00145 timing_%t_t2=0.0;
00146 timing_%t_name=name_;
00147 timing_%t_unit="ms";
00148 timing_%t_icount=0;
00149 timing_%t_inbcalls=inbcalls_;
00150 timing_%t_ioffset=ioffset_;
00151 call ft_reset(timing_);
00152
00153 end subroutine ft_create_time
00154
00162 subroutine ft_create_time_copy(timing_,timingcopy_)
00163 implicit none
00164 type(t_time) :: timingcopy_,timing_;
00165 character(len=len(timingcopy_%t_name)) name_;
00166
00167 timingcopy_%t_elapsed=timing_%t_elapsed;
00168 timingcopy_%t_t=timing_%t_t;
00169 timingcopy_%t_t1=timing_%t_t1;
00170 timingcopy_%t_t2=timing_%t_t2;
00171 timingcopy_%t_scale=timingcopy_%t_scale;
00172 timingcopy_%t_name=timing_%t_name;
00173 timingcopy_%t_unit=timing_%t_unit;
00174 timingcopy_%t_icount=timing_%t_icount;
00175 timingcopy_%t_inbcalls=timing_%t_inbcalls;
00176 timingcopy_%t_ioffset=timing_%t_ioffset;
00177 call ft_reset(timing_);
00178
00179
00180 end subroutine ft_create_time_copy
00181
00188 subroutine ft_reset(timing_)
00189 implicit none
00190 type(t_time) :: timing_;
00191
00192 timing_%t_t=0.0;
00193 call cpu_time(timing_%t_t1);
00194 timing_%t_icount=0;
00195
00196 end subroutine ft_reset
00197
00204 subroutine ft_begin(timing_)
00205 implicit none
00206 type(t_time) :: timing_;
00207
00208 if (timing_%t_icount .LT. timing_%t_ioffset) then
00209 timing_%t_icount = timing_%t_icount + 1;
00210 return
00211 endif
00212 call ft_gettimeofday(timing_%t_start);
00213 call cpu_time(timing_%t_t1);
00214 timing_%t_t2=0.0;
00215 timing_%t_icount = timing_%t_icount + 1;
00216
00217 end subroutine ft_begin
00218
00225 subroutine ft_end(timing_)
00226 implicit none
00227 type(t_time) :: timing_;
00228 type_precision t_tmp
00229
00230 if (timing_%t_icount .LE. timing_%t_ioffset) return;
00231
00232 call ft_gettimeofday(timing_%t_end);
00233 t_tmp = (timing_%t_end%tv_sec - timing_%t_start%tv_sec);
00234 timing_%t_t = timing_%t_t + t_tmp;
00235
00236 if (timing_%t_icount .EQ. timing_%t_inbcalls) then
00237
00238 call ft_reset(timing_);
00239 endif
00240
00241 end subroutine ft_end
00242
00250 subroutine ft_print(timing_,myrank)
00251 implicit none
00252 type(t_time), intent(in) :: timing_;
00253 integer, intent(in), optional :: myrank
00254
00255 integer :: in_myrank
00256
00257 if(present(myrank)) then
00258 in_myrank=myrank
00259 else
00260 in_myrank=0
00261 end if
00262
00263 if (timing_%t_icount .LE. 0) return;
00264
00265 write(*,100),trim(timing_%t_name),trim(timing_%t_unit),timing_%t_t,timing_%t_t/timing_%t_icount, timing_%t_icount, myrank
00266 100 FORMAT ('name:',A,', tot (',A,'): ',F24.3,', avg: ',F12.3,', COUNT=',I10,', myrank=',I3)
00267
00268 end subroutine ft_print
00269
00270 end module mod_times
00271