SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_read_grib.F90
Go to the documentation of this file.
00001 !     #####################
00002 MODULE MODE_READ_GRIB
00003 !     #####################
00004 !-------------------------------------------------------------------
00005 !
00006 USE MODI_ABOR1_SFX
00007 USE GRIB_API
00008 !
00009 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00010 USE PARKIND1  ,ONLY : JPRB
00011 !
00012 CONTAINS
00013 !-------------------------------------------------------------------
00014 !     ####################
00015       SUBROUTINE MAKE_GRIB_INDEX(HGRIB)
00016 !     ####################
00017 !
00018 USE MODD_GRID_GRIB, ONLY : CGRIB_FILE, NIDX
00019 !
00020 IMPLICIT NONE
00021 !
00022  CHARACTER(LEN=*), INTENT(IN) :: HGRIB
00023 !
00024 INTEGER(KIND=kindOfInt) :: IRET
00025 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00026 !
00027 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:MAKE_GRIB_INDEX',0,ZHOOK_HANDLE)
00028 !
00029 IF (CGRIB_FILE==HGRIB) CALL DR_HOOK('MODE_READ_GRIB:MAKE_GRIB_INDEX',1,ZHOOK_HANDLE)
00030 IF (CGRIB_FILE==HGRIB) RETURN
00031 !
00032 CGRIB_FILE=HGRIB
00033 !
00034  CALL GRIB_INDEX_CREATE(NIDX,HGRIB,'indicatorOfParameter',IRET)
00035 IF (IRET/=0) CALL ABOR1_SFX("MODE_READ_GRIB:MAKE_GRIB_INDEX: error while creating the grib index")
00036 !
00037 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:MAKE_GRIB_INDEX',1,ZHOOK_HANDLE)
00038 !
00039 END SUBROUTINE MAKE_GRIB_INDEX
00040 !-------------------------------------------------------------------
00041 !     ####################
00042       SUBROUTINE CLEAR_GRIB_INDEX
00043 !     ####################
00044 !
00045 USE MODD_GRID_GRIB, ONLY : CGRIB_FILE, NIDX
00046 !
00047 IMPLICIT NONE
00048 !
00049 INTEGER(KIND=kindOfInt) :: IRET
00050 !
00051 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00052 !
00053 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:CLEAR_GRIB_INDEX',0,ZHOOK_HANDLE)
00054 !
00055 IF (CGRIB_FILE.NE."") THEN
00056   CGRIB_FILE=""
00057   CALL GRIB_INDEX_RELEASE(NIDX,IRET)
00058   IF (IRET/=0) CALL ABOR1_SFX("MODE_READ_GRIB:MAKE_GRIB_INDEX: error while deleting the grib index")
00059 ENDIF
00060 !
00061 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:CLEAR_GRIB_INDEX',1,ZHOOK_HANDLE)
00062 !
00063 END SUBROUTINE CLEAR_GRIB_INDEX
00064 !-------------------------------------------------------------------
00065 !     ####################
00066       SUBROUTINE GET_GRIB_MESSAGE(KLUOUT,KLTYPE,KLEV1,KLEV2,KGRIB,KFOUND)
00067 !     ####################
00068 !
00069 USE MODD_GRID_GRIB, ONLY : NIDX
00070 !
00071 IMPLICIT NONE
00072 !
00073 INTEGER, INTENT(IN) :: KLUOUT
00074 INTEGER, INTENT(INOUT)  :: KLTYPE
00075 INTEGER, INTENT(INOUT)  :: KLEV1
00076 INTEGER, INTENT(INOUT)  :: KLEV2
00077 INTEGER(KIND=kindOfInt), INTENT(INOUT) :: KGRIB
00078 INTEGER, INTENT(OUT) :: KFOUND
00079 !
00080 INTEGER :: ILTYPE
00081 INTEGER :: ILEV1
00082 INTEGER :: ILEV2
00083 INTEGER(KIND=kindOfInt) :: IRET
00084 !
00085 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00086 !
00087 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:GET_GRIB_MESSAGE',0,ZHOOK_HANDLE)
00088 !
00089 IRET = 0
00090 KFOUND=0
00091 !
00092 DO WHILE (IRET /= GRIB_END_OF_INDEX .AND. KFOUND/=3)
00093   !
00094   IRET = 0
00095   KFOUND=0
00096   !
00097   IF (KLTYPE/=-2) THEN
00098     CALL GRIB_GET(KGRIB,'indicatorOfTypeOfLevel',ILTYPE,IRET)
00099     CALL TEST_IRET(KLUOUT,ILTYPE,KLTYPE,IRET)
00100   ENDIF
00101   !
00102   IF (IRET.EQ.0) THEN
00103     !
00104     KFOUND = KFOUND + 1
00105     !
00106     IF (KLEV1/=-2) THEN
00107       CALL GRIB_GET(KGRIB,'topLevel',ILEV1,IRET)
00108       CALL TEST_IRET(KLUOUT,ILEV1,KLEV1,IRET)
00109     ENDIF
00110     !
00111     IF (IRET.EQ.0) THEN
00112       !
00113       KFOUND = KFOUND + 1
00114       !
00115       IF (KLEV2/=-2) THEN
00116         CALL GRIB_GET(KGRIB,'bottomLevel',ILEV2,IRET)
00117         CALL TEST_IRET(KLUOUT,ILEV2,KLEV2,IRET)
00118       ENDIF
00119       !
00120       IF (IRET.EQ.0) KFOUND = KFOUND + 1
00121       !
00122     ENDIF
00123     !
00124   ENDIF
00125   !
00126   IF (KFOUND.NE.3) THEN
00127     CALL GRIB_RELEASE(KGRIB)
00128     CALL GRIB_NEW_FROM_INDEX(NIDX,KGRIB,IRET)
00129   ENDIF
00130   !
00131 ENDDO
00132 !
00133 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:GET_GRIB_MESSAGE',1,ZHOOK_HANDLE)
00134 !
00135 CONTAINS
00136 !
00137 !       ##############
00138         SUBROUTINE TEST_IRET(KLUOUT,VAL1,VAL0,KRET)
00139 !       ##############
00140 !
00141 IMPLICIT NONE
00142 !
00143 INTEGER, INTENT(IN) :: KLUOUT ! logical unit of output listing
00144 INTEGER, INTENT(IN) :: VAL1
00145 INTEGER, INTENT(INOUT) :: VAL0
00146 INTEGER(KIND=kindOfInt), INTENT(INOUT) :: KRET   ! number of the message researched
00147 !
00148 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00149 !
00150 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:TEST_IRET',0,ZHOOK_HANDLE)
00151 !
00152 IF (KRET > 0) THEN
00153   WRITE (KLUOUT,'(A)')' | Error encountered in the Grib file, skipping field'
00154 ELSE IF (KRET == -6) THEN
00155   WRITE (KLUOUT,'(A)')' | ECMWF pseudo-Grib data encountered, skipping field'
00156 ELSEIF (VAL1 /= VAL0) THEN
00157   IF (VAL0 == -1) THEN
00158     VAL0 = VAL1
00159   ELSE
00160     KRET=1
00161   ENDIF
00162 ENDIF
00163 !
00164 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:TEST_IRET',1,ZHOOK_HANDLE)
00165 END SUBROUTINE TEST_IRET
00166 !
00167 END SUBROUTINE GET_GRIB_MESSAGE
00168 !-------------------------------------------------------------------
00169 !     ####################
00170       SUBROUTINE READ_GRIB(HGRIB,KLUOUT,KPARAM,KRET,PFIELD,KLTYPE,KLEV1,KLEV2,KPARAM2)
00171 !     ####################
00172 !
00173 USE MODD_GRID_GRIB, ONLY : NIDX
00174 !
00175 IMPLICIT NONE
00176 !
00177  CHARACTER(LEN=*), INTENT(IN) :: HGRIB      ! name of the GRIB file
00178 INTEGER, INTENT(IN) :: KLUOUT
00179 INTEGER,INTENT(IN)    :: KPARAM ! Parameter to read
00180 INTEGER(KIND=kindOfInt), INTENT(OUT)  :: KRET
00181 REAL, DIMENSION(:), POINTER :: PFIELD
00182 INTEGER,INTENT(INOUT), OPTIONAL :: KLTYPE ! Level type
00183 INTEGER,INTENT(INOUT), OPTIONAL :: KLEV1  ! Level parameter 1
00184 INTEGER,INTENT(INOUT), OPTIONAL :: KLEV2  ! Level parameter 2
00185 INTEGER, INTENT(INOUT), OPTIONAL :: KPARAM2
00186 !
00187 INTEGER :: ILTYPE, ILEV1, ILEV2
00188 INTEGER(KIND=kindOfInt) :: IGRIB
00189 INTEGER :: ISIZE, IFOUND
00190 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00191 !
00192 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB',0,ZHOOK_HANDLE)
00193 !
00194 ILTYPE=-2
00195 IF (PRESENT(KLTYPE)) ILTYPE=KLTYPE
00196 ILEV1=-2
00197 IF (PRESENT(KLEV1)) ILEV1=KLEV1
00198 ILEV2=-2
00199 IF (PRESENT(KLEV2)) ILEV2=KLEV2
00200 !
00201  CALL MAKE_GRIB_INDEX(HGRIB)
00202 !
00203 IFOUND=0
00204 KRET=0
00205 !
00206  CALL GRIB_INDEX_SELECT(NIDX,'indicatorOfParameter',KPARAM,KRET)
00207  CALL GRIB_NEW_FROM_INDEX(NIDX,IGRIB,KRET)
00208 IF (KRET.EQ.0) CALL GET_GRIB_MESSAGE(KLUOUT,ILTYPE,ILEV1,ILEV2,IGRIB,IFOUND)
00209 !
00210 IF (PRESENT(KPARAM2)) THEN
00211   IF (IFOUND/=3) THEN
00212     CALL GRIB_INDEX_SELECT(NIDX,'indicatorOfParameter',KPARAM2,KRET)
00213     CALL GRIB_NEW_FROM_INDEX(NIDX,IGRIB,KRET)
00214     IF (KRET.EQ.0) THEN
00215       ILTYPE=-2
00216       IF (PRESENT(KLTYPE)) ILTYPE=KLTYPE
00217       CALL GET_GRIB_MESSAGE(KLUOUT,ILTYPE,ILEV1,ILEV2,IGRIB,IFOUND)
00218     ENDIF
00219   ELSE
00220     KPARAM2 = KPARAM
00221   ENDIF
00222 ENDIF
00223 !
00224 IF (IFOUND==3) THEN
00225   !
00226   IF (PRESENT(KLTYPE)) KLTYPE = ILTYPE
00227   IF (PRESENT(KLEV1))  KLEV1  = ILEV1
00228   IF (PRESENT(KLEV2))  KLEV2  = ILEV2
00229   !
00230   IF (.NOT.ASSOCIATED(PFIELD)) THEN
00231     CALL GRIB_GET_SIZE(IGRIB,'values',ISIZE,KRET)
00232     IF (KRET.NE.0) CALL ABOR1_SFX("MODE_READ_GRIB:READ_GRIB: Problem getting size of values")
00233     ALLOCATE(PFIELD(ISIZE))
00234   ENDIF
00235   !
00236   CALL GRIB_GET(IGRIB,'values',PFIELD,KRET)
00237   IF (KRET.NE.0) CALL ABOR1_SFX("MODE_READ_GRIB:READ_GRIB: Problem getting values")
00238   CALL GRIB_RELEASE(IGRIB,KRET)
00239   IF (KRET.NE.0) CALL ABOR1_SFX("MODE_READ_GRIB:READ_GRIB: Problem releasing memory")
00240   !
00241 ELSE
00242   !
00243   KRET = 1
00244   !
00245 ENDIF
00246 !
00247 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB',1,ZHOOK_HANDLE)
00248 END SUBROUTINE READ_GRIB
00249 !
00250 !-------------------------------------------------------------------
00251 !-------------------------------------------------------------------
00252 !     ####################
00253       SUBROUTINE READ_GRIB_LAND_MASK(HGRIB,KLUOUT,HINMODEL,PMASK)
00254 !     ####################
00255 !
00256 IMPLICIT NONE
00257 !
00258  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00259 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00260  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00261 REAL, DIMENSION(:), POINTER       :: PMASK     ! Land mask
00262 !
00263 INTEGER(KIND=kindOfInt)                 :: IRET      ! return code
00264 INTEGER                           :: ILTYPE    ! leveltype
00265 INTEGER                           :: ILEV      ! level
00266 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00267 !-------------------------------------------------------------------
00268 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_LAND_MASK',0,ZHOOK_HANDLE)
00269 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_LAND_MASK: | Reading land mask from ',HINMODEL
00270 !
00271 SELECT CASE (HINMODEL)
00272   CASE ('ECMWF ')
00273     CALL READ_GRIB(HGRIB,KLUOUT,172,IRET,PMASK) 
00274   CASE ('ARPEGE','ALADIN','MOCAGE')
00275     CALL READ_GRIB(HGRIB,KLUOUT,81,IRET,PMASK)          
00276   CASE ('HIRLAM')        
00277     ILTYPE=105
00278     ILEV  =0    
00279     CALL READ_GRIB(HGRIB,KLUOUT,81,IRET,PMASK,KLTYPE=ILTYPE,KLEV1=ILEV)            
00280   CASE DEFAULT
00281     CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_LAND_MASK: OPTION NOT SUPPORTED '//HINMODEL)
00282 END SELECT
00283 !
00284 IF (IRET /= 0) THEN
00285   CALL ABOR1_SFX('MODE_READ_GRIB: LAND SEA MASK MISSING (READ_GRIB_LAND_MASK)')
00286 END IF
00287 !
00288 WHERE (PMASK>0.5)
00289   PMASK = 1.
00290 ELSEWHERE
00291   PMASK = 0.
00292 END WHERE
00293 !
00294 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_LAND_MASK',1,ZHOOK_HANDLE)
00295 END SUBROUTINE READ_GRIB_LAND_MASK
00296 !-------------------------------------------------------------------
00297 !     ############################
00298       SUBROUTINE READ_GRIB_ZS(HGRIB,KLUOUT,HINMODEL,PZS)
00299 !     ############################
00300 !
00301 USE MODD_CSTS,       ONLY : XG
00302 !
00303 IMPLICIT NONE
00304 !
00305  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00306 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00307  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00308 REAL, DIMENSION(:), POINTER       :: PZS       ! 
00309 !
00310 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
00311 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00312 !-------------------------------------------------------------------
00313 !* Read orography
00314 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_ZS',0,ZHOOK_HANDLE)
00315 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_ZS: | Reading orography from ',HINMODEL
00316 !
00317 SELECT CASE (HINMODEL)
00318   CASE ('ECMWF ')
00319     CALL READ_GRIB(HGRIB,KLUOUT,129,IRET,PZS) 
00320   CASE ('ARPEGE','MOCAGE')
00321     CALL READ_GRIB(HGRIB,KLUOUT,8,IRET,PZS)               
00322   CASE ('HIRLAM','ALADIN')
00323     CALL READ_GRIB(HGRIB,KLUOUT,6,IRET,PZS)                  
00324   CASE DEFAULT
00325     CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_ZS:OPTION NOT SUPPORTED '//HINMODEL)
00326 END SELECT
00327 !
00328 IF (IRET /= 0) THEN
00329   CALL ABOR1_SFX('MODE_READ_GRIB: OROGRAPHY MISSING (READ_GRIB_ZS_LAND)')
00330 END IF
00331 !
00332 ! Datas given in archives are multiplied by the gravity acceleration
00333 PZS = PZS / XG
00334 !
00335 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_ZS',1,ZHOOK_HANDLE)
00336 END SUBROUTINE READ_GRIB_ZS
00337 !-------------------------------------------------------------------
00338 !     ############################
00339       SUBROUTINE READ_GRIB_ZS_LAND(HGRIB,KLUOUT,HINMODEL,PMASK,PZSL)
00340 !     ############################
00341 !
00342 IMPLICIT NONE
00343 !
00344  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00345 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00346  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00347 REAL, DIMENSION(:), INTENT(IN)    :: PMASK     ! grib land mask
00348 REAL, DIMENSION(:), POINTER       :: PZSL      ! 
00349 !
00350 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00351 !-------------------------------------------------------------------
00352 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_ZS_LAND',0,ZHOOK_HANDLE)
00353 !
00354  CALL READ_GRIB_ZS(HGRIB,KLUOUT,HINMODEL,PZSL)
00355 !
00356 IF (SIZE(PMASK)==SIZE(PZSL)) &
00357   WHERE (PMASK(:)/=1.) PZSL = 0.
00358 !
00359 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_ZS_LAND',1,ZHOOK_HANDLE)
00360 END SUBROUTINE READ_GRIB_ZS_LAND
00361 !-------------------------------------------------------------------
00362 !     ############################
00363       SUBROUTINE READ_GRIB_ZS_SEA(HGRIB,KLUOUT,HINMODEL,PMASK,PZSS)
00364 !     ############################
00365 !
00366 IMPLICIT NONE
00367 !
00368  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00369 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00370  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00371 REAL, DIMENSION(:), INTENT(IN)    :: PMASK     ! grib land mask
00372 REAL, DIMENSION(:), POINTER       :: PZSS      ! 
00373 !
00374 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00375 !-------------------------------------------------------------------
00376 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_ZS_SEA',0,ZHOOK_HANDLE)
00377 !
00378 IF (HINMODEL=='HIRLAM') THEN
00379   CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_ZS_SEA:OPTION NOT SUPPORTED '//HINMODEL)
00380 ELSE
00381   CALL READ_GRIB_ZS(HGRIB,KLUOUT,HINMODEL,PZSS)
00382 ENDIF
00383 !
00384 IF (SIZE(PMASK)==SIZE(PZSS)) &
00385   WHERE (PMASK(:)/=0.) PZSS = 0.
00386 !
00387 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_ZS_SEA',1,ZHOOK_HANDLE)
00388 END SUBROUTINE READ_GRIB_ZS_SEA
00389 !-------------------------------------------------------------------
00390 !     ###########################
00391       SUBROUTINE READ_GRIB_T(HGRIB,KLUOUT,HINMODEL,PT)
00392 !     ###########################
00393 !
00394 IMPLICIT NONE
00395 !
00396  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00397 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00398  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00399 REAL, DIMENSION(:), POINTER       :: PT        ! 
00400 !
00401 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
00402 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
00403 INTEGER                           :: ILEV      ! level definition
00404 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00405 !-------------------------------------------------------------------
00406 !* Read surface temperature
00407 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_T',0,ZHOOK_HANDLE)
00408 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_T: | Reading surface temperature'
00409 !
00410 SELECT CASE (HINMODEL)
00411   CASE ('ECMWF ')
00412     CALL READ_GRIB(HGRIB,KLUOUT,139,IRET,PT)    
00413 
00414   CASE ('ARPEGE','ALADIN','MOCAGE')
00415     ILEV=0
00416     ILTYPE=111
00417     CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,PT,KLTYPE=ILTYPE,KLEV1=ILEV) 
00418     IF (IRET /= 0) THEN
00419       ILTYPE=1
00420       CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,PT,KLTYPE=ILTYPE) 
00421       IF (IRET /= 0) THEN
00422          ILTYPE=105
00423         CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,PT,KLTYPE=ILTYPE,KLEV1=ILEV)   
00424       ENDIF        
00425     END IF
00426 
00427   CASE ('HIRLAM ')
00428     WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_T: | Reading surface temperature tile 4'
00429      ILTYPE=105
00430      ILEV=904
00431     CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,PT,KLTYPE=ILTYPE,KLEV1=ILEV)
00432 
00433   CASE DEFAULT
00434     CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_T:OPTION NOT SUPPORTED '//HINMODEL)
00435 END SELECT
00436 !
00437 IF (IRET /= 0) THEN
00438   CALL ABOR1_SFX('MODE_READ_GRIB: SURFACE TEMPERATURE MISSING (READ_GRIB_T)')
00439 END IF
00440 !
00441 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_T',1,ZHOOK_HANDLE)
00442 END SUBROUTINE READ_GRIB_T
00443 !-------------------------------------------------------------------
00444 !     ###########################
00445       SUBROUTINE READ_GRIB_TS(HGRIB,KLUOUT,HINMODEL,PMASK,PTS)
00446 !     ###########################
00447 !
00448 USE MODD_SURF_PAR,   ONLY : XUNDEF
00449 !
00450 IMPLICIT NONE
00451 !
00452  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00453 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00454  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00455 REAL, DIMENSION(:), INTENT(IN)    :: PMASK     ! grib land mask
00456 REAL, DIMENSION(:), POINTER       :: PTS       ! 
00457 !
00458 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00459 !-------------------------------------------------------------------
00460 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TS',0,ZHOOK_HANDLE)
00461 !
00462  CALL READ_GRIB_T(HGRIB,KLUOUT,HINMODEL,PTS)
00463 !
00464 IF (SIZE(PMASK)==SIZE(PTS)) &
00465   WHERE (PMASK(:)/=1.) PTS = XUNDEF
00466 !
00467 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TS',1,ZHOOK_HANDLE)
00468 END SUBROUTINE READ_GRIB_TS
00469 !-------------------------------------------------------------------
00470 !     ###########################
00471       SUBROUTINE READ_GRIB_SST(HGRIB,KLUOUT,HINMODEL,PMASK,PSST)
00472 !     ###########################
00473 !
00474 USE MODD_SURF_PAR,   ONLY : XUNDEF
00475 !
00476 IMPLICIT NONE
00477 !
00478  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00479 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00480  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00481 REAL, DIMENSION(:), INTENT(IN)    :: PMASK     ! grib land mask
00482 REAL, DIMENSION(:), POINTER       :: PSST      ! 
00483 !
00484 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00485 !-------------------------------------------------------------------
00486 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SST',0,ZHOOK_HANDLE)
00487 !
00488 IF (HINMODEL=='HIRLAM') THEN
00489   CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_SST:OPTION NOT SUPPORTED '//HINMODEL)
00490 ELSE
00491   CALL READ_GRIB_T(HGRIB,KLUOUT,HINMODEL,PSST)
00492 ENDIF
00493 !
00494 IF (SIZE(PMASK)==SIZE(PSST)) &
00495   WHERE (PMASK(:)/=0.) PSST = XUNDEF
00496 !
00497 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SST',1,ZHOOK_HANDLE)
00498 END SUBROUTINE READ_GRIB_SST
00499 !-------------------------------------------------------------------
00500 !     ###########################
00501       SUBROUTINE READ_GRIB_T2(HGRIB,KLUOUT,HINMODEL,PMASK,PT2)
00502 !     ###########################
00503 !
00504 USE MODD_SURF_PAR,   ONLY : XUNDEF
00505 !
00506 IMPLICIT NONE
00507 !
00508  CHARACTER(LEN=*),   INTENT(IN)    :: HGRIB     ! Grib file name
00509 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00510  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00511 REAL, DIMENSION(:), INTENT(IN)    :: PMASK     ! grib land mask
00512 REAL, DIMENSION(:), POINTER       :: PT2       ! 
00513 !
00514 INTEGER(KIND=kindOfInt)                           :: IRET
00515 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
00516 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00517 !-------------------------------------------------------------------
00518 !* Read deep soil temperature
00519 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_T2',0,ZHOOK_HANDLE)
00520 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_T2: | Reading deep soil temperature'
00521 !
00522 SELECT CASE (HINMODEL)
00523   CASE ('ECMWF ')
00524      CALL READ_GRIB(HGRIB,KLUOUT,170,IRET,PT2)   
00525   CASE ('ARPEGE','ALADIN','MOCAGE')
00526      ILTYPE=111
00527      CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,PT2,KLTYPE=ILTYPE) 
00528     IF (IRET /= 0) THEN
00529        ILTYPE=105
00530       CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,PT2,KLTYPE=ILTYPE)   
00531     ENDIF     
00532    CASE DEFAULT
00533      CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_T2:OPTION NOT SUPPORTED '//HINMODEL)
00534 END SELECT
00535 !
00536 IF (IRET /= 0) THEN
00537   CALL ABOR1_SFX('MODE_READ_GRIB: DEEP SOIL TEMPERATURE MISSING (READ_GRIB_T2)')
00538 END IF
00539 !
00540 IF (SIZE(PMASK)==SIZE(PT2)) &
00541   WHERE (PMASK(:)/=1.) PT2 = XUNDEF
00542 !
00543 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_T2',1,ZHOOK_HANDLE)
00544 END SUBROUTINE READ_GRIB_T2
00545 !-------------------------------------------------------------------
00546 !-------------------------------------------------------------------
00547 SUBROUTINE PUT_LAYER_DEPTH(KLUOUT,KLEV,HROUT,KLTYPE,KLEV1,KLEV2,KNLAYERDEEP,PV4,PV,PD)
00548 !
00549 IMPLICIT NONE
00550 !
00551 INTEGER, INTENT(IN) :: KLUOUT
00552 INTEGER, INTENT(IN) :: KLEV
00553  CHARACTER(LEN=*), INTENT(IN) :: HROUT
00554 INTEGER, INTENT(INOUT) :: KLTYPE
00555 INTEGER, INTENT(IN) :: KLEV1
00556 INTEGER, INTENT(IN) :: KLEV2
00557 INTEGER, INTENT(IN) :: KNLAYERDEEP
00558 REAL, INTENT(IN) :: PV4
00559 REAL, INTENT(IN) :: PV
00560 REAL, INTENT(OUT) :: PD
00561 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00562 !
00563 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:PUT_LAYER_DEPTH',0,ZHOOK_HANDLE)
00564 !
00565 IF (KLEV2 == -1) KLTYPE = 0
00566 IF (KLTYPE==112) THEN
00567   PD = (KLEV2 - KLEV1) / 100.
00568 ELSE
00569   IF (KNLAYERDEEP == 4) THEN
00570     PD = PV4            
00571   ELSE
00572     PD = PV
00573   END IF
00574   WRITE (KLUOUT,'(A,i1,A,f5.2,A)') 'MODE_READ_GRIB:'//TRIM(HROUT)//': | Level ',&
00575                                     KLEV,' height not available, assuming ',PD,' m'
00576 END IF
00577 !
00578 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:PUT_LAYER_DEPTH',1,ZHOOK_HANDLE)
00579 END SUBROUTINE PUT_LAYER_DEPTH
00580 !-------------------------------------------------------------------
00581 !     #######################
00582       SUBROUTINE FILL_PFIELD(KLUOUT,HROUT,KNLAYERDEEP,PDIN,PFIELDIN,PMASK,PFIELDOUT,PDOUT)
00583 !     #######################
00584 !
00585 USE MODD_SURF_PAR,   ONLY : XUNDEF
00586 !
00587 IMPLICIT NONE
00588 !
00589 INTEGER, INTENT(IN) :: KLUOUT
00590  CHARACTER(LEN=*), INTENT(IN) :: HROUT
00591 INTEGER, INTENT(IN) :: KNLAYERDEEP
00592 REAL, DIMENSION(:), INTENT(IN) :: PDIN
00593 REAL, DIMENSION(:,:), INTENT(IN) :: PFIELDIN
00594 REAL, DIMENSION(:), INTENT(IN) :: PMASK
00595 REAL, DIMENSION(:,:), POINTER :: PFIELDOUT
00596 REAL, DIMENSION(:,:), POINTER :: PDOUT
00597 !
00598  CHARACTER(LEN=20) :: FMT0
00599 INTEGER :: JL
00600 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00601 !
00602 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:FILL_PFIELD',0,ZHOOK_HANDLE)
00603 !--------------------------------------------------------------------------------
00604 ! 1.  Display the number of layer found
00605 !     -----------------------
00606 WRITE(FMT0,FMT='(A8,I1,A11)') '(A,I1,A,',KNLAYERDEEP,'(F5.2,","))'
00607 WRITE (KLUOUT,FMT=FMT0) 'MODE_READ_GRIB:'//TRIM(HROUT)//': | ',KNLAYERDEEP,&
00608                         ' deep layers, heights are : ',PDIN(1:KNLAYERDEEP)
00609 !--------------------------------------------------------------------------------
00610 ! 2.  Set temperature profile and layer thicknesses
00611 !     -----------------------------------------------
00612 ALLOCATE(PFIELDOUT(SIZE(PFIELDIN,1),KNLAYERDEEP))
00613 ALLOCATE(PDOUT(SIZE(PFIELDIN,1),KNLAYERDEEP))
00614 !
00615 DO JL=1,KNLAYERDEEP
00616   PDOUT(:,JL)=SUM(PDIN(1:JL))
00617   PFIELDOUT(:,JL)=PFIELDIN(:,JL)
00618   IF (SIZE(PMASK)==SIZE(PFIELDOUT,1)) &
00619     WHERE (PMASK(:)/=1.) PFIELDOUT(:,JL) = XUNDEF
00620 ENDDO
00621 !
00622 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:FILL_PFIELD',1,ZHOOK_HANDLE)
00623 END SUBROUTINE FILL_PFIELD
00624 !-------------------------------------------------------------------
00625 !     #######################
00626       SUBROUTINE READ_GRIB_TG_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,PTG,PD)
00627 !     #######################
00628 !
00629 IMPLICIT NONE
00630 !
00631 !* dummy arguments
00632 !  ---------------
00633  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
00634 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00635  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00636 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
00637 REAL, DIMENSION(:,:), POINTER       :: PTG       ! field to initialize
00638 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
00639 !
00640 !* local variables
00641 !  ---------------
00642 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
00643 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
00644 INTEGER                           :: ILEV1     ! level definition
00645 INTEGER                           :: ILEV2     ! level definition
00646 INTEGER                           :: JL         ! layer loop counter
00647 INTEGER                           :: INLAYERDEEP! number of deep moisture layers
00648 REAL,    DIMENSION(:), POINTER    :: ZFIELD => NULL()  ! first layer temperature
00649 REAL,  DIMENSION(:,:), ALLOCATABLE:: ZTG      ! first layer temperature
00650 REAL, DIMENSION(:)   , ALLOCATABLE:: ZD
00651 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00652 !--------------------------------------------------------------------------------
00653 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TG_ECMWF',0,ZHOOK_HANDLE)
00654 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_TG_ECMWF: | Reading soil temperature'
00655 !
00656 ALLOCATE(ZD(5))
00657 !
00658 ! 1.  Search and read level 1 (and its depth)
00659 !     --------------------------------------
00660 ILTYPE= -1
00661 ILEV1 = -1
00662 ILEV2 = -1
00663  CALL READ_GRIB(HGRIB,KLUOUT,139,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
00664 !
00665 IF (IRET== 0) THEN
00666   CALL PUT_LAYER_DEPTH(KLUOUT,1,'READ_GRIB_TG_ECMWF',ILTYPE,ILEV1,ILEV2,4,0.07,0.07,ZD(1))
00667   ALLOCATE(ZTG(SIZE(ZFIELD),5))
00668   ZTG(:,1)=ZFIELD
00669 ELSE
00670   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL TEMPERATURE LEVEL 1 MISSING (READ_GRIB_TG_ECMWF)')
00671 ENDIF
00672 !
00673 ! 2.  Search and read level 4 (and its depth) This level is optionnal
00674 !     ---------------------------------------------------------------
00675 ILTYPE= -1
00676 ILEV1 = -1
00677 ILEV2 = -1
00678  CALL READ_GRIB(HGRIB,KLUOUT,236,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
00679 !
00680 IF (IRET == 0) THEN
00681   INLAYERDEEP = 4
00682   CALL PUT_LAYER_DEPTH(KLUOUT,4,'READ_GRIB_TG_ECMWF',ILTYPE,ILEV1,ILEV2,INLAYERDEEP,1.89,1.89,ZD(4))
00683   ZTG(:,4)=ZFIELD
00684 ELSE
00685   INLAYERDEEP = 3
00686   ZD(4) = 0.
00687 ENDIF
00688 !
00689 ! 3.  Search and read level 3 (and its depth) This level is optionnal
00690 !     ---------------------------------------------------------------
00691 ILTYPE= -1
00692 ILEV1 = -1
00693 ILEV2 = -1
00694  CALL READ_GRIB(HGRIB,KLUOUT,183,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
00695 !
00696 IF (IRET == 0) THEN      
00697   CALL PUT_LAYER_DEPTH(KLUOUT,3,'READ_GRIB_TG_ECMWF',ILTYPE,ILEV1,ILEV2,INLAYERDEEP,0.72,0.42,ZD(3))
00698   ZTG(:,3)=ZFIELD 
00699 ELSE
00700   INLAYERDEEP = 2
00701   ZD(3) = 0.        
00702 ENDIF
00703 !
00704 ! 4.  Search and read level 2 (and its depth)
00705 !     ---------------------------------------
00706 ILTYPE= -1
00707 ILEV1 = -1
00708 ILEV2 = -1
00709  CALL READ_GRIB(HGRIB,KLUOUT,170,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
00710 !
00711 IF (IRET== 0) THEN         
00712   CALL PUT_LAYER_DEPTH(KLUOUT,2,'READ_GRIB_TG_ECMWF',ILTYPE,ILEV1,ILEV2,INLAYERDEEP,0.21,0.42,ZD(2))
00713   ZTG(:,2)=ZFIELD
00714   DEALLOCATE(ZFIELD)    
00715 ELSE
00716   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL TEMPERATURE LEVEL 2 MISSING (READ_GRIB_TG_ECMWF)')
00717 ENDIF
00718 !--------------------------------------------------------------------------------
00719 ! 5.  Assumes uniform temperature profile up to 3m depth
00720 !     -------------------------------------------------
00721 !
00722 IF(SUM(ZD(1:INLAYERDEEP)) < 3.) THEN
00723   !We add a temperature layer
00724   INLAYERDEEP=INLAYERDEEP+1
00725   ZD(INLAYERDEEP)=3.-SUM(ZD(1:INLAYERDEEP-1))
00726   ZTG(:,INLAYERDEEP)=ZTG(:,INLAYERDEEP-1)
00727 ENDIF
00728 !
00729 !--------------------------------------------------------------------------------
00730 ! 6.  Set temperature profile and layer thicknesses
00731 !     ----------------------------------------------
00732  CALL FILL_PFIELD(KLUOUT,'READ_GRIB_TG_ECMWF',INLAYERDEEP,ZD,ZTG,PMASK,PTG,PD)
00733 DEALLOCATE(ZD)
00734 DEALLOCATE(ZTG)
00735 !
00736 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TG_ECMWF',1,ZHOOK_HANDLE)
00737 END SUBROUTINE READ_GRIB_TG_ECMWF
00738 !-------------------------------------------------------------------
00739 !     #######################
00740       SUBROUTINE READ_GRIB_WG_ECMWF_1(HGRIB,KLUOUT,HINMODEL,PMASK,PWG,PD)
00741 !     #######################
00742 !
00743 ! This tasks is divided in the following steps :
00744 !  - computing the MesoNH constants
00745 !  - reading the grib datas according to the type of file (ECMWF/Arpege/Aladin)
00746 !  - converting from specific humidity to relative humidity
00747 !  - interpolation with land mask
00748 !  - converting back from relative humidity to specific humidity with MesoNH constants
00749 ! Five different models are supported :
00750 !  - ECMWF with 2 layers (untested)
00751 !  - ECMWF with 3 layers (archive before 1991 - Blondin model)
00752 !  - ECMWF with 4 layers (archive after 1991 - Viterbo model)
00753 !  - Arpege/Aladin before ISBA (I don't know the name of this model)
00754 !  - Arpege/Aladin with ISBA model
00755 ! The available model is detect according to the fields which are presents :
00756 !  - ECMWF archive : loads as many layers as possible
00757 !  - Arpege/Aladin archive : ISBA model needs Clay and Sans fraction fields, if they
00758 !    are present, they are used and the model is declared to be ISBA.
00759 ! To detect the height of the layers, two methods are used :
00760 !  - if level type is not 112, a default value is assumed and a warning message is
00761 !    displayed
00762 !  - if level type is ID 112, then the position of the top and bottom surface may be
00763 !    given. If they are present, they are used, if not the default value is taken and
00764 !    a warning message is issued.
00765 !
00766 IMPLICIT NONE
00767 !
00768 !* dummy arguments
00769 !  ---------------
00770  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
00771 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00772  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00773 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
00774 REAL, DIMENSION(:,:), POINTER       :: PWG       ! field to initialize
00775 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
00776 !
00777 !* local variables
00778 !  ---------------
00779 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
00780 INTEGER                           :: IPAR      ! parameter number for field reading
00781 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
00782 INTEGER                           :: ILEV1     ! level definition
00783 INTEGER                           :: ILEV2     ! level definition
00784 INTEGER                           :: INLAYERDEEP! number of deep moisture layers
00785 REAL,    DIMENSION(:), POINTER    :: ZFIELD => NULL()  ! first layer temperature
00786 REAL,  DIMENSION(:,:), ALLOCATABLE:: ZWG      ! first layer temperature
00787 REAL, DIMENSION(:)   , ALLOCATABLE:: ZD
00788 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00789 !--------------------------------------------------------------------------------
00790 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_ECMWF_1',0,ZHOOK_HANDLE)
00791 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WG_ECMWF_1: | Reading soil moisture'
00792 !
00793 ALLOCATE(ZD(4))
00794 !
00795 ! 1.  Search and read level 1 (and its depth)
00796 !     --------------------------------------
00797 ILTYPE= -1
00798 ILEV1 = -1
00799 ILEV2 = -1
00800 IPAR=39
00801  CALL READ_GRIB(HGRIB,KLUOUT,140,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2,KPARAM2=IPAR)
00802 !
00803 IF (IRET == 0) THEN 
00804   CALL PUT_LAYER_DEPTH(KLUOUT,1,'READ_GRIB_WG_ECMWF_1',ILTYPE,ILEV1,ILEV2,4,0.07,0.07,ZD(1))
00805   ALLOCATE(ZWG(SIZE(ZFIELD,1),4))
00806   ZWG(:,1)=ZFIELD
00807   !
00808   IF (IPAR==140) ZWG(:,1)=ZWG(:,1) / ZD(1)
00809 ELSE
00810   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 1 MISSING (READ_GRIB_WG_ECMWF_1)')
00811 ENDIF
00812 !
00813 ! 2.  Search and read level 4 (and its depth) This level is optionnal
00814 !     ---------------------------------------------------------------
00815 ILTYPE= -1
00816 ILEV1 = -1
00817 ILEV2 = -1
00818 IPAR=42
00819  CALL READ_GRIB(HGRIB,KLUOUT,237,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2,KPARAM2=IPAR)
00820 !
00821 IF (IRET == 0) THEN   
00822   INLAYERDEEP = 4
00823   CALL PUT_LAYER_DEPTH(KLUOUT,4,'READ_GRIB_WG_ECMWF_1',ILTYPE,ILEV1,ILEV2,INLAYERDEEP,1.89,1.89,ZD(4))
00824   ZWG(:,4)=ZFIELD   
00825   !
00826   IF (IPAR==237) ZWG(:,4)=ZWG(:,4) / ZD(1) 
00827 ELSE
00828   INLAYERDEEP = 3  
00829   ZD(4) = 0.
00830 ENDIF
00831 !
00832 ! 3.  Search and read level 3 (and its depth) This level is optionnal
00833 !     ---------------------------------------------------------------
00834 ILTYPE= -1
00835 ILEV1 = -1
00836 ILEV2 = -1
00837 IPAR=41
00838  CALL READ_GRIB(HGRIB,KLUOUT,184,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2,KPARAM2=IPAR)
00839 !
00840 IF (IRET == 0) THEN
00841   CALL PUT_LAYER_DEPTH(KLUOUT,3,'READ_GRIB_WG_ECMWF_1',ILTYPE,ILEV1,ILEV2,INLAYERDEEP,0.72,0.42,ZD(3))
00842   ZWG(:,3)=ZFIELD 
00843   !
00844   IF (IPAR==184) ZWG(:,3)=ZWG(:,3) / ZD(1)
00845 ELSE
00846   INLAYERDEEP = 2  
00847   ZD(3) = 0.  
00848 ENDIF
00849 !
00850 ! 4.  Search and read level 2 (and its depth)
00851 !     ---------------------------------------
00852 ILTYPE= -1
00853 ILEV1 = -1
00854 ILEV2 = -1
00855 IPAR=40
00856  CALL READ_GRIB(HGRIB,KLUOUT,171,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2,KPARAM2=IPAR)
00857 !
00858 IF (IRET == 0) THEN
00859   CALL PUT_LAYER_DEPTH(KLUOUT,2,'READ_GRIB_WG_ECMWF_1',ILTYPE,ILEV1,ILEV2,INLAYERDEEP,0.21,0.42,ZD(2))
00860   ZWG(:,2)=ZFIELD
00861   DEALLOCATE(ZFIELD)  
00862   !
00863   IF (IPAR==171) ZWG(:,2)=ZWG(:,2) / ZD(1)
00864 ELSE
00865   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 MISSING (READ_GRIB_WG_ECMWF_1)')
00866 ENDIF
00867 !
00868 !--------------------------------------------------------------------------------
00869 !
00870  CALL FILL_PFIELD(KLUOUT,'READ_GRIB_WG_ECMWF_1',INLAYERDEEP,ZD,ZWG,PMASK,PWG,PD)
00871 DEALLOCATE(ZD)
00872 DEALLOCATE(ZWG)
00873 !
00874 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_ECMWF_1',1,ZHOOK_HANDLE)
00875 END SUBROUTINE READ_GRIB_WG_ECMWF_1
00876 !-------------------------------------------------------------------
00877 !     #######################
00878       SUBROUTINE ECMWF_WGI(PTG,PWG,PWGI)
00879 !     #######################
00880 !
00881 ! ECMWF grib only contain (ice+water) content.
00882 ! This routine computes iced part and water part according to the formula
00883 ! given in ECMWF documentation. But we use real water content instead of
00884 ! (CL+CH) times saturation capacity.
00885 !
00886 USE MODD_CSTS,        ONLY : XTT, XPI
00887 !
00888 IMPLICIT NONE
00889 !
00890 !* dummy arguments
00891 !  ---------------
00892 REAL, DIMENSION(:,:), INTENT(IN)    :: PTG       ! Temperature profil
00893 REAL, DIMENSION(:,:), INTENT(INOUT) :: PWG       ! INPUT contains (water+ice) profil
00894                                                  ! OUTPUT contains only water profil
00895 REAL, DIMENSION(:,:), INTENT(OUT)   :: PWGI      ! ice profil
00896 !
00897 !* local variables
00898 !  ---------------
00899 REAL  :: ZT1, ZT2  ! Temperature threshold
00900 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00901 !--------------------------------------------------------------------------------
00902 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:ECMWF_WGI',0,ZHOOK_HANDLE)
00903 !
00904 ZT1=XTT + 1.
00905 ZT2=XTT - 3.
00906 !
00907 WHERE(PTG(:,:) > ZT1)
00908   PWGI(:,:) = 0.
00909 ELSEWHERE(PTG(:,:) < ZT2)
00910   PWGI(:,:) = PWG(:,:)
00911   PWG(:,:) = 0.
00912 ELSEWHERE
00913   PWGI(:,:)=PWG(:,:) * 0.5* (1 - sin(XPI * (PTG(:,:) - 0.5*ZT1 - 0.5*ZT2) / &
00914                                            (ZT1 - ZT2                   )   ))
00915   PWG(:,:) = PWG(:,:) - PWGI(:,:)
00916 ENDWHERE
00917 !
00918 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:ECMWF_WGI',1,ZHOOK_HANDLE)
00919 END SUBROUTINE ECMWF_WGI
00920 !--------------------------------------------------------------------------------
00921 !     #######################
00922       SUBROUTINE HARMONIZE_GRIB_WG_WGI_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,PWG,PD,PWGI)
00923 !     #######################
00924 !
00925 ! ECMWF grib only contain (ice+water) content.
00926 ! This routine computes iced part and water part according to the formula
00927 ! given in ECMWF documentation. But we use real water content instead of
00928 ! (CL+CH) times saturation capacity.
00929 !
00930 USE MODD_CSTS,        ONLY : XTT, XPI
00931 !
00932 IMPLICIT NONE
00933 !
00934 !* dummy arguments
00935 !  ---------------
00936  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
00937 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00938  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00939 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
00940 REAL, DIMENSION(:,:), OPTIONAL, POINTER :: PWG   ! INPUT contains (water+ice) profil
00941                                                  ! OUTPUT contains only water profil
00942 REAL, DIMENSION(:,:), OPTIONAL, POINTER :: PD    ! thickness of each layer                          
00943 REAL, DIMENSION(:,:), OPTIONAL, POINTER :: PWGI  ! ice profil
00944 !* local variables
00945 !  ---------------
00946 REAL,  DIMENSION(:,:), POINTER :: ZWG => NULL()          ! profile of soil water contents
00947 REAL,  DIMENSION(:,:), POINTER :: ZD => NULL()           ! thickness of each layer
00948 REAL,  DIMENSION(:,:), POINTER :: ZTG => NULL()          ! profile of temperature
00949 REAL,  DIMENSION(:,:), POINTER :: ZDT => NULL()          ! thickness of each temperature layer
00950 REAL,  DIMENSION(:,:), ALLOCATABLE:: ZWGI      ! profile of soil ice contents
00951 REAL  :: ZT1, ZT2  ! Temperature threshold
00952 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00953 !--------------------------------------------------------------------------------
00954 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF',0,ZHOOK_HANDLE)
00955 !
00956  CALL READ_GRIB_TG_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,ZTG,ZDT)
00957  CALL READ_GRIB_WG_ECMWF_1(HGRIB,KLUOUT,HINMODEL,PMASK,ZWG,ZD)
00958 !
00959 IF (SIZE(ZTG,2) .LT. SIZE(ZWG,2)) THEN
00960   WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF: '
00961   WRITE  (KLUOUT,'(A)') 'ERROR, YOU HAVE NOT THE SAME NUMBER OF LEVELS '
00962   WRITE  (KLUOUT,'(A)') 'IN SOIL FOR TEMPERATURE AND HUMIDITY '
00963   WRITE  (KLUOUT,'(A)') 'VERIFY GRIB FILE '
00964   CALL ABOR1_SFX("MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF: VERIFY NUMBER OF LEVELS IN GRIB FILE")
00965 ENDIF
00966 !
00967 IF (PRESENT(PD)) THEN
00968   ALLOCATE(PD(SIZE(ZD,1),SIZE(ZD,2)))
00969   PD(:,:)=ZD(:,:)
00970 ENDIF
00971 IF (PRESENT(PWGI)) THEN
00972   ALLOCATE(PWGI(SIZE(ZWG,1),SIZE(ZWG,2)))
00973   PWGI(:,:)=0.
00974 ENDIF
00975 !
00976 !If same vertical grids are taken into account for WG and TG we can
00977 !compute ice content and new water content
00978 IF(ALL(ZDT(:,1:SIZE(ZWG,2))==ZD(:,1:SIZE(ZWG,2)))) THEN     
00979   ALLOCATE(ZWGI(SIZE(ZWG,1),SIZE(ZWG,2)))
00980   CALL ECMWF_WGI(ZTG(:,1:SIZE(ZWG,2)),ZWG,ZWGI)
00981   IF (PRESENT(PWGI)) PWGI(:,:)=ZWGI(:,:)
00982   DEALLOCATE(ZWGI)
00983 ENDIF
00984 !
00985 IF (PRESENT(PWG)) THEN
00986   ALLOCATE(PWG(SIZE(ZWG,1),SIZE(ZWG,2)))
00987   PWG(:,:)=ZWG(:,:)
00988 ENDIF
00989 !
00990 DEALLOCATE(ZWG)
00991 DEALLOCATE(ZD)
00992 DEALLOCATE(ZTG)
00993 DEALLOCATE(ZDT)
00994 !
00995 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:HARMONIZE_GRIB_WG_WGI_ECMWF',1,ZHOOK_HANDLE)
00996 END SUBROUTINE HARMONIZE_GRIB_WG_WGI_ECMWF
00997 !--------------------------------------------------------------------------------
00998 !     #######################
00999       SUBROUTINE READ_GRIB_WG_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,PFIELD,PD)
01000 !     #######################
01001 !
01002 USE MODD_GRID_GRIB,  ONLY : NNI
01003 USE MODD_SURF_PAR,   ONLY : XUNDEF
01004 !
01005 IMPLICIT NONE
01006 !
01007 !* dummy arguments
01008 !  ---------------
01009  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01010 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01011  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01012 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01013 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
01014 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer     
01015 !* local variables
01016 !  ---------------
01017 INTEGER(KIND=kindOfInt)                           :: IRET       ! return code
01018 REAL,    DIMENSION(:), POINTER    :: ZSLT => NULL()       ! soil type
01019 REAL,    DIMENSION(:), ALLOCATABLE:: ZWWILT     ! ECMWF wilting point
01020 REAL,    DIMENSION(:), ALLOCATABLE:: ZWFC       ! ECMWF field capacity
01021 INTEGER                           :: JL         ! loop counter on layers
01022 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01023 !
01024 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_ECMWF',0,ZHOOK_HANDLE)
01025 !
01026  CALL HARMONIZE_GRIB_WG_WGI_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,PWG=PFIELD,PD=PD)
01027 !
01028 ! 1.  Get soil type to compute SWI
01029 !     ----------------------------
01030  CALL READ_GRIB(HGRIB,KLUOUT,43,IRET,ZSLT)
01031 !--------------------------------------------------------------------------------
01032 ALLOCATE (ZWFC(SIZE(PFIELD,1)))
01033 ALLOCATE (ZWWILT(SIZE(PFIELD,1)))
01034 ZWFC  (:) = 0.
01035 ZWWILT(:) = 0.
01036 !
01037 IF (IRET == 0) THEN
01038 !        
01039 ! 2.1 Convert from specific humidity to relative humidity using soil types
01040 !     --------------------------------------------------------------------
01041   WHERE (ZSLT(:)==1.) 
01042     ZWFC(:)         = 0.242
01043     ZWWILT(:)       = 0.059
01044   ELSEWHERE (ZSLT(:)==2.) 
01045     ZWFC(:)         = 0.346
01046     ZWWILT(:)       = 0.151
01047   ELSEWHERE (ZSLT(:)==3.) 
01048     ZWFC(:)         = 0.382
01049     ZWWILT(:)       = 0.133
01050   ELSEWHERE (ZSLT(:)==4.) 
01051     ZWFC(:)         = 0.448
01052     ZWWILT(:)       = 0.279
01053   ELSEWHERE (ZSLT(:)==5.) 
01054     ZWFC(:)         = 0.541
01055     ZWWILT(:)       = 0.335
01056   ELSEWHERE (ZSLT(:)==6.) 
01057     ZWFC(:)         = 0.662
01058     ZWWILT(:)       = 0.267
01059   ENDWHERE
01060   !
01061 ELSE
01062 !
01063 ! 2.2 Convert from specific humidity to relative humidity single soil type
01064 !     --------------------------------------------------------------------
01065   ! Compute model's constants
01066   IF (SIZE(PFIELD,2)==4) THEN
01067     ZWFC(:)   = 0.323
01068     ZWWILT(:) = 0.171
01069   ELSE
01070     ZWFC(:)   = 0.171
01071     ZWWILT(:) = 0.086
01072   END IF
01073   !
01074 ENDIF
01075 !
01076 DO JL=1,SIZE(PFIELD,2)
01077   WHERE ( PFIELD(:,JL).NE.XUNDEF .AND. ZWFC(:).NE.0. ) 
01078     PFIELD(:,JL) = (PFIELD(:,JL) - ZWWILT(:)) / (ZWFC(:) - ZWWILT(:))
01079   ELSEWHERE
01080     PFIELD(:,JL) = 0.
01081   ENDWHERE
01082 ENDDO
01083 !
01084 IF (ASSOCIATED(ZSLT)) DEALLOCATE(ZSLT)
01085 DEALLOCATE(ZWFC)
01086 DEALLOCATE(ZWWILT)
01087 !
01088 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_ECMWF',1,ZHOOK_HANDLE)
01089 END SUBROUTINE READ_GRIB_WG_ECMWF
01090 !----------------------------------------------------------------------------
01091 !     #######################
01092       SUBROUTINE READ_GRIB_WGI_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,PFIELD,PD)
01093 !     #######################
01094 !
01095 USE MODD_GRID_GRIB,  ONLY : NNI
01096 USE MODD_SURF_PAR,   ONLY : XUNDEF
01097 !
01098 IMPLICIT NONE
01099 !
01100 !* dummy arguments
01101 !  ---------------
01102  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01103 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01104  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01105 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01106 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
01107 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
01108 !* local variables
01109 !  ---------------
01110 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01111 REAL,    DIMENSION(:), POINTER    :: ZSLT => NULL()      ! soil type
01112 REAL,  DIMENSION(:)  , ALLOCATABLE:: ZWSAT     ! ECMWF saturation
01113 INTEGER                           :: JL        ! loop counter on layers
01114 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01115 !--------------------------------------------------------------------------------
01116 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WGI_ECMWF',0,ZHOOK_HANDLE)
01117 !
01118  CALL HARMONIZE_GRIB_WG_WGI_ECMWF(HGRIB,KLUOUT,HINMODEL,PMASK,PD=PD,PWGI=PFIELD)
01119 !
01120 ! 1.  Get soil type to compute WSAT
01121 !     ----------------------------
01122  CALL READ_GRIB(HGRIB,KLUOUT,43,IRET,ZSLT)
01123 !--------------------------------------------------------------------------------
01124 ALLOCATE (ZWSAT(SIZE(PFIELD,1)))
01125 ZWSAT(:)=0.
01126 !
01127 IF (IRET == 0) THEN
01128 !        
01129 ! 2.1 Convert from specific humidity to relative humidity using soil types
01130 !     --------------------------------------------------------------------
01131   WHERE (ZSLT(:)==1.) 
01132     ZWSAT(:) = 0.403
01133   ELSEWHERE (ZSLT(:)==2.) 
01134     ZWSAT(:) = 0.439
01135   ELSEWHERE (ZSLT(:)==3.) 
01136     ZWSAT(:) = 0.430
01137   ELSEWHERE (ZSLT(:)==4.) 
01138     ZWSAT(:) = 0.520
01139   ELSEWHERE (ZSLT(:)==5.) 
01140     ZWSAT(:) = 0.614
01141   ELSEWHERE (ZSLT(:)==6.) 
01142     ZWSAT(:) = 0.766
01143   ENDWHERE
01144 !
01145 ELSE
01146 !
01147 ! 2.2 Convert from specific humidity to relative humidity single soil type
01148 !     --------------------------------------------------------------------
01149   ! Compute model's constants
01150   IF (SIZE(PFIELD,2)==4) THEN
01151     ZWSAT(:)  = 0.472
01152   ELSE
01153     ZWSAT(:)  = 0.286
01154   END IF
01155   !
01156 ENDIF
01157 !
01158 ! Then perform conversion
01159 DO JL=1,SIZE(PFIELD,2)
01160   WHERE ( PFIELD(:,JL).NE.XUNDEF .AND. ZWSAT(:).NE.0. ) 
01161     PFIELD(:,JL) = PFIELD(:,JL) / ZWSAT(:)
01162   ELSEWHERE
01163     PFIELD(:,JL) = 0.
01164   ENDWHERE
01165 ENDDO
01166 !
01167 IF (ASSOCIATED(ZSLT)) DEALLOCATE(ZSLT)
01168 DEALLOCATE(ZWSAT)
01169 !
01170 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WGI_ECMWF',1,ZHOOK_HANDLE)
01171 END SUBROUTINE READ_GRIB_WGI_ECMWF
01172 !-------------------------------------------------------------------
01173 !-------------------------------------------------------------------
01174 !     #######################
01175       SUBROUTINE READ_GRIB_TG_METEO_FRANCE(HGRIB,KLUOUT,HINMODEL,PMASK,PTG,PDT)
01176 !     #######################
01177 !
01178 USE MODD_SURF_PAR,   ONLY : XUNDEF
01179 !
01180 IMPLICIT NONE
01181 !
01182 !* dummy arguments
01183 !  ---------------
01184  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01185 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01186  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01187 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01188 REAL, DIMENSION(:,:), POINTER       :: PTG       ! field to initialize
01189 REAL, DIMENSION(:,:), POINTER       :: PDT       ! thickness of each layer
01190 !* local variables
01191 !  ---------------
01192 REAL,    DIMENSION(:), POINTER    :: ZFIELD => NULL()    ! field to read
01193 INTEGER                           :: JL         ! layer loop counter
01194 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01195 !--------------------------------------------------------------------------------
01196 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TG_METEO_FRANCE',0,ZHOOK_HANDLE)
01197 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_TG_METEO_FRANCE: | Reading soil temperature'
01198 !--------------------------------------------------------------------------------
01199 ! 1.  Allocate soil temperature profile
01200 !     ---------------------------------
01201 !--------------------------------------------------------------------------------
01202 ! 2.  Search and read level 1 (and its depth)
01203 !     ---------------------------------------
01204  CALL READ_GRIB_TS(HGRIB,KLUOUT,HINMODEL,PMASK,ZFIELD)
01205 !
01206 ALLOCATE(PTG(SIZE(ZFIELD),3))
01207 ALLOCATE(PDT(SIZE(ZFIELD),3))
01208 !
01209 PTG(:,1) = ZFIELD(:)
01210 PDT(:,1) = 0.
01211 !--------------------------------------------------------------------------------
01212 ! 3.  Deep soil temperature
01213 !     ---------------------
01214  CALL READ_GRIB_T2(HGRIB,KLUOUT,HINMODEL,PMASK,ZFIELD)
01215 !
01216 PTG(:,2) = ZFIELD(:)
01217 PDT(:,2) = 0.2         ! deep temperature depth assumed equal to 0.2m
01218 DEALLOCATE(ZFIELD)
01219 !--------------------------------------------------------------------------------
01220 ! 4.  Assumes uniform temperature profile below
01221 !     -----------------------------------------
01222 PTG(:,3) = PTG(:,2)
01223 PDT(:,3) = 3.          ! temperature profile down to 3m
01224 !
01225 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TG_METEO_FRANCE',1,ZHOOK_HANDLE)
01226 END SUBROUTINE READ_GRIB_TG_METEO_FRANCE
01227 !-------------------------------------------------------------------
01228 !     #######################
01229       SUBROUTINE READ_GRIB_SAND_CLAY_METEO_FRANCE(HGRIB,KLUOUT,HINMODEL,PSAND,PCLAY,GISBA)
01230 !     ######################
01231 !
01232 IMPLICIT NONE
01233 !
01234 !* dummy arguments
01235 !  ---------------
01236  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01237 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01238  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01239 REAL, DIMENSION(:), POINTER         :: PSAND     ! field to initialize
01240 REAL, DIMENSION(:), POINTER         :: PCLAY     ! thickness of each layer
01241 LOGICAL, INTENT(OUT)                :: GISBA     ! T: surface scheme in file is ISBA
01242 !* local variables
01243 !  ---------------
01244 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01245 INTEGER                           :: IPAR      ! parameter number for field reading
01246 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01247 !-------------------------------------------------------------------------------
01248 ! 1.  Search and read clay fraction if available
01249 !     ------------------------------------------
01250 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SAND_CLAY_METEO_FRANCE',0,ZHOOK_HANDLE)
01251 !
01252 IF (HINMODEL == 'ARPEGE' .OR. HINMODEL == 'MOCAGE') IPAR=171
01253 IF (HINMODEL == 'ALADIN') IPAR=128
01254  CALL READ_GRIB(HGRIB,KLUOUT,IPAR,IRET,PCLAY)
01255 !
01256 ! if not available, the model is not ISBA (IWMODE=1)
01257 IF (IRET /= 0) THEN
01258   GISBA = .FALSE.
01259 ELSE
01260   GISBA = .TRUE.
01261   PCLAY(:) = PCLAY(:) / 100. ! this field is given in percent
01262   WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_SAND_CLAY_METEO_FRANCE: | The soil model is ISBA'
01263 END IF
01264 !-------------------------------------------------------------------------------
01265 ! 2.  Search and read sand fraction if available
01266 !     ------------------------------------------
01267 IF (HINMODEL == 'ARPEGE' .OR. HINMODEL == 'MOCAGE') IPAR=172
01268 IF (HINMODEL == 'ALADIN') IPAR=129
01269  CALL READ_GRIB(HGRIB,KLUOUT,IPAR,IRET,PSAND)
01270 !
01271 ! if not available, the model is not ISBA (IWMODE=1)
01272 IF (GISBA) THEN
01273   IF (IRET /= 0) THEN
01274     CALL ABOR1_SFX('MODE_READ_GRIB: SAND FRACTION MISSING (READ_GRIB_SAND_CLAY_METEO_FRANCE)')
01275   ELSE
01276     PSAND(:) = PSAND(:) / 100. ! this field is given in percent
01277   END IF
01278 END IF
01279 !
01280 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SAND_CLAY_METEO_FRANCE',1,ZHOOK_HANDLE)
01281 END SUBROUTINE READ_GRIB_SAND_CLAY_METEO_FRANCE
01282 !-----------------------------------------------------------------------------------
01283 !     #######################
01284       SUBROUTINE READ_GRIB_WG_METEO_FRANCE(HGRIB,KLUOUT,HINMODEL,PMASK,PFIELD,PD)
01285 !     #######################
01286 !
01287 USE MODD_GRID_GRIB,  ONLY : NNI
01288 USE MODD_SURF_PAR,   ONLY : XUNDEF
01289 !
01290 IMPLICIT NONE
01291 !
01292 !* dummy arguments
01293 !  ---------------
01294  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01295 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01296  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01297 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01298 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
01299 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
01300 !
01301 !* local variables
01302 !  ---------------
01303 LOGICAL                           :: GISBA     ! T: surface scheme in file is ISBA
01304 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01305 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
01306 INTEGER                           :: ILEV1     ! level definition
01307 INTEGER                           :: ILEV2     ! level definition
01308 REAL,  DIMENSION(:),   POINTER    :: ZCLAY => NULL()     ! clay fraction
01309 REAL,  DIMENSION(:),   POINTER    :: ZSAND => NULL()     ! sand fraction
01310 REAL,  DIMENSION(:),   POINTER    :: ZFIELD => NULL()
01311 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWWILT     ! wilting point
01312 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWFC       ! field capacity
01313 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWSAT      ! saturation
01314 INTEGER                           :: JL         ! layer loop counter
01315 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01316 !-------------------------------------------------------------------------------
01317 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_METEO_FRANCE',0,ZHOOK_HANDLE)
01318 !
01319 ! 1.  Search and read clay and sand fractions if available
01320 !     ----------------------------------------------------
01321  CALL READ_GRIB_SAND_CLAY_METEO_FRANCE(HGRIB,KLUOUT,HINMODEL,ZSAND,ZCLAY,GISBA)
01322 !-------------------------------------------------------------------------------
01323 IF (GISBA) THEN
01324   ALLOCATE(PFIELD(SIZE(ZSAND),3))
01325   ALLOCATE(PD(SIZE(ZSAND),3))
01326 ELSE
01327   ALLOCATE(PFIELD(NNI,3))
01328   ALLOCATE(PD(NNI,3))
01329 ENDIF
01330 !
01331 PD(:,1) = 0.
01332 PD(:,2) = 0.20
01333 !-------------------------------------------------------------------------------
01334 ! 2.  Read layer 1 moisture
01335 !     ---------------------
01336 ILEV1   = 0
01337 IF (HINMODEL == 'ARPEGE' .OR. HINMODEL=='MOCAGE') THEN
01338   ILTYPE  = 112     
01339   ILEV2   = 1        
01340   CALL READ_GRIB(HGRIB,KLUOUT,153,IRET,ZFIELD,KLEV1=ILEV1,KLEV2=ILEV2)
01341 ELSE
01342   ILTYPE  = 105
01343   ILEV2   = 0
01344   CALL READ_GRIB(HGRIB,KLUOUT,86,IRET,ZFIELD,KLEV1=ILEV1,KLEV2=ILEV2)
01345 ENDIF
01346 IF (IRET /= 0) THEN
01347   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 1 MISSING (READ_GRIB_WG_METEO_FRANCE)')
01348 END IF
01349 !
01350 PFIELD(:,1) = ZFIELD(:)
01351 !-------------------------------------------------------------------------------
01352 ! 3.  Read layer 2 moisture
01353 !     ---------------------
01354 IF (HINMODEL == 'ARPEGE' .OR. HINMODEL=='MOCAGE') THEN
01355   ILTYPE  = 112  
01356   ILEV1   = 0  
01357   ILEV2   = 250             
01358   CALL READ_GRIB(HGRIB,KLUOUT,153,IRET,ZFIELD,KLEV1=ILEV1,KLEV2=ILEV2)
01359 ELSE
01360   ILTYPE  = 111
01361   ILEV1   = -1
01362   ILEV2   = -1        
01363   CALL READ_GRIB(HGRIB,KLUOUT,86,IRET,ZFIELD,KLEV1=ILEV1,KLEV2=ILEV2)
01364 ENDIF
01365 IF (IRET /= 0) THEN
01366   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 MISSING (READ_GRIB_WG_METEO_FRANCE)')
01367 END IF
01368 !        
01369 PFIELD(:,2) = ZFIELD(:)
01370 !-------------------------------------------------------------------------------
01371 ! 4.  Read layer 2 depth (ISBA only)
01372 !     -----------------------------
01373 !* note that soil water reservoir is considered uniform between 0.2m and GRIB soil depth
01374 IF (GISBA) THEN
01375   IF (HINMODEL == 'ARPEGE' .OR. HINMODEL == 'MOCAGE') THEN
01376     CALL READ_GRIB(HGRIB,KLUOUT,173,IRET,ZFIELD)
01377   ELSE
01378     CALL READ_GRIB(HGRIB,KLUOUT,130,IRET,ZFIELD)
01379   ENDIF
01380   IF (IRET /= 0) THEN
01381     CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 DEPTH MISSING (READ_GRIB_WG_METEO_FRANCE)')          
01382   END IF
01383   PD(:,3) = ZFIELD(:)
01384   DEALLOCATE(ZFIELD)
01385 ELSE
01386   PD(:,3) = 2.
01387 END IF
01388 !-------------------------------------------------------------------------------
01389 ! 5.  Compute relative humidity from units kg/m^2
01390 !     -------------------------------------------
01391 ! Compute ISBA model constants (if needed)
01392 IF (GISBA) THEN
01393   !
01394   !* updates Wg in m3/m3
01395   PFIELD(:,1) = PFIELD(:,1) / 10.
01396   PFIELD(:,2) = PFIELD(:,2) /(1000. * PD(:,3))
01397   !
01398   ALLOCATE (ZWSAT (SIZE(ZSAND)))
01399   ZWSAT (:) = (-1.08*100. * ZSAND(:) + 494.305) * 0.001
01400   PFIELD(:,1) = MAX(MIN(PFIELD(:,1),ZWSAT(:)),0.)
01401   PFIELD(:,2) = MAX(MIN(PFIELD(:,2),ZWSAT(:)),0.)
01402   DEALLOCATE(ZWSAT)
01403   DEALLOCATE (ZSAND)
01404   !
01405   ALLOCATE (ZWWILT(SIZE(ZCLAY)))
01406   ALLOCATE (ZWFC  (SIZE(ZCLAY)))
01407   ZWWILT(:) = 37.1342E-3 * SQRT( 100. * ZCLAY(:) )
01408   ZWFC  (:) = 89.0467E-3 * (100. * ZCLAY(:) )**0.3496
01409   PFIELD(:,1) = (PFIELD(:,1) - ZWWILT(:)) / (ZWFC(:) - ZWWILT(:))
01410   PFIELD(:,2) = (PFIELD(:,2) - ZWWILT(:)) / (ZWFC(:) - ZWWILT(:))
01411   DEALLOCATE (ZWWILT)
01412   DEALLOCATE (ZWFC)
01413   DEALLOCATE (ZCLAY)
01414   !
01415 ELSE ! Non ISBA
01416  !
01417   PFIELD(:,2) = (PFIELD(:,1)+PFIELD(:,2)) / (20. + 100.) 
01418   PFIELD(:,1) =  PFIELD(:,1)           /  20.
01419   !
01420 END IF
01421 !
01422 PFIELD(:,3) = PFIELD(:,2)
01423 !--------------------------------------------------------------------------------
01424 ! 6.  Apply land mask
01425 !     ---------------
01426 IF (SIZE(PMASK)==SIZE(PFIELD,1)) THEN
01427   DO JL=1,SIZE(PFIELD,2)
01428     WHERE (PMASK(:)/=1.) PFIELD(:,JL) = XUNDEF
01429   END DO
01430 ENDIF
01431 !
01432 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_METEO_FRANCE',1,ZHOOK_HANDLE)
01433 END SUBROUTINE READ_GRIB_WG_METEO_FRANCE
01434 !--------------------------------------------------------------------------------
01435 !     #######################
01436       SUBROUTINE READ_GRIB_WGI_METEO_FRANCE(HGRIB,KLUOUT,HINMODEL,PMASK,PFIELD,PD)
01437 !     #######################
01438 !
01439 USE MODD_GRID_GRIB,  ONLY : NNI
01440 USE MODD_SURF_PAR,   ONLY : XUNDEF
01441 !
01442 IMPLICIT NONE
01443 !
01444 !* dummy arguments
01445 !  ---------------
01446  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01447 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01448  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01449 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01450 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
01451 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
01452 !
01453 !* local variables
01454 !  ---------------
01455 LOGICAL                           :: GISBA     ! T: surface scheme in file is ISBA
01456 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01457 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
01458 INTEGER                           :: ILEV1     ! level definition
01459 INTEGER                           :: ILEV2     ! level definition
01460 REAL,  DIMENSION(:),   POINTER    :: ZCLAY => NULL()     ! clay fraction
01461 REAL,  DIMENSION(:),   POINTER    :: ZSAND => NULL()     ! sand fraction
01462 REAL,  DIMENSION(:),   POINTER    :: ZFIELD => NULL()
01463 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWSAT      ! saturation
01464 INTEGER                           :: JL         ! layer loop counter
01465 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01466 !-------------------------------------------------------------------------------
01467 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE',0,ZHOOK_HANDLE)
01468 !
01469 ! 1.  Search and read clay fraction if available
01470 !     ------------------------------------------
01471  CALL READ_GRIB_SAND_CLAY_METEO_FRANCE(HGRIB,KLUOUT,HINMODEL,ZSAND,ZCLAY,GISBA)
01472 !-------------------------------------------------------------------------------
01473 IF (GISBA) THEN
01474   ALLOCATE(PFIELD(SIZE(ZSAND),2))
01475   ALLOCATE(PD(SIZE(ZSAND),2))
01476 ELSE
01477   ALLOCATE(PFIELD(NNI,2))
01478   ALLOCATE(PD(NNI,2))
01479 ENDIF
01480 !
01481 PD(:,1) = 0.
01482 !-------------------------------------------------------------------------------
01483 ! 2.  Read layer 1 soil ice
01484 !     ---------------------
01485 ILEV1   = 0  
01486 IF (HINMODEL == 'ARPEGE' .OR. HINMODEL=='MOCAGE') THEN
01487   ILTYPE  = 112     
01488   ILEV2   = 1
01489   CALL READ_GRIB(HGRIB,KLUOUT,152,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
01490 ELSE
01491   ILTYPE  = 105      
01492   ILEV2   = 0        
01493   CALL READ_GRIB(HGRIB,KLUOUT,139,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
01494 END IF
01495 !
01496 IF (IRET == 0) THEN
01497   PFIELD(:,1) = ZFIELD(:)
01498   WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE: -> Soil ice level 1 is present'
01499 ELSE
01500   PFIELD(:,1) = 0.
01501 END IF
01502 !-------------------------------------------------------------------------------
01503 ! 3.  Read layer 2 soil ice
01504 !     ---------------------
01505 IF (HINMODEL == 'ARPEGE' .OR. HINMODEL=='MOCAGE') THEN
01506   ILTYPE  = 112
01507   ILEV1   = 0        
01508   ILEV2   = 250
01509   CALL READ_GRIB(HGRIB,KLUOUT,152,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
01510 ELSE
01511   ILTYPE  = 111
01512   ILEV1   = -1        
01513   ILEV2   = -1        
01514   CALL READ_GRIB(HGRIB,KLUOUT,139,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
01515 END IF
01516 !
01517 IF (IRET == 0) THEN
01518   PFIELD(:,2) = ZFIELD(:)     
01519   WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE: -> Soil ice level 2 is present'
01520 ELSE
01521   PFIELD(:,2) = 0.
01522 END IF
01523 !-------------------------------------------------------------------------------
01524 ! 4.  Read layer 2 depth (ISBA only)
01525 !     ------------------------------
01526 IF (GISBA) THEN
01527   IF (HINMODEL == 'ARPEGE' .OR. HINMODEL=='MOCAGE') THEN 
01528     CALL READ_GRIB(HGRIB,KLUOUT,173,IRET,ZFIELD)
01529   ELSE
01530     CALL READ_GRIB(HGRIB,KLUOUT,130,IRET,ZFIELD)
01531   ENDIF
01532   IF (IRET /= 0) THEN
01533     CALL ABOR1_SFX('MODE_READ_GRIB: SOIL ICE LEVEL 2 MISSING (READ_GRIB_WGI_METEO_FRANCE)')
01534   END IF
01535   PD(:,2) = ZFIELD(:)
01536   DEALLOCATE(ZFIELD)
01537 ELSE
01538   PD(:,2) = 2.
01539 END IF
01540 !-------------------------------------------------------------------------------
01541 ! 5.  Compute relative humidity from units kg/m^2
01542 !     -------------------------------------------
01543 IF (GISBA) THEN
01544   !
01545   !* updates Wgi in m3/m3
01546   PFIELD(:,1) = PFIELD(:,1) / 10.
01547   PFIELD(:,2) = PFIELD(:,2) /(1000. * PD(:,2))
01548   !        
01549   ALLOCATE (ZWSAT (NNI))
01550   ZWSAT (:) = (-1.08*100. * ZSAND(:) + 494.305) * 0.001
01551   PFIELD(:,1) = PFIELD(:,1) / ZWSAT(:)
01552   PFIELD(:,2) = PFIELD(:,2) / ZWSAT(:)
01553   DEALLOCATE (ZWSAT) 
01554   DEALLOCATE (ZSAND)
01555   DEALLOCATE (ZCLAY)
01556   !
01557 ELSE ! Non ISBA
01558   !
01559   PFIELD(:,1) = 0.
01560   PFIELD(:,2) = 0.
01561   !
01562 END IF
01563 !--------------------------------------------------------------------------------
01564 ! 6.  Apply land mask
01565 !     ---------------
01566 IF (SIZE(PMASK)==SIZE(PFIELD,1)) THEN
01567   DO JL=1,SIZE(PFIELD,2)
01568     WHERE (PMASK(:)/=1.) PFIELD(:,JL) = XUNDEF
01569   END DO
01570 ENDIF
01571 !
01572 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WGI_METEO_FRANCE',1,ZHOOK_HANDLE)
01573 END SUBROUTINE READ_GRIB_WGI_METEO_FRANCE
01574 !-------------------------------------------------------------------
01575 !-------------------------------------------------------------------
01576 !     #######################
01577       SUBROUTINE READ_GRIB_TG_HIRLAM(HGRIB,KLUOUT,HINMODEL,PMASK,PTG,PDT)
01578 !     #######################
01579 !
01580 USE MODD_GRID_GRIB,  ONLY : NNI
01581 USE MODD_SURF_PAR,   ONLY : XUNDEF
01582 !
01583 IMPLICIT NONE
01584 !
01585 !* dummy arguments
01586 !  ---------------
01587  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01588 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01589  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01590 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01591 REAL, DIMENSION(:,:), POINTER       :: PTG       ! field to initialize
01592 REAL, DIMENSION(:,:), POINTER       :: PDT       ! thickness of each layer
01593 !
01594 !* local variables
01595 !  ---------------
01596 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01597 INTEGER                           :: ILEV1     ! level definition
01598 INTEGER                           :: ILEV2     ! level definition
01599 REAL,  DIMENSION(:),   POINTER    :: ZFIELD => NULL()
01600 INTEGER                           :: JL         ! layer loop counter
01601 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01602 !--------------------------------------------------------------------------------
01603 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TG_HIRLAM',0,ZHOOK_HANDLE)
01604 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_TG_HIRLAM: | Reading soil temperature'
01605 !--------------------------------------------------------------------------------
01606 ! 1.  Search and read level 1 (and its depth)
01607 !     -----------------------
01608 ILEV1 = 904
01609 ILEV2 = -1
01610  CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,ZFIELD,KLEV1=ILEV1,KLEV2=ILEV2)
01611 IF (IRET /= 0 ) THEN
01612   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL TEMPERATURE LEVEL 1 MISSING (READ_GRIB_TG_HIRLAM)')
01613 END IF
01614 !
01615 ALLOCATE(PTG(SIZE(ZFIELD),3))
01616 ALLOCATE(PDT(SIZE(ZFIELD),3))
01617 PTG(:,1)= ZFIELD(:)
01618 PDT(:,1) = 0.
01619 !--------------------------------------------------------------------------------
01620 ! 2.  Deep soil temperature
01621 !     ---------------------
01622 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_TG_HIRLAM: | Reading deep soil temperature'
01623 !
01624 ILEV1 = 954
01625 ILEV2 = -1
01626  CALL READ_GRIB(HGRIB,KLUOUT,11,IRET,ZFIELD,KLEV1=ILEV1,KLEV2=ILEV2)
01627 IF (IRET /= 0) THEN
01628   CALL ABOR1_SFX('MODE_READ_GRIB: DEEP SOIL TEMPERATURE MISSING (READ_GRIB_TG_HIRLAM)')
01629 END IF
01630 !
01631 PTG(:,2)= ZFIELD(:)
01632 DEALLOCATE(ZFIELD)
01633 PDT(:,2) = 0.2         ! deep temperature depth assumed equal to 0.20m
01634 !--------------------------------------------------------------------------------
01635 ! 4.  Assumes uniform temperature profile below
01636 !     -----------------------------------------
01637 PTG(:,3) = PTG(:,2)
01638 PDT(:,3) = 3.          ! temperature profile down to 3m
01639 !--------------------------------------------------------------------------------
01640 ! 5.  Apply land mask
01641 !     ---------------
01642 IF (SIZE(PMASK)==SIZE(PTG,1)) THEN
01643   DO JL=1,SIZE(PTG,2)
01644     WHERE (PMASK(:)/=1.) PTG(:,JL) = XUNDEF
01645   END DO
01646 ENDIF
01647 !
01648 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TG_HIRLAM',1,ZHOOK_HANDLE)
01649 END SUBROUTINE READ_GRIB_TG_HIRLAM
01650 !-------------------------------------------------------------------
01651 !     #######################
01652       SUBROUTINE READ_GRIB_WG_HIRLAM(HGRIB,KLUOUT,HINMODEL,PMASK,PFIELD,PD)
01653 !     #######################
01654 !
01655 USE MODD_GRID_GRIB,  ONLY : NNI
01656 USE MODD_SURF_PAR,   ONLY : XUNDEF
01657 !
01658 IMPLICIT NONE
01659 !
01660 !* dummy arguments
01661 !  ---------------
01662  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01663 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01664  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01665 REAL, DIMENSION(:), INTENT(IN)      :: PMASK     ! grib land mask
01666 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
01667 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
01668 !
01669 !* local variables
01670 !  ---------------
01671 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01672 INTEGER                           :: ILTYPE    ! type of level (Grib code table 3)
01673 INTEGER                           :: ILEV1     ! level definition
01674 INTEGER                           :: ILEV2     ! level definition
01675 REAL, DIMENSION(:), POINTER       :: ZFIELD => NULL()
01676 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWG        ! first water reservoir
01677 REAL, DIMENSION(:), ALLOCATABLE   :: ZD         ! Height of each layer
01678 INTEGER                           :: INLAYERDEEP! number of deep moisture layers
01679 REAL                              :: ZWWILT     ! ECMWF wilting point
01680 REAL                              :: ZWFC       ! ECMWF field capacity
01681 REAL                              :: ZWSAT      ! ECMWF saturation
01682 INTEGER                           :: JL         ! loop counter on layers
01683 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01684 !--------------------------------------------------------------------------------
01685 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_HIRLAM',0,ZHOOK_HANDLE)
01686 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | Reading soil moisture'
01687 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | WARNING READING LOW VEGETATION TILE (NR 4) ONLY'
01688 !
01689 ALLOCATE(ZD(2))
01690 !
01691 ! 1.  Search and read level 1 (and its depth)
01692 !     -----------------------
01693 ILTYPE=105
01694 ILEV1=904
01695 ILEV2=-1
01696  CALL READ_GRIB(HGRIB,KLUOUT,86,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
01697 IF (IRET /= 0 ) THEN
01698   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 1 MISSING (READ_GRIB_WG_HIRLAM)')
01699 END IF
01700 !
01701 ALLOCATE(ZWG(SIZE(ZFIELD),2))
01702 ZWG(:,1)=ZFIELD
01703 !
01704 ZD(1) = 0.01
01705 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | Level 1 height set to 0.01 m '
01706 !
01707 ZWG(:,1) = ZWG(:,1) / ZD(1)      ! convert units to m3/m3  
01708 !--------------------------------------------------------------------------------
01709 ! 2.  Search and read level 2 (and its depth) This level is optionnal
01710 !     -----------------------
01711 ILTYPE=105
01712 ILEV1=954
01713 ILEV2=-1
01714  CALL READ_GRIB(HGRIB,KLUOUT,86,IRET,ZFIELD,KLTYPE=ILTYPE,KLEV1=ILEV1,KLEV2=ILEV2)
01715 IF (IRET /= 0 ) THEN
01716   CALL ABOR1_SFX('MODE_READ_GRIB: SOIL MOISTURE LEVEL 2 MISSING (READ_GRIB_WG_HIRLAM)')
01717 END IF
01718 !
01719 ZWG(:,2)=ZFIELD ! already units m3/m3 
01720 DEALLOCATE(ZFIELD)
01721 !
01722 INLAYERDEEP = 2
01723 ZD(2) = 0.42
01724 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_WG_HIRLAM: | Level 2 height set to 0.42 m '
01725 !
01726 WRITE  (KLUOUT,'(A)') 'WARNING MODE_READ_GRIB: ZWG3 AND ZWG4 SET TO 0. (READ_GRIB_WG_HIRLAM)'
01727 !--------------------------------------------------------------------------------
01728 ! 3.  Set water content profile and layer thicknesses
01729 !     -----------------------------------------------
01730  CALL FILL_PFIELD(KLUOUT,'READ_GRIB_WG_HIRLAM',INLAYERDEEP,ZD,ZWG,PMASK,PFIELD,PD)
01731 DEALLOCATE(ZD)
01732 DEALLOCATE(ZWG)
01733 !--------------------------------------------------------------------------------
01734 ! 4.  Convert from specific humidity to relative humidity
01735 !     ---------------------------------------------------
01736 ! Compute model's constants
01737 ZWFC   = 0.171
01738 ZWWILT = 0.086
01739 !
01740 ! Then perform conversion
01741 DO JL=1,INLAYERDEEP
01742   WHERE (PFIELD(:,JL).NE.XUNDEF) PFIELD(:,JL) = (PFIELD(:,JL) - ZWWILT) / (ZWFC - ZWWILT)
01743 ENDDO
01744 !
01745 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WG_HIRLAM',1,ZHOOK_HANDLE)
01746 END SUBROUTINE READ_GRIB_WG_HIRLAM
01747 !-------------------------------------------------------------------
01748 !     #######################
01749       SUBROUTINE READ_GRIB_WGI_HIRLAM(HGRIB,KLUOUT,PFIELD,PD)
01750 !     #######################
01751 !
01752 USE MODD_GRID_GRIB,  ONLY : NNI
01753 !
01754 IMPLICIT NONE
01755 !
01756 !* dummy arguments
01757 !  ---------------
01758  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01759 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01760 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
01761 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
01762 !
01763 !* local variables
01764 !  ---------------
01765 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01766 !--------------------------------------------------------------------------------
01767 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WGI_HIRLAM',0,ZHOOK_HANDLE)
01768 !
01769 ALLOCATE (PFIELD(NNI,2))
01770 ALLOCATE (PD    (NNI,2))
01771 PFIELD(:,:) = 0.
01772 !
01773 PD    (:,1) = 0.
01774 PD    (:,2) = 1.
01775 !
01776 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_WGI_HIRLAM',1,ZHOOK_HANDLE)
01777 END SUBROUTINE READ_GRIB_WGI_HIRLAM
01778 !-------------------------------------------------------------------
01779 !-------------------------------------------------------------------
01780 !     #######################
01781       SUBROUTINE READ_GRIB_SNOW_VEG_AND_DEPTH(HGRIB,KLUOUT,HINMODEL,PMASK,PSNV,PSNVD)
01782 !     #######################
01783 !
01784 USE MODD_GRID_GRIB,  ONLY : NNI
01785 USE MODD_SURF_PAR,   ONLY : XUNDEF
01786 USE MODD_SNOW_PAR,   ONLY : XRHOSMAX
01787 !
01788 IMPLICIT NONE
01789 !
01790 !* dummy arguments
01791 !  ---------------
01792  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01793 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01794  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01795 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01796 REAL, DIMENSION(:), OPTIONAL, POINTER :: PSNV    ! field to initialize
01797 REAL, DIMENSION(:), OPTIONAL, POINTER :: PSNVD   ! field to initialize
01798 !
01799 !* local variables
01800 !  ---------------
01801 INTEGER(KIND=kindOfInt)                           :: IRET      ! return code
01802 REAL, DIMENSION(:), POINTER       :: ZFIELD => NULL()    ! field to initialize
01803 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01804 !--------------------------------------------------------------------------------
01805 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH',0,ZHOOK_HANDLE)
01806 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH: | Reading snow depth'
01807 !
01808 SELECT CASE(HINMODEL)
01809   CASE('ECMWF ')
01810     CALL READ_GRIB(HGRIB,KLUOUT,141,IRET,ZFIELD)
01811   CASE('ARPEGE','ALADIN','MOCAGE','HIRLAM')
01812     CALL READ_GRIB(HGRIB,KLUOUT,66,IRET,ZFIELD)          
01813   CASE DEFAULT
01814     CALL ABOR1_SFX('MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH: OPTION NOT SUPPORTED '//HINMODEL)
01815 END SELECT
01816 !
01817 IF (IRET /= 0 ) THEN
01818   CALL ABOR1_SFX('MODE_READ_GRIB: SNOW AND VEG DEPTH MISSING (READ_GRIB_SNOW_VEG_AND_DEPTH)')
01819 END IF
01820 !
01821 IF (PRESENT(PSNV)) THEN
01822   ALLOCATE(PSNV(SIZE(ZFIELD)))
01823   PSNV(:)=ZFIELD(:)
01824   IF (HINMODEL=='ECMWF ') PSNV(:) = PSNV(:) * XRHOSMAX
01825   IF (SIZE(PMASK)==SIZE(PSNV)) &
01826     WHERE (PMASK(:)/=1.) PSNV(:) = XUNDEF
01827 ENDIF
01828 !
01829 IF (PRESENT(PSNVD)) THEN
01830   ALLOCATE(PSNVD(SIZE(ZFIELD)))
01831   PSNVD(:)=ZFIELD(:)
01832   IF (HINMODEL/='ECMWF ') PSNVD = PSNVD / XRHOSMAX
01833   IF (SIZE(PMASK)==SIZE(PSNVD)) &
01834     WHERE (PMASK(:)/=1.) PSNVD(:) = XUNDEF
01835 ENDIF
01836 !
01837 DEALLOCATE(ZFIELD)
01838 !
01839 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_SNOW_VEG_AND_DEPTH',1,ZHOOK_HANDLE)
01840 END SUBROUTINE READ_GRIB_SNOW_VEG_AND_DEPTH
01841 !-------------------------------------------------------------------
01842 !-------------------------------------------------------------------
01843 !     #######################
01844       SUBROUTINE READ_GRIB_T_TEB(HGRIB,KLUOUT,HINMODEL,PTI,PMASK,PT,PD)
01845 !     #######################
01846 !
01847 USE MODD_GRID_GRIB,  ONLY : NNI
01848 USE MODD_SURF_PAR,   ONLY : XUNDEF
01849 !
01850 IMPLICIT NONE
01851 !
01852 !* dummy arguments
01853 !  ---------------
01854  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01855 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01856  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01857 REAL,                 INTENT(IN)    :: PTI       ! internal temperature
01858 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01859 REAL, DIMENSION(:,:), POINTER       :: PT        ! field to initialize
01860 REAL, DIMENSION(:,:), POINTER       :: PD        ! normalized grid
01861 !
01862 !* local variables
01863 !  ---------------
01864 REAL, DIMENSION(:), POINTER       :: ZFIELD => NULL()    ! field to initialize
01865 INTEGER                           :: JL         ! layer loop counter
01866 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01867 !--------------------------------------------------------------------------------
01868 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_T_TEB',0,ZHOOK_HANDLE)
01869 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_T_TEB: | Reading temperature for buildings'
01870 !
01871  CALL READ_GRIB_TS(HGRIB,KLUOUT,HINMODEL,PMASK,ZFIELD)
01872 !
01873 ALLOCATE(PT(SIZE(ZFIELD),3))
01874 ALLOCATE(PD(SIZE(ZFIELD),3))
01875 !
01876 PT(:,1) = ZFIELD
01877 DEALLOCATE(ZFIELD)
01878 PD(:,1) = 0.
01879 !
01880 PT(:,2) = PTI
01881 PD(:,2) = 0.5         ! deep temperature depth assumed at half of wall or roof
01882 !
01883 PT(:,3) = PTI
01884 PD(:,3) = 1.          ! temperature at building interior
01885 !
01886 IF (SIZE(PMASK)==SIZE(PT,1)) THEN
01887   DO JL=1,SIZE(PT,2)
01888     WHERE (PMASK(:)/=1.) PT(:,JL) = XUNDEF
01889   END DO
01890 ENDIF
01891 !
01892 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_T_TEB',1,ZHOOK_HANDLE)
01893 END SUBROUTINE READ_GRIB_T_TEB
01894 !-------------------------------------------------------------------
01895 !     #######################
01896       SUBROUTINE READ_GRIB_TF_TEB(HGRIB,KLUOUT,HINMODEL,PTI,PMASK,PTF,PD)
01897 !     #######################
01898 !
01899 USE MODD_SURF_PAR,   ONLY : XUNDEF
01900 !
01901 IMPLICIT NONE
01902 !
01903 !* dummy arguments
01904 !  ---------------
01905  CHARACTER(LEN=*),     INTENT(IN)    :: HGRIB     ! Grib file name
01906 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
01907  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
01908 REAL,                 INTENT(IN)    :: PTI       ! internal temperature
01909 REAL, DIMENSION(:),   INTENT(IN)    :: PMASK     ! grib land mask
01910 REAL, DIMENSION(:,:), POINTER       :: PTF       ! field to initialize
01911 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
01912 !
01913 !* local variables
01914 !  ---------------
01915 INTEGER(KIND=kindOfInt)           :: IRET      ! return code
01916 REAL,    DIMENSION(:), POINTER    :: ZFIELD => NULL()    ! field to read
01917 INTEGER                           :: JL         ! layer loop counter
01918 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01919 !--------------------------------------------------------------------------------
01920 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TF_TEB',0,ZHOOK_HANDLE)
01921 WRITE  (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_TF_TEB: | Reading temperature for building floor'
01922 !
01923 ! 1.  Deep soil temperature
01924 !     ---------------------
01925 !
01926 WRITE (KLUOUT,'(A)') 'MODE_READ_GRIB:READ_GRIB_TF_TEB: | Reading deep soil temperature'
01927 !
01928  CALL READ_GRIB_T2(HGRIB,KLUOUT,HINMODEL,PMASK,ZFIELD)
01929 !
01930 ALLOCATE(PTF(SIZE(ZFIELD),3))
01931 ALLOCATE(PD (SIZE(ZFIELD),3))
01932 !
01933 PTF(:,2) = ZFIELD(:)
01934 PD (:,2) = 0.5           ! deep temperature depth assumed at half of the floor
01935 !
01936 DEALLOCATE(ZFIELD)
01937 !
01938 ! 2.  level 1 is the internal building temperature
01939 !     -----------------------
01940 !
01941 PTF(:,1) = PTI
01942 PD (:,1) = 0.
01943 !
01944 ! 3.  Assumes uniform temperature profile below
01945 !     -----------------------------------------
01946 !
01947 PTF(:,3) = PTF(:,2)
01948 PD (:,3) = 1.          ! deep temperature value
01949 !
01950 IF (LHOOK) CALL DR_HOOK('MODE_READ_GRIB:READ_GRIB_TF_TEB',1,ZHOOK_HANDLE)
01951 !------------------------------------------------------------------------------
01952 END SUBROUTINE READ_GRIB_TF_TEB
01953 !-------------------------------------------------------------------
01954 END MODULE MODE_READ_GRIB