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