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
RevLine 
[1632]1module times
[5117]2  INTEGER,PRIVATE,save :: Last_Count=0
3  REAL, PRIVATE,save :: Last_cpuCount=0
[5113]4  logical, PRIVATE,save :: AllTimer_IsActive=.FALSE.
[1632]5 
[5117]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
[1632]14 
[5116]15  INTEGER :: max_size
[5117]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
[1632]23 
[5119]24  CONTAINS
[1632]25 
[5103]26  SUBROUTINE init_timer
[1823]27    USE parallel_lmdz
[5113]28    IMPLICIT NONE
[4593]29    INCLUDE "dimensions.h"
30    INCLUDE "paramet.h"
[1632]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     
[5103]48  END SUBROUTINE  init_timer
[1632]49 
[5103]50  SUBROUTINE start_timer(no_timer)
[5128]51
52
[5113]53    IMPLICIT NONE
[5116]54    INTEGER :: no_timer
[1632]55   
[5117]56    IF (AllTimer_IsActive) THEN
57      IF (timer_state(no_timer)/=stopped) THEN
[4469]58        CALL abort_gcm("times","start_timer :: timer is already running or suspended",1)
[1632]59      else
60        timer_state(no_timer)=running
61      endif
62     
63      timer_running(no_timer)=0
[5101]64      CALL cpu_time(last_time(no_timer))
[1632]65   
66    endif
67   
[5103]68  END SUBROUTINE  start_timer
[1632]69 
[5103]70  SUBROUTINE suspend_timer(no_timer)
[5113]71    IMPLICIT NONE
[5116]72    INTEGER :: no_timer
[1632]73     
[5117]74    IF (AllTimer_IsActive) THEN
75      IF (timer_state(no_timer)/=running) THEN
[4469]76         CALL abort_gcm("times","suspend_timer :: timer is not running",1)
[1632]77      else
78        timer_state(no_timer)=suspended
79      endif
80   
81      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
[5101]82      CALL cpu_time(last_time(no_timer))
[1632]83      timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
84    endif
[5103]85  END SUBROUTINE  suspend_timer
[1632]86 
[5103]87  SUBROUTINE resume_timer(no_timer)
[5113]88    IMPLICIT NONE
[5116]89    INTEGER :: no_timer
[1632]90     
[5117]91    IF (AllTimer_IsActive) THEN
92      IF (timer_state(no_timer)/=suspended) THEN
[4469]93        CALL abort_gcm("times","resume_timer :: timer is not suspended",1)
[1632]94      else
95        timer_state(no_timer)=running
96      endif
97     
[5101]98      CALL cpu_time(last_time(no_timer))
[1632]99    endif
100   
[5103]101  END SUBROUTINE  resume_timer
[1632]102
[5103]103  SUBROUTINE stop_timer(no_timer)
[1823]104    USE parallel_lmdz
[5113]105    IMPLICIT NONE
[5116]106    INTEGER :: no_timer
107    INTEGER :: N
108    REAL :: V,V2
[1632]109   
[5117]110    IF (AllTimer_IsActive) THEN
111      IF (timer_state(no_timer)/=running) THEN
[4469]112        CALL abort_gcm("times","stop_timer :: timer is not running",1)
[1632]113      else
114        timer_state(no_timer)=stopped
115      endif
116   
117      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
[5101]118      CALL cpu_time(last_time(no_timer))
[1632]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)
[5117]125      IF (timer_iteration(jj_nb,no_timer,mpi_rank)>=2) THEN
[1632]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   
[5103]135  END SUBROUTINE  stop_timer
[1632]136   
[5103]137  SUBROUTINE allgather_timer
[1823]138    USE parallel_lmdz
[4600]139    USE lmdz_mpi
[5113]140    IMPLICIT NONE
[4600]141
[5116]142    INTEGER :: ierr
143    INTEGER :: data_size
[5117]144    REAL, ALLOCATABLE,DIMENSION(:,:) :: tmp_table
[1632]145
146    IF (using_mpi) THEN   
147   
[5117]148      IF (AllTimer_IsActive) THEN
[1632]149      allocate(tmp_table(max_size,nb_timer))
150   
151      data_size=max_size*nb_timer
152   
153      tmp_table(:,:)=timer_table(:,:,mpi_rank)
[5101]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)
[1632]155      tmp_table(:,:)=timer_table_sqr(:,:,mpi_rank)
[5101]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)
[1632]157      deallocate(tmp_table)
158   
159      endif
160     
161    ENDIF ! using_mpi
162   
[5103]163  END SUBROUTINE  allgather_timer
[1632]164 
[5103]165  SUBROUTINE allgather_timer_average
[1823]166    USE parallel_lmdz
[4600]167    USE lmdz_mpi
[5113]168    IMPLICIT NONE
[5116]169    INTEGER :: ierr
170    INTEGER :: data_size
[5117]171    REAL, ALLOCATABLE,DIMENSION(:,:),target :: tmp_table
172    INTEGER, ALLOCATABLE,DIMENSION(:,:),target :: tmp_iter
[5116]173    INTEGER :: istats
[1632]174
175    IF (using_mpi) THEN
176       
[5117]177      IF (AllTimer_IsActive) THEN
[1632]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)
[5101]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)
[1632]185      tmp_table(:,:)=timer_delta(:,:,mpi_rank)
[5101]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)
[1632]187      tmp_iter(:,:)=timer_iteration(:,:,mpi_rank)
[5101]188      CALL mpi_allgather(tmp_iter(1,1),data_size,MPI_INTEGER,timer_iteration(1,1,0),data_size,MPI_INTEGER,COMM_LMDZ,ierr)
[1632]189      deallocate(tmp_table)
190   
191      endif
192     
[5093]193    ENDIF  ! using_mpi
[5103]194  END SUBROUTINE  allgather_timer_average
[1632]195 
[5103]196  SUBROUTINE InitTime
[5113]197  IMPLICIT NONE
[5116]198    INTEGER :: count,count_rate,count_max
[1632]199   
200    AllTimer_IsActive=.TRUE.
[5117]201    IF (AllTimer_IsActive) THEN
[5101]202      CALL system_clock(count,count_rate,count_max)
203      CALL cpu_time(Last_cpuCount)
[1632]204      Last_Count=count
205    endif
[5103]206  END SUBROUTINE  InitTime
[1632]207 
208  function DiffTime()
[5113]209  IMPLICIT NONE
[1632]210    double precision :: DiffTime
[5116]211    INTEGER :: count,count_rate,count_max
[1632]212 
[5101]213    CALL system_clock(count,count_rate,count_max)
[5117]214    IF (Count>=Last_Count) THEN
[1632]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
[5116]220  END FUNCTION DiffTime
[1632]221 
222  function DiffCpuTime()
[5113]223  IMPLICIT NONE
[5116]224    REAL :: DiffCpuTime
225    REAL :: Count
[1632]226   
[5101]227    CALL cpu_time(Count)
[1632]228    DiffCpuTime=Count-Last_cpuCount
229    Last_cpuCount=Count
[5116]230  END FUNCTION DiffCpuTime
[1632]231
[5119]232END MODULE times
Note: See TracBrowser for help on using the repository browser.