LMDZ
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
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))
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
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)
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
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
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 
172  subroutine allgather_timer_average
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 
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
real, dimension(:), allocatable last_time
Definition: times.F90:21
integer, parameter timer_physic
Definition: times.F90:10
integer, parameter suspended
Definition: times.F90:13
subroutine init_timer
Definition: times.F90:27
subroutine stop_timer(no_timer)
Definition: times.F90:103
real, dimension(:), allocatable timer_running
Definition: times.F90:21
integer, save mpi_rank
double precision function difftime()
Definition: times.F90:225
integer, save mpi_size
real, dimension(:,:,:), allocatable timer_average
Definition: times.F90:19
integer, save, private last_count
Definition: times.F90:2
integer, parameter timer_caldyn
Definition: times.F90:7
subroutine resume_timer(no_timer)
Definition: times.F90:87
subroutine allgather_timer_average
Definition: times.F90:173
real, dimension(:,:,:), allocatable timer_table
Definition: times.F90:16
integer, dimension(:,:,:), allocatable timer_iteration
Definition: times.F90:18
integer, parameter timer_dissip
Definition: times.F90:9
logical, save, private alltimer_isactive
Definition: times.F90:4
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
real, dimension(:,:,:), allocatable timer_delta
Definition: times.F90:20
integer, parameter stopped
Definition: times.F90:11
integer, parameter running
Definition: times.F90:12
subroutine inittime
Definition: times.F90:213
real, dimension(:,:,:), allocatable timer_table_sqr
Definition: times.F90:17
real function diffcputime()
Definition: times.F90:239
Definition: times.F90:1
integer, save jj_nb
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
subroutine allgather_timer
Definition: times.F90:138
real, save, private last_cpucount
Definition: times.F90:3
subroutine suspend_timer(no_timer)
Definition: times.F90:70
logical, save using_mpi
subroutine start_timer(no_timer)
Definition: times.F90:51
integer, dimension(:), allocatable timer_state
Definition: times.F90:22
integer, parameter nb_timer
Definition: times.F90:6
integer max_size
Definition: times.F90:15
integer, parameter timer_vanleer
Definition: times.F90:8