source: codes/icosagcm/branches/SATURN_DYNAMICO/ICOSAGCM/src/time.f90 @ 221

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

Creating temporary dynamico/lmdz/saturn branche

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.