times.f90

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;     ! seconds 
00030      integer    tv_msec;    ! milliseconds
00031      integer    tv_usec;    ! microseconds
00032      integer    tv_nsec;    ! nanoseconds
00033   end type t_timeval
00034 
00053   type t_time 
00054      type(t_timeval) t_start;  ! start time type(t_timeval)
00055      type(t_timeval) t_end;    ! start end type(t_timeval)
00056      type_precision t_elapsed; ! elapsed time
00057      type_precision t_t;       ! time 
00058      type_precision t_t1;      ! time 
00059      type_precision t_t2;      ! time 
00060      type_precision t_scale;   ! scale time
00061      character(len=30) t_name  ! time name
00062      character(len=2) t_unit   ! time unit 
00063      integer t_icount;         ! occurence time
00064      integer t_inbcalls;       ! number times of call
00065      integer t_ioffset;        ! offset 
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     !time on millisecondxes
00083     call SYSTEM_CLOCK(t_timeval_%tv_sec);
00084     !time on seconds
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     !!TODO add time in timeList
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     !!TODO add time in timeList
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        ! call ft_print(timing_);
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     !local variables
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 
 All Classes Namespaces Files Functions Variables Defines