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

Last change on this file since 211 was 186, checked in by ymipsl, 11 years ago

Add new openMP parallelism based on distribution of domains on threads. There is no more limitation of number of threads by MPI process.

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
[97]12  REAL(rstd),SAVE :: dt
[186]13!$OMP THREADPRIVATE(dt) 
[97]14  REAL(rstd),SAVE :: write_period
[186]15!$OMP THREADPRIVATE(write_period) 
[132]16  INTEGER,SAVE    :: itau_out, itau_adv, itau_dissip, itau_physics, itaumax
[186]17!$OMP THREADPRIVATE(itau_out, itau_adv, itau_dissip, itau_physics, itaumax) 
[97]18 
[149]19  INTEGER,SAVE :: day_step,ndays
[186]20!$OMP THREADPRIVATE(day_step,ndays) 
[149]21  REAL(rstd),SAVE :: jD_ref,jH_ref
[186]22!$OMP THREADPRIVATE(jD_ref,jH_ref) 
[149]23  INTEGER,SAVE :: day_ini,day_end,annee_ref,day_ref
[186]24!$OMP THREADPRIVATE(day_ini,day_end,annee_ref,day_ref) 
[149]25  REAL(rstd),SAVE::start_time
[186]26!$OMP THREADPRIVATE(start_time) 
[149]27  CHARACTER(LEN=255) :: time_style
[186]28!$OMP THREADPRIVATE(time_style) 
[149]29  INTEGER,SAVE:: an, mois, jour
[186]30!$OMP THREADPRIVATE(an, mois, jour) 
[149]31  REAL(rstd),SAVE:: heure
[186]32!$OMP THREADPRIVATE(heure) 
[149]33  CHARACTER (LEN=10):: calend
[186]34!$OMP THREADPRIVATE(calend) 
[149]35
[98]36  PUBLIC create_time_counter_header, update_time_counter, close_time_counter, init_time,  &
[149]37         dt, write_period, itau_out, itau_adv, itau_dissip, itau_physics, itaumax, & 
38day_step,ndays,jD_ref,jH_ref,day_ini,day_end,annee_ref,day_ref,an, mois, jour,heure, &
39            calend,time_style
[82]40
41
42
[149]43
[82]44CONTAINS
[97]45 
46  SUBROUTINE init_time
47  USE earth_const
[186]48  USE getin_mod
[131]49  USE mpipara
[97]50  IMPLICIT NONE
51  REAL(rstd) :: run_length
[149]52
53
[186]54   time_style='dcmip'
[149]55   CALL getin('time_style',time_style)
56
57   IF (TRIM(time_style)=='dcmip')  Then
[97]58    dt=90.
59    CALL getin('dt',dt)
[82]60
[97]61    itaumax=100
62    CALL getin('itaumax',itaumax)
63
64    run_length=dt*itaumax
65    CALL getin('run_length',run_length)
66    itaumax=run_length/dt
[132]67    IF (is_mpi_root)  THEN
68       PRINT *, 'itaumax=',itaumax
69       PRINT *, 'itau_adv=',itau_adv, 'itau_dissip=',itau_dissip, 'itau_physics=',itau_physics
70    END IF
[97]71    dt=dt/scale_factor
72
73    write_period=0
74    CALL getin('write_period',write_period)
75    write_period=write_period/scale_factor
76    itau_out=FLOOR(.5+write_period/dt)
[131]77    IF (is_mpi_root) PRINT *, 'Output frequency (scaled) set to ',write_period, ' : itau_out = ',itau_out
[149]78    ENDIF
79
80    itau_adv=1
81    CALL getin('itau_adv',itau_adv)
82
83    itau_dissip=1
84    CALL getin('itau_dissip',itau_dissip)
85
86    itau_physics=1
87    CALL getin('itau_physics',itau_physics)
88
[97]89   
90    CALL create_time_counter_header
91   
92  END SUBROUTINE init_time
93
[82]94  SUBROUTINE create_time_counter_header
95  USE netcdf_mod
96  USE prec
[186]97  USE getin_mod
[131]98  USE mpipara
[82]99  IMPLICIT NONE
100  INTEGER :: status
101  INTEGER :: timeid, dtid
102  REAL(rstd) :: dt
[97]103  CHARACTER(LEN=255) :: time_frequency
[186]104
105  CALL getin("dt",dt)
106
107!$OMP BARRIER
108!$OMP MASTER 
[131]109    IF (is_mpi_root) THEN
110      status = NF90_CREATE('time_counter.nc', NF90_CLOBBER, ncid)
111      status = NF90_DEF_DIM(ncid,'time_counter',NF90_UNLIMITED,timeid)
112      status = NF90_DEF_VAR(ncid,'time_counter',NF90_DOUBLE,(/ timeid /),time_counter_id)
113      status = NF90_PUT_ATT(ncid,time_counter_id,"long_name","time")
114      status = NF90_PUT_ATT(ncid,time_counter_id,"units","seconds since 2000-01-01 00:00:00")
115      status = NF90_PUT_ATT(ncid,time_counter_id,"calendar","noleap")
116      status = NF90_DEF_VAR(ncid,'mdt',NF90_DOUBLE,varid=dtid)
[97]117
[131]118      WRITE(time_frequency,*) write_period
119      PRINT*,TRIM(time_frequency)
120      status = NF90_PUT_ATT(ncid,NF90_GLOBAL,"time_frequency",TRIM(time_frequency)//"s")
[97]121
[131]122      status = NF90_ENDDEF(ncid) 
[82]123
[131]124      status=NF90_PUT_VAR(ncid,dtid, dt)
125    ENDIF
[82]126    it=0
[186]127!$OMP END MASTER
128!$OMP BARRIER
[82]129
130  END SUBROUTINE create_time_counter_header
131 
132  SUBROUTINE update_time_counter(time)
133  USE netcdf_mod
[131]134  USE mpipara
[82]135  USE prec
136  IMPLICIT NONE
137  REAL(rstd),INTENT(IN) ::time
138  INTEGER :: status
139  REAL(rstd) ::time_array(1)
[151]140
[186]141!$OMP BARRIER
[151]142!$OMP MASTER
[82]143    time_array(1)=time
144 
145    it=it+1
[131]146    IF (is_mpi_root) THEN
147      status=NF90_PUT_VAR(ncid,time_counter_id,time_array,start=(/ it /),count=(/ 1 /))
148      status=NF90_SYNC(ncid)
149    ENDIF
[151]150!$OMP END MASTER
[186]151!$OMP BARRIER
[131]152
[82]153  END SUBROUTINE update_time_counter   
154 
155  SUBROUTINE close_time_counter
156  USE netcdf_mod
[131]157  USE mpipara
[82]158  IMPLICIT NONE
159    INTEGER :: status
160   
[186]161!$OMP BARRIER
162!$OMP MASTER
[131]163     IF (is_mpi_root) status=NF90_CLOSE(ncid)
[186]164!$OMP END MASTER
165!$OMP BARRIER
[82]166   
167  END SUBROUTINE  close_time_counter 
168
169END MODULE time_mod
Note: See TracBrowser for help on using the repository browser.