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

Last change on this file since 149 was 149, checked in by sdubey, 11 years ago
Added few new routines to read NC files and compute diagnostics to r145.
Few routines of dry physics including radiation module, surface process and convective adjustment in new routine phyparam.f90. dynetat to read start files for dynamics. check_conserve routine to compute conservation of quatities like mass, energy etc.etat0_heldsz.f90 for held-suarez test case initial conditions. new Key time_style=lmd or dcmip to use day_step, ndays like in LMDZ
File size: 3.6 KB
Line 
1MODULE time_mod
2  use prec
3  PRIVATE
4
5  INTEGER,SAVE :: ncid
6  INTEGER,SAVE :: time_counter_id
7  INTEGER,SAVE :: it
8
9  REAL(rstd),SAVE :: dt
10  REAL(rstd),SAVE :: write_period
11  INTEGER,SAVE    :: itau_out, itau_adv, itau_dissip, itau_physics, itaumax
12 
13  INTEGER,SAVE :: day_step,ndays
14  REAL(rstd),SAVE :: jD_ref,jH_ref
15  INTEGER,SAVE :: day_ini,day_end,annee_ref,day_ref
16  REAL(rstd),SAVE::start_time
17  CHARACTER(LEN=255) :: time_style
18  INTEGER,SAVE:: an, mois, jour
19  REAL(rstd),SAVE:: heure
20  CHARACTER (LEN=10):: calend
21
22  PUBLIC create_time_counter_header, update_time_counter, close_time_counter, init_time,  &
23         dt, write_period, itau_out, itau_adv, itau_dissip, itau_physics, itaumax, & 
24day_step,ndays,jD_ref,jH_ref,day_ini,day_end,annee_ref,day_ref,an, mois, jour,heure, &
25            calend,time_style
26
27
28
29
30CONTAINS
31 
32  SUBROUTINE init_time
33  USE earth_const
34  USE ioipsl
35  USE mpipara
36  IMPLICIT NONE
37  REAL(rstd) :: run_length
38
39
40     time_style='dcmip'
41   CALL getin('time_style',time_style)
42
43   IF (TRIM(time_style)=='dcmip')  Then
44    dt=90.
45    CALL getin('dt',dt)
46
47    itaumax=100
48    CALL getin('itaumax',itaumax)
49
50    run_length=dt*itaumax
51    CALL getin('run_length',run_length)
52    itaumax=run_length/dt
53    IF (is_mpi_root)  THEN
54       PRINT *, 'itaumax=',itaumax
55       PRINT *, 'itau_adv=',itau_adv, 'itau_dissip=',itau_dissip, 'itau_physics=',itau_physics
56    END IF
57    dt=dt/scale_factor
58
59    write_period=0
60    CALL getin('write_period',write_period)
61    write_period=write_period/scale_factor
62    itau_out=FLOOR(.5+write_period/dt)
63    IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out
64    ENDIF
65
66    itau_adv=1
67    CALL getin('itau_adv',itau_adv)
68
69    itau_dissip=1
70    CALL getin('itau_dissip',itau_dissip)
71
72    itau_physics=1
73    CALL getin('itau_physics',itau_physics)
74
75   
76    CALL create_time_counter_header
77   
78  END SUBROUTINE init_time
79
80  SUBROUTINE create_time_counter_header
81  USE netcdf_mod
82  USE prec
83  USE ioipsl
84  USE mpipara
85  IMPLICIT NONE
86  INTEGER :: status
87  INTEGER :: timeid, dtid
88  REAL(rstd) :: dt
89  CHARACTER(LEN=255) :: time_frequency
90 
91    IF (is_mpi_root) THEN
92      status = NF90_CREATE('time_counter.nc', NF90_CLOBBER, ncid)
93      status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeid)
94      status = NF90_DEF_VAR(ncid,'time_counter',NF90_DOUBLE,(/ timeid /),time_counter_id)
95      status = NF90_PUT_ATT(ncid,time_counter_id,"long_name","time")
96      status = NF90_PUT_ATT(ncid,time_counter_id,"units","seconds since 2000-01-01 00:00:00")
97      status = NF90_PUT_ATT(ncid,time_counter_id,"calendar","noleap")
98      status = NF90_DEF_VAR(ncid,'mdt',NF90_DOUBLE,varid=dtid)
99
100      WRITE(time_frequency,*) write_period
101      PRINT*,TRIM(time_frequency)
102      status = NF90_PUT_ATT(ncid,NF90_GLOBAL,"time_frequency",TRIM(time_frequency)//"s")
103
104      status = NF90_ENDDEF(ncid) 
105
106      CALL getin("dt",dt)
107      status=NF90_PUT_VAR(ncid,dtid, dt)
108    ENDIF
109    it=0
110
111  END SUBROUTINE create_time_counter_header
112 
113  SUBROUTINE update_time_counter(time)
114  USE netcdf_mod
115  USE mpipara
116  USE prec
117  IMPLICIT NONE
118  REAL(rstd),INTENT(IN) ::time
119  INTEGER :: status
120  REAL(rstd) ::time_array(1)
121    time_array(1)=time
122 
123    it=it+1
124    IF (is_mpi_root) THEN
125      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
126      status=NF90_SYNC(ncid)
127    ENDIF
128
129  END SUBROUTINE update_time_counter   
130 
131  SUBROUTINE close_time_counter
132  USE netcdf_mod
133  USE mpipara
134  IMPLICIT NONE
135    INTEGER :: status
136   
137     IF (is_mpi_root) status=NF90_CLOSE(ncid)
138   
139  END SUBROUTINE  close_time_counter 
140
141END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.