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

Last change on this file since 278 was 278, checked in by dubos, 10 years ago

time_style cleanup

File size: 4.7 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    dt=90.
57    CALL getin('dt',dt)
58    write_period=0
59    CALL getin('write_period',write_period)
60    itaumax=100
61    CALL getin('itaumax',itaumax)   
62    run_length=dt*itaumax
63    CALL getin('run_length',run_length)
64    itaumax=run_length/dt
65   
66    time_style='dcmip'
67    CALL getin('time_style',time_style)
68    SELECT CASE(TRIM(time_style))
69    CASE('none') ! do nothing
70    CASE('dcmip') ! rescale time step for small-planet experiments
71       dt=dt/scale_factor       
72       write_period=write_period/scale_factor
73       IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period
74    CASE DEFAULT
75       IF (is_mpi_root) PRINT*,"Bad selector for variable time_style >",TRIM(time_style),"> options are <none>, <dcmip>"
76       STOP
77    END SELECT
78   
79    itau_out=FLOOR(.5+write_period/dt)
80    IF (is_mpi_root) PRINT *, 'Output frequency itau_out = ',itau_out
81
82    itau_adv=1
83    CALL getin('itau_adv',itau_adv)
84   
85    itau_dissip=1
86    CALL getin('itau_dissip',itau_dissip)
87   
88    itau_physics=1
89    CALL getin('itau_physics',itau_physics)
90   
91    IF (is_mpi_root)  THEN
92       PRINT *, 'itaumax=',itaumax
93       PRINT *, 'itau_adv=',itau_adv, 'itau_dissip=',itau_dissip, 'itau_physics=',itau_physics
94    END IF
95   
96    CALL create_time_counter_header
97   
98  END SUBROUTINE init_time
99
100  SUBROUTINE create_time_counter_header
101  USE netcdf_mod
102  USE prec
103  USE getin_mod
104  USE mpipara
105  IMPLICIT NONE
106  INTEGER :: status
107  INTEGER :: timeid, dtid
108  REAL(rstd) :: dt
109  CHARACTER(LEN=255) :: time_frequency
110
111  CALL getin("dt",dt)
112
113!$OMP BARRIER
114!$OMP MASTER 
115    IF (is_mpi_root) THEN
116      status = NF90_CREATE('time_counter.nc', NF90_CLOBBER, ncid)
117      status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeid)
118      status = NF90_DEF_VAR(ncid,'time_counter',NF90_DOUBLE,(/ timeid /),time_counter_id)
119      status = NF90_PUT_ATT(ncid,time_counter_id,"long_name","time")
120      status = NF90_PUT_ATT(ncid,time_counter_id,"units","seconds since 2000-01-01 00:00:00")
121      status = NF90_PUT_ATT(ncid,time_counter_id,"calendar","noleap")
122      status = NF90_DEF_VAR(ncid,'mdt',NF90_DOUBLE,varid=dtid)
123
124      WRITE(time_frequency,*) write_period
125      PRINT*,TRIM(time_frequency)
126      status = NF90_PUT_ATT(ncid,NF90_GLOBAL,"time_frequency",TRIM(time_frequency)//"s")
127
128      status = NF90_ENDDEF(ncid) 
129
130      status=NF90_PUT_VAR(ncid,dtid, dt)
131    ENDIF
132    it=0
133!$OMP END MASTER
134!$OMP BARRIER
135
136  END SUBROUTINE create_time_counter_header
137 
138  SUBROUTINE update_time_counter(time)
139  USE netcdf_mod
140  USE mpipara
141  USE prec
142  IMPLICIT NONE
143  REAL(rstd),INTENT(IN) ::time
144  INTEGER :: status
145  REAL(rstd) ::time_array(1)
146
147!$OMP BARRIER
148!$OMP MASTER
149    time_array(1)=time
150 
151    it=it+1
152    IF (is_mpi_root) THEN
153      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
154      status=NF90_SYNC(ncid)
155    ENDIF
156!$OMP END MASTER
157!$OMP BARRIER
158
159  END SUBROUTINE update_time_counter   
160 
161  SUBROUTINE close_time_counter
162  USE netcdf_mod
163  USE mpipara
164  IMPLICIT NONE
165    INTEGER :: status
166   
167!$OMP BARRIER
168!$OMP MASTER
169     IF (is_mpi_root) status=NF90_CLOSE(ncid)
170!$OMP END MASTER
171!$OMP BARRIER
172   
173  END SUBROUTINE  close_time_counter 
174
175END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.