source: codes/icosagcm/trunk/src/time.f90 @ 203

Last change on this file since 203 was 186, checked in by ymipsl, 10 years ago

Add new openMP parallelism based on distribution of domains on threads. There is no more limitation of number of threads by MPI process.

YM

File size: 4.3 KB
Line 
1MODULE time_mod
2  use prec
3  PRIVATE
4
5  INTEGER,SAVE :: ncid
6!$OMP THREADPRIVATE(ncid) 
7  INTEGER,SAVE :: time_counter_id
8!$OMP THREADPRIVATE(time_counter_id) 
9  INTEGER,SAVE :: it
10!$OMP THREADPRIVATE(it) 
11
12  REAL(rstd),SAVE :: dt
13!$OMP THREADPRIVATE(dt) 
14  REAL(rstd),SAVE :: write_period
15!$OMP THREADPRIVATE(write_period) 
16  INTEGER,SAVE    :: itau_out, itau_adv, itau_dissip, itau_physics, itaumax
17!$OMP THREADPRIVATE(itau_out, itau_adv, itau_dissip, itau_physics, itaumax) 
18 
19  INTEGER,SAVE :: day_step,ndays
20!$OMP THREADPRIVATE(day_step,ndays) 
21  REAL(rstd),SAVE :: jD_ref,jH_ref
22!$OMP THREADPRIVATE(jD_ref,jH_ref) 
23  INTEGER,SAVE :: day_ini,day_end,annee_ref,day_ref
24!$OMP THREADPRIVATE(day_ini,day_end,annee_ref,day_ref) 
25  REAL(rstd),SAVE::start_time
26!$OMP THREADPRIVATE(start_time) 
27  CHARACTER(LEN=255) :: time_style
28!$OMP THREADPRIVATE(time_style) 
29  INTEGER,SAVE:: an, mois, jour
30!$OMP THREADPRIVATE(an, mois, jour) 
31  REAL(rstd),SAVE:: heure
32!$OMP THREADPRIVATE(heure) 
33  CHARACTER (LEN=10):: calend
34!$OMP THREADPRIVATE(calend) 
35
36  PUBLIC create_time_counter_header, update_time_counter, close_time_counter, init_time,  &
37         dt, write_period, itau_out, itau_adv, itau_dissip, itau_physics, itaumax, & 
38day_step,ndays,jD_ref,jH_ref,day_ini,day_end,annee_ref,day_ref,an, mois, jour,heure, &
39            calend,time_style
40
41
42
43
44CONTAINS
45 
46  SUBROUTINE init_time
47  USE earth_const
48  USE getin_mod
49  USE mpipara
50  IMPLICIT NONE
51  REAL(rstd) :: run_length
52
53
54   time_style='dcmip'
55   CALL getin('time_style',time_style)
56
57   IF (TRIM(time_style)=='dcmip')  Then
58    dt=90.
59    CALL getin('dt',dt)
60
61    itaumax=100
62    CALL getin('itaumax',itaumax)
63
64    run_length=dt*itaumax
65    CALL getin('run_length',run_length)
66    itaumax=run_length/dt
67    IF (is_mpi_root)  THEN
68       PRINT *, 'itaumax=',itaumax
69       PRINT *, 'itau_adv=',itau_adv, 'itau_dissip=',itau_dissip, 'itau_physics=',itau_physics
70    END IF
71    dt=dt/scale_factor
72
73    write_period=0
74    CALL getin('write_period',write_period)
75    write_period=write_period/scale_factor
76    itau_out=FLOOR(.5+write_period/dt)
77    IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out
78    ENDIF
79
80    itau_adv=1
81    CALL getin('itau_adv',itau_adv)
82
83    itau_dissip=1
84    CALL getin('itau_dissip',itau_dissip)
85
86    itau_physics=1
87    CALL getin('itau_physics',itau_physics)
88
89   
90    CALL create_time_counter_header
91   
92  END SUBROUTINE init_time
93
94  SUBROUTINE create_time_counter_header
95  USE netcdf_mod
96  USE prec
97  USE getin_mod
98  USE mpipara
99  IMPLICIT NONE
100  INTEGER :: status
101  INTEGER :: timeid, dtid
102  REAL(rstd) :: dt
103  CHARACTER(LEN=255) :: time_frequency
104
105  CALL getin("dt",dt)
106
107!$OMP BARRIER
108!$OMP MASTER 
109    IF (is_mpi_root) THEN
110      status = NF90_CREATE('time_counter.nc', NF90_CLOBBER, ncid)
111      status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeid)
112      status = NF90_DEF_VAR(ncid,'time_counter',NF90_DOUBLE,(/ timeid /),time_counter_id)
113      status = NF90_PUT_ATT(ncid,time_counter_id,"long_name","time")
114      status = NF90_PUT_ATT(ncid,time_counter_id,"units","seconds since 2000-01-01 00:00:00")
115      status = NF90_PUT_ATT(ncid,time_counter_id,"calendar","noleap")
116      status = NF90_DEF_VAR(ncid,'mdt',NF90_DOUBLE,varid=dtid)
117
118      WRITE(time_frequency,*) write_period
119      PRINT*,TRIM(time_frequency)
120      status = NF90_PUT_ATT(ncid,NF90_GLOBAL,"time_frequency",TRIM(time_frequency)//"s")
121
122      status = NF90_ENDDEF(ncid) 
123
124      status=NF90_PUT_VAR(ncid,dtid, dt)
125    ENDIF
126    it=0
127!$OMP END MASTER
128!$OMP BARRIER
129
130  END SUBROUTINE create_time_counter_header
131 
132  SUBROUTINE update_time_counter(time)
133  USE netcdf_mod
134  USE mpipara
135  USE prec
136  IMPLICIT NONE
137  REAL(rstd),INTENT(IN) ::time
138  INTEGER :: status
139  REAL(rstd) ::time_array(1)
140
141!$OMP BARRIER
142!$OMP MASTER
143    time_array(1)=time
144 
145    it=it+1
146    IF (is_mpi_root) THEN
147      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
148      status=NF90_SYNC(ncid)
149    ENDIF
150!$OMP END MASTER
151!$OMP BARRIER
152
153  END SUBROUTINE update_time_counter   
154 
155  SUBROUTINE close_time_counter
156  USE netcdf_mod
157  USE mpipara
158  IMPLICIT NONE
159    INTEGER :: status
160   
161!$OMP BARRIER
162!$OMP MASTER
163     IF (is_mpi_root) status=NF90_CLOSE(ncid)
164!$OMP END MASTER
165!$OMP BARRIER
166   
167  END SUBROUTINE  close_time_counter 
168
169END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.