SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_read_surf_lfi.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_LFI 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 !! S.Malardel *METEO-FRANCE*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !!
36 !! original 01/08/03
37 !----------------------------------------------------------------------------
38 !
39 #ifdef SFX_LFI
40 !
41 INTERFACE read_surf0_lfi
42  MODULE PROCEDURE read_surfx0_lfi
43  MODULE PROCEDURE read_surfn0_lfi
44  MODULE PROCEDURE read_surfl0_lfi
45  MODULE PROCEDURE read_surfc0_lfi
46 END INTERFACE
47 INTERFACE read_surfn_lfi
48  MODULE PROCEDURE read_surfx1_lfi
49  MODULE PROCEDURE read_surfn1_lfi
50  MODULE PROCEDURE read_surfl1_lfi
51  MODULE PROCEDURE read_surfx2_lfi
52 END INTERFACE
53 INTERFACE read_surft_lfi
54  MODULE PROCEDURE read_surft0_lfi
55  MODULE PROCEDURE read_surft1_lfi
56  MODULE PROCEDURE read_surft2_lfi
57 END INTERFACE
58 !
59  CONTAINS
60 !
61 ! #############################################################
62  SUBROUTINE read_surfx0_lfi(HREC,PFIELD,KRESP,HCOMMENT)
63 ! #############################################################
64 !
65 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
66 !
67 USE modi_fmread
68 USE modi_error_read_surf_lfi
69 !
70 USE yomhook ,ONLY : lhook, dr_hook
71 USE parkind1 ,ONLY : jprb
72 !
73 IMPLICIT NONE
74 !
75 !* 0.1 Declarations of arguments
76 !
77  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
78 REAL, INTENT(OUT) :: pfield ! the real scalar to be read
79 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
80  CHARACTER(LEN=100),INTENT(OUT) :: hcomment ! comment
81 !
82 !* 0.2 Declarations of local variables
83 !
84 INTEGER :: igrid ! position of data on grid
85 INTEGER :: ilench ! length of comment string
86 REAL(KIND=JPRB) :: zhook_handle
87 !
88 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX0_LFI',0,zhook_handle)
89 !
90 kresp=0
91 !
92  CALL fmreadx0(cfile_lfi,hrec,cluout_lfi,1,pfield,igrid,ilench,hcomment,kresp)
93 !
94  CALL error_read_surf_lfi(hrec,kresp)
95 !
96 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX0_LFI',1,zhook_handle)
97 !
98 END SUBROUTINE read_surfx0_lfi
99 !
100 ! #############################################################
101  SUBROUTINE read_surfx1_lfi(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
102 ! #############################################################
103 !
104 !!**** *READX1* - routine to fill a real 1D array for the externalised surface
105 !
106 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
107 !
108 USE modd_surfex_omp, ONLY : xworkd, nworkb
109 !
110 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi, nmask, nfull, &
111  lmnh_compatible
112 !
113 USE modi_fmread
114 USE modi_error_read_surf_lfi
116 USE modi_get_surf_undef
117 !
118 USE yomhook ,ONLY : lhook, dr_hook
119 USE parkind1 ,ONLY : jprb
120 !
121 IMPLICIT NONE
122 !
123 #ifdef SFX_MPI
124 include "mpif.h"
125 #endif
126 !
127 !* 0.1 Declarations of arguments
128 !
129  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
130 REAL, DIMENSION(:), INTENT(OUT) :: pfield ! array containing the data field
131 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
132  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
133  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
134  ! 'H' : field with
135  ! horizontal spatial dim.
136  ! '-' : no horizontal dim.
137 !* 0.2 Declarations of local variables
138 !
139  CHARACTER(LEN=18) :: yrec
140 REAL :: zundef ! default value
141 INTEGER :: igrid ! position of data on grid
142 INTEGER :: ilench ! length of comment string
143 INTEGER :: iversion, ibugfix
144 INTEGER :: il1, infompi
145 !
146 #ifdef SFX_MPI
147 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
148 #endif
149 DOUBLE PRECISION :: xtime0
150 REAL(KIND=JPRB) :: zhook_handle
151 !
152 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX1_LFI',0,zhook_handle)
153 !
154 !$OMP BARRIER
155 !
156 il1 = SIZE(pfield)
157 !
158 !$OMP SINGLE
159 nworkb=0
160 !$OMP END SINGLE
161 !
162 #ifdef SFX_MPI
163 xtime0 = mpi_wtime()
164 #endif
165 !
166 IF (hdir=='-') THEN
167 !$OMP SINGLE
168  ALLOCATE(xworkd(il1))
169 !$OMP END SINGLE
170 ENDIF
171 !
172 IF (nrank==npio) THEN
173  !
174 !$OMP SINGLE
175  !
176  IF (hdir=='A') THEN
177  ALLOCATE(xworkd(il1))
178  ELSEIF (hdir/='-') THEN
179  ALLOCATE(xworkd(nfull))
180  ENDIF
181  !
182  yrec = hrec
183  !
184  !---------------------------------------------------------------------------
185  !* patch to read some test files done before version 3.5
186  ! this should be removed once all tests with reading lfi files done with 923
187  ! configuration (with these early versions) are finished.
188  !
189  IF (hrec(1:2)=='D_') THEN
190  CALL fmreadn0(cfile_lfi,'VERSION',cluout_lfi,1,iversion,igrid,ilench,hcomment,nworkb)
191  CALL fmreadn0(cfile_lfi,'BUG',cluout_lfi,1,ibugfix,igrid,ilench,hcomment,nworkb)
192  IF (iversion<=2 .OR. (iversion==3 .AND. ibugfix<=5)) yrec = 'DATA_'//hrec(3:12)
193  END IF
194  !---------------------------------------------------------------------------
195  !
196  IF (hdir=='H' .OR. hdir=='A') THEN
197  IF (.NOT. lmnh_compatible) THEN
198  CALL fmreadx1(cfile_lfi,yrec,cluout_lfi,nfull,xworkd,igrid,ilench,hcomment,nworkb)
199  ELSE
200  CALL read_in_lfi_x1_for_mnh(yrec,xworkd,nworkb,hcomment,hdir)
201  END IF
202  ELSE
203  CALL fmreadx1(cfile_lfi,yrec,cluout_lfi,il1,xworkd,igrid,ilench,hcomment,nworkb)
204  END IF
205  CALL error_read_surf_lfi(yrec,nworkb)
206  !
207 !$OMP END SINGLE
208  !
209 ELSEIF (hdir/='-') THEN
210 !$OMP SINGLE
211  ALLOCATE(xworkd(0))
212 !$OMP END SINGLE
213 ENDIF
214 !
215 kresp = nworkb
216 !
217 #ifdef SFX_MPI
218 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
219 #endif
220 !
221 IF (hdir=='A') THEN ! no distribution on other tasks
222  IF ( nrank==npio ) THEN
223 #ifdef SFX_MPI
224  xtime0 = mpi_wtime()
225 #endif
226  pfield(:) = xworkd(1:il1)
227 #ifdef SFX_MPI
228  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
229 #endif
230  ENDIF
231 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
232 !$OMP SINGLE
233  IF (nproc>1) THEN
234 #ifdef SFX_MPI
235  xtime0 = mpi_wtime()
236  CALL mpi_bcast(xworkd,il1*kind(xworkd)/4,mpi_real,npio,ncomm,infompi)
237  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
238 #endif
239  ENDIF
240 !$OMP END SINGLE
241  pfield(:) = xworkd(:)
242 ELSE
243  CALL read_and_send_mpi(xworkd,pfield,nmask)
244 ENDIF
245 !
246 !$OMP BARRIER
247 !
248 !$OMP SINGLE
249 DEALLOCATE(xworkd)
250 !$OMP END SINGLE
251 !
252 !
253 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX1_LFI',1,zhook_handle)
254 !
255  CONTAINS
256 !
257 ! #############################################################
258  SUBROUTINE read_in_lfi_x1_for_mnh(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
259 ! #############################################################
260 !
261 !!**** * - routine to fill a read 2D array for the externalised surface
262 !
263 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi, &
264  niu, nib, nie, nju, njb, nje
265 !
266 USE modi_fmread
267 USE modi_error_read_surf_lfi
268 !
269 USE yomhook ,ONLY : lhook, dr_hook
270 USE parkind1 ,ONLY : jprb
271 !
272 IMPLICIT NONE
273 !
274 !* 0.1 Declarations of arguments
275 !
276  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
277 REAL, DIMENSION(:), INTENT(OUT):: pfield ! array containing the data field
278 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
279  CHARACTER(LEN=100), INTENT(OUT):: hcomment ! comment string
280  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
281  ! 'H' : field with
282  ! horizontal spatial dim.
283  ! '-' : no horizontal dim.
284 !
285 !* 0.2 Declarations of local variables
286 !
287  CHARACTER(LEN=4) :: yrec1d
288 INTEGER :: ji, jj
289 INTEGER :: ilen
290 INTEGER :: igrid, ilench
291 REAL, DIMENSION(:), ALLOCATABLE :: zwork1d! 1D work array read in the file
292 REAL, DIMENSION(:,:), ALLOCATABLE :: zwork2d ! work array read in a MNH file
293 REAL(KIND=JPRB) :: zhook_handle
294 !
295 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX1_LFI:READ_IN_LFI_X1_FOR_MNH',0,zhook_handle)
296 !
297 ALLOCATE(zwork2d(niu,nju))
298 zwork2d(:,:) = 999.
299 !
300 IF (hrec=='XX ' .OR. hrec=='DX ') THEN
301  ALLOCATE(zwork1d(niu))
302  yrec1d = 'XHAT'
303  ilen = niu
304 ELSEIF (hrec=='YY ' .OR. hrec=='DY ') THEN
305  ALLOCATE(zwork1d(nju))
306  yrec1d = 'YHAT'
307  ilen = nju
308 ELSEIF (njb==nje) THEN
309  ALLOCATE(zwork1d(niu))
310  zwork1d(:) = 999.
311 ELSEIF (nib==nie) THEN
312  ALLOCATE(zwork1d(nju))
313  zwork1d(:) = 999.
314 ENDIF
315 !
316 IF (hrec=='XX' .OR. hrec=='YY'.OR. hrec=='DX' .OR. hrec=='DY') THEN
317 !
318  CALL fmreadx1(cfile_lfi,yrec1d,cluout_lfi,ilen,zwork1d,igrid,ilench,hcomment,kresp)
319  CALL error_read_surf_lfi(yrec1d,kresp)
320 !
321  SELECT CASE(hrec)
322  CASE('XX ')
323  DO jj = 1,SIZE(zwork2d,2)
324  zwork2d(nib:nie,jj) = 0.5 * zwork1d(nib:nie) + 0.5 * zwork1d(nib+1:nie+1)
325  END DO
326  CASE('DX ')
327  DO jj = 1,SIZE(zwork2d,2)
328  zwork2d(nib:nie,jj) = - zwork1d(nib:nie) + zwork1d(nib+1:nie+1)
329  END DO
330  CASE('YY ')
331  DO ji = 1,SIZE(zwork2d,1)
332  zwork2d(ji,njb:nje) = 0.5 * zwork1d(njb:nje) + 0.5 * zwork1d(njb+1:nje+1)
333  END DO
334  CASE('DY ')
335  DO ji = 1,SIZE(zwork2d,1)
336  zwork2d(ji,njb:nje) = - zwork1d(njb:nje) + zwork1d(njb+1:nje+1)
337  END DO
338  END SELECT
339 !
340  DEALLOCATE(zwork1d)
341 !
342 ELSEIF (njb==nje) THEN
343 !
344  CALL fmreadx1(cfile_lfi,yrec,cluout_lfi,SIZE(zwork1d),zwork1d,igrid,ilench,hcomment,kresp)
345  DO jj = 1,SIZE(zwork2d,2)
346  zwork2d(nib:nie,jj) = zwork1d(nib:nie)
347  END DO
348 !
349  DEALLOCATE(zwork1d)
350 !
351 ELSEIF (nib==nie) THEN
352 !
353  CALL fmreadx1(cfile_lfi,yrec,cluout_lfi,SIZE(zwork1d),zwork1d,igrid,ilench,hcomment,kresp)
354  DO ji = 1,SIZE(zwork2d,1)
355  zwork2d(ji,njb:nje) = zwork1d(njb:nje)
356  END DO
357 !
358  DEALLOCATE(zwork1d)
359 !
360 ELSE
361 !
362  CALL fmreadx2(cfile_lfi,hrec,cluout_lfi,SIZE(zwork2d),zwork2d,igrid,ilench,hcomment,kresp)
363 !
364 ENDIF
365 !
366 DO jj=1,nje-njb+1
367  DO ji=1,nie-nib+1
368  pfield(ji+(nie-nib+1)*(jj-1)) = zwork2d(nib+ji-1,njb+jj-1)
369  END DO
370 END DO
371 !
372 DEALLOCATE(zwork2d)
373 !
374  CALL error_read_surf_lfi(hrec,kresp)
375 !
376 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX1_LFI:READ_IN_LFI_X1_FOR_MNH',1,zhook_handle)
377 !
378 END SUBROUTINE read_in_lfi_x1_for_mnh
379 !
380 END SUBROUTINE read_surfx1_lfi
381 !
382 ! #############################################################
383  SUBROUTINE read_surfx2_lfi(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
384 ! #############################################################
385 !
386 !!**** *READX2* - routine to fill a real 2D array for the externalised surface
387 !
388 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
389 !
390 USE modd_surfex_omp, ONLY : xworkd2, nworkb
391 !
392 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi, nmask, nfull, &
393  lmnh_compatible
394 !
395 USE modi_fmread
396 USE modi_error_read_surf_lfi
398 USE modi_get_surf_undef
399 !
400 USE yomhook ,ONLY : lhook, dr_hook
401 USE parkind1 ,ONLY : jprb
402 !
403 IMPLICIT NONE
404 !
405 #ifdef SFX_MPI
406 include "mpif.h"
407 #endif
408 !
409 !* 0.1 Declarations of arguments
410 !
411  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
412 REAL, DIMENSION(:,:), INTENT(OUT) :: pfield ! array containing the data field
413 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
414  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
415  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
416  ! 'H' : field with
417  ! horizontal spatial dim.
418  ! '-' : no horizontal dim.
419 !* 0.2 Declarations of local variables
420 !
421  CHARACTER(LEN=16) :: yrec
422 REAL :: zundef ! default value
423 INTEGER :: igrid ! position of data on grid
424 INTEGER :: ilench ! length of comment string
425 INTEGER :: iversion, ibugfix
426 INTEGER :: il1, il2, infompi
427 !
428 #ifdef SFX_MPI
429 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
430 #endif
431 DOUBLE PRECISION :: xtime0
432 REAL(KIND=JPRB) :: zhook_handle
433 !
434 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX2_LFI',0,zhook_handle)
435 !
436 !$OMP BARRIER
437 !
438 il1 = SIZE(pfield,1)
439 il2 = SIZE(pfield,2)
440 !
441 !$OMP SINGLE
442 nworkb=0
443 !$OMP END SINGLE
444 !
445 #ifdef SFX_MPI
446 xtime0 = mpi_wtime()
447 #endif
448 !
449 IF (hdir=='-') THEN
450 !$OMP SINGLE
451  ALLOCATE(xworkd2(il1,il2))
452 !$OMP END SINGLE
453 ENDIF
454 !
455 IF (nrank==npio) THEN
456  !
457 !$OMP SINGLE
458  !
459  IF (hdir=='A') THEN
460  ALLOCATE(xworkd2(il1,il2))
461  ELSEIF (hdir/='-') THEN
462  ALLOCATE(xworkd2(nfull,il2))
463  ENDIF
464  !
465  yrec = hrec
466  !
467  !---------------------------------------------------------------------------
468  !* patch to read some test files done before version 3.5
469  ! this should be removed once all tests with reading lfi files done with 923
470  ! configuration (with these early versions) are finished.
471  !
472  IF (hrec(1:2)=='D_') THEN
473  CALL fmreadn0(cfile_lfi,'VERSION',cluout_lfi,1,iversion,igrid,ilench,hcomment,nworkb)
474  CALL fmreadn0(cfile_lfi,'BUG',cluout_lfi,1,ibugfix,igrid,ilench,hcomment,nworkb)
475  IF (iversion<=2 .OR. (iversion==3 .AND. ibugfix<=5)) yrec = 'DATA_'//hrec(3:12)
476  IF (yrec(13:15)=='SOI') yrec=yrec(1:15)//'L'
477  IF (yrec(12:14)=='SOI') yrec=yrec(1:14)//'L'
478  END IF
479  !---------------------------------------------------------------------------
480  !
481  IF (hdir=='H' .OR. hdir=='A') THEN
482  IF (.NOT. lmnh_compatible) THEN
483  CALL fmreadx2(cfile_lfi,yrec,cluout_lfi,SIZE(xworkd2),xworkd2(:,:),igrid,ilench,hcomment,nworkb)
484  ELSE
485  CALL read_in_lfi_x2_for_mnh(yrec,xworkd2,nworkb,hcomment,hdir)
486  END IF
487  ELSE
488  CALL fmreadx2(cfile_lfi,yrec,cluout_lfi,il1*il2,xworkd2(:,:),igrid,ilench,hcomment,nworkb)
489  END IF
490  CALL error_read_surf_lfi(yrec,nworkb)
491  !
492 !$OMP END SINGLE
493  !
494 ELSEIF (hdir/='-') THEN
495  ALLOCATE(xworkd2(0,0))
496 ENDIF
497 !
498 kresp = nworkb
499 !
500 #ifdef SFX_MPI
501 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
502 #endif
503 !
504 IF (hdir=='A') THEN ! no distribution on other tasks
505  IF ( nrank==npio ) THEN
506 #ifdef SFX_MPI
507  xtime0 = mpi_wtime()
508 #endif
509  pfield(:,:) = xworkd2(1:il1,:)
510 #ifdef SFX_MPI
511  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
512 #endif
513  ENDIF
514 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
515 !$OMP SINGLE
516  IF (nproc>1) THEN
517 #ifdef SFX_MPI
518  xtime0 = mpi_wtime()
519  CALL mpi_bcast(xworkd2,il1*il2*kind(xworkd2)/4,mpi_real,npio,ncomm,infompi)
520  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
521 #endif
522  ENDIF
523 !$OMP END SINGLE
524  pfield(:,:) = xworkd2(1:il1,:)
525 ELSE
526  CALL read_and_send_mpi(xworkd2,pfield,nmask)
527 ENDIF
528 !
529 !$OMP BARRIER
530 !
531 !$OMP SINGLE
532 DEALLOCATE(xworkd2)
533 !$OMP END SINGLE
534 !
535 IF (hdir=='H' .OR. hdir=='A') THEN
536  CALL get_surf_undef(zundef)
537  WHERE(pfield==999.) pfield=zundef
538 ENDIF
539 !
540 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX2_LFI',1,zhook_handle)
541 !
542  CONTAINS
543 !
544 ! #############################################################
545  SUBROUTINE read_in_lfi_x2_for_mnh(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
546 ! #############################################################
547 !
548 !!**** * - routine to fill a read 2D array for the externalised surface
549 !
550 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi, &
551  niu, nib, nie, nju, njb, nje
552 !
553 USE modi_fmread
554 USE modi_error_read_surf_lfi
555 !
556 USE yomhook ,ONLY : lhook, dr_hook
557 USE parkind1 ,ONLY : jprb
558 !
559 IMPLICIT NONE
560 !
561 !* 0.1 Declarations of arguments
562 !
563  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
564 REAL, DIMENSION(:,:), INTENT(OUT):: pfield ! array containing the data field
565 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
566  CHARACTER(LEN=100), INTENT(OUT):: hcomment ! comment string
567  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
568  ! 'H' : field with
569  ! horizontal spatial dim.
570  ! '-' : no horizontal dim.
571 !* 0.2 Declarations of local variables
572 !
573 INTEGER :: ji, jj
574 INTEGER :: igrid, ilench
575 REAL, DIMENSION(:,:,:), ALLOCATABLE :: zwork3d ! work array read in a MNH file
576 REAL, DIMENSION(:,:), ALLOCATABLE :: zwork2d
577 REAL(KIND=JPRB) :: zhook_handle
578 !
579 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX2_LFI:READ_IN_LFI_X2_FOR_MNH',0,zhook_handle)
580 !
581 ALLOCATE(zwork3d(niu,nju,SIZE(pfield,2)))
582 zwork3d(:,:,:) = 999.
583 !
584 IF (njb==nje) THEN
585  ALLOCATE(zwork2d(niu,SIZE(pfield,2)))
586  zwork2d(:,:) = 999.
587 ELSEIF (nib==nie) THEN
588  ALLOCATE(zwork2d(nju,SIZE(pfield,2)))
589  zwork2d(:,:) = 999.
590 ENDIF
591 !
592 IF (njb==nje) THEN
593 !
594  CALL fmreadx2(cfile_lfi,yrec,cluout_lfi,SIZE(zwork2d),zwork2d,igrid,ilench,hcomment,kresp)
595  DO jj = 1,SIZE(zwork3d,2)
596  zwork3d(nib:nie,jj,:) = zwork2d(nib:nie,:)
597  END DO
598 !
599  DEALLOCATE(zwork2d)
600 !
601 ELSEIF (nib==nie) THEN
602 !
603  CALL fmreadx2(cfile_lfi,yrec,cluout_lfi,SIZE(zwork2d),zwork2d,igrid,ilench,hcomment,kresp)
604  DO ji = 1,SIZE(zwork3d,1)
605  zwork3d(ji,nib:nie,:) = zwork2d(njb:nje,:)
606  END DO
607 !
608  DEALLOCATE(zwork2d)
609 !
610 ELSE
611 !
612  CALL fmreadx3(cfile_lfi,hrec,cluout_lfi,SIZE(zwork3d),zwork3d,igrid,ilench,hcomment,kresp)
613 !
614 ENDIF
615 !
616 DO jj=1,nje-njb+1
617  DO ji=1,nie-nib+1
618  pfield(ji+(nie-nib+1)*(jj-1),:) = zwork3d(nib+ji-1,njb+jj-1,:)
619  END DO
620 END DO
621 DEALLOCATE(zwork3d)
622 !
623  CALL error_read_surf_lfi(hrec,kresp)
624 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFX2_LFI:READ_IN_LFI_X2_FOR_MNH',1,zhook_handle)
625 !
626 END SUBROUTINE read_in_lfi_x2_for_mnh
627 !
628 END SUBROUTINE read_surfx2_lfi
629 !
630 ! #############################################################
631  SUBROUTINE read_surfn0_lfi(HREC,KFIELD,KRESP,HCOMMENT)
632 ! #############################################################
633 !
634 !!**** *READN0* - routine to read an integer
635 !! B. Decharme 07/2011 : Grdid dimension only read in pgd file
636 !
637 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi, cfilepgd_lfi, &
638  lmnh_compatible, niu, nib, nie, nju, njb, nje
639 !
640 USE modd_surfex_omp, ONLY : nblock
641 !
642 USE modi_fmread
643 USE modi_error_read_surf_lfi
644 !
645 USE yomhook ,ONLY : lhook, dr_hook
646 USE parkind1 ,ONLY : jprb
647 !
648 IMPLICIT NONE
649 !
650 !* 0.1 Declarations of arguments
651 !
652  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
653 INTEGER, INTENT(OUT) :: kfield ! the integer to be read
654 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
655  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
656 !
657 !* 0.2 Declarations of local variables
658 !
659  CHARACTER(LEN=40) :: ygrid
660 INTEGER :: igrid ! position of data on grid
661 INTEGER :: ilench ! length of comment string
662 INTEGER :: iimax, ijmax
663 INTEGER :: inb ! number of articles in the file
664 INTEGER :: iresp
665 REAL(KIND=JPRB) :: zhook_handle
666 !
667 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFN0_LFI',0,zhook_handle)
668 !
669 kresp=0
670 !
671  CALL fmreadn0(cfile_lfi,hrec,cluout_lfi,1,kfield,igrid,ilench,hcomment,kresp)
672 !
673  CALL error_read_surf_lfi(hrec,kresp)
674 !
675 !* tests compatibility with MesoNH files
676 !
677 IF (hrec/='DIM_FULL' .AND. lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFN0_LFI',1,zhook_handle)
678 IF (hrec/='DIM_FULL') RETURN
679 !
680 !-----------------------------------------------------------------------------------------------------
681 ! READ PGD FILE
682 !-----------------------------------------------------------------------------------------------------
683 !
684 !IF (CFILE_LFI/=CFILEPGD_LFI) THEN
685 ! CALL FMOPEN(CFILEPGD_LFI,'OLD',CLUOUT_LFI,0,1,1,INB,IRESP)
686 !ENDIF
687 !
688  CALL fmreadc0(cfile_lfi,'GRID_TYPE ',cluout_lfi,1,ygrid,igrid,ilench,hcomment,kresp)
689  CALL error_read_surf_lfi('GRID_TYPE ',kresp)
690 lmnh_compatible = (ygrid=="CARTESIAN " .OR. ygrid=="CONF PROJ ")
691 !
692 IF (lmnh_compatible) THEN
693  CALL fmreadn0(cfile_lfi,'IMAX',cluout_lfi,1,iimax,igrid,ilench,hcomment,kresp)
694  CALL error_read_surf_lfi('IMAX',kresp)
695  niu = iimax+2
696  nib = 2
697  nie = iimax+1
698  CALL fmreadn0(cfile_lfi,'JMAX',cluout_lfi,1,ijmax,igrid,ilench,hcomment,kresp)
699  CALL error_read_surf_lfi('JMAX',kresp)
700  nju = ijmax+2
701  njb = 2
702  nje = ijmax+1
703 END IF
704 !
705 !IF(CFILE_LFI/=CFILEPGD_LFI)THEN
706 ! CALL FMCLOS(CFILEPGD_LFI,'KEEP',CLUOUT_LFI,IRESP)
707 !ENDIF
708 !
709 !-----------------------------------------------------------------------------------------------------
710 ! END READ PGD FILE
711 !-----------------------------------------------------------------------------------------------------
712 !
713 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFN0_LFI',1,zhook_handle)
714 !
715 END SUBROUTINE read_surfn0_lfi
716 !
717 ! #############################################################
718  SUBROUTINE read_surfn1_lfi(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
719 ! #############################################################
720 !
721 !!**** *READN0* - routine to read an integer
722 !
723 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
724 !
725 USE modd_surfex_omp, ONLY : nworkd, nworkb
726 !
727 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi, nmask, nfull
728 !
729 USE modi_fmread
730 USE modi_error_read_surf_lfi
732 !
733 USE yomhook ,ONLY : lhook, dr_hook
734 USE parkind1 ,ONLY : jprb
735 !
736 IMPLICIT NONE
737 !
738 #ifdef SFX_MPI
739 include "mpif.h"
740 #endif
741 !
742 !* 0.1 Declarations of arguments
743 !
744  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
745 INTEGER, DIMENSION(:), INTENT(OUT) :: kfield ! the integer to be read
746 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
747  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
748  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
749  ! 'H' : field with
750  ! horizontal spatial dim.
751  ! '-' : no horizontal dim.
752 !* 0.2 Declarations of local variables
753 !
754 INTEGER :: igrid ! position of data on grid
755 INTEGER :: ilench ! length of comment string
756 INTEGER :: il1, infompi
757 !
758 #ifdef SFX_MPI
759 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
760 #endif
761 DOUBLE PRECISION :: xtime0
762 REAL(KIND=JPRB) :: zhook_handle
763 !
764 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFN1_LFI',0,zhook_handle)
765 !
766 !$OMP BARRIER
767 !
768 il1 = SIZE(kfield)
769 !
770 !$OMP SINGLE
771 nworkb=0
772 !$OMP END SINGLE
773 !
774 #ifdef SFX_MPI
775 xtime0 = mpi_wtime()
776 #endif
777 !
778 IF (hdir=='-') THEN
779 !$OMP SINGLE
780  ALLOCATE(nworkd(il1))
781 !$OMP END SINGLE
782 ENDIF
783 !
784 IF (nrank==npio) THEN
785  !
786 !$OMP SINGLE
787  !
788  IF (hdir=='A') THEN
789  ALLOCATE(nworkd(il1))
790  ELSEIF (hdir/='-') THEN
791  ALLOCATE(nworkd(nfull))
792  ENDIF
793  !
794  IF (hdir=='H') THEN
795  CALL fmreadn1(cfile_lfi,hrec,cluout_lfi,nfull,nworkd,igrid,ilench,hcomment,nworkb)
796  ELSE
797  CALL fmreadn1(cfile_lfi,hrec,cluout_lfi,il1,nworkd(:),igrid,ilench,hcomment,nworkb)
798  END IF
799  !
800 !$OMP END SINGLE
801  !
802  CALL error_read_surf_lfi(hrec,nworkb)
803  !
804 ENDIF
805 !
806 kresp = nworkb
807 !
808 #ifdef SFX_MPI
809 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
810 #endif
811 !
812 IF (hdir=='A') THEN ! no distribution on other tasks
813  IF ( nrank==npio ) THEN
814 #ifdef SFX_MPI
815  xtime0 = mpi_wtime()
816 #endif
817  kfield(:) = nworkd(1:il1)
818 #ifdef SFX_MPI
819  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
820 #endif
821  ENDIF
822 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
823 !$OMP SINGLE
824  IF (nproc>1) THEN
825 #ifdef SFX_MPI
826  xtime0 = mpi_wtime()
827  CALL mpi_bcast(nworkd,il1*kind(nworkd)/4,mpi_integer,npio,ncomm,infompi)
828  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
829 #endif
830  ENDIF
831 !$OMP END SINGLE
832  kfield(:) = nworkd(1:il1)
833 ELSE
834  CALL read_and_send_mpi(nworkd,kfield,nmask)
835 ENDIF
836 !
837 !$OMP BARRIER
838 !
839 !$OMP SINGLE
840 DEALLOCATE(nworkd)
841 !$OMP END SINGLE
842 !
843 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFN1_LFI',1,zhook_handle)
844 !
845 END SUBROUTINE read_surfn1_lfi
846 !
847 ! #############################################################
848  SUBROUTINE read_surfc0_lfi(HREC,HFIELD,KRESP,HCOMMENT)
849 ! #############################################################
850 !
851 !!**** *READC0* - routine to read a character
852 !
853 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
854 !
855 USE modi_fmread
856 USE modi_error_read_surf_lfi
857 !
858 USE yomhook ,ONLY : lhook, dr_hook
859 USE parkind1 ,ONLY : jprb
860 !
861 IMPLICIT NONE
862 !
863 !* 0.1 Declarations of arguments
864 !
865  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
866  CHARACTER(LEN=40), INTENT(OUT) :: hfield ! the integer to be read
867 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
868  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
869 !
870 !* 0.2 Declarations of local variables
871 !
872 INTEGER :: igrid ! position of data on grid
873 INTEGER :: ilench ! length of comment string
874 REAL(KIND=JPRB) :: zhook_handle
875 !
876 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFC0_LFI',0,zhook_handle)
877 !
878 kresp=0
879 !
880  CALL fmreadc0(cfile_lfi,hrec,cluout_lfi,1,hfield,igrid,ilench,hcomment,kresp)
881 !
882  CALL error_read_surf_lfi(hrec,kresp)
883 !
884 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFC0_LFI',1,zhook_handle)
885 !
886 END SUBROUTINE read_surfc0_lfi
887 !
888 ! #############################################################
889  SUBROUTINE read_surfl0_lfi(HREC,OFIELD,KRESP,HCOMMENT)
890 ! #############################################################
891 !
892 !!**** *READL0* - routine to read a logical
893 !
894 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
895 !
896 USE modi_fmread
897 USE modi_error_read_surf_lfi
898 !
899 USE yomhook ,ONLY : lhook, dr_hook
900 USE parkind1 ,ONLY : jprb
901 !
902 IMPLICIT NONE
903 !
904 !* 0.1 Declarations of arguments
905 !
906  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
907 LOGICAL, INTENT(OUT) :: ofield ! array containing the data field
908 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
909  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
910 !
911 !* 0.2 Declarations of local variables
912 !
913 INTEGER :: igrid ! position of data on grid
914 INTEGER :: ilench ! length of comment string
915 REAL(KIND=JPRB) :: zhook_handle
916 !
917 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFL0_LFI',0,zhook_handle)
918 !
919 kresp=0
920 !
921  CALL fmreadl0(cfile_lfi,hrec,cluout_lfi,1,ofield,igrid,ilench,hcomment,kresp)
922 !
923  CALL error_read_surf_lfi(hrec,kresp)
924 !
925 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFL0_LFI',1,zhook_handle)
926 !
927 END SUBROUTINE read_surfl0_lfi
928 !
929 ! #############################################################
930  SUBROUTINE read_surfl1_lfi(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
931 ! #############################################################
932 !
933 !!**** *READL1* - routine to read a logical array
934 !
935 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
936 !
937 USE modd_surfex_omp, ONLY : lworkd, nworkb
938 !
939 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
940 !
941 USE modi_fmread
942 USE modi_error_read_surf_lfi
943 USE modi_abor1_sfx
944 USE modi_get_luout
945 !
946 USE yomhook ,ONLY : lhook, dr_hook
947 USE parkind1 ,ONLY : jprb
948 !
949 IMPLICIT NONE
950 !
951 #ifdef SFX_MPI
952 include "mpif.h"
953 #endif
954 !
955 !* 0.1 Declarations of arguments
956 !
957  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
958 LOGICAL, DIMENSION(:), INTENT(OUT) :: ofield ! array containing the data field
959 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
960  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
961  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
962  ! 'H' : field with
963  ! horizontal spatial dim.
964  ! '-' : no horizontal dim.
965 !* 0.2 Declarations of local variables
966 !
967 INTEGER :: iluout
968 INTEGER :: igrid ! position of data on grid
969 INTEGER :: ilench ! length of comment string
970 INTEGER :: il1, infompi
971 DOUBLE PRECISION :: xtime0
972 REAL(KIND=JPRB) :: zhook_handle
973 !
974 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFL1_LFI',0,zhook_handle)
975 !
976 !$OMP BARRIER
977 !
978 il1 = SIZE(ofield)
979 !
980 #ifdef SFX_MPI
981 xtime0 = mpi_wtime()
982 #endif
983 !
984 !$OMP SINGLE
985 nworkb=0
986 ALLOCATE(lworkd(il1))
987 !$OMP END SINGLE
988 !
989 IF (nrank==npio) THEN
990  !
991 !$OMP SINGLE
992  !
993  IF (hdir=='H') THEN
994  CALL get_luout('LFI ',iluout)
995  WRITE(iluout,*) 'Error: 1D logical vector for reading on an horizontal grid:'
996  WRITE(iluout,*) 'this option is not coded in READ_SURFL1_LFI'
997  CALL abor1_sfx('MODE_READ_SURF_LFI: 1D LOGICAL VECTOR FOR READING NOT CODED IN READ_SURFL1_LFI')
998  END IF
999  !
1000  CALL fmreadl1(cfile_lfi,hrec,cluout_lfi,il1,lworkd,igrid,ilench,hcomment,nworkb)
1001  !
1002 !$OMP END SINGLE
1003  !
1004  CALL error_read_surf_lfi(hrec,nworkb)
1005  !
1006 ENDIF
1007 !
1008 kresp = nworkb
1009 !
1010 #ifdef SFX_MPI
1011 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
1012 #endif
1013 !
1014 IF (nproc>1 .AND. hdir/='A') THEN
1015 #ifdef SFX_MPI
1016  xtime0 = mpi_wtime()
1017 !$OMP SINGLE
1018  CALL mpi_bcast(lworkd,il1,mpi_logical,npio,ncomm,infompi)
1019 !$OMP END SINGLE
1020  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
1021 #endif
1022 ENDIF
1023 !
1024 ofield = lworkd
1025 !
1026 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFL1_LFI',1,zhook_handle)
1027 !
1028 END SUBROUTINE read_surfl1_lfi
1029 !
1030 ! #############################################################
1031  SUBROUTINE read_surft0_lfi(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1032 ! #############################################################
1033 !
1034 !!**** *READT0* - routine to read a date
1035 !
1036 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
1037 !
1038 USE modi_fmread
1039 USE modi_error_read_surf_lfi
1040 !
1041 USE yomhook ,ONLY : lhook, dr_hook
1042 USE parkind1 ,ONLY : jprb
1043 !
1044 IMPLICIT NONE
1045 !
1046 !* 0.1 Declarations of arguments
1047 !
1048  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1049 INTEGER, INTENT(OUT) :: kyear ! year
1050 INTEGER, INTENT(OUT) :: kmonth ! month
1051 INTEGER, INTENT(OUT) :: kday ! day
1052 REAL, INTENT(OUT) :: ptime ! year
1053 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1054  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1055 
1056 !* 0.2 Declarations of local variables
1057 !
1058  CHARACTER(LEN=12) :: yrec ! Name of the article to be read
1059 INTEGER, DIMENSION(3) :: itdate
1060 !
1061 INTEGER :: igrid ! position of data on grid
1062 INTEGER :: ilench ! length of comment string
1063 REAL(KIND=JPRB) :: zhook_handle
1064 !
1065 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFT0_LFI',0,zhook_handle)
1066 !
1067 kresp=0
1068 !
1069 yrec=trim(hrec)//'%TDATE'
1070  CALL fmreadn1(cfile_lfi,yrec,cluout_lfi,3,itdate,igrid,ilench,hcomment,kresp)
1071  CALL error_read_surf_lfi(hrec,kresp)
1072 !
1073 yrec=trim(hrec)//'%TIME'
1074  CALL fmreadx0(cfile_lfi,yrec,cluout_lfi,1,ptime,igrid,ilench,hcomment,kresp)
1075  CALL error_read_surf_lfi(hrec,kresp)
1076 !
1077 kyear = itdate(1)
1078 kmonth = itdate(2)
1079 kday = itdate(3)
1080 !
1081 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFT0_LFI',1,zhook_handle)
1082 !
1083 END SUBROUTINE read_surft0_lfi
1084 !
1085 ! #############################################################
1086  SUBROUTINE read_surft1_lfi(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1087 ! #############################################################
1088 !
1089 !!**** *READT0* - routine to read a date
1090 !
1091 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
1092 !
1093 USE modi_fmread
1094 USE modi_error_read_surf_lfi
1095 !
1096 USE yomhook ,ONLY : lhook, dr_hook
1097 USE parkind1 ,ONLY : jprb
1098 !
1099 IMPLICIT NONE
1100 !
1101 !* 0.1 Declarations of arguments
1102 !
1103  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1104 INTEGER, DIMENSION(:), INTENT(OUT) :: kyear ! year
1105 INTEGER, DIMENSION(:), INTENT(OUT) :: kmonth ! month
1106 INTEGER, DIMENSION(:), INTENT(OUT) :: kday ! day
1107 REAL, DIMENSION(:), INTENT(OUT) :: ptime ! year
1108 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1109  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1110 
1111 !* 0.2 Declarations of local variables
1112 !
1113  CHARACTER(LEN=12) :: yrec ! Name of the article to be read
1114 INTEGER :: iluout
1115 INTEGER :: igrid ! position of data on grid
1116 INTEGER :: ilench ! length of comment string
1117 INTEGER, DIMENSION(3,SIZE(KYEAR)) :: itdate
1118 REAL(KIND=JPRB) :: zhook_handle
1119 !
1120 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFT1_LFI',0,zhook_handle)
1121 !
1122 kresp=0
1123 !
1124 yrec=trim(hrec)//'%TDATE'
1125  CALL fmreadn2(cfile_lfi,yrec,cluout_lfi,SIZE(itdate),itdate,igrid,ilench,hcomment,kresp)
1126  CALL error_read_surf_lfi(hrec,kresp)
1127 !
1128 yrec=trim(hrec)//'%TIME'
1129  CALL fmreadx1(cfile_lfi,yrec,cluout_lfi,SIZE(ptime),ptime,igrid,ilench,hcomment,kresp)
1130  CALL error_read_surf_lfi(hrec,kresp)
1131 !
1132 kyear(:) = itdate(1,:)
1133 kmonth(:) = itdate(2,:)
1134 kday(:) = itdate(3,:)
1135 !
1136 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFT1_LFI',1,zhook_handle)
1137 !
1138 END SUBROUTINE read_surft1_lfi
1139 !
1140 ! #############################################################
1141  SUBROUTINE read_surft2_lfi(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1142 ! #############################################################
1143 !
1144 !!**** *READT0* - routine to read a date
1145 !
1146 USE modd_io_surf_lfi, ONLY : cfile_lfi, cluout_lfi
1147 !
1148 USE modi_fmread
1149 USE modi_error_read_surf_lfi
1150 !
1151 USE yomhook ,ONLY : lhook, dr_hook
1152 USE parkind1 ,ONLY : jprb
1153 !
1154 IMPLICIT NONE
1155 !
1156 !* 0.1 Declarations of arguments
1157 !
1158  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1159 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kyear ! year
1160 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kmonth ! month
1161 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kday ! day
1162 REAL, DIMENSION(:,:), INTENT(OUT) :: ptime ! year
1163 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1164  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1165 
1166 !* 0.2 Declarations of local variables
1167 !
1168  CHARACTER(LEN=12) :: yrec ! Name of the article to be read
1169 INTEGER :: iluout
1170 INTEGER :: igrid ! position of data on grid
1171 INTEGER :: ilench ! length of comment string
1172 REAL(KIND=JPRB) :: zhook_handle
1173 !
1174 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFT2_LFI',0,zhook_handle)
1175 !
1176 kresp=0
1177 !
1178 yrec=trim(hrec)//'%YEAR'
1179  CALL fmreadn2(cfile_lfi,yrec,cluout_lfi,SIZE(kyear),kyear,igrid,ilench,hcomment,kresp)
1180  CALL error_read_surf_lfi(hrec,kresp)
1181 !
1182 yrec=trim(hrec)//'%MONTH'
1183  CALL fmreadn2(cfile_lfi,yrec,cluout_lfi,SIZE(kmonth),kmonth,igrid,ilench,hcomment,kresp)
1184  CALL error_read_surf_lfi(hrec,kresp)
1185 !
1186 yrec=trim(hrec)//'%DAY'
1187  CALL fmreadn2(cfile_lfi,yrec,cluout_lfi,SIZE(kday),kday,igrid,ilench,hcomment,kresp)
1188  CALL error_read_surf_lfi(hrec,kresp)
1189 !
1190 yrec=trim(hrec)//'%TIME'
1191  CALL fmreadx2(cfile_lfi,yrec,cluout_lfi,SIZE(ptime),ptime,igrid,ilench,hcomment,kresp)
1192  CALL error_read_surf_lfi(hrec,kresp)
1193 !
1194 IF (lhook) CALL dr_hook('MODE_READ_SURF_LFI:READ_SURFT2_LFI',1,zhook_handle)
1195 !
1196 END SUBROUTINE read_surft2_lfi
1197 !
1198 #endif
1199 !
1200 END MODULE mode_read_surf_lfi
subroutine error_read_surf_lfi(HREC, KRESP)
subroutine read_surfx0_lfi(HREC, PFIELD, KRESP, HCOMMENT)
subroutine read_surft2_lfi(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surfn0_lfi(HREC, KFIELD, KRESP, HCOMMENT)
subroutine read_in_lfi_x2_for_mnh(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine get_surf_undef(PUNDEF)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine read_surfn1_lfi(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfc0_lfi(HREC, HFIELD, KRESP, HCOMMENT)
subroutine read_in_lfi_x1_for_mnh(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfl0_lfi(HREC, OFIELD, KRESP, HCOMMENT)
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:6
subroutine read_surfl1_lfi(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surft0_lfi(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surft1_lfi(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surfx1_lfi(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfx2_lfi(HREC, PFIELD, KRESP, HCOMMENT, HDIR)