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

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

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

YM

File size: 4.3 KB
RevLine 
[82]1MODULE time_mod
[97]2  use prec
[82]3  PRIVATE
4
5  INTEGER,SAVE :: ncid
[186]6!$OMP THREADPRIVATE(ncid) 
[82]7  INTEGER,SAVE :: time_counter_id
[186]8!$OMP THREADPRIVATE(time_counter_id) 
[82]9  INTEGER,SAVE :: it
[186]10!$OMP THREADPRIVATE(it) 
[82]11
[266]12  INTEGER,SAVE :: itau0=0
13!$OMP THREADPRIVATE(itau0) 
14
[97]15  REAL(rstd),SAVE :: dt
[186]16!$OMP THREADPRIVATE(dt) 
[97]17  REAL(rstd),SAVE :: write_period
[186]18!$OMP THREADPRIVATE(write_period) 
[132]19  INTEGER,SAVE    :: itau_out, itau_adv, itau_dissip, itau_physics, itaumax
[186]20!$OMP THREADPRIVATE(itau_out, itau_adv, itau_dissip, itau_physics, itaumax) 
[97]21 
[149]22  INTEGER,SAVE :: day_step,ndays
[186]23!$OMP THREADPRIVATE(day_step,ndays) 
[149]24  REAL(rstd),SAVE :: jD_ref,jH_ref
[186]25!$OMP THREADPRIVATE(jD_ref,jH_ref) 
[149]26  INTEGER,SAVE :: day_ini,day_end,annee_ref,day_ref
[186]27!$OMP THREADPRIVATE(day_ini,day_end,annee_ref,day_ref) 
[149]28  REAL(rstd),SAVE::start_time
[186]29!$OMP THREADPRIVATE(start_time) 
[149]30  CHARACTER(LEN=255) :: time_style
[186]31!$OMP THREADPRIVATE(time_style) 
[149]32  INTEGER,SAVE:: an, mois, jour
[186]33!$OMP THREADPRIVATE(an, mois, jour) 
[149]34  REAL(rstd),SAVE:: heure
[186]35!$OMP THREADPRIVATE(heure) 
[149]36  CHARACTER (LEN=10):: calend
[186]37!$OMP THREADPRIVATE(calend) 
[149]38
[98]39  PUBLIC create_time_counter_header, update_time_counter, close_time_counter, init_time,  &
[149]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, &
[266]42            calend,time_style,itau0
[82]43
44
45
[149]46
[82]47CONTAINS
[97]48 
49  SUBROUTINE init_time
50  USE earth_const
[186]51  USE getin_mod
[131]52  USE mpipara
[97]53  IMPLICIT NONE
54  REAL(rstd) :: run_length
[149]55
56
[186]57   time_style='dcmip'
[149]58   CALL getin('time_style',time_style)
59
60   IF (TRIM(time_style)=='dcmip')  Then
[97]61    dt=90.
62    CALL getin('dt',dt)
[82]63
[97]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)
[131]76    IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out
[149]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
[212]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
[97]92   
93    CALL create_time_counter_header
94   
95  END SUBROUTINE init_time
96
[82]97  SUBROUTINE create_time_counter_header
98  USE netcdf_mod
99  USE prec
[186]100  USE getin_mod
[131]101  USE mpipara
[82]102  IMPLICIT NONE
103  INTEGER :: status
104  INTEGER :: timeid, dtid
105  REAL(rstd) :: dt
[97]106  CHARACTER(LEN=255) :: time_frequency
[186]107
108  CALL getin("dt",dt)
109
110!$OMP BARRIER
111!$OMP MASTER 
[131]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)
[97]120
[131]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")
[97]124
[131]125      status = NF90_ENDDEF(ncid) 
[82]126
[131]127      status=NF90_PUT_VAR(ncid,dtid, dt)
128    ENDIF
[82]129    it=0
[186]130!$OMP END MASTER
131!$OMP BARRIER
[82]132
133  END SUBROUTINE create_time_counter_header
134 
135  SUBROUTINE update_time_counter(time)
136  USE netcdf_mod
[131]137  USE mpipara
[82]138  USE prec
139  IMPLICIT NONE
140  REAL(rstd),INTENT(IN) ::time
141  INTEGER :: status
142  REAL(rstd) ::time_array(1)
[151]143
[186]144!$OMP BARRIER
[151]145!$OMP MASTER
[82]146    time_array(1)=time
147 
148    it=it+1
[131]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
[151]153!$OMP END MASTER
[186]154!$OMP BARRIER
[131]155
[82]156  END SUBROUTINE update_time_counter   
157 
158  SUBROUTINE close_time_counter
159  USE netcdf_mod
[131]160  USE mpipara
[82]161  IMPLICIT NONE
162    INTEGER :: status
163   
[186]164!$OMP BARRIER
165!$OMP MASTER
[131]166     IF (is_mpi_root) status=NF90_CLOSE(ncid)
[186]167!$OMP END MASTER
168!$OMP BARRIER
[82]169   
170  END SUBROUTINE  close_time_counter 
171
172END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.