SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
ol_read_atm_conf_netcdf.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 ! #########
6 SUBROUTINE ol_read_atm_conf_netcdf (YSC, &
7  hsurf_filetype, &
8  pduration, ptstep_forc, kni, &
9  kyear, kmonth, kday, ptime, &
10  plat, plon, pzs, &
11  pzref, puref )
12 !
13 !==================================================================
14 !!**** *OL_READ_ATM_CONF* - Initialization routine
15 !!
16 !! PURPOSE
17 !! -------
18 !!
19 !!** METHOD
20 !! ------
21 !!
22 !! EXTERNAL
23 !! --------
24 !!
25 !!
26 !! IMPLICIT ARGUMENTS
27 !! ------------------
28 !!
29 !! REFERENCE
30 !! ---------
31 !!
32 !!
33 !! AUTHOR
34 !! ------
35 !! F. Habets *Meteo France*
36 !!
37 !! MODIFICATIONS
38 !! -------------
39 !! Original 01/2004
40 !! Modified by P. Le Moigne (04/2005): cleaning and checking
41 !! Modified by P. Le Moigne (04/2006): init_io_surf for nature
42 !! with GTMSK to read dimensions.
43 !! Modified by Matthieu Lafaysse 2012-11-12
44 !==================================================================
45 !
46 !
47 USE modd_surfex_n, ONLY : surfex_t
48 !
50 !
51 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc, xtime_comm_read, xtime_npio_read
52 !
53 USE modi_set_surfex_filein
54 USE modi_get_luout
55 USE modi_init_io_surf_n
57 USE modi_end_io_surf_n
58 USE modi_get_size_full_n
59 USE modi_abor1_sfx
60 !
62 !
63 USE yomhook ,ONLY : lhook, dr_hook
64 USE parkind1 ,ONLY : jprb
65 !
66 IMPLICIT NONE
67 !
68 #ifdef SFX_MPI
69 include "mpif.h"
70 #endif
71 !
72 TYPE(surfex_t), INTENT(INOUT) :: ysc
73 !
74  CHARACTER(LEN=6), INTENT(IN) :: hsurf_filetype
75 INTEGER, INTENT(OUT) :: kni
76 INTEGER, INTENT(OUT) :: kyear, kmonth, kday
77 REAL, INTENT(OUT) :: pduration,ptstep_forc
78 REAL, INTENT(OUT) :: ptime
79 REAL, DIMENSION(:), POINTER :: plat, plon
80 REAL, DIMENSION(:), POINTER :: pzs
81 REAL, DIMENSION(:), POINTER :: pzref, puref
82 !
83  CHARACTER(LEN=100) :: yunits
84 REAL :: ztime
85 REAL :: zfirsttimefile
86 INTEGER :: iyear, imonth, iday
87 INTEGER :: iret, inb_forc
88 INTEGER :: ini, idim_full
89 INTEGER :: iluout
90 INTEGER :: infompi
91 TYPE (date_time) :: ttime
92 TYPE (date_time) ,DIMENSION(1):: tz_firstdatefile
93 DOUBLE PRECISION :: xtime0
94 REAL(KIND=JPRB) :: zhook_handle
95 !
96 !==================================================================
97 !
98 !* 0. IO initialization
99 !
100 IF (lhook) CALL dr_hook('OL_READ_ATM_CONF_NETCDF',0,zhook_handle)
101 !
102 IF (nrank==npio) THEN
103  !
104 #ifdef SFX_MPI
105  xtime0 = mpi_wtime()
106 #endif
107  !
108  CALL get_luout(hsurf_filetype,iluout)
109  !
110  !* 1. Read parameters from netcdf forcing file
111  !
112  yunits = ""
113  CALL read_surf_dim_ol(yunits, inb_forc, ini, zfirsttimefile, iret)
114  !
115 #ifdef SFX_MPI
116  xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
117 #endif
118  !
119 ENDIF
120 !
121 IF (nproc>1) THEN
122 #ifdef SFX_MPI
123  xtime0 = mpi_wtime()
124  CALL mpi_bcast(inb_forc,kind(inb_forc)/4,mpi_integer,npio,ncomm,infompi)
125  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
126 #endif
127 ENDIF
128 !
129  CALL read_surf(&
130  'OFFLIN','FRC_TIME_STP' ,ptstep_forc ,iret)
131 !
132 pduration = ( inb_forc - 1 ) * ptstep_forc
133 !
134 !* 2. Read full grid dimension and date
135 !
136  CALL set_surfex_filein(hsurf_filetype,'PREP')
137  CALL init_io_surf_n(ysc%DTCO, ysc%DGU, ysc%U, &
138  hsurf_filetype,'FULL ','SURF ','READ ')
139 !
140  CALL read_surf(&
141  hsurf_filetype,'DIM_FULL',idim_full,iret)
142  CALL read_surf(&
143  hsurf_filetype,'DTCUR',ttime,iret)
144 !
145 kyear = ttime%TDATE%YEAR
146 kmonth = ttime%TDATE%MONTH
147 kday = ttime%TDATE%DAY
148 ptime = ttime%TIME
149 !
150  CALL end_io_surf_n(hsurf_filetype)
151 !
152 !* 5. Geographical initialization
153 !
154  CALL get_size_full_n(ysc%U, &
155  'OFFLIN ',idim_full,kni)
156 !
157 ALLOCATE(plon(kni))
158 ALLOCATE(plat(kni))
159 ALLOCATE(pzs(kni))
160 ALLOCATE(pzref(kni))
161 ALLOCATE(puref(kni))
162 !
163  CALL read_surf(&
164  'OFFLIN','LAT',plat,iret)
165  CALL read_surf(&
166  'OFFLIN','LON',plon,iret)
167  CALL read_surf(&
168  'OFFLIN','ZS',pzs,iret)
169  CALL read_surf(&
170  'OFFLIN','ZREF',pzref,iret)
171  CALL read_surf(&
172  'OFFLIN','UREF',puref,iret)
173 !
174 !* 6. Check the consistency
175 !
176 IF (nrank == npio) THEN
177  !
178  IF (idim_full /= ini) THEN
179  WRITE(iluout,*)' NUMBER OF GRID POINTS INCONSISTENCY: ',kni,'/',ini
180  CALL abor1_sfx('OL_READ_ATM_CONF_NETCDF: NUMBER OF GRID POINTS INCONSISTENCY')
181  ENDIF
182  !
183  CALL netcdf2date((/zfirsttimefile/),yunits,tz_firstdatefile)
184  iyear = tz_firstdatefile(1)%TDATE%YEAR
185  imonth = tz_firstdatefile(1)%TDATE%MONTH
186  iday = tz_firstdatefile(1)%TDATE%DAY
187  ztime = tz_firstdatefile(1)%TIME* 3600.
188  !
189  IF ( (kyear /= iyear) .OR. (kmonth /= imonth) .OR. (kday /= iday) ) THEN
190  WRITE(iluout,*)' DATE INCONSISTENCY: ',kyear,kmonth,kday,'/',iyear,imonth,iday
191  CALL abor1_sfx('OL_READ_ATM_CONF_NETCDF: DATE INCONSISTENCY')
192  ENDIF
193  !
194  IF ( ptime /= ztime ) THEN
195  WRITE(iluout,*)' TIME INCONSISTENCY: ',ptime,'/',ztime
196  CALL abor1_sfx('OL_READ_ATM_CONF_NETCDF: TIME INCONSISTENCY')
197  ENDIF
198  !
199 ENDIF
200 !
201 IF (lhook) CALL dr_hook('OL_READ_ATM_CONF_NETCDF',1,zhook_handle)
202 !==================================================================
203  CONTAINS
204 !
205 ! #############################################################
206  SUBROUTINE read_surf_dim_ol(HUNITS,KSIZE,KNI,PFIRSTTIMEFILE,KRESP)
207 ! #############################################################
208 !
209 USE modi_ol_find_file_read
210 !
211 IMPLICIT NONE
212 include "netcdf.inc"
213 !
214 !* 0.1 Declarations of arguments
215 !
216  CHARACTER(LEN=100), INTENT(OUT) :: hunits
217 INTEGER, INTENT(OUT) :: ksize
218 INTEGER, INTENT(OUT) :: kni
219 REAL, INTENT(OUT) :: pfirsttimefile
220 INTEGER, INTENT(OUT) :: kresp
221 !
222 !* 0.2 Declarations of local variables
223 !
224 INTEGER :: ifile_id,ivar_id,indims,jret,jdim,itype
225 INTEGER,DIMENSION(2) :: idimids,idimlen
226 INTEGER,DIMENSION(7) :: iret
227 
228 REAL*4,DIMENSION(:),ALLOCATABLE :: ztimefile4
229 REAL,DIMENSION(:),ALLOCATABLE :: ztimefile
230 INTEGER, DIMENSION(:), ALLOCATABLE :: itimefile
231 !
232 REAL(KIND=JPRB) :: zhook_handle
233 !-------------------------------------------------------------------------------
234 
235 IF (lhook) CALL dr_hook('OL_READ_ATM_CONF_NETCDF:READ_SURF_DIM_OL',0,zhook_handle)
236 kresp=0
237 
238 ! 0. find filename
239 ! -----------------
240  CALL ol_find_file_read('time',ifile_id)
241 
242 IF (ifile_id.NE.0) THEN
243 
244  ! 1. Find id of the variable
245  !----------------------------
246  iret(1)=nf_inq_varid(ifile_id,'time',ivar_id)
247  iret(2)=nf_inq_varndims(ifile_id,ivar_id,indims)
248  iret(3)=nf_inq_vardimid(ifile_id,ivar_id,idimids(1:1))
249  iret(4)=nf_inq_dimlen(ifile_id,idimids(1),ksize)
250  iret(5)=nf_get_att_text(ifile_id,ivar_id,'units',hunits)
251 
252  iret(6)=nf_inq_vartype(ifile_id,ivar_id,itype)
253 
254  SELECT CASE (itype)
255  CASE (nf_double)
256  ALLOCATE(ztimefile(ksize))
257  iret(7)=nf_get_var_double(ifile_id,ivar_id,ztimefile)
258  pfirsttimefile=ztimefile(1)
259  DEALLOCATE(ztimefile)
260  CASE (nf_float)
261  ALLOCATE(ztimefile4(ksize))
262  iret(7)=REAL(nf_get_var_real(ifile_id,ivar_id,ztimefile4))
263  pfirsttimefile=ztimefile4(1)
264  DEALLOCATE(ztimefile4)
265  CASE (nf_int)
266  ALLOCATE(itimefile(ksize))
267  iret(7)=REAL(nf_get_var_int(ifile_id,ivar_id,itimefile))
268  pfirsttimefile=itimefile(1)
269  DEALLOCATE(itimefile)
270  CASE default
271  CALL abor1_sfx('OL_READ_ATM_CONF_NETCDF: TYPE OF TIME VARIABLE NOT KNOWN')
272  END SELECT
273 
274  ! 3. Check for errors
275  !--------------------
276  DO jret=1,7
277  IF (ifile_id==0.OR.iret(jret).NE.nf_noerr) kresp=1
278  ENDDO
279 
280 ENDIF
281 
282  CALL ol_find_file_read('LON',ifile_id)
283 
284 IF (ifile_id.NE.0) THEN
285 
286  iret(1)=nf_inq_varid(ifile_id,'LON',ivar_id)
287  iret(2)=nf_inq_varndims(ifile_id,ivar_id,indims)
288  iret(3)=nf_inq_vardimid(ifile_id,ivar_id,idimids(:))
289  idimlen(:)=1.
290  DO jdim=1,indims
291  iret(4)=nf_inq_dimlen(ifile_id,idimids(jdim),idimlen(jdim))
292  ENDDO
293  kni = idimlen(1) * idimlen(2)
294 
295  DO jret=1,4
296  IF (ifile_id==0.OR.iret(jret).NE.nf_noerr) kresp=1
297  ENDDO
298 
299 ENDIF
300 !
301 IF (lhook) CALL dr_hook('OL_READ_ATM_CONF_NETCDF:READ_SURF_DIM_OL',1,zhook_handle)
302 !-------------------------------------------------------------------------------
303 END SUBROUTINE read_surf_dim_ol
304 !
305 END SUBROUTINE ol_read_atm_conf_netcdf
subroutine init_io_surf_n(DTCO, DGU, U, HPROGRAM, HMASK, HSCHEME, HACTION)
subroutine set_surfex_filein(HPROGRAM, HMASK)
subroutine ol_find_file_read(HNAME, IFILE_ID)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine end_io_surf_n(HPROGRAM)
Definition: end_io_surfn.F90:6
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine get_size_full_n(U, HPROGRAM, KDIM_FULL, KSIZE_FULL)
subroutine ol_read_atm_conf_netcdf(YSC, HSURF_FILETYPE, PDURATION, PTSTEP_FORC, KNI, KYEAR, KMONTH, KDAY, PTIME, PLAT, PLON, PZS, PZREF, PUREF)
subroutine netcdf2date(PTIME, HUNITS, PDATETIME)
subroutine read_surf_dim_ol(HUNITS, KSIZE, KNI, PFIRSTTIMEFILE, KRESP)