source: LMDZ6/branches/Amaury_dev/libf/dyn3dmem/times.F90 @ 5139

Last change on this file since 5139 was 5128, checked in by abarral, 8 weeks ago

Correct bug in vlspltqs_loc.f90 from r2270 where we call SSUM with incorrect arguments.
Merge the three different versions of abort_gcm into one
Fix seq, para 3D compilation broken from r5107 onwards
(lint) usual + Remove uneeded fixed-form continuations

  • Property copyright set to
    Name of program: LMDZ
    Creation date: 1984
    Version: LMDZ5
    License: CeCILL version 2
    Holder: Laboratoire de m\'et\'eorologie dynamique, CNRS, UMR 8539
    See the license file in the root directory
File size: 7.0 KB
Line 
1module 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_lmdz
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
52
53    IMPLICIT NONE
54    INTEGER :: no_timer
55   
56    IF (AllTimer_IsActive) THEN
57      IF (timer_state(no_timer)/=stopped) THEN
58        CALL abort_gcm("times","start_timer :: timer is already running or suspended",1)
59      else
60        timer_state(no_timer)=running
61      endif
62     
63      timer_running(no_timer)=0
64      CALL cpu_time(last_time(no_timer))
65   
66    endif
67   
68  END SUBROUTINE  start_timer
69 
70  SUBROUTINE suspend_timer(no_timer)
71    IMPLICIT NONE
72    INTEGER :: no_timer
73     
74    IF (AllTimer_IsActive) THEN
75      IF (timer_state(no_timer)/=running) THEN
76         CALL abort_gcm("times","suspend_timer :: timer is not running",1)
77      else
78        timer_state(no_timer)=suspended
79      endif
80   
81      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
82      CALL cpu_time(last_time(no_timer))
83      timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
84    endif
85  END SUBROUTINE  suspend_timer
86 
87  SUBROUTINE resume_timer(no_timer)
88    IMPLICIT NONE
89    INTEGER :: no_timer
90     
91    IF (AllTimer_IsActive) THEN
92      IF (timer_state(no_timer)/=suspended) THEN
93        CALL abort_gcm("times","resume_timer :: timer is not suspended",1)
94      else
95        timer_state(no_timer)=running
96      endif
97     
98      CALL cpu_time(last_time(no_timer))
99    endif
100   
101  END SUBROUTINE  resume_timer
102
103  SUBROUTINE stop_timer(no_timer)
104    USE parallel_lmdz
105    IMPLICIT NONE
106    INTEGER :: no_timer
107    INTEGER :: N
108    REAL :: V,V2
109   
110    IF (AllTimer_IsActive) THEN
111      IF (timer_state(no_timer)/=running) THEN
112        CALL abort_gcm("times","stop_timer :: timer is not running",1)
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_lmdz
139    USE lmdz_mpi
140    IMPLICIT NONE
141
142    INTEGER :: ierr
143    INTEGER :: data_size
144    REAL, ALLOCATABLE,DIMENSION(:,:) :: tmp_table
145
146    IF (using_mpi) THEN   
147   
148      IF (AllTimer_IsActive) THEN
149      allocate(tmp_table(max_size,nb_timer))
150   
151      data_size=max_size*nb_timer
152   
153      tmp_table(:,:)=timer_table(:,:,mpi_rank)
154      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)
155      tmp_table(:,:)=timer_table_sqr(:,:,mpi_rank)
156      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)
157      deallocate(tmp_table)
158   
159      endif
160     
161    ENDIF ! using_mpi
162   
163  END SUBROUTINE  allgather_timer
164 
165  SUBROUTINE allgather_timer_average
166    USE parallel_lmdz
167    USE lmdz_mpi
168    IMPLICIT NONE
169    INTEGER :: ierr
170    INTEGER :: data_size
171    REAL, ALLOCATABLE,DIMENSION(:,:),target :: tmp_table
172    INTEGER, ALLOCATABLE,DIMENSION(:,:),target :: tmp_iter
173    INTEGER :: istats
174
175    IF (using_mpi) THEN
176       
177      IF (AllTimer_IsActive) THEN
178      allocate(tmp_table(max_size,nb_timer))
179      allocate(tmp_iter(max_size,nb_timer))
180   
181      data_size=max_size*nb_timer
182
183      tmp_table(:,:)=timer_average(:,:,mpi_rank)
184      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)
185      tmp_table(:,:)=timer_delta(:,:,mpi_rank)
186      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)
187      tmp_iter(:,:)=timer_iteration(:,:,mpi_rank)
188      CALL mpi_allgather(tmp_iter(1,1),data_size,MPI_INTEGER,timer_iteration(1,1,0),data_size,MPI_INTEGER,COMM_LMDZ,ierr)
189      deallocate(tmp_table)
190   
191      endif
192     
193    ENDIF  ! using_mpi
194  END SUBROUTINE  allgather_timer_average
195 
196  SUBROUTINE InitTime
197  IMPLICIT NONE
198    INTEGER :: count,count_rate,count_max
199   
200    AllTimer_IsActive=.TRUE.
201    IF (AllTimer_IsActive) THEN
202      CALL system_clock(count,count_rate,count_max)
203      CALL cpu_time(Last_cpuCount)
204      Last_Count=count
205    endif
206  END SUBROUTINE  InitTime
207 
208  function DiffTime()
209  IMPLICIT NONE
210    double precision :: DiffTime
211    INTEGER :: count,count_rate,count_max
212 
213    CALL system_clock(count,count_rate,count_max)
214    IF (Count>=Last_Count) THEN
215      DiffTime=(1.*(Count-last_Count))/count_rate
216    else
217      DiffTime=(1.*(Count-last_Count+Count_max))/count_rate
218    endif
219    Last_Count=Count
220  END FUNCTION DiffTime
221 
222  function DiffCpuTime()
223  IMPLICIT NONE
224    REAL :: DiffCpuTime
225    REAL :: Count
226   
227    CALL cpu_time(Count)
228    DiffCpuTime=Count-Last_cpuCount
229    Last_cpuCount=Count
230  END FUNCTION DiffCpuTime
231
232END MODULE times
Note: See TracBrowser for help on using the repository browser.