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

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

Synchronize trunk and Saturn branch.
Merge modification from trunk branch to Saturn branch.

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