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

Last change on this file since 314 was 314, checked in by ymipsl, 10 years ago
  • activate splitting of XIOS file in physics so starting time is passed to the physic initialiszation.
  • call restart file periodically using the - itau_write_etat0 - start parameter.

YM

File size: 4.6 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, itau_write_etat0
20!$OMP THREADPRIVATE(itau_out, itau_adv, itau_dissip, itau_physics, itaumax, itau_write_etat0) 
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,itau_write_etat0, 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  USE omp_para, ONLY: omp_master
54  IMPLICIT NONE
55  REAL(rstd) :: run_length
56
57
58   time_style='dcmip'
59   CALL getin('time_style',time_style)
60
61   IF (TRIM(time_style)=='dcmip')  Then
62    dt=90.
63    CALL getin('dt',dt)
64
65    itaumax=100
66    CALL getin('itaumax',itaumax)
67
68    run_length=dt*itaumax
69    CALL getin('run_length',run_length)
70    itaumax=run_length/dt
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 .AND. omp_master) 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    itau_write_etat0=HUGE(itau_write_etat0)
90    CALL getin('itau_write_etat0',itau_write_etat0)
91    itau_write_etat0=itau_write_etat0/dt
92
93    IF (is_mpi_root .AND. omp_master)  THEN
94       PRINT *, 'itaumax=',itaumax
95       PRINT *, 'itau_adv=',itau_adv, 'itau_dissip=',itau_dissip, 'itau_physics=',itau_physics
96    END IF
97   
98    CALL create_time_counter_header
99   
100  END SUBROUTINE init_time
101
102  SUBROUTINE create_time_counter_header
103  USE netcdf_mod
104  USE prec
105  USE getin_mod
106  USE mpipara
107  IMPLICIT NONE
108  INTEGER :: status
109  INTEGER :: timeid, dtid
110  REAL(rstd) :: dt
111  CHARACTER(LEN=255) :: time_frequency
112
113  CALL getin("dt",dt)
114
115!$OMP BARRIER
116!$OMP MASTER 
117    IF (is_mpi_root) THEN
118      status = NF90_CREATE('time_counter.nc', NF90_CLOBBER, ncid)
119      status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeid)
120      status = NF90_DEF_VAR(ncid,'time_counter',NF90_DOUBLE,(/ timeid /),time_counter_id)
121      status = NF90_PUT_ATT(ncid,time_counter_id,"long_name","time")
122      status = NF90_PUT_ATT(ncid,time_counter_id,"units","seconds since 2000-01-01 00:00:00")
123      status = NF90_PUT_ATT(ncid,time_counter_id,"calendar","noleap")
124      status = NF90_DEF_VAR(ncid,'mdt',NF90_DOUBLE,varid=dtid)
125
126      WRITE(time_frequency,*) write_period
127      PRINT*,TRIM(time_frequency)
128      status = NF90_PUT_ATT(ncid,NF90_GLOBAL,"time_frequency",TRIM(time_frequency)//"s")
129
130      status = NF90_ENDDEF(ncid) 
131
132      status=NF90_PUT_VAR(ncid,dtid, dt)
133    ENDIF
134    it=0
135!$OMP END MASTER
136!$OMP BARRIER
137
138  END SUBROUTINE create_time_counter_header
139 
140  SUBROUTINE update_time_counter(time)
141  USE netcdf_mod
142  USE mpipara
143  USE prec
144  IMPLICIT NONE
145  REAL(rstd),INTENT(IN) ::time
146  INTEGER :: status
147  REAL(rstd) ::time_array(1)
148
149!$OMP BARRIER
150!$OMP MASTER
151    time_array(1)=time
152 
153    it=it+1
154    IF (is_mpi_root) THEN
155      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
156      status=NF90_SYNC(ncid)
157    ENDIF
158!$OMP END MASTER
159!$OMP BARRIER
160
161  END SUBROUTINE update_time_counter   
162 
163  SUBROUTINE close_time_counter
164  USE netcdf_mod
165  USE mpipara
166  IMPLICIT NONE
167    INTEGER :: status
168   
169!$OMP BARRIER
170!$OMP MASTER
171     IF (is_mpi_root) status=NF90_CLOSE(ncid)
172!$OMP END MASTER
173!$OMP BARRIER
174   
175  END SUBROUTINE  close_time_counter 
176
177END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.