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

Last change on this file since 156 was 151, checked in by ymipsl, 11 years ago

Implementation of mixte parallelism MPI/OpenMP into src directory

YM

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
122!$OMP MASTER
123    time_array(1)=time
124 
125    it=it+1
126    IF (is_mpi_root) THEN
127      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
128      status=NF90_SYNC(ncid)
129    ENDIF
130!$OMP END MASTER
131
132  END SUBROUTINE update_time_counter   
133 
134  SUBROUTINE close_time_counter
135  USE netcdf_mod
136  USE mpipara
137  IMPLICIT NONE
138    INTEGER :: status
139   
140     IF (is_mpi_root) status=NF90_CLOSE(ncid)
141   
142  END SUBROUTINE  close_time_counter 
143
144END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.