SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/mode_read_surf_lfi.F90
Go to the documentation of this file.
00001 MODULE MODE_READ_SURF_LFI
00002 !
00003 !!    PURPOSE
00004 !!    -------
00005 !
00006 !       The purpose of READ_SURF_LFI is
00007 !
00008 !!**  METHOD
00009 !!    ------
00010 !!
00011 !!    EXTERNAL
00012 !!    --------
00013 !!
00014 !!     
00015 !!
00016 !!    IMPLICIT ARGUMENTS
00017 !!    ------------------
00018 !!
00019 !!
00020 !!    REFERENCE
00021 !!    ---------
00022 !!
00023 !!
00024 !!    AUTHOR
00025 !!    ------
00026 !!
00027 !!      S.Malardel      *METEO-FRANCE*
00028 !!
00029 !!    MODIFICATIONS
00030 !!    -------------
00031 !!
00032 !!      original                                                     01/08/03
00033 !----------------------------------------------------------------------------
00034 !
00035 INTERFACE READ_SURF0_LFI
00036         MODULE PROCEDURE READ_SURFX0_LFI
00037         MODULE PROCEDURE READ_SURFN0_LFI
00038         MODULE PROCEDURE READ_SURFL0_LFI
00039         MODULE PROCEDURE READ_SURFC0_LFI
00040 END INTERFACE
00041 INTERFACE READ_SURFN_LFI
00042         MODULE PROCEDURE READ_SURFX1_LFI
00043         MODULE PROCEDURE READ_SURFN1_LFI
00044         MODULE PROCEDURE READ_SURFL1_LFI
00045         MODULE PROCEDURE READ_SURFX2_LFI
00046 END INTERFACE
00047 INTERFACE READ_SURFT_LFI
00048         MODULE PROCEDURE READ_SURFT0_LFI
00049         MODULE PROCEDURE READ_SURFT1_LFI
00050 END INTERFACE
00051 !
00052 CONTAINS
00053 !
00054 !     #############################################################
00055       SUBROUTINE READ_SURFX0_LFI(HREC,PFIELD,KRESP,HCOMMENT)
00056 !     #############################################################
00057 !
00058 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI
00059 !
00060 USE MODI_FMREAD
00061 USE MODI_ERROR_READ_SURF_LFI
00062 !
00063 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00064 USE PARKIND1  ,ONLY : JPRB
00065 !
00066 IMPLICIT NONE
00067 !
00068 !*      0.1   Declarations of arguments
00069 !
00070  CHARACTER(LEN=*), INTENT(IN)  :: HREC     ! name of the article to be read
00071 REAL,              INTENT(OUT) :: PFIELD   ! the real scalar to be read
00072 INTEGER,           INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00073  CHARACTER(LEN=100),INTENT(OUT) :: HCOMMENT ! comment
00074 !
00075 !*      0.2   Declarations of local variables
00076 !
00077 INTEGER          :: IGRID   ! position of data on grid
00078 INTEGER          :: ILENCH  ! length of comment string
00079 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00080 !
00081 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX0_LFI',0,ZHOOK_HANDLE)
00082 !
00083 KRESP=0
00084 !
00085  CALL FMREADX0(CFILE_LFI,HREC,CLUOUT_LFI,1,PFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
00086 !
00087  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00088 !
00089 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX0_LFI',1,ZHOOK_HANDLE)
00090 !
00091 END SUBROUTINE READ_SURFX0_LFI
00092 !
00093 !     #############################################################
00094       SUBROUTINE READ_SURFX1_LFI(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
00095 !     #############################################################
00096 !
00097 !!****  *READX1* - routine to fill a real 1D array for the externalised surface 
00098 !
00099 USE MODD_SURFEX_MPI, ONLY : NRANK, NPROC, NCOMM, NPIO, XTIME_NPIO_READ, XTIME_COMM_READ
00100 !
00101 USE MODD_IO_SURF_LFI, ONLY : CFILE_LFI, CLUOUT_LFI, NMASK, NFULL, &
00102                              LMNH_COMPATIBLE  
00103 !
00104 USE MODI_FMREAD
00105 USE MODI_ERROR_READ_SURF_LFI
00106 USE MODI_READ_AND_SEND_MPI
00107 USE MODI_GET_SURF_UNDEF
00108 !
00109 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00110 USE PARKIND1  ,ONLY : JPRB
00111 !
00112 IMPLICIT NONE
00113 !
00114 #ifndef NOMPI
00115 INCLUDE "mpif.h"
00116 #endif
00117 !
00118 !*      0.1   Declarations of arguments
00119 !
00120  CHARACTER(LEN=*),   INTENT(IN)  :: HREC     ! name of the article to be read
00121 REAL, DIMENSION(:),  INTENT(OUT) :: PFIELD   ! array containing the data field
00122 INTEGER,             INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00123  CHARACTER(LEN=100),  INTENT(OUT) :: HCOMMENT ! comment
00124  CHARACTER(LEN=1),    INTENT(IN)  :: HDIR     ! type of field :
00125                                              ! 'H' : field with
00126                                              !       horizontal spatial dim.
00127                                              ! '-' : no horizontal dim.
00128 !*      0.2   Declarations of local variables
00129 !
00130  CHARACTER(LEN=18) :: YREC
00131 REAL              :: ZUNDEF  ! default value
00132 INTEGER           :: IGRID   ! position of data on grid
00133 INTEGER           :: ILENCH  ! length of comment string
00134 INTEGER           :: IVERSION, IBUGFIX
00135 INTEGER           :: I, INFOMPI
00136 !
00137 #ifndef NOMPI
00138 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
00139 #endif
00140 DOUBLE PRECISION   :: XTIME0
00141 REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK   ! work array read in the file
00142 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00143 !
00144 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX1_LFI',0,ZHOOK_HANDLE)
00145 !
00146 KRESP=0
00147 !
00148 #ifndef NOMPI
00149 XTIME0 = MPI_WTIME()
00150 #endif
00151 !
00152 IF (NRANK==NPIO) THEN
00153   !
00154   IF (HDIR=='H' .OR. HDIR=='A') THEN
00155     ALLOCATE(ZWORK(NFULL))
00156   ELSE
00157     ALLOCATE(ZWORK(SIZE(PFIELD)))
00158   ENDIF
00159   !
00160 !$OMP SINGLE        
00161   !  
00162   YREC = HREC
00163   !
00164   !---------------------------------------------------------------------------
00165   !* patch to read some test files done before version 3.5
00166   !  this should be removed once all tests with reading lfi files done with 923
00167   !  configuration (with these early versions) are finished.
00168   !
00169   IF (HREC(1:2)=='D_') THEN
00170     CALL FMREADN0(CFILE_LFI,'VERSION',CLUOUT_LFI,1,IVERSION,IGRID,ILENCH,HCOMMENT,KRESP)
00171     CALL FMREADN0(CFILE_LFI,'BUG',CLUOUT_LFI,1,IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
00172     IF (IVERSION<=2 .OR. (IVERSION==3 .AND. IBUGFIX<=5)) YREC = 'DATA_'//HREC(3:12)
00173   END IF
00174   !---------------------------------------------------------------------------
00175   !
00176   IF (HDIR=='H' .OR. HDIR=='A') THEN
00177     IF (.NOT. LMNH_COMPATIBLE) THEN
00178       CALL FMREADX1(CFILE_LFI,YREC,CLUOUT_LFI,NFULL,ZWORK,IGRID,ILENCH,HCOMMENT,KRESP)
00179     ELSE
00180       CALL READ_IN_LFI_X1_FOR_MNH(YREC,ZWORK,KRESP,HCOMMENT,HDIR)
00181     END IF
00182   ELSE
00183     CALL FMREADX1(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK),ZWORK,IGRID,ILENCH,HCOMMENT,KRESP)
00184   END IF
00185   CALL ERROR_READ_SURF_LFI(YREC,KRESP)
00186   !
00187 !$OMP END SINGLE COPYPRIVATE(ZWORK,HCOMMENT,KRESP)
00188   !  
00189 ELSE
00190   ALLOCATE(ZWORK(0))
00191 ENDIF
00192 !
00193 #ifndef NOMPI
00194 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0)
00195 #endif
00196 !
00197 IF (HDIR=='A') THEN  ! no distribution on other tasks
00198   IF ( NRANK==NPIO ) THEN
00199 #ifndef NOMPI          
00200     XTIME0 = MPI_WTIME()
00201 #endif
00202     PFIELD(:) = ZWORK(1:SIZE(PFIELD))
00203 #ifndef NOMPI
00204     XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0)
00205 #endif
00206   ENDIF
00207 ELSEIF (HDIR=='-') THEN ! distribution of the total field on other tasks
00208 !$OMP SINGLE    
00209   PFIELD(:) = ZWORK(1:SIZE(PFIELD))
00210   IF (NPROC>1) THEN
00211 #ifndef NOMPI
00212     XTIME0 = MPI_WTIME()
00213     CALL MPI_BCAST(PFIELD,SIZE(PFIELD)*KIND(PFIELD)/4,MPI_REAL,NPIO,NCOMM,INFOMPI)
00214     XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0)
00215 #endif
00216   ENDIF
00217 !$OMP END SINGLE COPYPRIVATE(PFIELD)    
00218 ELSE
00219   CALL READ_AND_SEND_MPI(ZWORK,PFIELD,NMASK)
00220 ENDIF
00221 !
00222 DEALLOCATE(ZWORK)
00223 !
00224 !
00225 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX1_LFI',1,ZHOOK_HANDLE)
00226 !
00227 CONTAINS
00228 !
00229 !     #############################################################
00230       SUBROUTINE READ_IN_LFI_X1_FOR_MNH(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
00231 !     #############################################################
00232 !
00233 !!****  * - routine to fill a read 2D array for the externalised surface 
00234 !
00235 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI, &
00236                                     NIU, NIB, NIE, NJU, NJB, NJE
00237 !
00238 USE MODI_FMREAD
00239 USE MODI_ERROR_READ_SURF_LFI
00240 !
00241 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00242 USE PARKIND1  ,ONLY : JPRB
00243 !
00244 IMPLICIT NONE
00245 !
00246 !*      0.1   Declarations of arguments
00247 !
00248  CHARACTER(LEN=*),        INTENT(IN) :: HREC     ! name of the article to be read
00249 REAL, DIMENSION(:),     INTENT(OUT):: PFIELD   ! array containing the data field
00250 INTEGER,                  INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00251  CHARACTER(LEN=100),       INTENT(OUT):: HCOMMENT ! comment string
00252  CHARACTER(LEN=1),         INTENT(IN) :: HDIR     ! type of field :
00253                                                  ! 'H' : field with
00254                                                  !       horizontal spatial dim.
00255                                                  ! '-' : no horizontal dim.
00256 !
00257 !*      0.2   Declarations of local variables
00258 ! 
00259  CHARACTER(LEN=4)   :: YREC1D
00260 INTEGER :: JI, JJ
00261 INTEGER :: ILEN
00262 INTEGER :: IGRID, ILENCH
00263 REAL, DIMENSION(:),   ALLOCATABLE :: ZWORK1D! 1D work array read in the file
00264 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D ! work array read in a MNH file
00265 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00266 !
00267 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX1_LFI:READ_IN_LFI_X1_FOR_MNH',0,ZHOOK_HANDLE)
00268 !
00269 ALLOCATE(ZWORK2D(NIU,NJU))
00270 ZWORK2D(:,:) = 999.
00271 !
00272 IF (HREC=='XX                 ' .OR. HREC=='DX                 ') THEN
00273   ALLOCATE(ZWORK1D(NIU))
00274   YREC1D = 'XHAT'
00275   ILEN   = NIU
00276 ELSEIF (HREC=='YY                 ' .OR. HREC=='DY                 ') THEN
00277   ALLOCATE(ZWORK1D(NJU))
00278   YREC1D = 'YHAT'
00279   ILEN   = NJU
00280 ELSEIF (NJB==NJE) THEN
00281   ALLOCATE(ZWORK1D(NIU))
00282   ZWORK1D(:) = 999.
00283 ELSEIF (NIB==NIE) THEN
00284   ALLOCATE(ZWORK1D(NJU))
00285   ZWORK1D(:) = 999. 
00286 ENDIF
00287 !
00288 IF (HREC=='XX' .OR. HREC=='YY'.OR. HREC=='DX' .OR. HREC=='DY') THEN
00289 !
00290   CALL FMREADX1(CFILE_LFI,YREC1D,CLUOUT_LFI,ILEN,ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
00291   CALL ERROR_READ_SURF_LFI(YREC1D,KRESP)
00292 !
00293   SELECT CASE(HREC)
00294     CASE('XX                  ')
00295       DO JJ = 1,SIZE(ZWORK2D,2)
00296         ZWORK2D(NIB:NIE,JJ) = 0.5 * ZWORK1D(NIB:NIE) + 0.5 * ZWORK1D(NIB+1:NIE+1)
00297       END DO
00298     CASE('DX                  ')
00299       DO JJ = 1,SIZE(ZWORK2D,2)
00300         ZWORK2D(NIB:NIE,JJ) = - ZWORK1D(NIB:NIE) + ZWORK1D(NIB+1:NIE+1)
00301       END DO
00302     CASE('YY                  ')
00303       DO JI = 1,SIZE(ZWORK2D,1)
00304         ZWORK2D(JI,NJB:NJE) = 0.5 * ZWORK1D(NJB:NJE) + 0.5 * ZWORK1D(NJB+1:NJE+1)
00305       END DO
00306     CASE('DY                  ')
00307       DO JI = 1,SIZE(ZWORK2D,1)
00308         ZWORK2D(JI,NJB:NJE) = - ZWORK1D(NJB:NJE) + ZWORK1D(NJB+1:NJE+1)
00309       END DO
00310   END SELECT
00311 !
00312   DEALLOCATE(ZWORK1D)
00313 !
00314 ELSEIF (NJB==NJE) THEN
00315 !
00316   CALL FMREADX1(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK1D),ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
00317   DO JJ = 1,SIZE(ZWORK2D,2)
00318     ZWORK2D(NIB:NIE,JJ) = ZWORK1D(NIB:NIE)
00319   END DO
00320 !
00321   DEALLOCATE(ZWORK1D) 
00322 !
00323 ELSEIF (NIB==NIE) THEN
00324 !
00325   CALL FMREADX1(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK1D),ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP) 
00326   DO JI = 1,SIZE(ZWORK2D,1)
00327     ZWORK2D(JI,NJB:NJE) = ZWORK1D(NJB:NJE)
00328   END DO
00329 !
00330   DEALLOCATE(ZWORK1D)
00331 !
00332 ELSE
00333 !
00334   CALL FMREADX2(CFILE_LFI,HREC,CLUOUT_LFI,SIZE(ZWORK2D),ZWORK2D,IGRID,ILENCH,HCOMMENT,KRESP)
00335 !
00336 ENDIF
00337 !
00338 DO JJ=1,NJE-NJB+1
00339   DO JI=1,NIE-NIB+1
00340     PFIELD(JI+(NIE-NIB+1)*(JJ-1)) = ZWORK2D(NIB+JI-1,NJB+JJ-1) 
00341   END DO
00342 END DO
00343 !
00344 DEALLOCATE(ZWORK2D) 
00345 !  
00346  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00347 !
00348 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX1_LFI:READ_IN_LFI_X1_FOR_MNH',1,ZHOOK_HANDLE)
00349 !
00350 END SUBROUTINE READ_IN_LFI_X1_FOR_MNH
00351 !
00352 END SUBROUTINE READ_SURFX1_LFI
00353 !
00354 !     #############################################################
00355       SUBROUTINE READ_SURFX2_LFI(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
00356 !     #############################################################
00357 !
00358 !!****  *READX2* - routine to fill a real 2D array for the externalised surface 
00359 !
00360 USE MODD_SURFEX_MPI, ONLY : NRANK, NPROC, NCOMM, NPIO, XTIME_NPIO_READ, XTIME_COMM_READ
00361 !
00362 USE MODD_IO_SURF_LFI, ONLY : CFILE_LFI, CLUOUT_LFI, NMASK, NFULL, &
00363                              LMNH_COMPATIBLE  
00364 !
00365 USE MODI_FMREAD
00366 USE MODI_ERROR_READ_SURF_LFI
00367 USE MODI_READ_AND_SEND_MPI
00368 USE MODI_GET_SURF_UNDEF
00369 !
00370 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00371 USE PARKIND1  ,ONLY : JPRB
00372 !
00373 IMPLICIT NONE
00374 !
00375 #ifndef NOMPI
00376 INCLUDE "mpif.h"
00377 #endif
00378 !
00379 !*      0.1   Declarations of arguments
00380 !
00381  CHARACTER(LEN=*),        INTENT(IN)  :: HREC     ! name of the article to be read
00382 REAL, DIMENSION(:,:),     INTENT(OUT) :: PFIELD   ! array containing the data field
00383 INTEGER,                  INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00384  CHARACTER(LEN=100),       INTENT(OUT) :: HCOMMENT ! comment
00385  CHARACTER(LEN=1),         INTENT(IN)  :: HDIR     ! type of field :
00386                                                   ! 'H' : field with
00387                                                   !       horizontal spatial dim.
00388                                                   ! '-' : no horizontal dim.
00389 !*      0.2   Declarations of local variables
00390 ! 
00391  CHARACTER(LEN=16) :: YREC
00392 REAL              :: ZUNDEF  ! default value
00393 INTEGER           :: IGRID   ! position of data on grid
00394 INTEGER           :: ILENCH  ! length of comment string
00395 INTEGER           :: IVERSION, IBUGFIX
00396 INTEGER           :: I, INFOMPI
00397 !
00398 #ifndef NOMPI
00399 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
00400 #endif
00401 DOUBLE PRECISION   :: XTIME0
00402 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK   ! work array read in the file
00403 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00404 !
00405 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX2_LFI',0,ZHOOK_HANDLE)
00406 !
00407 KRESP=0
00408 !
00409 #ifndef NOMPI
00410 XTIME0 = MPI_WTIME()
00411 #endif
00412 !
00413 IF (NRANK==NPIO) THEN
00414   !
00415   IF (HDIR=='H' .OR. HDIR=='A') THEN
00416     ALLOCATE(ZWORK(NFULL,SIZE(PFIELD,2)))
00417   ELSE
00418     ALLOCATE(ZWORK(SIZE(PFIELD,1),SIZE(PFIELD,2)))
00419   ENDIF
00420   !
00421 !$OMP SINGLE        
00422   !  
00423   YREC = HREC
00424   !
00425   !---------------------------------------------------------------------------
00426   !* patch to read some test files done before version 3.5
00427   !  this should be removed once all tests with reading lfi files done with 923
00428   !  configuration (with these early versions) are finished.
00429   !
00430   IF (HREC(1:2)=='D_') THEN
00431     CALL FMREADN0(CFILE_LFI,'VERSION',CLUOUT_LFI,1,IVERSION,IGRID,ILENCH,HCOMMENT,KRESP)
00432     CALL FMREADN0(CFILE_LFI,'BUG',CLUOUT_LFI,1,IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
00433     IF (IVERSION<=2 .OR. (IVERSION==3 .AND. IBUGFIX<=5)) YREC = 'DATA_'//HREC(3:12)
00434     IF (YREC(13:15)=='SOI') YREC=YREC(1:15)//'L'
00435     IF (YREC(12:14)=='SOI') YREC=YREC(1:14)//'L'
00436   END IF
00437   !---------------------------------------------------------------------------
00438   !
00439   IF (HDIR=='H' .OR. HDIR=='A') THEN
00440     IF (.NOT. LMNH_COMPATIBLE) THEN
00441       CALL FMREADX2(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK),ZWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
00442      ELSE
00443       CALL READ_IN_LFI_X2_FOR_MNH(YREC,ZWORK,KRESP,HCOMMENT,HDIR)
00444     END IF
00445   ELSE
00446     CALL FMREADX2(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK),ZWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
00447   END IF
00448   CALL ERROR_READ_SURF_LFI(YREC,KRESP)
00449   !
00450 !$OMP END SINGLE COPYPRIVATE(ZWORK,HCOMMENT,KRESP)
00451   !  
00452 ELSE
00453   ALLOCATE(ZWORK(0,0))
00454 ENDIF
00455 !
00456 #ifndef NOMPI
00457 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0)
00458 #endif
00459 !
00460 IF (HDIR=='A') THEN  ! no distribution on other tasks
00461   IF ( NRANK==NPIO ) THEN    
00462 #ifndef NOMPI          
00463     XTIME0 = MPI_WTIME()
00464 #endif    
00465     PFIELD(:,:) = ZWORK(1:SIZE(PFIELD,1),:)
00466 #ifndef NOMPI    
00467     XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0)
00468 #endif
00469   ENDIF
00470 ELSEIF (HDIR=='-') THEN ! distribution of the total field on other tasks
00471 !$OMP SINGLE          
00472   PFIELD(:,:) = ZWORK(1:SIZE(PFIELD,1),:)
00473   IF (NPROC>1) THEN
00474 #ifndef NOMPI            
00475     XTIME0 = MPI_WTIME()
00476     CALL MPI_BCAST(PFIELD,SIZE(PFIELD)*KIND(PFIELD)/4,MPI_REAL,NPIO,NCOMM,INFOMPI)
00477     XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0)
00478 #endif    
00479   ENDIF
00480 !$OMP END SINGLE COPYPRIVATE(PFIELD)    
00481 ELSE
00482   CALL READ_AND_SEND_MPI(ZWORK,PFIELD,NMASK)
00483 ENDIF
00484 !
00485 DEALLOCATE(ZWORK)
00486 !
00487 IF (HDIR=='H' .OR. HDIR=='A') THEN
00488   CALL GET_SURF_UNDEF(ZUNDEF)
00489   WHERE(PFIELD==999.) PFIELD=ZUNDEF
00490 ENDIF
00491 !
00492 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX2_LFI',1,ZHOOK_HANDLE)
00493 !
00494 CONTAINS
00495 !
00496 !     #############################################################
00497       SUBROUTINE READ_IN_LFI_X2_FOR_MNH(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
00498 !     #############################################################
00499 !
00500 !!****  * - routine to fill a read 2D array for the externalised surface 
00501 !
00502 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI, &
00503                                     NIU, NIB, NIE, NJU, NJB, NJE
00504 !
00505 USE MODI_FMREAD
00506 USE MODI_ERROR_READ_SURF_LFI
00507 !
00508 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00509 USE PARKIND1  ,ONLY : JPRB
00510 !
00511 IMPLICIT NONE
00512 !
00513 !*      0.1   Declarations of arguments
00514 !
00515  CHARACTER(LEN=*),        INTENT(IN) :: HREC     ! name of the article to be read
00516 REAL, DIMENSION(:,:), INTENT(OUT):: PFIELD   ! array containing the data field
00517 INTEGER,                  INTENT(OUT):: KRESP    ! KRESP  : return-code if a problem appears
00518  CHARACTER(LEN=100),       INTENT(OUT):: HCOMMENT ! comment string
00519  CHARACTER(LEN=1),         INTENT(IN) :: HDIR     ! type of field :
00520                                                  ! 'H' : field with
00521                                                  !       horizontal spatial dim.
00522                                                  ! '-' : no horizontal dim.
00523 !*      0.2   Declarations of local variables
00524 ! 
00525 INTEGER :: JI, JJ
00526 INTEGER :: IGRID, ILENCH
00527 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D ! work array read in a MNH file
00528 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2D
00529 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00530 !
00531 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX2_LFI:READ_IN_LFI_X2_FOR_MNH',0,ZHOOK_HANDLE)
00532 !
00533 ALLOCATE(ZWORK3D(NIU,NJU,SIZE(PFIELD,2)))
00534 ZWORK3D(:,:,:) = 999.
00535 !
00536 IF (NJB==NJE) THEN
00537   ALLOCATE(ZWORK2D(NIU,SIZE(PFIELD,2)))
00538   ZWORK2D(:,:) = 999.
00539 ELSEIF (NIB==NIE) THEN
00540   ALLOCATE(ZWORK2D(NJU,SIZE(PFIELD,2)))
00541   ZWORK2D(:,:) = 999. 
00542 ENDIF
00543 !
00544 IF (NJB==NJE) THEN
00545 !
00546   CALL FMREADX2(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK2D),ZWORK2D,IGRID,ILENCH,HCOMMENT,KRESP)
00547   DO JJ = 1,SIZE(ZWORK3D,2)
00548     ZWORK3D(NIB:NIE,JJ,:) = ZWORK2D(NIB:NIE,:)
00549   END DO
00550 !
00551   DEALLOCATE(ZWORK2D) 
00552 !
00553 ELSEIF (NIB==NIE) THEN
00554 !
00555   CALL FMREADX2(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ZWORK2D),ZWORK2D,IGRID,ILENCH,HCOMMENT,KRESP)
00556   DO JI = 1,SIZE(ZWORK3D,1)
00557     ZWORK3D(JI,NIB:NIE,:) = ZWORK2D(NJB:NJE,:)
00558   END DO  
00559 !
00560   DEALLOCATE(ZWORK2D)
00561 !
00562 ELSE
00563 !
00564   CALL FMREADX3(CFILE_LFI,HREC,CLUOUT_LFI,SIZE(ZWORK3D),ZWORK3D,IGRID,ILENCH,HCOMMENT,KRESP)
00565 !
00566 ENDIF
00567 !
00568 DO JJ=1,NJE-NJB+1
00569   DO JI=1,NIE-NIB+1
00570     PFIELD(JI+(NIE-NIB+1)*(JJ-1),:) = ZWORK3D(NIB+JI-1,NJB+JJ-1,:) 
00571   END DO
00572 END DO
00573 DEALLOCATE(ZWORK3D)
00574 !  
00575  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00576 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFX2_LFI:READ_IN_LFI_X2_FOR_MNH',1,ZHOOK_HANDLE)
00577 !
00578 END SUBROUTINE READ_IN_LFI_X2_FOR_MNH
00579 !
00580 END SUBROUTINE READ_SURFX2_LFI
00581 !
00582 !     #############################################################
00583       SUBROUTINE READ_SURFN0_LFI(HREC,KFIELD,KRESP,HCOMMENT)
00584 !     #############################################################
00585 !
00586 !!****  *READN0* - routine to read an integer
00587 !!      B. Decharme 07/2011 : Grdid dimension only read in pgd file
00588 !
00589 USE MODD_IO_SURF_LFI, ONLY : CFILE_LFI, CLUOUT_LFI, CFILEPGD_LFI, &
00590                              LMNH_COMPATIBLE, NIU, NIB, NIE, NJU, NJB, NJE
00591 !
00592 USE MODD_SURFEX_OMP, ONLY : NBLOCK
00593 !
00594 USE MODI_FMREAD
00595 USE MODI_ERROR_READ_SURF_LFI
00596 !
00597 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00598 USE PARKIND1  ,ONLY : JPRB
00599 !
00600 IMPLICIT NONE
00601 !
00602 !*      0.1   Declarations of arguments
00603 !
00604  CHARACTER(LEN=*),  INTENT(IN)  :: HREC     ! name of the article to be read
00605 INTEGER,            INTENT(OUT) :: KFIELD   ! the integer to be read
00606 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00607  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
00608 !
00609 !*      0.2   Declarations of local variables
00610 !
00611  CHARACTER(LEN=40) :: YGRID
00612 INTEGER           :: IGRID   ! position of data on grid
00613 INTEGER           :: ILENCH  ! length of comment string
00614 INTEGER           :: IIMAX, IJMAX
00615 INTEGER           :: INB ! number of articles in the file
00616 INTEGER           :: IRESP
00617 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00618 !
00619 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFN0_LFI',0,ZHOOK_HANDLE)
00620 !
00621 KRESP=0
00622 !
00623  CALL FMREADN0(CFILE_LFI,HREC,CLUOUT_LFI,1,KFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
00624 !
00625  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00626 !
00627 !* tests compatibility with MesoNH files
00628 !
00629 IF (HREC/='DIM_FULL' .AND. LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFN0_LFI',1,ZHOOK_HANDLE)
00630 IF (HREC/='DIM_FULL') RETURN
00631 !
00632 !-----------------------------------------------------------------------------------------------------
00633 ! READ PGD FILE
00634 !-----------------------------------------------------------------------------------------------------
00635 !
00636 IF (CFILE_LFI/=CFILEPGD_LFI) THEN
00637   CALL FMOPEN(CFILEPGD_LFI,'OLD',CLUOUT_LFI,0,1,1,INB,IRESP)
00638 ENDIF
00639 !
00640  CALL FMREADC0(CFILEPGD_LFI,'GRID_TYPE ',CLUOUT_LFI,1,YGRID,IGRID,ILENCH,HCOMMENT,KRESP)
00641  CALL ERROR_READ_SURF_LFI('GRID_TYPE ',KRESP)
00642 LMNH_COMPATIBLE = (YGRID=="CARTESIAN " .OR. YGRID=="CONF PROJ ")
00643 !
00644 IF (LMNH_COMPATIBLE) THEN
00645   CALL FMREADN0(CFILEPGD_LFI,'IMAX',CLUOUT_LFI,1,IIMAX,IGRID,ILENCH,HCOMMENT,KRESP)
00646   CALL ERROR_READ_SURF_LFI('IMAX',KRESP)
00647   NIU = IIMAX+2
00648   NIB = 2
00649   NIE = IIMAX+1
00650   CALL FMREADN0(CFILEPGD_LFI,'JMAX',CLUOUT_LFI,1,IJMAX,IGRID,ILENCH,HCOMMENT,KRESP)
00651   CALL ERROR_READ_SURF_LFI('JMAX',KRESP)
00652   NJU = IJMAX+2
00653   NJB = 2
00654   NJE = IJMAX+1
00655 END IF
00656 !
00657 IF(CFILE_LFI/=CFILEPGD_LFI)THEN
00658   CALL FMCLOS(CFILEPGD_LFI,'KEEP',CLUOUT_LFI,IRESP)
00659 ENDIF
00660 !
00661 !-----------------------------------------------------------------------------------------------------
00662 ! END READ PGD FILE
00663 !-----------------------------------------------------------------------------------------------------
00664 !
00665 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFN0_LFI',1,ZHOOK_HANDLE)
00666 !
00667 END SUBROUTINE READ_SURFN0_LFI
00668 !
00669 !     #############################################################
00670       SUBROUTINE READ_SURFN1_LFI(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
00671 !     #############################################################
00672 !
00673 !!****  *READN0* - routine to read an integer
00674 !
00675 USE MODD_SURFEX_MPI, ONLY : NRANK, NPROC, NCOMM, NPIO, XTIME_NPIO_READ, XTIME_COMM_READ
00676 !
00677 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI, NMASK, NFULL
00678 !
00679 USE MODI_FMREAD
00680 USE MODI_ERROR_READ_SURF_LFI
00681 USE MODI_READ_AND_SEND_MPI
00682 !
00683 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00684 USE PARKIND1  ,ONLY : JPRB
00685 !
00686 IMPLICIT NONE
00687 !
00688 #ifndef NOMPI
00689 INCLUDE "mpif.h"
00690 #endif
00691 !
00692 !*      0.1   Declarations of arguments
00693 !
00694  CHARACTER(LEN=*),      INTENT(IN)  :: HREC     ! name of the article to be read
00695 INTEGER, DIMENSION(:),  INTENT(OUT) :: KFIELD   ! the integer to be read
00696 INTEGER,                INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00697  CHARACTER(LEN=100),     INTENT(OUT) :: HCOMMENT ! comment
00698  CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
00699                                                 ! 'H' : field with
00700                                                 !       horizontal spatial dim.
00701                                                 ! '-' : no horizontal dim.
00702 !*      0.2   Declarations of local variables
00703 !
00704 INTEGER          :: IGRID   ! position of data on grid
00705 INTEGER          :: ILENCH  ! length of comment string
00706 INTEGER          :: I, INFOMPI
00707 !
00708 #ifndef NOMPI
00709 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: ISTATUS
00710 #endif
00711 INTEGER, DIMENSION(:), ALLOCATABLE :: IWORK  ! work array read in the file
00712 DOUBLE PRECISION   :: XTIME0
00713 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00714 !
00715 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFN1_LFI',0,ZHOOK_HANDLE)
00716 !
00717 KRESP=0
00718 !
00719 #ifndef NOMPI
00720 XTIME0 = MPI_WTIME()
00721 #endif
00722 !
00723 IF (NRANK==NPIO) THEN
00724   !
00725   IF (HDIR=='H' .OR. HDIR=='A') THEN
00726     ALLOCATE(IWORK(NFULL))
00727   ELSE
00728     ALLOCATE(IWORK(SIZE(KFIELD)))
00729   ENDIF
00730   !
00731 !$OMP SINGLE        
00732   !  
00733   IF (HDIR=='H' .OR. HDIR=='A')  THEN
00734     CALL FMREADN1(CFILE_LFI,HREC,CLUOUT_LFI,NFULL,IWORK,IGRID,ILENCH,HCOMMENT,KRESP)
00735   ELSE
00736     CALL FMREADN1(CFILE_LFI,HREC,CLUOUT_LFI,SIZE(IWORK),IWORK(:),IGRID,ILENCH,HCOMMENT,KRESP)
00737   END IF
00738   !
00739 !$OMP END SINGLE COPYPRIVATE(IWORK,HCOMMENT,KRESP)  
00740   !  
00741   CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00742   !
00743 ENDIF
00744 !
00745 #ifndef NOMPI
00746 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0)
00747 #endif
00748 !
00749 IF (HDIR=='A') THEN  ! no distribution on other tasks
00750   IF ( NRANK==NPIO ) THEN
00751 #ifndef NOMPI          
00752     XTIME0 = MPI_WTIME()
00753 #endif    
00754     KFIELD(:) = IWORK(1:SIZE(KFIELD))
00755 #ifndef NOMPI    
00756     XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0)
00757 #endif 
00758   ENDIF
00759 ELSEIF (HDIR=='-') THEN ! distribution of the total field on other tasks
00760 !$OMP SINGLE     
00761   KFIELD(:) = IWORK(1:SIZE(KFIELD))
00762   IF (NPROC>1) THEN
00763 #ifndef NOMPI           
00764     XTIME0 = MPI_WTIME()
00765     CALL MPI_BCAST(KFIELD,SIZE(KFIELD)*KIND(KFIELD)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
00766     XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0)
00767 #endif     
00768   ENDIF
00769 !$OMP END SINGLE COPYPRIVATE(KFIELD)    
00770 ELSE
00771   CALL READ_AND_SEND_MPI(IWORK,KFIELD,NMASK)
00772 ENDIF
00773 !
00774 !$OMP SINGLE
00775 DEALLOCATE(IWORK)
00776 !$OMP END SINGLE
00777 !
00778 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFN1_LFI',1,ZHOOK_HANDLE)
00779 !
00780 END SUBROUTINE READ_SURFN1_LFI
00781 !
00782 !     #############################################################
00783       SUBROUTINE READ_SURFC0_LFI(HREC,HFIELD,KRESP,HCOMMENT)
00784 !     #############################################################
00785 !
00786 !!****  *READC0* - routine to read a character
00787 !
00788 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI
00789 !
00790 USE MODI_FMREAD
00791 USE MODI_ERROR_READ_SURF_LFI
00792 !
00793 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00794 USE PARKIND1  ,ONLY : JPRB
00795 !
00796 IMPLICIT NONE
00797 !
00798 !*      0.1   Declarations of arguments
00799 !
00800  CHARACTER(LEN=*),  INTENT(IN)  :: HREC      ! name of the article to be read
00801  CHARACTER(LEN=40),  INTENT(OUT) :: HFIELD    ! the integer to be read
00802 INTEGER,            INTENT(OUT) :: KRESP     ! KRESP  : return-code if a problem appears
00803  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT  ! comment
00804 !
00805 !*      0.2   Declarations of local variables
00806 !
00807 INTEGER          :: IGRID   ! position of data on grid
00808 INTEGER          :: ILENCH  ! length of comment string
00809 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00810 !
00811 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFC0_LFI',0,ZHOOK_HANDLE)
00812 !
00813 KRESP=0
00814 !
00815  CALL FMREADC0(CFILE_LFI,HREC,CLUOUT_LFI,1,HFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
00816 !
00817  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00818 !
00819 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFC0_LFI',1,ZHOOK_HANDLE)
00820 !
00821 END SUBROUTINE READ_SURFC0_LFI
00822 !
00823 !     #############################################################
00824       SUBROUTINE READ_SURFL0_LFI(HREC,OFIELD,KRESP,HCOMMENT)
00825 !     #############################################################
00826 !
00827 !!****  *READL0* - routine to read a logical
00828 !
00829 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI
00830 !
00831 USE MODI_FMREAD
00832 USE MODI_ERROR_READ_SURF_LFI
00833 !
00834 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00835 USE PARKIND1  ,ONLY : JPRB
00836 !
00837 IMPLICIT NONE
00838 !
00839 !*      0.1   Declarations of arguments
00840 !
00841  CHARACTER(LEN=*),  INTENT(IN)  :: HREC     ! name of the article to be read
00842 LOGICAL,            INTENT(OUT) :: OFIELD   ! array containing the data field
00843 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00844  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
00845 !
00846 !*      0.2   Declarations of local variables
00847 !
00848 INTEGER          :: IGRID   ! position of data on grid
00849 INTEGER          :: ILENCH  ! length of comment string
00850 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00851 !
00852 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFL0_LFI',0,ZHOOK_HANDLE)
00853 !
00854 KRESP=0
00855 !
00856  CALL FMREADL0(CFILE_LFI,HREC,CLUOUT_LFI,1,OFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
00857 !
00858  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00859 !
00860 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFL0_LFI',1,ZHOOK_HANDLE)
00861 !
00862 END SUBROUTINE READ_SURFL0_LFI
00863 !
00864 !     #############################################################
00865       SUBROUTINE READ_SURFL1_LFI(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
00866 !     #############################################################
00867 !
00868 !!****  *READL1* - routine to read a logical array
00869 !
00870 USE MODD_SURFEX_MPI, ONLY : NRANK, NPROC, NCOMM, NPIO, XTIME_NPIO_READ, XTIME_COMM_READ
00871 !
00872 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI
00873 !
00874 USE MODI_FMREAD
00875 USE MODI_ERROR_READ_SURF_LFI
00876 USE MODI_ABOR1_SFX
00877 USE MODI_GET_LUOUT
00878 !
00879 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00880 USE PARKIND1  ,ONLY : JPRB
00881 !
00882 IMPLICIT NONE
00883 !
00884 #ifndef NOMPI
00885 INCLUDE "mpif.h"
00886 #endif
00887 !
00888 !*      0.1   Declarations of arguments
00889 !
00890  CHARACTER(LEN=*),      INTENT(IN)  :: HREC     ! name of the article to be read
00891 LOGICAL, DIMENSION(:), INTENT(OUT) :: OFIELD   ! array containing the data field
00892 INTEGER,                INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00893  CHARACTER(LEN=100),     INTENT(OUT) :: HCOMMENT ! comment
00894  CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
00895                                                 ! 'H' : field with
00896                                                 !       horizontal spatial dim.
00897                                                 ! '-' : no horizontal dim.
00898 !*      0.2   Declarations of local variables
00899 !
00900 INTEGER :: ILUOUT
00901 INTEGER :: IGRID   ! position of data on grid
00902 INTEGER :: ILENCH  ! length of comment string
00903 INTEGER :: INFOMPI
00904 DOUBLE PRECISION   :: XTIME0
00905 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00906 !
00907 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFL1_LFI',0,ZHOOK_HANDLE)
00908 !
00909 KRESP=0
00910 !
00911 #ifndef NOMPI
00912 XTIME0 = MPI_WTIME()
00913 #endif
00914 !
00915 IF (NRANK==NPIO) THEN
00916   !
00917 !$OMP SINGLE
00918   !   
00919   IF (HDIR=='H') THEN
00920     CALL GET_LUOUT('LFI   ',ILUOUT)
00921     WRITE(ILUOUT,*) 'Error: 1D logical vector for reading on an horizontal grid:'
00922     WRITE(ILUOUT,*) 'this option is not coded in READ_SURFL1_LFI'
00923     CALL ABOR1_SFX('MODE_READ_SURF_LFI: 1D LOGICAL VECTOR FOR READING NOT CODED IN READ_SURFL1_LFI')
00924   END IF
00925   !
00926   CALL FMREADL1(CFILE_LFI,HREC,CLUOUT_LFI,SIZE(OFIELD),OFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
00927   !
00928 !$OMP END SINGLE COPYPRIVATE(OFIELD,HCOMMENT,KRESP)
00929   !
00930   CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00931   !
00932 ENDIF
00933 !
00934 #ifndef NOMPI
00935 XTIME_NPIO_READ = XTIME_NPIO_READ + (MPI_WTIME() - XTIME0)
00936 #endif
00937 !
00938 IF (NPROC>1 .AND. HDIR/='A') THEN
00939 #ifndef NOMPI        
00940   XTIME0 = MPI_WTIME()
00941 !$OMP SINGLE
00942   CALL MPI_BCAST(OFIELD,SIZE(OFIELD),MPI_LOGICAL,NPIO,NCOMM,INFOMPI)
00943 !$OMP END SINGLE COPYPRIVATE(OFIELD)   
00944   XTIME_COMM_READ = XTIME_COMM_READ + (MPI_WTIME() - XTIME0) 
00945 #endif
00946 ENDIF
00947 !
00948 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFL1_LFI',1,ZHOOK_HANDLE)
00949 !
00950 END SUBROUTINE READ_SURFL1_LFI
00951 !
00952 !     #############################################################
00953       SUBROUTINE READ_SURFT0_LFI(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
00954 !     #############################################################
00955 !
00956 !!****  *READT0* - routine to read a date
00957 !
00958 USE MODD_IO_SURF_LFI,  ONLY : CFILE_LFI, CLUOUT_LFI  
00959 !
00960 USE MODI_FMREAD
00961 USE MODI_ERROR_READ_SURF_LFI
00962 !
00963 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00964 USE PARKIND1  ,ONLY : JPRB
00965 !
00966 IMPLICIT NONE
00967 !
00968 !*      0.1   Declarations of arguments
00969 !
00970  CHARACTER(LEN=*),  INTENT(IN)  :: HREC     ! name of the article to be read
00971 INTEGER,            INTENT(OUT) :: KYEAR    ! year
00972 INTEGER,            INTENT(OUT) :: KMONTH   ! month
00973 INTEGER,            INTENT(OUT) :: KDAY     ! day
00974 REAL,               INTENT(OUT) :: PTIME    ! year
00975 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
00976  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
00977 
00978 !*      0.2   Declarations of local variables
00979 !
00980  CHARACTER(LEN=18)     :: YREC     ! Name of the article to be read
00981 INTEGER, DIMENSION(3) :: ITDATE
00982 !
00983 INTEGER          :: IGRID   ! position of data on grid
00984 INTEGER          :: ILENCH  ! length of comment string
00985 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00986 !
00987 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFT0_LFI',0,ZHOOK_HANDLE)
00988 !
00989 KRESP=0
00990 !
00991 YREC=TRIM(HREC)//'%TDATE'
00992  CALL FMREADN1(CFILE_LFI,YREC,CLUOUT_LFI,3,ITDATE,IGRID,ILENCH,HCOMMENT,KRESP)
00993  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00994 !
00995 YREC=TRIM(HREC)//'%TIME'
00996  CALL FMREADX0(CFILE_LFI,YREC,CLUOUT_LFI,1,PTIME,IGRID,ILENCH,HCOMMENT,KRESP)
00997  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
00998 !
00999 KYEAR  = ITDATE(1)
01000 KMONTH = ITDATE(2)
01001 KDAY   = ITDATE(3)
01002 !
01003 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFT0_LFI',1,ZHOOK_HANDLE)
01004 !
01005 END SUBROUTINE READ_SURFT0_LFI
01006 !
01007 !     #############################################################
01008       SUBROUTINE READ_SURFT1_LFI(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
01009 !     #############################################################
01010 !
01011 !!****  *READT0* - routine to read a date
01012 !
01013 USE MODD_IO_SURF_LFI,        ONLY : CFILE_LFI, CLUOUT_LFI  
01014 !
01015 USE MODI_FMREAD
01016 USE MODI_ERROR_READ_SURF_LFI
01017 !
01018 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
01019 USE PARKIND1  ,ONLY : JPRB
01020 !
01021 IMPLICIT NONE
01022 !
01023 !*      0.1   Declarations of arguments
01024 !
01025  CHARACTER(LEN=*),     INTENT(IN)  :: HREC     ! name of the article to be read
01026 INTEGER, DIMENSION(:), INTENT(OUT) :: KYEAR    ! year
01027 INTEGER, DIMENSION(:), INTENT(OUT) :: KMONTH   ! month
01028 INTEGER, DIMENSION(:), INTENT(OUT) :: KDAY     ! day
01029 REAL,    DIMENSION(:), INTENT(OUT) :: PTIME    ! year
01030 INTEGER,            INTENT(OUT) :: KRESP    ! KRESP  : return-code if a problem appears
01031  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
01032 
01033 !*      0.2   Declarations of local variables
01034 !
01035  CHARACTER(LEN=18)     :: YREC     ! Name of the article to be read
01036 INTEGER          :: ILUOUT
01037 INTEGER          :: IGRID   ! position of data on grid
01038 INTEGER          :: ILENCH  ! length of comment string
01039 INTEGER, DIMENSION(3,SIZE(KYEAR)) :: ITDATE
01040 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01041 !
01042 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFT1_LFI',0,ZHOOK_HANDLE)
01043 !
01044 KRESP=0
01045 !
01046 YREC=TRIM(HREC)//'%TDATE'
01047  CALL FMREADN2(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(ITDATE),ITDATE,IGRID,ILENCH,HCOMMENT,KRESP)
01048  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
01049 !
01050 YREC=TRIM(HREC)//'%TIME'
01051  CALL FMREADX1(CFILE_LFI,YREC,CLUOUT_LFI,SIZE(PTIME),PTIME,IGRID,ILENCH,HCOMMENT,KRESP)
01052  CALL ERROR_READ_SURF_LFI(HREC,KRESP)
01053 !
01054 KYEAR (:) = ITDATE(1,:)
01055 KMONTH(:) = ITDATE(2,:)
01056 KDAY  (:) = ITDATE(3,:)
01057 !
01058 IF (LHOOK) CALL DR_HOOK('MODE_READ_SURF_LFI:READ_SURFT1_LFI',1,ZHOOK_HANDLE)
01059 !
01060 END SUBROUTINE READ_SURFT1_LFI
01061 !
01062 END MODULE MODE_READ_SURF_LFI