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

Last change on this file was 899, checked in by adurocher, 5 years ago

trunk : Fixed GCC warnings

Fixed iso c bindings
fixed warnings with -Wall -Wno-aliasing -Wno-unused -Wno-unused-dummy-argument -Wno-maybe-uninitialized -Wno-tabs warnings
Removed all unused variables (-Wunused-variable)
vector%dot_product is now dot_product_3d to avoid compilation warning "dot_product shadows intrinsic" with GCC

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