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

Last change on this file since 132 was 132, checked in by dubos, 11 years ago

Some steps towards coupling with transport

File size: 3.1 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  PUBLIC create_time_counter_header, update_time_counter, close_time_counter, init_time,  &
14         dt, write_period, itau_out, itau_adv, itau_dissip, itau_physics, itaumax
15
16
17
18CONTAINS
19 
20  SUBROUTINE init_time
21  USE earth_const
22  USE ioipsl
23  USE mpipara
24  IMPLICIT NONE
25  REAL(rstd) :: run_length
26 
27    dt=90.
28    CALL getin('dt',dt)
29
30    itaumax=100
31    CALL getin('itaumax',itaumax)
32
33    itau_adv=1
34    CALL getin('itau_adv',itau_adv)
35
36    itau_dissip=1
37    CALL getin('itau_dissip',itau_dissip)
38
39    itau_physics=1
40    CALL getin('itau_physics',itau_physics)
41
42    run_length=dt*itaumax
43    CALL getin('run_length',run_length)
44    itaumax=run_length/dt
45    IF (is_mpi_root)  THEN
46       PRINT *, 'itaumax=',itaumax
47       PRINT *, 'itau_adv=',itau_adv, 'itau_dissip=',itau_dissip, 'itau_physics=',itau_physics
48    END IF
49    dt=dt/scale_factor
50
51    write_period=0
52    CALL getin('write_period',write_period)
53    write_period=write_period/scale_factor
54    itau_out=FLOOR(.5+write_period/dt)
55    IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out
56   
57    CALL create_time_counter_header
58   
59  END SUBROUTINE init_time
60
61  SUBROUTINE create_time_counter_header
62  USE netcdf_mod
63  USE prec
64  USE ioipsl
65  USE mpipara
66  IMPLICIT NONE
67  INTEGER :: status
68  INTEGER :: timeid, dtid
69  REAL(rstd) :: dt
70  CHARACTER(LEN=255) :: time_frequency
71 
72    IF (is_mpi_root) THEN
73      status = NF90_CREATE('time_counter.nc', NF90_CLOBBER, ncid)
74      status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeid)
75      status = NF90_DEF_VAR(ncid,'time_counter',NF90_DOUBLE,(/ timeid /),time_counter_id)
76      status = NF90_PUT_ATT(ncid,time_counter_id,"long_name","time")
77      status = NF90_PUT_ATT(ncid,time_counter_id,"units","seconds since 2000-01-01 00:00:00")
78      status = NF90_PUT_ATT(ncid,time_counter_id,"calendar","noleap")
79      status = NF90_DEF_VAR(ncid,'mdt',NF90_DOUBLE,varid=dtid)
80
81      WRITE(time_frequency,*) write_period
82      PRINT*,TRIM(time_frequency)
83      status = NF90_PUT_ATT(ncid,NF90_GLOBAL,"time_frequency",TRIM(time_frequency)//"s")
84
85      status = NF90_ENDDEF(ncid) 
86
87      CALL getin("dt",dt)
88      status=NF90_PUT_VAR(ncid,dtid, dt)
89    ENDIF
90    it=0
91
92  END SUBROUTINE create_time_counter_header
93 
94  SUBROUTINE update_time_counter(time)
95  USE netcdf_mod
96  USE mpipara
97  USE prec
98  IMPLICIT NONE
99  REAL(rstd),INTENT(IN) ::time
100  INTEGER :: status
101  REAL(rstd) ::time_array(1)
102    time_array(1)=time
103 
104    it=it+1
105    IF (is_mpi_root) THEN
106      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
107      status=NF90_SYNC(ncid)
108    ENDIF
109
110  END SUBROUTINE update_time_counter   
111 
112  SUBROUTINE close_time_counter
113  USE netcdf_mod
114  USE mpipara
115  IMPLICIT NONE
116    INTEGER :: status
117   
118     IF (is_mpi_root) status=NF90_CLOSE(ncid)
119   
120  END SUBROUTINE  close_time_counter 
121
122END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.