SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_read_surf_ol.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.
6 !
7 !! PURPOSE
8 !! -------
9 !
10 ! The purpose of READ_SURF_OL is
11 !
12 !!** METHOD
13 !! ------
14 !!
15 !! EXTERNAL
16 !! --------
17 !!
18 !!
19 !!
20 !! IMPLICIT ARGUMENTS
21 !! ------------------
22 !!
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! F. Habets *METEO-FRANCE*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !!
36 !! original 01/08/03
37 !----------------------------------------------------------------------------
38 !
39 INTERFACE read_surf0_ol
40  SUBROUTINE read_surfx0_ol(HREC,PFIELD,KRESP,HCOMMENT)
41  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
42 REAL, INTENT(OUT) :: pfield ! the real scalar to be read
43 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
44  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
45 END SUBROUTINE read_surfx0_ol
46  SUBROUTINE read_surfn0_ol(HREC,KFIELD,KRESP,HCOMMENT)
47  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
48 INTEGER, INTENT(OUT) :: kfield ! the integer scalar to be read
49 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
50  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
51 END SUBROUTINE read_surfn0_ol
52  SUBROUTINE read_surfc0_ol(HREC,HFIELD,KRESP,HCOMMENT)
53  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
54  CHARACTER(LEN=40), INTENT(OUT) :: hfield ! the integer scalar to be read
55 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
56  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
57 END SUBROUTINE read_surfc0_ol
58  SUBROUTINE read_surfl0_ol(HREC,OFIELD,KRESP,HCOMMENT)
59  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
60 LOGICAL, INTENT(OUT) :: ofield ! array containing the data field
61 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
62  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
63 END SUBROUTINE read_surfl0_ol
64 END INTERFACE
65 INTERFACE read_surfn_ol
66  SUBROUTINE read_surfx1_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
67  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
68 REAL, DIMENSION(:), INTENT(OUT) :: pfield ! array containing the data field
69 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
70  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
71  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
72 END SUBROUTINE read_surfx1_ol
73  SUBROUTINE read_surfx2_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
74  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
75 REAL, DIMENSION(:,:), INTENT(OUT) :: pfield ! array containing the data field
76 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
77  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
78  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
79 END SUBROUTINE read_surfx2_ol
80  SUBROUTINE read_surfx3_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
81  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
82 REAL, DIMENSION(:,:,:), INTENT(OUT) :: pfield ! array containing the data field
83 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
84  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
85  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
86 END SUBROUTINE read_surfx3_ol
87  SUBROUTINE read_surfn1_ol(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
88  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
89 INTEGER, DIMENSION(:), INTENT(OUT) :: kfield ! the integer scalar to be read
90 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
91  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
92  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
93 END SUBROUTINE read_surfn1_ol
94  SUBROUTINE read_surfl1_ol(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
95  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
96 LOGICAL, DIMENSION(:), INTENT(OUT) :: ofield ! array containing the data field
97 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
98  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
99  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
100 END SUBROUTINE read_surfl1_ol
101 END INTERFACE
102 INTERFACE read_surft_ol
103  SUBROUTINE read_surft0_ol(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
104  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
105 INTEGER, INTENT(OUT) :: kyear ! year
106 INTEGER, INTENT(OUT) :: kmonth ! month
107 INTEGER, INTENT(OUT) :: kday ! day
108 REAL, INTENT(OUT) :: ptime ! time
109 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
110  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
111 END SUBROUTINE read_surft0_ol
112 END INTERFACE
113 !
114 END MODULE mode_read_surf_ol
115 !
116 ! #############################################################
117  SUBROUTINE read_surfx0_ol(HREC,PFIELD,KRESP,HCOMMENT)
118 ! #############################################################
119 !
120 !!**** *READX0* - routine to read a real scalar
121 !
122 USE modd_surf_par, ONLY: xundef
123 !
124 USE modi_ol_find_file_read
125 USE modi_error_read_surf_ol
126 !
127 USE yomhook ,ONLY : lhook, dr_hook
128 USE parkind1 ,ONLY : jprb
129 !
130 IMPLICIT NONE
131 !
132 include "netcdf.inc"
133 !
134 !* 0.1 Declarations of arguments
135 !
136  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
137 REAL, INTENT(OUT) :: pfield ! the real scalar to be read
138 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
139  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
140 !
141 !* 0.2 Declarations of local variables
142 !
143 REAL*4 :: zfield
144  CHARACTER(LEN=100) :: yfile ! filename
145 INTEGER :: ivar_id,ifile_id,jret,ival,itype,indims
146 INTEGER,DIMENSION(4) :: iret
147 REAL(KIND=JPRB) :: zhook_handle
148 !
149 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX0_OL',0,zhook_handle)
150 !
151 kresp=0
152 hcomment = " "
153 !
154 ! 0. find filename
155 ! -----------------
156  CALL ol_find_file_read(hrec,ifile_id)
157 !
158 IF (ifile_id.NE.0) THEN
159  !
160  ! 1. Find id of the variable
161  !----------------------------
162  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
163  iret(1)=nf_inq_vartype(ifile_id,ivar_id,itype)
164  iret(1)=nf_inq_varndims(ifile_id,ivar_id,indims)
165  !
166  ! 2. Get variable
167  !----------------------------
168  IF (itype==nf_double) THEN
169  iret(2)=nf_get_var_double(ifile_id,ivar_id,pfield)
170  ELSEIF (itype==nf_float) THEN
171  iret(2)=nf_get_var_real(ifile_id,ivar_id,zfield)
172  pfield = zfield
173  ENDIF
174  !
175 ENDIF
176 !
177 ! 3. Check for errors
178 !--------------------
179 DO jret=1,2
180  IF ((pfield==xundef).OR.(ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
181  pfield=xundef
182  kresp=1
183  ENDIF
184 ENDDO
185 !
186 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
187 !
188 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX0_OL',1,zhook_handle)
189 !
190 END SUBROUTINE read_surfx0_ol
191 !
192 ! #############################################################
193  SUBROUTINE read_surfx1_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
194 ! #############################################################
195 !
196 !!**** *READX1* - routine to fill a real 1D array for the externalised surface
197 !
198 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_read
199 !
200 USE modd_surfex_omp, ONLY : xworkd, nworkb
201 !
202 USE modd_io_surf_ol, ONLY: lmask,nmask,xstart,xcount,xstride,lpartr
203 !
204 USE modd_surf_par, ONLY: xundef
205 !
206 USE modi_ol_find_file_read
207 USE modi_error_read_surf_ol
209 !
210 USE yomhook ,ONLY : lhook, dr_hook
211 USE parkind1 ,ONLY : jprb
212 !
213 IMPLICIT NONE
214 !
215 include "netcdf.inc"
216 !
217 #ifdef SFX_MPI
218 include "mpif.h"
219 #endif
220 !
221 !* 0.1 Declarations of arguments
222 !
223  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
224 REAL, DIMENSION(:), INTENT(OUT) :: pfield ! array containing the data field
225 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
226  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
227  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
228  ! 'H' : field with
229  ! horizontal spatial dim.
230  ! '-' : no horizontal dim.
231 !* 0.2 Declarations of local variables
232 !
233  CHARACTER(LEN=100) :: yfile,yout ! Filename
234 INTEGER :: ivar_id,ifile_id,jret,jdim,indims, itype
235 INTEGER,DIMENSION(2) :: idimids,idimlen
236 INTEGER,DIMENSION(2) :: iret
237 !
238 INTEGER,DIMENSION(:),ALLOCATABLE :: istart,icount,istride
239 REAL*4, DIMENSION(:), ALLOCATABLE :: ztab_1d4
240 DOUBLE PRECISION :: xtime0
241 REAL(KIND=JPRB) :: zhook_handle
242 !
243 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX1_OL',0,zhook_handle)
244 !
245 !$OMP BARRIER
246 !
247 !$OMP SINGLE
248 nworkb=0
249 !$OMP END SINGLE
250 !
251 hcomment = " "
252 !
253 #ifdef SFX_MPI
254 xtime0 = mpi_wtime()
255 #endif
256 !
257 IF (nrank==npio) THEN
258  !
259 !$OMP SINGLE
260  !
261  ! 0. find filename
262  ! -----------------
263  CALL ol_find_file_read(hrec,ifile_id)
264  !
265  IF (ifile_id.NE.0) THEN
266  !
267  ! 1. Find id of the variable
268  !----------------------------
269  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
270  iret(1)=nf_inq_vartype(ifile_id,ivar_id,itype)
271  iret(1)=nf_inq_varndims(ifile_id,ivar_id,indims)
272  iret(1)=nf_inq_vardimid(ifile_id,ivar_id,idimids(1:indims))
273  idimlen(:) = 1.
274  DO jdim=1,indims
275  jret=nf_inq_dimlen(ifile_id,idimids(jdim),idimlen(jdim))
276  ENDDO
277  ALLOCATE(xworkd(idimlen(1)*idimlen(2)))
278  !
279  ! 2. Get variable
280  !----------------------------
281  IF (lpartr) THEN
282  ! write partially a time-matrix.
283  ! Have to find which of the dimension is the time dimension
284  ALLOCATE(istart(indims))
285  ALLOCATE(icount(indims))
286  ALLOCATE(istride(indims))
287  DO jdim=1,indims
288  iret=nf_inq_dimname(ifile_id,idimids(jdim),yout)
289  IF ((index(yout,'time') > 0).OR.(index(yout,'TIME') >0) &
290  .OR.(index(yout,'Time')>0.)) THEN
291  istart(jdim)=xstart
292  icount(jdim)=xcount
293  istride(jdim)=xstride
294  ELSE
295  istart(jdim)=1
296  icount(jdim)=idimlen(jdim)
297  istride(jdim)=1
298  ENDIF
299  ENDDO
300 
301  IF (itype==nf_double) THEN
302  iret(1)=nf_get_vars_double(ifile_id,ivar_id,istart,icount,istride,xworkd)
303  ELSEIF (itype==nf_float) THEN
304  ALLOCATE(ztab_1d4(idimlen(1)*idimlen(2)))
305  iret(1)=nf_get_vars_real(ifile_id,ivar_id,istart,icount,istride,ztab_1d4)
306  xworkd(:) = ztab_1d4(:)
307  DEALLOCATE(ztab_1d4)
308  ENDIF
309 
310  DEALLOCATE(istart)
311  DEALLOCATE(icount)
312  DEALLOCATE(istride)
313 
314  ELSE
315  IF (itype==nf_double) THEN
316  iret(1)=nf_get_var_double(ifile_id,ivar_id,xworkd)
317  ELSEIF (itype==nf_float) THEN
318  ALLOCATE(ztab_1d4(idimlen(1)*idimlen(2)))
319  iret(1)=nf_get_var_real(ifile_id,ivar_id,ztab_1d4)
320  xworkd(:) = ztab_1d4(:)
321  DEALLOCATE(ztab_1d4)
322  ENDIF
323  ENDIF
324  !
325  ENDIF
326  !
327  ! 3. Check for errors
328  !--------------------
329  DO jret=1,1
330  IF ((ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
331  xworkd = xundef
332  nworkb=1
333  ELSE
334  IF (minval(xworkd)==xundef) THEN
335  nworkb = 1
336  xworkd = xundef
337  ENDIF
338  ENDIF
339  ENDDO
340  !
341 !$OMP END SINGLE
342  !
343  IF (nworkb /=0) CALL error_read_surf_ol(hrec,nworkb)
344  !
345 ELSE
346 !$OMP SINGLE
347  ALLOCATE(xworkd(0))
348 !$OMP END SINGLE
349 ENDIF
350 !
351 kresp = nworkb
352 !
353 #ifdef SFX_MPI
354 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
355 #endif
356 !
357 IF (lmask) THEN
358  CALL read_and_send_mpi(xworkd,pfield,nmask)
359 ELSE
360  CALL read_and_send_mpi(xworkd,pfield)
361 END IF
362 !
363 !$OMP BARRIER
364 !
365 !$OMP SINGLE
366 DEALLOCATE(xworkd)
367 !$OMP END SINGLE
368 !
369 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX1_OL',1,zhook_handle)
370 !
371 END SUBROUTINE read_surfx1_ol
372 !
373 ! #############################################################
374  SUBROUTINE read_surfx2_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
375 ! #############################################################
376 !
377 !!**** *READX2* - routine to fill a real 2D array for the externalised surface
378 !
379 USE modd_surfex_mpi, ONLY: nrank, npio, xtime_npio_read
380 !
381 USE modd_surfex_omp, ONLY : xworkd2, nworkb
382 !
383 USE modd_io_surf_ol, ONLY: lmask,nmask,xstart,xcount,xstride,lpartr
384 USE modd_surf_par, ONLY: xundef
385 !
386 USE modi_ol_find_file_read
387 USE modi_error_read_surf_ol
389 !
390 USE yomhook ,ONLY : lhook, dr_hook
391 USE parkind1 ,ONLY : jprb
392 !
393 IMPLICIT NONE
394 !
395 include "netcdf.inc"
396 !
397 #ifdef SFX_MPI
398 include "mpif.h"
399 #endif
400 !
401 !* 0.1 Declarations of arguments
402 !
403  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
404 REAL, DIMENSION(:,:), INTENT(OUT) :: pfield ! array containing the data field
405 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
406  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
407  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
408  ! 'H' : field with
409  ! horizontal spatial dim.
410  ! '-' : no horizontal dim.
411 !* 0.2 Declarations of local variables
412 !
413  CHARACTER(LEN=100) :: yfile,yout ! filename
414 INTEGER :: ivar_id,ifile_id,jret,jdim,indims,itype
415 INTEGER,DIMENSION(3) :: idimids,idimlen
416 INTEGER,DIMENSION(2) :: iret
417 INTEGER, DIMENSION(:), ALLOCATABLE :: istart,istride,icount
418 REAL*4, DIMENSION(:,:), ALLOCATABLE :: ztab_2d4
419 DOUBLE PRECISION :: xtime0
420 REAL(KIND=JPRB) :: zhook_handle
421 !
422 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX2_OL',0,zhook_handle)
423 !
424 !$OMP BARRIER
425 !
426 !$OMP SINGLE
427 nworkb=0
428 !$OMP END SINGLE
429 !
430 hcomment = " "
431 !
432 #ifdef SFX_MPI
433 xtime0 = mpi_wtime()
434 #endif
435 !
436 IF (nrank==npio) THEN
437  !
438 !$OMP SINGLE
439  !
440  ! 0. find filename
441  ! -----------------
442  CALL ol_find_file_read(hrec,ifile_id)
443  !
444  IF (ifile_id.NE.0) THEN
445  !
446  ! 1. Find id of the variable
447  !----------------------------
448  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
449  iret(1)=nf_inq_vartype(ifile_id,ivar_id,itype)
450  iret(1)=nf_inq_varndims(ifile_id,ivar_id,indims)
451  iret(1)=nf_inq_vardimid(ifile_id,ivar_id,idimids(1:indims))
452  idimlen(:) = 1.
453  DO jdim=1,indims
454  jret=nf_inq_dimlen(ifile_id,idimids(jdim),idimlen(jdim))
455  ENDDO
456  !
457  ! 2. Get variable
458  !----------------------------
459  IF (lpartr) THEN
460  ! write partially a time-matrix.
461  ! Have to find which of the dimension is the time dimension
462  ALLOCATE(istart(indims))
463  ALLOCATE(icount(indims))
464  icount(:) = 1.
465  ALLOCATE(istride(indims))
466  DO jdim=1,indims
467  iret=nf_inq_dimname(ifile_id,idimids(jdim),yout)
468  IF ((index(yout,'time') > 0).OR.(index(yout,'TIME') >0) &
469  .OR.(index(yout,'Time')>0.)) THEN
470  istart(jdim)=xstart
471  icount(jdim)=xcount
472  istride(jdim)=xstride
473  ELSE
474  istart(jdim)=1
475  icount(jdim)=idimlen(jdim)
476  istride(jdim)=1
477  ENDIF
478  ENDDO
479 
480  ALLOCATE(xworkd2(product(icount(1:indims-1)),icount(indims)))
481  IF (itype==nf_double) THEN
482  iret(2)=nf_get_vars_double(ifile_id,ivar_id,istart,icount,istride,xworkd2)
483  ELSEIF (itype==nf_float) THEN
484  ALLOCATE(ztab_2d4(product(icount(1:indims-1)),icount(indims)))
485  iret(2)=nf_get_vars_real(ifile_id,ivar_id,istart,icount,istride,ztab_2d4)
486  xworkd2(:,:) = ztab_2d4(:,:)
487  DEALLOCATE(ztab_2d4)
488  ENDIF
489  DEALLOCATE(istart)
490  DEALLOCATE(icount)
491  DEALLOCATE(istride)
492 
493  ELSE
494  ALLOCATE(xworkd2(product(idimlen(1:indims-1)),idimlen(indims)))
495  IF (itype==nf_double) THEN
496  iret(2)=nf_get_var_double(ifile_id,ivar_id,xworkd2)
497  ELSEIF (itype==nf_float) THEN
498  ALLOCATE(ztab_2d4(product(idimlen(1:indims-1)),idimlen(indims)))
499  iret(2)=nf_get_var_real(ifile_id,ivar_id,ztab_2d4)
500  xworkd2(:,:) = ztab_2d4(:,:)
501  DEALLOCATE(ztab_2d4)
502  ENDIF
503  ENDIF
504 
505  ENDIF
506 
507  ! 3. Check for errors
508  !--------------------
509  DO jret=1,2
510  IF ((ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
511  xworkd2 = xundef
512  nworkb=1
513  ELSE
514  IF (minval(xworkd2)==xundef) THEN
515  nworkb=1
516  xworkd2 = xundef
517  ENDIF
518  ENDIF
519  ENDDO
520  !
521 !$OMP END SINGLE
522  !
523  IF (nworkb /=0) CALL error_read_surf_ol(hrec,nworkb)
524  !
525 ELSE
526 !$OMP SINGLE
527  ALLOCATE(xworkd2(0,0))
528 !$OMP END SINGLE
529 ENDIF
530 !
531 kresp = nworkb
532 !
533 #ifdef SFX_MPI
534 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
535 #endif
536 !
537 IF (lmask) THEN
538  CALL read_and_send_mpi(xworkd2,pfield,nmask)
539 ELSE
540  CALL read_and_send_mpi(xworkd2,pfield)
541 END IF
542 !
543 !$OMP BARRIER
544 !
545 !$OMP SINGLE
546 DEALLOCATE(xworkd2)
547 !$OMP END SINGLE
548 !
549 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX2_OL',1,zhook_handle)
550 !
551 END SUBROUTINE read_surfx2_ol
552 !
553 ! #############################################################
554  SUBROUTINE read_surfx3_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
555 ! #############################################################
556 !
557 !!**** *READX3* - routine to fill a real 2D array for the externalised surface
558 !
559 USE modd_surfex_mpi, ONLY: nrank, npio, xtime_npio_read
560 !
561 USE modd_surfex_omp, ONLY: xworkd3, nworkb
562 !
563 USE modd_io_surf_ol, ONLY: lmask,nmask,xstart,xcount,xstride,lpartr
564 USE modd_surf_par, ONLY: xundef
565 !
566 USE modi_ol_find_file_read
567 USE modi_error_read_surf_ol
569 !
570 USE yomhook ,ONLY : lhook, dr_hook
571 USE parkind1 ,ONLY : jprb
572 !
573 IMPLICIT NONE
574 !
575 include "netcdf.inc"
576 !
577 #ifdef SFX_MPI
578 include "mpif.h"
579 #endif
580 !
581 !* 0.1 Declarations of arguments
582 !
583  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
584 REAL, DIMENSION(:,:,:), INTENT(OUT) :: pfield ! array containing the data field
585 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
586  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
587  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
588  ! 'H' : field with
589  ! horizontal spatial dim.
590  ! '-' : no horizontal dim.
591 !* 0.2 Declarations of local variables
592 !
593  CHARACTER(LEN=100) :: yfile,yout ! filename
594 INTEGER :: ivar_id,ifile_id,jret,jdim,indims,itype
595 INTEGER,DIMENSION(3) :: idimids,idimlen
596 INTEGER,DIMENSION(2) :: iret
597 INTEGER, DIMENSION(:), ALLOCATABLE :: istart,istride,icount
598 REAL*4, DIMENSION(:,:,:), ALLOCATABLE :: ztab_3d4
599 DOUBLE PRECISION :: xtime0
600 REAL(KIND=JPRB) :: zhook_handle
601 !
602 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX3_OL',0,zhook_handle)
603 !
604 !$OMP BARRIER
605 !
606 !$OMP SINGLE
607 nworkb=0
608 !$OMP END SINGLE
609 !
610 hcomment = " "
611 !
612 #ifdef SFX_MPI
613 xtime0 = mpi_wtime()
614 #endif
615 !
616 IF (nrank==npio) THEN
617  !
618 !$OMP SINGLE
619  !
620  ! 0. find filename
621  ! -----------------
622  CALL ol_find_file_read(hrec,ifile_id)
623  !
624  IF (ifile_id.NE.0) THEN
625  !
626  ! 1. Find id of the variable
627  !----------------------------
628  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
629  iret(1)=nf_inq_vartype(ifile_id,ivar_id,itype)
630  iret(1)=nf_inq_varndims(ifile_id,ivar_id,indims)
631  iret(1)=nf_inq_vardimid(ifile_id,ivar_id,idimids(1:indims))
632  DO jdim=1,indims
633  jret=nf_inq_dimlen(ifile_id,idimids(jdim),idimlen(jdim))
634  ENDDO
635  !
636  ! 2. Get variable
637  !----------------------------
638  IF (lpartr) THEN
639  ! write partially a time-matrix.
640  ! Have to find which of the dimension is the time dimension
641  ALLOCATE(istart(indims))
642  ALLOCATE(icount(indims))
643  ALLOCATE(istride(indims))
644  DO jdim=1,indims
645  iret=nf_inq_dimname(ifile_id,idimids(jdim),yout)
646  IF ((index(yout,'time') > 0).OR.(index(yout,'TIME') >0) &
647  .OR.(index(yout,'Time')>0.)) THEN
648  istart(jdim)=xstart
649  icount(jdim)=xcount
650  istride(jdim)=xstride
651  ELSE
652  istart(jdim)=1
653  icount(jdim)=idimlen(jdim)
654  istride(jdim)=1
655  ENDIF
656  ENDDO
657 
658  ALLOCATE(xworkd3(icount(1),icount(2),icount(3)))
659 
660  IF (itype==nf_double) THEN
661  iret(2)=nf_get_vars_double(ifile_id,ivar_id,istart,icount,istride,xworkd3)
662  ELSEIF (itype==nf_float) THEN
663  ALLOCATE(ztab_3d4(icount(1),icount(2),icount(3)))
664  iret(2)=nf_get_vars_real(ifile_id,ivar_id,istart,icount,istride,ztab_3d4)
665  xworkd3(:,:,:) = ztab_3d4(:,:,:)
666  DEALLOCATE(ztab_3d4)
667  ENDIF
668  DEALLOCATE(istart)
669  DEALLOCATE(icount)
670  DEALLOCATE(istride)
671  !
672  ELSE
673  ALLOCATE(xworkd3(idimlen(1),idimlen(2),idimlen(3)))
674  IF (itype==nf_double) THEN
675  iret(2)=nf_get_var_double(ifile_id,ivar_id,xworkd3)
676  ELSEIF (itype==nf_float) THEN
677  ALLOCATE(ztab_3d4(icount(1),icount(2),icount(3)))
678  iret(2)=nf_get_var_real(ifile_id,ivar_id,ztab_3d4)
679  xworkd3(:,:,:) = ztab_3d4(:,:,:)
680  DEALLOCATE(ztab_3d4)
681  ENDIF
682  ENDIF
683  !
684  ENDIF
685  !
686  ! 3. Check for errors
687  !--------------------
688  DO jret=1,2
689  IF ((ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
690  xworkd3 = xundef
691  nworkb = 1
692  ELSE
693  IF (minval(xworkd3)==xundef) THEN
694  nworkb = 1
695  xworkd3 = xundef
696  ENDIF
697  ENDIF
698  ENDDO
699  !
700 !$OMP END SINGLE
701  !
702  IF (nworkb /=0) CALL error_read_surf_ol(hrec,nworkb)
703  !
704 ELSE
705 !$OMP SINGLE
706  ALLOCATE(xworkd3(0,0,0))
707 !$OMP END SINGLE
708 ENDIF
709 !
710 kresp = nworkb
711 !
712 #ifdef SFX_MPI
713 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
714 #endif
715 !
716 IF (lmask) THEN
717  CALL read_and_send_mpi(xworkd3,pfield,nmask)
718 ELSE
719  CALL read_and_send_mpi(xworkd3,pfield)
720 END IF
721 !
722 !$OMP BARRIER
723 !
724 !$OMP SINGLE
725 DEALLOCATE(xworkd3)
726 !$OMP END SINGLE
727 !
728 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX3_OL',1,zhook_handle)
729 !
730 END SUBROUTINE read_surfx3_ol
731 !
732 ! #############################################################
733  SUBROUTINE read_surfn0_ol(HREC,KFIELD,KRESP,HCOMMENT)
734 ! #############################################################
735 !
736 !!**** *READN0* - routine to read an integer
737 !
738 USE modd_surf_par, ONLY: nundef
739 !
740 USE modi_ol_find_file_read
741 USE modi_error_read_surf_ol
742 !
743 USE yomhook ,ONLY : lhook, dr_hook
744 USE parkind1 ,ONLY : jprb
745 !
746 IMPLICIT NONE
747 !
748 include "netcdf.inc"
749 !
750 !* 0.1 Declarations of arguments
751 !
752  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
753 INTEGER, INTENT(OUT) :: kfield ! the integer scalar to be read
754 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
755  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
756 !
757 !
758 !* 0.2 Declarations of local variables
759 !
760  CHARACTER(LEN=100):: yfile ! filename
761 INTEGER :: ivar_id,ifile_id,jret,jdim,indims
762 INTEGER,DIMENSION(4) :: iret
763 REAL(KIND=JPRB) :: zhook_handle
764 !
765 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN0_OL',0,zhook_handle)
766 !
767 kresp=0
768 hcomment = " "
769 !
770 ! 0. find filename
771 ! -----------------
772  CALL ol_find_file_read(hrec,ifile_id)
773 !
774 IF (ifile_id.NE.0) THEN
775  !
776  ! 1. Find id of the variable
777  !----------------------------
778  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
779  !
780  ! 2. Get variable
781  !----------------------------
782  iret(2)=nf_get_var_int(ifile_id,ivar_id,kfield)
783  !
784 ENDIF
785 !
786 ! 3. Check for errors
787 !--------------------
788 DO jret=1,2
789  IF ((kfield==nundef).OR.(ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
790  kfield=nundef
791  kresp=1
792  ENDIF
793 ENDDO
794 !
795 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
796 !
797 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN0_OL',1,zhook_handle)
798 !
799 END SUBROUTINE read_surfn0_ol
800 !
801 ! #############################################################
802  SUBROUTINE read_surfn1_ol(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
803 ! #############################################################
804 !
805 !!**** *READN0* - routine to read an integer
806 !
807 USE yomhook ,ONLY : lhook, dr_hook
808 USE parkind1 ,ONLY : jprb
809 !RJ: missing interface, assumed shape on callee
810 USE modi_read_surfx1_ol
811 !
812 IMPLICIT NONE
813 !
814 !* 0.1 Declarations of arguments
815 !
816  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
817 INTEGER, DIMENSION(:), INTENT(OUT) :: kfield ! the integer scalar to be read
818 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
819  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
820  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
821  ! 'H' : field with
822  ! horizontal spatial dim.
823  ! '-' : no horizontal dim.
824 !* 0.2 Declarations of local variables
825 !
826 REAL, DIMENSION(SIZE(KFIELD)) :: zfield
827 REAL(KIND=JPRB) :: zhook_handle
828 !
829 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN1_OL',0,zhook_handle)
830 !
831  CALL read_surfx1_ol(hrec,zfield,kresp,hcomment,hdir)
832 kfield = nint(zfield)
833 !
834 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN1_OL',1,zhook_handle)
835 !
836 END SUBROUTINE read_surfn1_ol
837 !
838 ! #############################################################
839  SUBROUTINE read_surfc0_ol(HREC,HFIELD,KRESP,HCOMMENT)
840 ! #############################################################
841 !
842 !!**** *READC0* - routine to read a STRING
843 !
844 USE modi_ol_find_file_read
845 USE modi_error_read_surf_ol
846 !
847 USE modd_surf_par, ONLY: xundef
848 !
849 USE yomhook ,ONLY : lhook, dr_hook
850 USE parkind1 ,ONLY : jprb
851 !
852 IMPLICIT NONE
853 !
854 include "netcdf.inc"
855 !
856 !* 0.1 Declarations of arguments
857 !
858  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
859  CHARACTER(LEN=40), INTENT(OUT) :: hfield ! the integer scalar to be read
860 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
861  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
862 !
863 !* 0.2 Declarations of local variables
864 !
865  CHARACTER(LEN=100):: yfile ! filename
866  CHARACTER(LEN=100):: yfield
867 INTEGER :: ivar_id,ifile_id,jret,jdim,indims
868 INTEGER,DIMENSION(4) :: iret
869 REAL(KIND=JPRB) :: zhook_handle
870 !
871 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFC0_OL',0,zhook_handle)
872 !
873 kresp=0
874 hcomment = " "
875 !
876 ! 0. find filename
877 ! -----------------
878  CALL ol_find_file_read(hrec,ifile_id)
879 !
880 IF (ifile_id.NE.0) THEN
881  !
882  ! 1. Find id of the variable
883  !----------------------------
884  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
885  !
886  ! 2. Get variable
887  !----------------------------
888  iret(2)=nf_get_var_text(ifile_id,ivar_id,yfield)
889  hfield=yfield(:len_trim(yfield))
890  !
891 ENDIF
892 
893 ! 3. Check for errors
894 !--------------------
895 DO jret=1,2
896  IF ((ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
897  kresp=1
898  ENDIF
899 ENDDO
900 !
901 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
902 !
903 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFC0_OL',1,zhook_handle)
904 !
905 END SUBROUTINE read_surfc0_ol
906 !
907 ! #############################################################
908  SUBROUTINE read_surfl0_ol(HREC,OFIELD,KRESP,HCOMMENT)
909 ! #############################################################
910 !
911 !!**** *READL0* - routine to read a logical
912 !
913 USE modi_ol_find_file_read
914 USE modi_error_read_surf_ol
915 !
916 USE modd_surf_par, ONLY: xundef
917 !
918 USE yomhook ,ONLY : lhook, dr_hook
919 USE parkind1 ,ONLY : jprb
920 !
921 IMPLICIT NONE
922 !
923 include "netcdf.inc"
924 !
925 !* 0.1 Declarations of arguments
926 !
927  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
928 LOGICAL, INTENT(OUT) :: ofield ! array containing the data field
929 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
930  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
931 !
932 !* 0.2 Declarations of local variables
933 !
934  CHARACTER(LEN=1) :: yfield ! work array read in the file
935  CHARACTER(LEN=100) :: yfile ! Filename
936 INTEGER :: ivar_id,ifile_id, jret
937 INTEGER,DIMENSION(2) :: iret
938 REAL(KIND=JPRB) :: zhook_handle
939 !
940 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL0_OL',0,zhook_handle)
941 !
942 kresp=0
943 hcomment = " "
944 !
945 ! 0. find filename
946 ! -----------------
947  CALL ol_find_file_read(hrec,ifile_id)
948 !
949 IF (ifile_id.NE.0) THEN
950  !
951  ! 1. Find id of the variable
952  !----------------------------
953  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
954  !
955  ! 2. Get variable
956  !----------------------------
957  iret(2)=nf_get_var_text(ifile_id,ivar_id,yfield)
958  !
959  IF (yfield =='T') ofield=.true.
960  IF (yfield =='F') ofield=.false.
961  !
962 ENDIF
963 !
964 ! 3. Check for errors
965 !--------------------
966 IF ((ifile_id==0).OR.iret(1).NE.nf_noerr) THEN
967  kresp=1
968 ENDIF
969 !
970 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
971 !
972 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL0_OL',1,zhook_handle)
973 !
974 END SUBROUTINE read_surfl0_ol
975 !
976 ! #############################################################
977  SUBROUTINE read_surfl1_ol(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
978 ! #############################################################
979 !
980 !!**** *READL1* - routine to read a logical array
981 !
982 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
983 !
984 USE modd_surfex_omp, ONLY : lworkd, nworkb
985 !
986 USE modi_ol_find_file_read
987 USE modi_error_read_surf_ol
988 !
989 USE modd_surf_par, ONLY: xundef
990 !
991 USE yomhook ,ONLY : lhook, dr_hook
992 USE parkind1 ,ONLY : jprb
993 !
994 IMPLICIT NONE
995 !
996 include "netcdf.inc"
997 !
998 #ifdef SFX_MPI
999 include "mpif.h"
1000 #endif
1001 !
1002 !* 0.1 Declarations of arguments
1003 !
1004  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1005 LOGICAL, DIMENSION(:), INTENT(OUT) :: ofield ! array containing the data field
1006 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1007  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1008  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
1009  ! 'H' : field with
1010  ! horizontal spatial dim.
1011  ! '-' : no horizontal dim.
1012 !* 0.2 Declarations of local variables
1013 !
1014  CHARACTER(LEN=100) :: yfile ! Filename
1015  CHARACTER(LEN=1), DIMENSION(:), ALLOCATABLE :: ytab_1d ! work array read in the file
1016 !
1017 INTEGER :: ivar_id,ifile_id,jret,jdim,indims
1018 INTEGER :: infompi
1019 INTEGER,DIMENSION(1) :: idimids,idimlen
1020 INTEGER,DIMENSION(2) :: iret
1021 INTEGER, DIMENSION(:), POINTER :: imask ! 1D mask to read only interesting
1022 DOUBLE PRECISION :: xtime0
1023 REAL(KIND=JPRB) :: zhook_handle
1024 !
1025 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL1_OL',0,zhook_handle)
1026 !
1027 !$OMP BARRIER
1028 !
1029 !$OMP SINGLE
1030 nworkb=0
1031 !$OMP END SINGLE
1032 !
1033 hcomment = " "
1034 !
1035 #ifdef SFX_MPI
1036 xtime0 = mpi_wtime()
1037 #endif
1038 !
1039 !$OMP SINGLE
1040 ALLOCATE(lworkd(SIZE(ofield)))
1041 !$OMP END SINGLE
1042 !
1043 IF (nrank==npio) THEN
1044  !
1045 !$OMP SINGLE
1046  !
1047  ! 0. find filename
1048  ! -----------------
1049  CALL ol_find_file_read(hrec,ifile_id)
1050  !
1051  IF (ifile_id.NE.0) THEN
1052  !
1053  ! 1. Find id of the variable
1054  !----------------------------
1055  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
1056  iret(1)=nf_inq_varndims(ifile_id,ivar_id,indims)
1057  iret(1)=nf_inq_vardimid(ifile_id,ivar_id,idimids)
1058  DO jdim=1,indims
1059  jret=nf_inq_dimlen(ifile_id,idimids(jdim),idimlen(jdim))
1060  ENDDO
1061  ALLOCATE(ytab_1d(idimlen(1)))
1062  !
1063  ! 2. Get variable
1064  !----------------------------
1065  iret(1)=nf_get_var_text(ifile_id,ivar_id,ytab_1d)
1066  !
1067  DO jret=1,idimlen(1)
1068  IF (ytab_1d(jret) =='T') lworkd(jret)=.true.
1069  IF (ytab_1d(jret) =='F') lworkd(jret)=.false.
1070  ENDDO
1071  !
1072  ENDIF
1073  !
1074  ! 3. Check for errors
1075  !--------------------
1076  DO jret=1,1
1077  IF ((ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
1078  nworkb=1
1079  ENDIF
1080  ENDDO
1081  !
1082  DEALLOCATE(ytab_1d)
1083  !
1084 !$OMP END SINGLE
1085  !
1086  IF (nworkb /=0) CALL error_read_surf_ol(hrec,nworkb)
1087  !
1088 ENDIF
1089 !
1090 kresp = nworkb
1091 !
1092 #ifdef SFX_MPI
1093 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
1094 #endif
1095 !
1096 IF (nproc>1) THEN
1097 #ifdef SFX_MPI
1098  xtime0 = mpi_wtime()
1099 !$OMP SINGLE
1100  CALL mpi_bcast(lworkd,SIZE(lworkd),mpi_logical,npio,ncomm,infompi)
1101 !$OMP END SINGLE
1102  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
1103 #endif
1104 ENDIF
1105 !
1106 ofield = lworkd
1107 !
1108 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL1_OL',1,zhook_handle)
1109 !
1110 END SUBROUTINE read_surfl1_ol
1111 !
1112 !
1113 ! #############################################################
1114  SUBROUTINE read_surft0_ol(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1115 ! #############################################################
1116 !
1117 !!**** *READT0* - routine to read a NETCDF date_time scalar
1118 !
1119 USE modi_ol_find_file_read
1120 USE modi_error_read_surf_ol
1121 !
1122 USE modd_surf_par, ONLY: xundef
1123 !
1124 USE yomhook ,ONLY : lhook, dr_hook
1125 USE parkind1 ,ONLY : jprb
1126 !
1127 IMPLICIT NONE
1128 !
1129 include "netcdf.inc"
1130 !
1131 !* 0.1 Declarations of arguments
1132 !
1133  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1134 INTEGER, INTENT(OUT) :: kyear ! year
1135 INTEGER, INTENT(OUT) :: kmonth ! month
1136 INTEGER, INTENT(OUT) :: kday ! day
1137 REAL, INTENT(OUT) :: ptime ! time
1138 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1139  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1140 
1141 !
1142 !* 0.2 Declarations of local variables
1143 !
1144  CHARACTER(LEN=18) :: yrecfm ! Name of the article to be written
1145  CHARACTER(LEN=100) :: yfile ! Filename
1146 INTEGER :: ivar_id,ifile_id,jret,jdim,indims,jwrk
1147 INTEGER, DIMENSION(1) :: idimids,idimlen
1148 INTEGER, DIMENSION(4) :: iret
1149 INTEGER, DIMENSION(3) :: itdate ! work array read in the file
1150 INTEGER, DIMENSION(:), POINTER :: imask ! 1D mask to read only interesting
1151 REAL:: ztime
1152 REAL(KIND=JPRB) :: zhook_handle
1153 !
1154 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFT0_OL',0,zhook_handle)
1155 !
1156 kresp=0
1157 hcomment = " "
1158 !
1159 DO jwrk=1,2
1160  IF (jwrk == 1) THEN
1161  yrecfm=trim(hrec)//'-TDATE'
1162  ELSE
1163  yrecfm=trim(hrec)//'-TIME'
1164  ENDIF
1165 ! 0. find filename
1166 ! -----------------
1167  CALL ol_find_file_read(yrecfm,ifile_id)
1168  !
1169  IF (ifile_id.NE.0) THEN
1170  !
1171  ! 1. Find id of the variable
1172  !----------------------------
1173  jret=nf_inq_varid(ifile_id,yrecfm,ivar_id)
1174  !
1175  ! 2. Get variable
1176  !----------------------------
1177  IF (jwrk == 1) THEN
1178  iret(jwrk)=nf_get_var_int(ifile_id,ivar_id,itdate)
1179  kyear = itdate(1)
1180  kmonth = itdate(2)
1181  kday = itdate(3)
1182  ELSE
1183  iret(jwrk)=nf_get_var_double(ifile_id,ivar_id,ptime)
1184  ENDIF
1185  ENDIF
1186 ENDDO
1187 !
1188 ! 3. Check for errors
1189 !--------------------
1190 DO jret=1,2
1191  IF ((ifile_id==0).OR.iret(jret).NE.nf_noerr) THEN
1192  kresp=1
1193  ENDIF
1194 ENDDO
1195 IF (kresp /=0) CALL error_read_surf_ol(yrecfm,kresp)
1196 !
1197 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFT0_OL',1,zhook_handle)
1198 !
1199 END SUBROUTINE read_surft0_ol
1200 !
subroutine read_surfx3_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfc0_ol(HREC, HFIELD, KRESP, HCOMMENT)
subroutine ol_find_file_read(HNAME, IFILE_ID)
subroutine read_surfx1_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfx2_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surft0_ol(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surfl0_ol(HREC, OFIELD, KRESP, HCOMMENT)
subroutine read_surfl1_ol(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfn0_ol(HREC, KFIELD, KRESP, HCOMMENT)
subroutine read_surfx0_ol(HREC, PFIELD, KRESP, HCOMMENT)
subroutine read_surfn1_ol(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine error_read_surf_ol(HREC, KRESP)