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