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
RevLine 
[82]1MODULE time_mod
[97]2  use prec
[82]3  PRIVATE
4
5  INTEGER,SAVE :: ncid
6  INTEGER,SAVE :: time_counter_id
7  INTEGER,SAVE :: it
8
[97]9  REAL(rstd),SAVE :: dt
10  REAL(rstd),SAVE :: write_period
[132]11  INTEGER,SAVE    :: itau_out, itau_adv, itau_dissip, itau_physics, itaumax
[97]12 
[149]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
[98]22  PUBLIC create_time_counter_header, update_time_counter, close_time_counter, init_time,  &
[149]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
[82]26
27
28
[149]29
[82]30CONTAINS
[97]31 
32  SUBROUTINE init_time
33  USE earth_const
34  USE ioipsl
[131]35  USE mpipara
[97]36  IMPLICIT NONE
37  REAL(rstd) :: run_length
[149]38
39
40     time_style='dcmip'
41   CALL getin('time_style',time_style)
42
43   IF (TRIM(time_style)=='dcmip')  Then
[97]44    dt=90.
45    CALL getin('dt',dt)
[82]46
[97]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
[132]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
[97]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)
[131]63    IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out
[149]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
[97]75   
76    CALL create_time_counter_header
77   
78  END SUBROUTINE init_time
79
[82]80  SUBROUTINE create_time_counter_header
81  USE netcdf_mod
82  USE prec
83  USE ioipsl
[131]84  USE mpipara
[82]85  IMPLICIT NONE
86  INTEGER :: status
87  INTEGER :: timeid, dtid
88  REAL(rstd) :: dt
[97]89  CHARACTER(LEN=255) :: time_frequency
90 
[131]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)
[97]99
[131]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")
[97]103
[131]104      status = NF90_ENDDEF(ncid) 
[82]105
[131]106      CALL getin("dt",dt)
107      status=NF90_PUT_VAR(ncid,dtid, dt)
108    ENDIF
[82]109    it=0
110
111  END SUBROUTINE create_time_counter_header
112 
113  SUBROUTINE update_time_counter(time)
114  USE netcdf_mod
[131]115  USE mpipara
[82]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
[131]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
[82]129  END SUBROUTINE update_time_counter   
130 
131  SUBROUTINE close_time_counter
132  USE netcdf_mod
[131]133  USE mpipara
[82]134  IMPLICIT NONE
135    INTEGER :: status
136   
[131]137     IF (is_mpi_root) status=NF90_CLOSE(ncid)
[82]138   
139  END SUBROUTINE  close_time_counter 
140
141END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.