SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_read_surf_nc.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_NC 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_nc
40  SUBROUTINE read_surfx0_nc(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_nc
46  SUBROUTINE read_surfn0_nc(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_nc
52  SUBROUTINE read_surfc0_nc(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_nc
58  SUBROUTINE read_surfl0_nc(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_nc
64 END INTERFACE
65 INTERFACE read_surfn_nc
66  SUBROUTINE read_surfx1_nc(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_nc
73  SUBROUTINE read_surfx2_nc(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_nc
80  SUBROUTINE read_surfn1_nc(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
81  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
82 INTEGER, DIMENSION(:), INTENT(OUT) :: kfield ! the integer scalar to be read
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_surfn1_nc
87  SUBROUTINE read_surfn2_nc(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_surfn2_nc
94  SUBROUTINE read_surfl1_nc(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_nc
101 END INTERFACE
102 INTERFACE read_surft_nc
103  SUBROUTINE read_surft0_nc(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_nc
112  SUBROUTINE read_surft1_nc(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
113  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
114 INTEGER, DIMENSION(:), INTENT(OUT) :: kyear ! year
115 INTEGER, DIMENSION(:), INTENT(OUT) :: kmonth ! month
116 INTEGER, DIMENSION(:), INTENT(OUT) :: kday ! day
117 REAL, DIMENSION(:), INTENT(OUT) :: ptime ! time
118 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
119  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
120 END SUBROUTINE read_surft1_nc
121  SUBROUTINE read_surft2_nc(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
122  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
123 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kyear ! year
124 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kmonth ! month
125 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kday ! day
126 REAL, DIMENSION(:,:), INTENT(OUT) :: ptime ! time
127 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
128  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
129 END SUBROUTINE read_surft2_nc
130 
131 END INTERFACE
132 !
133 END MODULE mode_read_surf_nc
134 !
135 ! #############################################################
136  SUBROUTINE read_surfx0_nc(HREC,PFIELD,KRESP,HCOMMENT)
137 ! #############################################################
138 !
139 !!**** *READX0* - routine to read a real scalar
140 !
141 USE modd_surf_par, ONLY: xundef
142 !
143 USE modd_io_surf_nc, ONLY : nid_nc
144 !
145 USE modi_error_read_surf_nc
146 !
147 USE yomhook ,ONLY : lhook, dr_hook
148 USE parkind1 ,ONLY : jprb
149 !
150 IMPLICIT NONE
151 !
152 include "netcdf.inc"
153 !
154 !* 0.1 Declarations of arguments
155 !
156  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
157 REAL, INTENT(OUT) :: pfield ! the real scalar to be read
158 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
159  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
160 !
161 !* 0.2 Declarations of local variables
162 !
163 REAL*4 :: zfield
164  CHARACTER(LEN=100) :: yfile ! filename
165 INTEGER :: ivar_id,jret,ival,itype,indims
166 INTEGER,DIMENSION(4) :: iret
167 REAL(KIND=JPRB) :: zhook_handle
168 !
169 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX0_NC',0,zhook_handle)
170 !
171 kresp=0
172 hcomment = " "
173 !
174 IF (nid_nc.NE.0) THEN
175  !
176  ! 1. Find id of the variable
177  !----------------------------
178  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
179  iret(1)=nf_inq_vartype(nid_nc,ivar_id,itype)
180  iret(1)=nf_inq_varndims(nid_nc,ivar_id,indims)
181  !
182  ! 2. Get variable
183  !----------------------------
184  IF (itype==nf_double) THEN
185  iret(2)=nf_get_var_double(nid_nc,ivar_id,pfield)
186  ELSEIF (itype==nf_float) THEN
187  iret(2)=nf_get_var_real(nid_nc,ivar_id,zfield)
188  pfield = zfield
189  ENDIF
190  !
191  iret(3) = nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
192  !
193 ENDIF
194 !
195 ! 3. Check for errors
196 !--------------------
197 DO jret=1,2
198  IF ((pfield==xundef).OR.(nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
199  pfield=xundef
200  kresp=1
201  ENDIF
202 ENDDO
203 !
204 IF (kresp /=0) CALL error_read_surf_nc(hrec,kresp)
205 !
206 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX0_NC',1,zhook_handle)
207 !
208 END SUBROUTINE read_surfx0_nc
209 !
210 ! #############################################################
211  SUBROUTINE read_surfx1_nc(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
212 ! #############################################################
213 !
214 !!**** *READX1* - routine to fill a real 1D array for the externalised surface
215 !
216 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_read, nproc, ncomm, &
217  xtime_npio_read, xtime_comm_read
218 !
219 USE modd_surfex_omp, ONLY : xworkd, nworkb, cwork0
220 !
221 USE modd_io_surf_nc, ONLY: lmask,nmask,nid_nc
222 !
223 USE modd_surf_par, ONLY: xundef
224 !
225 USE modi_error_read_surf_nc
227 !
228 USE yomhook ,ONLY : lhook, dr_hook
229 USE parkind1 ,ONLY : jprb
230 !
231 IMPLICIT NONE
232 !
233 include "netcdf.inc"
234 !
235 #ifdef SFX_MPI
236 include "mpif.h"
237 #endif
238 !
239 !* 0.1 Declarations of arguments
240 !
241  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
242 REAL, DIMENSION(:), INTENT(OUT) :: pfield ! array containing the data field
243 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
244  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
245  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
246  ! 'H' : field with
247  ! horizontal spatial dim.
248  ! '-' : no horizontal dim.
249 !* 0.2 Declarations of local variables
250 !
251  CHARACTER(LEN=100) :: yfile,yout ! Filename
252  CHARACTER(LEN=100) :: yname
253 INTEGER :: il1, ivar_id,jret,jdim,indims, itype, infompi
254 INTEGER,DIMENSION(4) :: idimids,idimlen
255 INTEGER,DIMENSION(4) :: iret
256 !
257 REAL*4, DIMENSION(:), ALLOCATABLE :: ztab_1d4
258 DOUBLE PRECISION :: xtime0
259 REAL(KIND=JPRB) :: zhook_handle
260 !
261 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX1_NC',0,zhook_handle)
262 !
263 il1 = SIZE(pfield)
264 !
265 !$OMP SINGLE
266 nworkb=0
267  cwork0 = " "
268 !$OMP END SINGLE
269 !
270 hcomment = " "
271 !
272 #ifdef SFX_MPI
273 xtime0 = mpi_wtime()
274 #endif
275 !
276 IF (hdir=='-') THEN
277 !$OMP SINGLE
278  ALLOCATE(xworkd(il1))
279 !$OMP END SINGLE
280 ENDIF
281 !
282 IF (nrank==npio) THEN
283  !
284 !$OMP SINGLE
285  !
286  IF (nid_nc.NE.0) THEN
287  !
288  ! 1. Find id of the variable
289  !----------------------------
290  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
291  iret(2)=nf_inq_vartype(nid_nc,ivar_id,itype)
292  !
293  IF (hdir=='A') THEN
294  !
295  ALLOCATE(xworkd(il1))
296  !
297  ELSEIF (hdir/='-') THEN
298  !
299  iret(3)=nf_inq_varndims(nid_nc,ivar_id,indims)
300  iret(4)=nf_inq_vardimid(nid_nc,ivar_id,idimids(1:indims))
301  idimlen(:) = 1.
302  DO jdim=1,indims
303  jret=nf_inq_dimlen(nid_nc,idimids(jdim),idimlen(jdim))
304  ENDDO
305  iret(4)=nf_inq_dimname(nid_nc,idimids(1),yname)
306  !
307  IF (trim(yname).NE.'Number_of_points') THEN
308  ALLOCATE(xworkd(idimlen(1)*idimlen(2)))
309  ELSE
310  ALLOCATE(xworkd(idimlen(1)))
311  ENDIF
312  !
313  ENDIF
314  !
315  ! 2. Get variable
316  !----------------------------
317  IF (itype==nf_double) THEN
318  iret(1)=nf_get_var_double(nid_nc,ivar_id,xworkd)
319  ELSEIF (itype==nf_float) THEN
320  ALLOCATE(ztab_1d4(SIZE(xworkd)))
321  iret(2)=nf_get_var_real(nid_nc,ivar_id,ztab_1d4)
322  xworkd(:) = ztab_1d4(:)
323  DEALLOCATE(ztab_1d4)
324  ENDIF
325  !
326  iret(3) = nf_get_att_text(nid_nc,ivar_id,"comment",cwork0)
327  !
328  ENDIF
329  !
330  ! 3. Check for errors
331  !--------------------
332  DO jret=1,1
333  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
334  xworkd = xundef
335  nworkb=1
336  ENDIF
337  ENDDO
338  !
339 !$OMP END SINGLE
340  !
341  IF (nworkb /=0) CALL error_read_surf_nc(hrec,nworkb)
342  !
343 ELSEIF (hdir/='-') THEN
344 !$OMP SINGLE
345  ALLOCATE(xworkd(0))
346 !$OMP END SINGLE
347 ENDIF
348 !
349 kresp = nworkb
350 hcomment = cwork0
351 !
352 #ifdef SFX_MPI
353 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
354 #endif
355 !
356 IF (hdir=='A') THEN ! no distribution on other tasks
357  IF ( nrank==npio ) THEN
358 #ifdef SFX_MPI
359  xtime0 = mpi_wtime()
360 #endif
361  pfield(:) = xworkd(1:SIZE(pfield))
362 #ifdef SFX_MPI
363  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
364 #endif
365  ENDIF
366 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
367 !$OMP SINGLE
368 #ifdef SFX_MPI
369  IF (nproc>1) THEN
370  xtime0 = mpi_wtime()
371  CALL mpi_bcast(xworkd,SIZE(xworkd)*kind(xworkd)/4,mpi_real,npio,ncomm,infompi)
372  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
373  ENDIF
374 #endif
375 !$OMP END SINGLE
376  pfield(:) = xworkd(1:SIZE(pfield))
377 ELSE
378  IF (lmask) THEN
379  CALL read_and_send_mpi(xworkd,pfield,nmask)
380  ELSE
381  CALL read_and_send_mpi(xworkd,pfield)
382  END IF
383 ENDIF
384 !
385 !$OMP BARRIER
386 !
387 !$OMP SINGLE
388 DEALLOCATE(xworkd)
389 !$OMP END SINGLE
390 !
391 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX1_NC',1,zhook_handle)
392 !
393 END SUBROUTINE read_surfx1_nc
394 !
395 ! #############################################################
396  SUBROUTINE read_surfx2_nc(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
397 ! #############################################################
398 !
399 !!**** *READX2* - routine to fill a real 2D array for the externalised surface
400 !
401 USE modd_surfex_mpi, ONLY: nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
402 !
403 USE modd_surfex_omp, ONLY : xworkd2, nworkb, cwork0
404 !
405 USE modd_io_surf_nc, ONLY: lmask,nmask,nid_nc
406 !
407 USE modd_surf_par, ONLY: xundef
408 !
409 USE modi_error_read_surf_nc
411 !
412 USE yomhook ,ONLY : lhook, dr_hook
413 USE parkind1 ,ONLY : jprb
414 !
415 IMPLICIT NONE
416 !
417 include "netcdf.inc"
418 !
419 #ifdef SFX_MPI
420 include "mpif.h"
421 #endif
422 !
423 !* 0.1 Declarations of arguments
424 !
425  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
426 REAL, DIMENSION(:,:), INTENT(OUT) :: pfield ! array containing the data field
427 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
428  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
429  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
430  ! 'H' : field with
431  ! horizontal spatial dim.
432  ! '-' : no horizontal dim.
433 !* 0.2 Declarations of local variables
434 !
435  CHARACTER(LEN=100) :: yfile,yout ! filename
436  CHARACTER(LEN=100) :: yname
437 INTEGER :: il1, il2
438 INTEGER :: ivar_id,jret,jdim,indims,itype, infompi
439 INTEGER,DIMENSION(4) :: idimids,idimlen
440 INTEGER,DIMENSION(4) :: iret
441 REAL*4, DIMENSION(:,:), ALLOCATABLE :: ztab_2d4
442 DOUBLE PRECISION :: xtime0
443 REAL(KIND=JPRB) :: zhook_handle
444 !
445 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX2_NC',0,zhook_handle)
446 !
447 il1 = SIZE(pfield,1)
448 il2 = SIZE(pfield,2)
449 !
450 !$OMP SINGLE
451 nworkb=0
452  cwork0 = " "
453 !$OMP END SINGLE
454 !
455 hcomment = " "
456 !
457 #ifdef SFX_MPI
458 xtime0 = mpi_wtime()
459 #endif
460 !
461 IF (hdir=='-') THEN
462 !$OMP SINGLE
463  ALLOCATE(xworkd2(il1,il2))
464 !$OMP END SINGLE
465 ENDIF
466 !
467 IF (nrank==npio) THEN
468  !
469 !$OMP SINGLE
470  !
471  IF (nid_nc.NE.0) THEN
472  !
473  ! 1. Find id of the variable
474  !----------------------------
475  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
476  iret(2)=nf_inq_vartype(nid_nc,ivar_id,itype)
477  !
478  IF (hdir=='A') THEN
479  !
480  ALLOCATE(xworkd2(il1,il2))
481  !
482  ELSEIF (hdir/='-') THEN
483  !
484  iret(3)=nf_inq_varndims(nid_nc,ivar_id,indims)
485  iret(4)=nf_inq_vardimid(nid_nc,ivar_id,idimids(1:indims))
486  idimlen(:) = 1.
487  DO jdim=1,indims
488  jret=nf_inq_dimlen(nid_nc,idimids(jdim),idimlen(jdim))
489  ENDDO
490  !
491  iret(4)=nf_inq_dimname(nid_nc,idimids(1),yname)
492  !
493  IF (trim(yname).NE.'Number_of_points') THEN
494  ALLOCATE(xworkd2(idimlen(1)*idimlen(2),idimlen(3)))
495  ELSE
496  ALLOCATE(xworkd2(idimlen(1),idimlen(2)))
497  ENDIF
498  !
499  ENDIF
500  !
501  ! 2. Get variable
502  !----------------------------
503  !
504  IF (itype==nf_double) THEN
505  iret(2)=nf_get_var_double(nid_nc,ivar_id,xworkd2)
506  ELSEIF (itype==nf_float) THEN
507  ALLOCATE(ztab_2d4(SIZE(xworkd2,1),SIZE(xworkd2,2)))
508  iret(2)=nf_get_var_real(nid_nc,ivar_id,ztab_2d4)
509  xworkd2(:,:) = ztab_2d4(:,:)
510  DEALLOCATE(ztab_2d4)
511  ENDIF
512  !
513  iret(3) = nf_get_att_text(nid_nc,ivar_id,"comment",cwork0)
514  !
515  ENDIF
516 
517  ! 3. Check for errors
518  !--------------------
519  DO jret=1,2
520  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
521  xworkd2 = xundef
522  nworkb=1
523  ENDIF
524  ENDDO
525  !
526 !$OMP END SINGLE
527  !
528  IF (nworkb /=0) CALL error_read_surf_nc(hrec,nworkb)
529  !
530 ELSEIF (hdir/='-') THEN
531 !$OMP SINGLE
532  ALLOCATE(xworkd2(1,SIZE(pfield,2)))
533 !$OMP END SINGLE
534 ENDIF
535 !
536 kresp = nworkb
537 hcomment = cwork0
538 !
539 #ifdef SFX_MPI
540 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
541 #endif
542 !
543 IF (hdir=='A') THEN ! no distribution on other tasks
544  IF ( nrank==npio ) THEN
545 #ifdef SFX_MPI
546  xtime0 = mpi_wtime()
547 #endif
548  pfield(:,:) = xworkd2(:,1:SIZE(pfield,2))
549 #ifdef SFX_MPI
550  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
551 #endif
552  ENDIF
553 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
554 !$OMP SINGLE
555 #ifdef SFX_MPI
556  IF (nproc>1) THEN
557  xtime0 = mpi_wtime()
558  CALL mpi_bcast(xworkd2,SIZE(xworkd2)*kind(xworkd2)/4,mpi_real,npio,ncomm,infompi)
559  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
560  ENDIF
561 #endif
562 !$OMP END SINGLE
563  pfield(:,:) = xworkd2(:,1:SIZE(pfield,2))
564 ELSE
565  IF (lmask) THEN
566  CALL read_and_send_mpi(xworkd2(:,1:SIZE(pfield,2)),pfield,nmask)
567  ELSE
568  CALL read_and_send_mpi(xworkd2(:,1:SIZE(pfield,2)),pfield)
569  END IF
570 ENDIF
571 !
572 !$OMP BARRIER
573 !
574 !$OMP SINGLE
575 DEALLOCATE(xworkd2)
576 !$OMP END SINGLE
577 !
578 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX2_NC',1,zhook_handle)
579 !
580 END SUBROUTINE read_surfx2_nc
581 !
582 ! #############################################################
583  SUBROUTINE read_surfn0_nc(HREC,KFIELD,KRESP,HCOMMENT)
584 ! #############################################################
585 !
586 !!**** *READN0* - routine to read an integer
587 !
588 USE modd_surf_par, ONLY: nundef
589 !
590 USE modd_io_surf_nc, ONLY : nid_nc
591 !
592 USE modi_error_read_surf_nc
593 !
594 USE yomhook ,ONLY : lhook, dr_hook
595 USE parkind1 ,ONLY : jprb
596 !
597 IMPLICIT NONE
598 !
599 include "netcdf.inc"
600 !
601 !* 0.1 Declarations of arguments
602 !
603  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
604 INTEGER, INTENT(OUT) :: kfield ! the integer scalar to be read
605 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
606  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
607 !
608 !
609 !* 0.2 Declarations of local variables
610 !
611  CHARACTER(LEN=100):: yfile ! filename
612 INTEGER :: ivar_id,jret,jdim,indims
613 INTEGER,DIMENSION(4) :: iret
614 REAL(KIND=JPRB) :: zhook_handle
615 !
616 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFN0_NC',0,zhook_handle)
617 !
618 kresp=0
619 hcomment = " "
620 !
621 IF (nid_nc.NE.0) THEN
622  !
623  ! 1. Find id of the variable
624  !----------------------------
625  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
626  !
627  ! 2. Get variable
628  !----------------------------
629  iret(2)=nf_get_var_int(nid_nc,ivar_id,kfield)
630  !
631  iret(3)=nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
632  !
633 ENDIF
634 !
635 ! 3. Check for errors
636 !--------------------
637 DO jret=1,2
638  IF ((kfield==nundef).OR.(nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
639  kfield=nundef
640  kresp=1
641  ENDIF
642 ENDDO
643 !
644 IF (kresp /=0) CALL error_read_surf_nc(hrec,kresp)
645 !
646 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFN0_NC',1,zhook_handle)
647 !
648 END SUBROUTINE read_surfn0_nc
649 !
650 ! #############################################################
651  SUBROUTINE read_surfn1_nc(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
652 ! #############################################################
653 !
654 !!**** *READN0* - routine to read an integer
655 !
656 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_read, nproc, ncomm, &
657  xtime_npio_read, xtime_comm_read
658 !
659 USE modd_surfex_omp, ONLY : nworkd, nworkb, cwork0
660 !
661 USE modd_io_surf_nc, ONLY: lmask,nmask,nid_nc
662 !
663 USE modd_surf_par, ONLY: nundef
664 !
665 USE modi_error_read_surf_nc
667 !
668 USE yomhook ,ONLY : lhook, dr_hook
669 USE parkind1 ,ONLY : jprb
670 !
671 IMPLICIT NONE
672 !
673 include "netcdf.inc"
674 !
675 #ifdef SFX_MPI
676 include "mpif.h"
677 #endif
678 !
679 !* 0.1 Declarations of arguments
680 !
681  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
682 INTEGER, DIMENSION(:), INTENT(OUT) :: kfield ! the integer scalar to be read
683 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
684  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
685  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
686  ! 'H' : field with
687  ! horizontal spatial dim.
688  ! '-' : no horizontal dim.
689 !* 0.2 Declarations of local variables
690 !
691  CHARACTER(LEN=100) :: yfile,yout ! Filename
692  CHARACTER(LEN=100) :: yname
693 INTEGER :: il1, ivar_id,jret,jdim,indims, itype, infompi
694 INTEGER,DIMENSION(4) :: idimids,idimlen
695 INTEGER,DIMENSION(4) :: iret
696 !
697 DOUBLE PRECISION :: xtime0
698 REAL(KIND=JPRB) :: zhook_handle
699 !
700 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFX1_NC',0,zhook_handle)
701 !
702 il1 = SIZE(kfield)
703 !
704 !$OMP SINGLE
705 nworkb=0
706  cwork0 = " "
707 !$OMP END SINGLE
708 !
709 hcomment = " "
710 !
711 #ifdef SFX_MPI
712 xtime0 = mpi_wtime()
713 #endif
714 !
715 IF (hdir=='-') THEN
716 !$OMP SINGLE
717  ALLOCATE(nworkd(il1))
718 !$OMP END SINGLE
719 ENDIF
720 !
721 IF (nrank==npio) THEN
722  !
723 !$OMP SINGLE
724  !
725  IF (nid_nc.NE.0) THEN
726  !
727  ! 1. Find id of the variable
728  !----------------------------
729  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
730  iret(2)=nf_inq_vartype(nid_nc,ivar_id,itype)
731  iret(3)=nf_inq_varndims(nid_nc,ivar_id,indims)
732  iret(4)=nf_inq_vardimid(nid_nc,ivar_id,idimids(1:indims))
733  idimlen(:) = 1.
734  DO jdim=1,indims
735  jret=nf_inq_dimlen(nid_nc,idimids(jdim),idimlen(jdim))
736  ENDDO
737  !
738  iret(4)=nf_inq_dimname(nid_nc,idimids(1),yname)
739  !
740  IF (trim(yname).NE.'Number_of_points') THEN
741  ALLOCATE(nworkd(idimlen(1)*idimlen(2)))
742  ELSE
743  ALLOCATE(nworkd(idimlen(1)))
744  ENDIF
745  !
746  ! 2. Get variable
747  !----------------------------
748  IF (itype==nf_int) THEN
749  iret(1)=nf_get_var_int(nid_nc,ivar_id,nworkd)
750  ENDIF
751  !
752  iret(2) = nf_get_att_text(nid_nc,ivar_id,"comment",cwork0)
753  !
754  ENDIF
755  !
756  ! 3. Check for errors
757  !--------------------
758  DO jret=1,1
759  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
760  nworkd = nundef
761  nworkb=1
762  ENDIF
763  ENDDO
764  !
765 !$OMP END SINGLE
766  !
767  IF (nworkb /=0) CALL error_read_surf_nc(hrec,nworkb)
768  !
769 ELSEIF (hdir/='-') THEN
770 !$OMP SINGLE
771  ALLOCATE(nworkd(0))
772 !$OMP END SINGLE
773 ENDIF
774 !
775 kresp = nworkb
776 hcomment = cwork0
777 !
778 #ifdef SFX_MPI
779 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
780 #endif
781 !
782 IF (hdir=='A') THEN ! no distribution on other tasks
783  IF ( nrank==npio ) THEN
784 #ifdef SFX_MPI
785  xtime0 = mpi_wtime()
786 #endif
787  kfield(:) = nworkd(1:SIZE(kfield))
788 #ifdef SFX_MPI
789  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
790 #endif
791  ENDIF
792 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
793 !$OMP SINGLE
794 #ifdef SFX_MPI
795  IF (nproc>1) THEN
796  xtime0 = mpi_wtime()
797  CALL mpi_bcast(nworkd,SIZE(nworkd)*kind(nworkd)/4,mpi_integer,npio,ncomm,infompi)
798  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
799  ENDIF
800 #endif
801 !$OMP END SINGLE
802  kfield(:) = nworkd(1:SIZE(kfield))
803 ELSE
804  IF (lmask) THEN
805  CALL read_and_send_mpi(nworkd,kfield,nmask)
806  ELSE
807  CALL read_and_send_mpi(nworkd,kfield)
808  END IF
809 ENDIF
810 !
811 !$OMP BARRIER
812 !
813 !$OMP SINGLE
814 DEALLOCATE(nworkd)
815 !$OMP END SINGLE
816 !
817 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFN1_NC',1,zhook_handle)
818 !
819 END SUBROUTINE read_surfn1_nc
820 !
821 ! #############################################################
822  SUBROUTINE read_surfn2_nc(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
823 ! #############################################################
824 !
825 !!**** *READN0* - routine to read an integer
826 !
827 USE modd_surfex_mpi, ONLY: nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
828 !
829 USE modd_surfex_omp, ONLY : nworkd2, nworkb, cwork0
830 !
831 USE modd_io_surf_nc, ONLY: lmask,nmask,nid_nc
832 !
833 USE modd_surf_par, ONLY: nundef
834 !
835 USE modi_error_read_surf_nc
837 !
838 USE yomhook ,ONLY : lhook, dr_hook
839 USE parkind1 ,ONLY : jprb
840 !
841 IMPLICIT NONE
842 !
843 include "netcdf.inc"
844 !
845 #ifdef SFX_MPI
846 include "mpif.h"
847 #endif
848 !
849 !* 0.1 Declarations of arguments
850 !
851  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
852 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kfield ! the integer scalar to be read
853 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
854  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
855  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
856  ! 'H' : field with
857  ! horizontal spatial dim.
858  ! '-' : no horizontal dim.
859 !* 0.2 Declarations of local variables
860 !
861  CHARACTER(LEN=100) :: yfile,yout ! filename
862  CHARACTER(LEN=100) :: yname
863 INTEGER :: il1, il2, ivar_id,jret,jdim,indims,itype, infompi
864 INTEGER,DIMENSION(4) :: idimids,idimlen
865 INTEGER,DIMENSION(4) :: iret
866 REAL*4, DIMENSION(:,:), ALLOCATABLE :: ztab_2d4
867 DOUBLE PRECISION :: xtime0
868 REAL(KIND=JPRB) :: zhook_handle
869 !
870 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFN2_NC',0,zhook_handle)
871 !
872 il1 = SIZE(kfield,1)
873 il2 = SIZE(kfield,2)
874 !
875 !$OMP SINGLE
876 nworkb=0
877  cwork0 = " "
878 !$OMP END SINGLE
879 !
880 hcomment = " "
881 !
882 #ifdef SFX_MPI
883 xtime0 = mpi_wtime()
884 #endif
885 !
886 IF (hdir=='-') THEN
887 !$OMP SINGLE
888  ALLOCATE(nworkd2(il1,il2))
889 !$OMP END SINGLE
890 ENDIF
891 !
892 IF (nrank==npio) THEN
893  !
894 !$OMP SINGLE
895  !
896  IF (nid_nc.NE.0) THEN
897  !
898  ! 1. Find id of the variable
899  !----------------------------
900  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
901  iret(2)=nf_inq_vartype(nid_nc,ivar_id,itype)
902  iret(3)=nf_inq_varndims(nid_nc,ivar_id,indims)
903  iret(4)=nf_inq_vardimid(nid_nc,ivar_id,idimids(1:indims))
904  idimlen(:) = 1.
905  DO jdim=1,indims
906  jret=nf_inq_dimlen(nid_nc,idimids(jdim),idimlen(jdim))
907  ENDDO
908  !
909  iret(4)=nf_inq_dimname(nid_nc,idimids(1),yname)
910  !
911  ! 2. Get variable
912  !----------------------------
913  IF (trim(yname).NE.'Number_of_points') THEN
914  ALLOCATE(nworkd2(idimlen(1)*idimlen(2),idimlen(3)))
915  ELSE
916  ALLOCATE(nworkd2(idimlen(1),idimlen(2)))
917  ENDIF
918  !
919  IF (itype==nf_int) THEN
920  iret(2)=nf_get_var_int(nid_nc,ivar_id,nworkd2)
921  ENDIF
922  !
923  iret(3) = nf_get_att_text(nid_nc,ivar_id,"comment",cwork0)
924  ENDIF
925 
926  ! 3. Check for errors
927  !--------------------
928  DO jret=1,2
929  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
930  nworkd2 = nundef
931  nworkb=1
932  ENDIF
933  ENDDO
934  !
935 !$OMP END SINGLE
936  !
937  IF (nworkb /=0) CALL error_read_surf_nc(hrec,nworkb)
938  !
939 ELSEIF (hdir/='-') THEN
940 !$OMP SINGLE
941  ALLOCATE(nworkd2(0,0))
942 !$OMP END SINGLE
943 ENDIF
944 !
945 kresp = nworkb
946 hcomment = cwork0
947 !
948 #ifdef SFX_MPI
949 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
950 #endif
951 !
952 IF (hdir=='A') THEN ! no distribution on other tasks
953  IF ( nrank==npio ) THEN
954 #ifdef SFX_MPI
955  xtime0 = mpi_wtime()
956 #endif
957  kfield(:,:) = nworkd2(:,:)
958 #ifdef SFX_MPI
959  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
960 #endif
961  ENDIF
962 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
963 !$OMP SINGLE
964 #ifdef SFX_MPI
965  IF (nproc>1) THEN
966  xtime0 = mpi_wtime()
967  CALL mpi_bcast(nworkd2,SIZE(nworkd2)*kind(nworkd2)/4,mpi_integer,npio,ncomm,infompi)
968  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
969  ENDIF
970 #endif
971 !$OMP END SINGLE
972  kfield(:,:) = nworkd2(:,:)
973 ELSE
974  IF (lmask) THEN
975  CALL read_and_send_mpi(nworkd2,kfield,nmask)
976  ELSE
977  CALL read_and_send_mpi(nworkd2,kfield)
978  END IF
979 ENDIF
980 !
981 !$OMP BARRIER
982 !
983 !$OMP SINGLE
984 DEALLOCATE(nworkd2)
985 !$OMP END SINGLE
986 !
987 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFN2_NC',1,zhook_handle)
988 !
989 END SUBROUTINE read_surfn2_nc
990 !
991 ! #############################################################
992  SUBROUTINE read_surfc0_nc(HREC,HFIELD,KRESP,HCOMMENT)
993 ! #############################################################
994 !
995 !!**** *READC0* - routine to read a STRING
996 !
997 USE modd_surf_par, ONLY: xundef
998 !
999 USE modd_io_surf_nc, ONLY : nid_nc
1000 !
1001 USE modi_error_read_surf_nc
1002 !
1003 USE yomhook ,ONLY : lhook, dr_hook
1004 USE parkind1 ,ONLY : jprb
1005 !
1006 IMPLICIT NONE
1007 !
1008 include "netcdf.inc"
1009 !
1010 !* 0.1 Declarations of arguments
1011 !
1012  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1013  CHARACTER(LEN=40), INTENT(OUT) :: hfield ! the integer scalar to be read
1014 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1015  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1016 !
1017 !* 0.2 Declarations of local variables
1018 !
1019  CHARACTER(LEN=100):: yfile ! filename
1020  CHARACTER(LEN=40):: yfield
1021 INTEGER :: ivar_id,jret,jdim,indims
1022 INTEGER,DIMENSION(4) :: iret
1023 REAL(KIND=JPRB) :: zhook_handle
1024 !
1025 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFC0_NC',0,zhook_handle)
1026 !
1027 kresp=0
1028 hcomment = " "
1029 !
1030 IF (nid_nc.NE.0) THEN
1031  !
1032  ! 1. Find id of the variable
1033  !----------------------------
1034  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
1035  !
1036  ! 2. Get variable
1037  !----------------------------
1038  iret(2)=nf_get_var_text(nid_nc,ivar_id,yfield)
1039  hfield=yfield(:len_trim(yfield))
1040  !
1041  iret(3) = nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
1042  !
1043 ENDIF
1044 
1045 ! 3. Check for errors
1046 !--------------------
1047 DO jret=1,2
1048  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
1049  kresp=1
1050  ENDIF
1051 ENDDO
1052 !
1053 IF (kresp /=0) CALL error_read_surf_nc(hrec,kresp)
1054 !
1055 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFC0_NC',1,zhook_handle)
1056 !
1057 END SUBROUTINE read_surfc0_nc
1058 !
1059 ! #############################################################
1060  SUBROUTINE read_surfl0_nc(HREC,OFIELD,KRESP,HCOMMENT)
1061 ! #############################################################
1062 !
1063 !!**** *READL0* - routine to read a logical
1064 !
1065 USE modd_io_surf_nc, ONLY : nid_nc
1066 !
1067 USE modi_error_read_surf_nc
1068 !
1069 USE modd_surf_par, ONLY: xundef
1070 !
1071 USE yomhook ,ONLY : lhook, dr_hook
1072 USE parkind1 ,ONLY : jprb
1073 !
1074 IMPLICIT NONE
1075 !
1076 include "netcdf.inc"
1077 !
1078 !* 0.1 Declarations of arguments
1079 !
1080  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1081 LOGICAL, INTENT(OUT) :: ofield ! array containing the data field
1082 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1083  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1084 !
1085 !* 0.2 Declarations of local variables
1086 !
1087  CHARACTER(LEN=1) :: yfield ! work array read in the file
1088  CHARACTER(LEN=100) :: yfile ! Filename
1089 INTEGER :: ivar_id,jret
1090 INTEGER,DIMENSION(3) :: iret
1091 REAL(KIND=JPRB) :: zhook_handle
1092 !
1093 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFL0_NC',0,zhook_handle)
1094 !
1095 kresp=0
1096 hcomment = " "
1097 !
1098 IF (nid_nc.NE.0) THEN
1099  !
1100  ! 1. Find id of the variable
1101  !----------------------------
1102  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
1103  !
1104  ! 2. Get variable
1105  !----------------------------
1106  iret(2)=nf_get_var_text(nid_nc,ivar_id,yfield)
1107  !
1108  iret(3) = nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
1109  !
1110 ENDIF
1111 !
1112 IF (yfield =="T") ofield=.true.
1113 IF (yfield =="F") ofield=.false.
1114 !
1115 ! 3. Check for errors
1116 !--------------------
1117 IF ((nid_nc==0).OR.iret(1).NE.nf_noerr) THEN
1118  kresp=1
1119 ENDIF
1120 !
1121 IF (kresp /=0) CALL error_read_surf_nc(hrec,kresp)
1122 !
1123 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFL0_NC',1,zhook_handle)
1124 !
1125 END SUBROUTINE read_surfl0_nc
1126 !
1127 ! #############################################################
1128  SUBROUTINE read_surfl1_nc(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
1129 ! #############################################################
1130 !
1131 !!**** *READL1* - routine to read a logical array
1132 !
1133 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
1134 !
1135 USE modd_surfex_omp, ONLY : lworkd, nworkb, cwork0
1136 !
1137 USE modd_io_surf_nc, ONLY : nid_nc
1138 !
1139 USE modi_error_read_surf_nc
1140 !
1141 USE modd_surf_par, ONLY: xundef
1142 !
1143 USE yomhook ,ONLY : lhook, dr_hook
1144 USE parkind1 ,ONLY : jprb
1145 !
1146 IMPLICIT NONE
1147 !
1148 include "netcdf.inc"
1149 !
1150 #ifdef SFX_MPI
1151 include "mpif.h"
1152 #endif
1153 !
1154 !* 0.1 Declarations of arguments
1155 !
1156  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1157 LOGICAL, DIMENSION(:), INTENT(OUT) :: ofield ! array containing the data field
1158 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1159  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1160  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
1161  ! 'H' : field with
1162  ! horizontal spatial dim.
1163  ! '-' : no horizontal dim.
1164 !* 0.2 Declarations of local variables
1165 !
1166  CHARACTER(LEN=100) :: yfile ! Filename
1167  CHARACTER(LEN=1), DIMENSION(:), ALLOCATABLE :: ytab_1d ! work array read in the file
1168 !
1169 INTEGER :: ivar_id,jret,jdim,indims
1170 INTEGER :: infompi
1171 INTEGER,DIMENSION(1) :: idimids,idimlen
1172 INTEGER,DIMENSION(2) :: iret
1173 INTEGER, DIMENSION(:), POINTER :: imask ! 1D mask to read only interesting
1174 DOUBLE PRECISION :: xtime0
1175 REAL(KIND=JPRB) :: zhook_handle
1176 !
1177 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFL1_NC',0,zhook_handle)
1178 !
1179 !$OMP BARRIER
1180 !
1181 !$OMP SINGLE
1182 nworkb=0
1183  cwork0 = " "
1184 !$OMP END SINGLE
1185 !
1186 hcomment = " "
1187 !
1188 #ifdef SFX_MPI
1189 xtime0 = mpi_wtime()
1190 #endif
1191 !
1192 !$OMP SINGLE
1193 ALLOCATE(lworkd(SIZE(ofield)))
1194 !$OMP END SINGLE
1195 !
1196 IF (nrank==npio) THEN
1197  !
1198 !$OMP SINGLE
1199  !
1200  IF (nid_nc.NE.0) THEN
1201  !
1202  ! 1. Find id of the variable
1203  !----------------------------
1204  iret(1)=nf_inq_varid(nid_nc,hrec,ivar_id)
1205  iret(1)=nf_inq_varndims(nid_nc,ivar_id,indims)
1206  iret(1)=nf_inq_vardimid(nid_nc,ivar_id,idimids)
1207  DO jdim=1,indims
1208  jret=nf_inq_dimlen(nid_nc,idimids(jdim),idimlen(jdim))
1209  ENDDO
1210  ALLOCATE(ytab_1d(idimlen(1)))
1211  !
1212  ! 2. Get variable
1213  !----------------------------
1214  iret(1)=nf_get_var_text(nid_nc,ivar_id,ytab_1d)
1215  !
1216  DO jret=1,SIZE(lworkd)
1217  IF (ytab_1d(jret) =="T") lworkd(jret)=.true.
1218  IF (ytab_1d(jret) =="F") lworkd(jret)=.false.
1219  ENDDO
1220  !
1221  iret(2) = nf_get_att_text(nid_nc,ivar_id,"comment",cwork0)
1222  !
1223  ENDIF
1224  !
1225  ! 3. Check for errors
1226  !--------------------
1227  DO jret=1,1
1228  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
1229  nworkb=1
1230  ENDIF
1231  ENDDO
1232  !
1233  DEALLOCATE(ytab_1d)
1234  !
1235 !$OMP END SINGLE
1236  !
1237  IF (nworkb /=0) CALL error_read_surf_nc(hrec,nworkb)
1238  !
1239 ENDIF
1240 !
1241 kresp = nworkb
1242 hcomment = cwork0
1243 !
1244 #ifdef SFX_MPI
1245 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
1246 #endif
1247 !
1248 IF (nproc>1 .AND. hdir/='A') THEN
1249 #ifdef SFX_MPI
1250  xtime0 = mpi_wtime()
1251 !$OMP SINGLE
1252  CALL mpi_bcast(lworkd,SIZE(lworkd),mpi_logical,npio,ncomm,infompi)
1253 !$OMP END SINGLE
1254  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
1255 #endif
1256 ENDIF
1257 !
1258 ofield = lworkd
1259 !
1260 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFL1_NC',1,zhook_handle)
1261 !
1262 END SUBROUTINE read_surfl1_nc
1263 !
1264 !
1265 ! #############################################################
1266  SUBROUTINE read_surft0_nc(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1267 ! #############################################################
1268 !
1269 !!**** *READT0* - routine to read a NETCDF date_time scalar
1270 !
1271 USE modd_io_surf_nc, ONLY : nid_nc
1272 !
1273 USE modi_error_read_surf_nc
1274 !
1275 USE modd_surf_par, ONLY: xundef
1276 !
1277 USE yomhook ,ONLY : lhook, dr_hook
1278 USE parkind1 ,ONLY : jprb
1279 !
1280 IMPLICIT NONE
1281 !
1282 include "netcdf.inc"
1283 !
1284 !* 0.1 Declarations of arguments
1285 !
1286  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1287 INTEGER, INTENT(OUT) :: kyear ! year
1288 INTEGER, INTENT(OUT) :: kmonth ! month
1289 INTEGER, INTENT(OUT) :: kday ! day
1290 REAL, INTENT(OUT) :: ptime ! time
1291 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1292  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1293 
1294 !
1295 !* 0.2 Declarations of local variables
1296 !
1297  CHARACTER(LEN=18) :: yrecfm ! Name of the article to be written
1298  CHARACTER(LEN=100) :: yfile ! Filename
1299 INTEGER :: ivar_id,jret,jdim,indims,jwrk
1300 INTEGER, DIMENSION(1) :: idimids,idimlen
1301 INTEGER, DIMENSION(5) :: iret
1302 INTEGER, DIMENSION(:), POINTER :: imask ! 1D mask to read only interesting
1303 REAL:: ztime
1304 REAL(KIND=JPRB) :: zhook_handle
1305 !
1306 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFT0_NC',0,zhook_handle)
1307 !
1308 kresp=0
1309 hcomment = " "
1310 !
1311 DO jwrk=1,4
1312  !
1313  IF (jwrk == 1) THEN
1314  yrecfm=trim(hrec)//'-YEAR'
1315  ELSEIF (jwrk == 2) THEN
1316  yrecfm = trim(hrec)//'-MONTH'
1317  ELSEIF (jwrk == 3) THEN
1318  yrecfm = trim(hrec)//'-DAY'
1319  ELSEIF (jwrk == 4) THEN
1320  yrecfm=trim(hrec)//'-TIME'
1321  ENDIF
1322 ! 0. find filename
1323  !
1324  IF (nid_nc.NE.0) THEN
1325  !
1326  ! 1. Find id of the variable
1327  !----------------------------
1328  jret=nf_inq_varid(nid_nc,yrecfm,ivar_id)
1329  !
1330  ! 2. Get variable
1331  !----------------------------
1332  IF (jwrk == 1) THEN
1333  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kyear)
1334  ELSEIF (jwrk==2) THEN
1335  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kmonth)
1336  ELSEIF (jwrk==3) THEN
1337  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kday)
1338  ELSEIF (jwrk==4) THEN
1339  iret(jwrk)=nf_get_var_double(nid_nc,ivar_id,ptime)
1340  ENDIF
1341  !
1342  iret(5) = nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
1343  !
1344  ENDIF
1345 ENDDO
1346 !
1347 ! 3. Check for errors
1348 !--------------------
1349 DO jret=1,4
1350  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
1351  kresp=1
1352  ENDIF
1353 ENDDO
1354 IF (kresp /=0) CALL error_read_surf_nc(yrecfm,kresp)
1355 !
1356 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFT0_NC',1,zhook_handle)
1357 !
1358 END SUBROUTINE read_surft0_nc
1359 !
1360 ! #############################################################
1361  SUBROUTINE read_surft1_nc(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1362 ! #############################################################
1363 !
1364 !!**** *READT0* - routine to read a NETCDF date_time scalar
1365 !
1366 USE modd_io_surf_nc, ONLY : nid_nc
1367 !
1368 USE modi_error_read_surf_nc
1369 !
1370 USE modd_surf_par, ONLY: xundef
1371 !
1372 USE yomhook ,ONLY : lhook, dr_hook
1373 USE parkind1 ,ONLY : jprb
1374 !
1375 IMPLICIT NONE
1376 !
1377 include "netcdf.inc"
1378 !
1379 !* 0.1 Declarations of arguments
1380 !
1381  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1382 INTEGER, DIMENSION(:), INTENT(OUT) :: kyear ! year
1383 INTEGER, DIMENSION(:), INTENT(OUT) :: kmonth ! month
1384 INTEGER, DIMENSION(:), INTENT(OUT) :: kday ! day
1385 REAL, DIMENSION(:), INTENT(OUT) :: ptime ! time
1386 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1387  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1388 
1389 !
1390 !* 0.2 Declarations of local variables
1391 !
1392  CHARACTER(LEN=18) :: yrecfm ! Name of the article to be written
1393  CHARACTER(LEN=100) :: yfile ! Filename
1394 INTEGER :: ivar_id,jret,jdim,indims,jwrk
1395 INTEGER, DIMENSION(1) :: idimids,idimlen
1396 INTEGER, DIMENSION(5) :: iret
1397 INTEGER, DIMENSION(:), POINTER :: imask ! 1D mask to read only interesting
1398 REAL:: ztime
1399 REAL(KIND=JPRB) :: zhook_handle
1400 !
1401 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFT1_NC',0,zhook_handle)
1402 !
1403 kresp=0
1404 hcomment = " "
1405 !
1406 DO jwrk=1,4
1407  !
1408  IF (jwrk == 1) THEN
1409  yrecfm=trim(hrec)//'-YEAR'
1410  ELSEIF (jwrk == 2) THEN
1411  yrecfm = trim(hrec)//'-MONTH'
1412  ELSEIF (jwrk == 3) THEN
1413  yrecfm = trim(hrec)//'-DAY'
1414  ELSEIF (jwrk == 4) THEN
1415  yrecfm=trim(hrec)//'-TIME'
1416  ENDIF
1417 ! 0. find filename
1418  !
1419  IF (nid_nc.NE.0) THEN
1420  !
1421  ! 1. Find id of the variable
1422  !----------------------------
1423  jret=nf_inq_varid(nid_nc,yrecfm,ivar_id)
1424  !
1425  ! 2. Get variable
1426  !----------------------------
1427  IF (jwrk == 1) THEN
1428  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kyear)
1429  ELSEIF (jwrk==2) THEN
1430  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kmonth)
1431  ELSEIF (jwrk==3) THEN
1432  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kday)
1433  ELSEIF (jwrk==4) THEN
1434  iret(jwrk)=nf_get_var_double(nid_nc,ivar_id,ptime)
1435  ENDIF
1436  !
1437  iret(5) = nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
1438  !
1439  ENDIF
1440 ENDDO
1441 !
1442 ! 3. Check for errors
1443 !--------------------
1444 DO jret=1,4
1445  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
1446  kresp=1
1447  ENDIF
1448 ENDDO
1449 IF (kresp /=0) CALL error_read_surf_nc(yrecfm,kresp)
1450 !
1451 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFT1_NC',1,zhook_handle)
1452 !
1453 END SUBROUTINE read_surft1_nc
1454 !
1455 ! #############################################################
1456  SUBROUTINE read_surft2_nc(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1457 ! #############################################################
1458 !
1459 !!**** *READT0* - routine to read a NETCDF date_time scalar
1460 !
1461 USE modd_io_surf_nc, ONLY : nid_nc
1462 !
1463 USE modi_error_read_surf_nc
1464 !
1465 USE modd_surf_par, ONLY: xundef
1466 !
1467 USE yomhook ,ONLY : lhook, dr_hook
1468 USE parkind1 ,ONLY : jprb
1469 !
1470 IMPLICIT NONE
1471 !
1472 include "netcdf.inc"
1473 !
1474 !* 0.1 Declarations of arguments
1475 !
1476  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1477 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kyear ! year
1478 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kmonth ! month
1479 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kday ! day
1480 REAL, DIMENSION(:,:), INTENT(OUT) :: ptime ! time
1481 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1482  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1483 
1484 !
1485 !* 0.2 Declarations of local variables
1486 !
1487  CHARACTER(LEN=18) :: yrecfm ! Name of the article to be written
1488  CHARACTER(LEN=100) :: yfile ! Filename
1489 INTEGER :: ivar_id,jret,jdim,indims,jwrk
1490 INTEGER, DIMENSION(1) :: idimids,idimlen
1491 INTEGER, DIMENSION(5) :: iret
1492 INTEGER, DIMENSION(:), POINTER :: imask ! 1D mask to read only interesting
1493 REAL:: ztime
1494 REAL(KIND=JPRB) :: zhook_handle
1495 !
1496 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFT2_NC',0,zhook_handle)
1497 !
1498 kresp=0
1499 hcomment = " "
1500 !
1501 DO jwrk=1,4
1502  !
1503  IF (jwrk == 1) THEN
1504  yrecfm=trim(hrec)//'-YEAR'
1505  ELSEIF (jwrk == 2) THEN
1506  yrecfm = trim(hrec)//'-MONTH'
1507  ELSEIF (jwrk == 3) THEN
1508  yrecfm = trim(hrec)//'-DAY'
1509  ELSEIF (jwrk == 4) THEN
1510  yrecfm=trim(hrec)//'-TIME'
1511  ENDIF
1512 ! 0. find filename
1513  !
1514  IF (nid_nc.NE.0) THEN
1515  !
1516  ! 1. Find id of the variable
1517  !----------------------------
1518  jret=nf_inq_varid(nid_nc,yrecfm,ivar_id)
1519  !
1520  ! 2. Get variable
1521  !----------------------------
1522  IF (jwrk == 1) THEN
1523  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kyear)
1524  ELSEIF (jwrk==2) THEN
1525  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kmonth)
1526  ELSEIF (jwrk==3) THEN
1527  iret(jwrk)=nf_get_var_int(nid_nc,ivar_id,kday)
1528  ELSEIF (jwrk==4) THEN
1529  iret(jwrk)=nf_get_var_double(nid_nc,ivar_id,ptime)
1530  ENDIF
1531  !
1532  iret(5) = nf_get_att_text(nid_nc,ivar_id,"comment",hcomment)
1533  !
1534  ENDIF
1535 ENDDO
1536 !
1537 ! 3. Check for errors
1538 !--------------------
1539 DO jret=1,4
1540  IF ((nid_nc==0).OR.iret(jret).NE.nf_noerr) THEN
1541  kresp=1
1542  ENDIF
1543 ENDDO
1544 IF (kresp /=0) CALL error_read_surf_nc(yrecfm,kresp)
1545 !
1546 IF (lhook) CALL dr_hook('MODE_READ_SURF_NC:READ_SURFT2_NC',1,zhook_handle)
1547 !
1548 END SUBROUTINE read_surft2_nc
1549 !
subroutine read_surfx0_nc(HREC, PFIELD, KRESP, HCOMMENT)
subroutine read_surfl0_nc(HREC, OFIELD, KRESP, HCOMMENT)
subroutine read_surfn2_nc(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfn0_nc(HREC, KFIELD, KRESP, HCOMMENT)
subroutine error_read_surf_nc(HREC, KRESP)
subroutine read_surfx2_nc(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfn1_nc(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surft1_nc(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surft0_nc(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surft2_nc(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surfl1_nc(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfx1_nc(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfc0_nc(HREC, HFIELD, KRESP, HCOMMENT)