My Project
 All Classes Files Functions Variables Macros
times.F90
Go to the documentation of this file.
1 module times
2  integer,private,save :: last_count=0
3  real, private,save :: last_cpucount=0
4  logical, private,save :: alltimer_isactive=.false.
5 
6  integer, parameter :: nb_timer = 4
7  integer, parameter :: timer_caldyn = 1
8  integer, parameter :: timer_vanleer = 2
9  integer, parameter :: timer_dissip = 3
10  integer, parameter :: timer_physic = 4
11  integer, parameter :: stopped = 1
12  integer, parameter :: running = 2
13  integer, parameter :: suspended = 3
14 
15  integer :: max_size
16  real, allocatable, dimension(:,:,:) :: timer_table
17  real, allocatable, dimension(:,:,:) :: timer_table_sqr
18  integer, allocatable, dimension(:,:,:) :: timer_iteration
19  real, allocatable, dimension(:,:,:) :: timer_average
20  real, allocatable, dimension(:,:,:) :: timer_delta
21  real, allocatable,dimension(:) :: timer_running, last_time
22  integer, allocatable,dimension(:) :: timer_state
23 
24  contains
25 
26  subroutine init_timer
27  use parallel
28  implicit none
29 #include "dimensions.h"
30 #include "paramet.h"
31 
32  max_size=jjm+1
33  allocate(timer_table(max_size,nb_timer,0:mpi_size-1))
34  allocate(timer_table_sqr(max_size,nb_timer,0:mpi_size-1))
35  allocate(timer_iteration(max_size,nb_timer,0:mpi_size-1))
36  allocate(timer_average(max_size,nb_timer,0:mpi_size-1))
37  allocate(timer_delta(max_size,nb_timer,0:mpi_size-1))
38  allocate(timer_running(nb_timer))
39  allocate(timer_state(nb_timer))
40  allocate(last_time(nb_timer))
41 
42  timer_table(:,:,:)=0
43  timer_table_sqr(:,:,:)=0
44  timer_iteration(:,:,:)=0
45  timer_average(:,:,:)=0
46  timer_delta(:,:,:)=0
47  timer_state(:)=stopped
48  end subroutine init_timer
49 
50  subroutine start_timer(no_timer)
51  implicit none
52  integer :: no_timer
53 
54  if (alltimer_isactive) then
55 
56  if (timer_state(no_timer)/=stopped) then
57  stop 'start_timer :: timer is already running or suspended'
58  else
59  timer_state(no_timer)=running
60  endif
61 
62  timer_running(no_timer)=0
63  call cpu_time(last_time(no_timer))
64 
65  endif
66 
67  end subroutine start_timer
68 
69  subroutine suspend_timer(no_timer)
70  implicit none
71  integer :: no_timer
72 
73  if (alltimer_isactive) then
74  if (timer_state(no_timer)/=running) then
75  stop 'suspend_timer :: timer is not running'
76  else
77  timer_state(no_timer)=suspended
78  endif
79 
80  timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
81  call cpu_time(last_time(no_timer))
82  timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
83  endif
84  end subroutine suspend_timer
85 
86  subroutine resume_timer(no_timer)
87  implicit none
88  integer :: no_timer
89 
90  if (alltimer_isactive) then
91  if (timer_state(no_timer)/=suspended) then
92  stop 'resume_timer :: timer is not suspended'
93  else
94  timer_state(no_timer)=running
95  endif
96 
97  call cpu_time(last_time(no_timer))
98  endif
99 
100  end subroutine resume_timer
101 
102  subroutine stop_timer(no_timer)
103  use parallel
104  implicit none
105  integer :: no_timer
106  integer :: n
107  real :: v,v2
108 
109  if (alltimer_isactive) then
110 
111  if (timer_state(no_timer)/=running) then
112  stop 'stop_timer :: timer is not running'
113  else
114  timer_state(no_timer)=stopped
115  endif
116 
117  timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
118  call cpu_time(last_time(no_timer))
119  timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
120 
121  timer_table(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)+timer_running(no_timer)
122  timer_table_sqr(jj_nb,no_timer,mpi_rank)=timer_table_sqr(jj_nb,no_timer,mpi_rank)+timer_running(no_timer)**2
123  timer_iteration(jj_nb,no_timer,mpi_rank)=timer_iteration(jj_nb,no_timer,mpi_rank)+1
124  timer_average(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)/timer_iteration(jj_nb,no_timer,mpi_rank)
125  if (timer_iteration(jj_nb,no_timer,mpi_rank)>=2) then
126  n=timer_iteration(jj_nb,no_timer,mpi_rank)
127  v2=timer_table_sqr(jj_nb,no_timer,mpi_rank)
128  v=timer_table(jj_nb,no_timer,mpi_rank)
129  timer_delta(jj_nb,no_timer,mpi_rank)=sqrt(abs(v2-v*v/n)/(n-1))
130  else
131  timer_delta(jj_nb,no_timer,mpi_rank)=0
132  endif
133  endif
134 
135  end subroutine stop_timer
136 
137  subroutine allgather_timer
138  use parallel
139  implicit none
140 #ifdef CPP_MPI
141  include 'mpif.h'
142 #endif
143  integer :: ierr
144  integer :: data_size
145  real, allocatable,dimension(:,:) :: tmp_table
146 
147  IF (using_mpi) THEN
148 
149  if (alltimer_isactive) then
150 
151 
152  allocate(tmp_table(max_size,nb_timer))
153 
154  data_size=max_size*nb_timer
155 
156  tmp_table(:,:)=timer_table(:,:,mpi_rank)
157 #ifdef CPP_MPI
158  call mpi_allgather(tmp_table(1,1),data_size,mpi_real_lmdz,timer_table(1,1,0),data_size,mpi_real_lmdz,comm_lmdz,ierr)
159 #endif
160  tmp_table(:,:)=timer_table_sqr(:,:,mpi_rank)
161 #ifdef CPP_MPI
162  call mpi_allgather(tmp_table(1,1),data_size,mpi_real_lmdz,timer_table_sqr(1,1,0),data_size,mpi_real_lmdz,comm_lmdz,ierr)
163 #endif
164  deallocate(tmp_table)
165 
166  endif
167 
168  ENDIF ! using_mpi
169 
170  end subroutine allgather_timer
171 
173  use parallel
174  implicit none
175 #ifdef CPP_MPI
176  include 'mpif.h'
177 #endif
178  integer :: ierr
179  integer :: data_size
180  real, allocatable,dimension(:,:),target :: tmp_table
181  integer, allocatable,dimension(:,:),target :: tmp_iter
182  integer :: istats
183 
184  IF (using_mpi) THEN
185 
186  if (alltimer_isactive) then
187 
188  allocate(tmp_table(max_size,nb_timer))
189  allocate(tmp_iter(max_size,nb_timer))
190 
191  data_size=max_size*nb_timer
192 
193  tmp_table(:,:)=timer_average(:,:,mpi_rank)
194 #ifdef CPP_MPI
195  call mpi_allgather(tmp_table(1,1),data_size,mpi_real_lmdz,timer_average(1,1,0),data_size,mpi_real_lmdz,comm_lmdz,ierr)
196 #endif
197  tmp_table(:,:)=timer_delta(:,:,mpi_rank)
198 #ifdef CPP_MPI
199  call mpi_allgather(tmp_table(1,1),data_size,mpi_real_lmdz,timer_delta(1,1,0),data_size,mpi_real_lmdz,comm_lmdz,ierr)
200 #endif
201  tmp_iter(:,:)=timer_iteration(:,:,mpi_rank)
202 #ifdef CPP_MPI
203  call mpi_allgather(tmp_iter(1,1),data_size,mpi_integer,timer_iteration(1,1,0),data_size,mpi_integer,comm_lmdz,ierr)
204 #endif
205  deallocate(tmp_table)
206 
207  endif
208 
209  ENDIF ! using_mp�
210  end subroutine allgather_timer_average
211 
212  subroutine inittime
213  implicit none
214  integer :: count,count_rate,count_max
215 
216  alltimer_isactive=.true.
217  if (alltimer_isactive) then
218  call system_clock(count,count_rate,count_max)
219  call cpu_time(last_cpucount)
220  last_count=count
221  endif
222  end subroutine inittime
223 
224  function difftime()
225  implicit none
226  double precision :: difftime
227  integer :: count,count_rate,count_max
228 
229  call system_clock(count,count_rate,count_max)
230  if (count>=last_count) then
231  difftime=(1.*(count-last_count))/count_rate
232  else
233  difftime=(1.*(count-last_count+count_max))/count_rate
234  endif
235  last_count=count
236  end function difftime
237 
238  function diffcputime()
239  implicit none
240  real :: diffcputime
241  real :: count
242 
243  call cpu_time(count)
244  diffcputime=count-last_cpucount
245  last_cpucount=count
246  end function diffcputime
247 
248 end module times