SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_read_buffer.F90
Go to the documentation of this file.
00001 MODULE MODE_READ_BUFFER
00002 !     #####################
00003 !-------------------------------------------------------------------
00004 !
00005 USE MODI_ABOR1_SFX
00006 !
00007 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00008 USE PARKIND1  ,ONLY : JPRB
00009 !
00010 CONTAINS
00011 !-------------------------------------------------------------------
00012 !     ####################
00013       SUBROUTINE READ_BUFFER_LAND_MASK(KLUOUT,HINMODEL,PMASK)
00014 !     ####################
00015 !
00016 USE MODD_GRID_BUFFER, ONLY : NNI
00017 !
00018 USE MODI_READ_BUFFER
00019 !
00020 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00021  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! originating model
00022 REAL, DIMENSION(:), POINTER       :: PMASK     ! Land mask
00023 !
00024 INTEGER                           :: IRET      ! return code
00025 REAL, DIMENSION(:), POINTER       :: ZFIELD    ! field read
00026 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00027 !-------------------------------------------------------------------
00028 !
00029 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_LAND_MASK',0,ZHOOK_HANDLE)
00030 WRITE (KLUOUT,'(A)') ' | Reading land mask'
00031 SELECT CASE (HINMODEL)
00032 CASE ('ALADIN')
00033 ALLOCATE (ZFIELD(NNI))
00034     CALL READ_BUFFER('LSM   ',ZFIELD,IRET)
00035 END SELECT
00036 IF (IRET /= 0) THEN
00037   CALL ABOR1_SFX('MODE_READ_BUFFER: LAND SEA MASK MISSING')
00038 END IF
00039 !
00040 ALLOCATE (PMASK(NNI))
00041 WHERE (ZFIELD>0.5)
00042   PMASK = 1.
00043 ELSEWHERE
00044   PMASK = 0.
00045 END WHERE
00046 DEALLOCATE (ZFIELD)
00047 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_LAND_MASK',1,ZHOOK_HANDLE)
00048 !
00049 END SUBROUTINE READ_BUFFER_LAND_MASK
00050 !-------------------------------------------------------------------
00051 !     ############################
00052       SUBROUTINE READ_BUFFER_ZS_LAND(KLUOUT,HINMODEL,PFIELD)
00053 !     ############################
00054 !
00055 USE MODD_SURF_PAR,   ONLY : XUNDEF
00056 USE MODD_CSTS,       ONLY : XG
00057 USE MODD_GRID_BUFFER,  ONLY : NNI
00058 !
00059 USE MODI_READ_BUFFER
00060 !
00061 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00062  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00063 REAL, DIMENSION(:), POINTER       :: PFIELD    ! 
00064 !
00065 INTEGER                           :: IRET      ! return code
00066 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00067 !-------------------------------------------------------------------
00068 !
00069 !* Read orography
00070 !
00071 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_ZS_LAND',0,ZHOOK_HANDLE)
00072 WRITE (KLUOUT,'(A)') ' | Reading land orography'
00073 SELECT CASE (HINMODEL)
00074 CASE ('ALADIN')
00075    ALLOCATE (PFIELD(NNI))
00076    CALL READ_BUFFER('LPHIS ',PFIELD,IRET)
00077 END SELECT
00078 !
00079 IF (IRET /= 0) THEN
00080   CALL ABOR1_SFX('MODE_READ_BUFFER: LAND OROGRAPHY MISSING')
00081 END IF
00082 !
00083 ! Datas given in archives are multiplied by the gravity acceleration
00084 PFIELD = PFIELD / XG
00085 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_ZS_LAND',1,ZHOOK_HANDLE)
00086 !
00087 !
00088 END SUBROUTINE READ_BUFFER_ZS_LAND
00089 !-------------------------------------------------------------------
00090 !     ############################
00091       SUBROUTINE READ_BUFFER_ZS_SEA(KLUOUT,HINMODEL,PFIELD)
00092 !     ############################
00093 !
00094 USE MODD_SURF_PAR,   ONLY : XUNDEF
00095 USE MODD_CSTS,       ONLY : XG
00096 USE MODD_GRID_BUFFER,  ONLY : NNI
00097 !
00098 USE MODI_READ_BUFFER
00099 !
00100 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00101  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Buffer originating model
00102 REAL, DIMENSION(:), POINTER       :: PFIELD    ! 
00103 !
00104 INTEGER                           :: IRET      ! return code
00105 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00106 !-------------------------------------------------------------------
00107 !
00108 !* Read orography
00109 !
00110 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_ZS_SEA',0,ZHOOK_HANDLE)
00111 WRITE (KLUOUT,'(A)') ' | Reading sea orography in buffer'
00112 SELECT CASE (HINMODEL)
00113 CASE ('ALADIN')
00114    ALLOCATE (PFIELD(NNI))
00115    CALL READ_BUFFER('SPHIS ',PFIELD,IRET)
00116 END SELECT
00117 !
00118 IF (IRET /= 0) THEN
00119   CALL ABOR1_SFX('MODE_READ_BUFFER: SEA OROGRAPHY MISSING')
00120 END IF
00121 !
00122 ! Datas given in archives are multiplied by the gravity acceleration
00123 PFIELD = PFIELD / XG
00124 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_ZS_SEA',1,ZHOOK_HANDLE)
00125 !
00126 !
00127 END SUBROUTINE READ_BUFFER_ZS_SEA
00128 !
00129 !-------------------------------------------------------------------
00130 !     ############################
00131       SUBROUTINE READ_BUFFER_ZS(KLUOUT,HINMODEL,PFIELD)
00132 !     ############################
00133 !
00134 USE MODD_SURF_PAR,   ONLY : XUNDEF
00135 USE MODD_CSTS,       ONLY : XG
00136 USE MODD_GRID_BUFFER,  ONLY : NNI
00137 !
00138 USE MODI_READ_BUFFER
00139 !
00140 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00141  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00142 REAL, DIMENSION(:), POINTER       :: PFIELD    ! 
00143 !
00144 INTEGER                           :: IRET      ! return code
00145 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00146 !-------------------------------------------------------------------
00147 !
00148 !* Read orography
00149 !
00150 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_ZS',0,ZHOOK_HANDLE)
00151 WRITE (KLUOUT,'(A)') ' | Reading orography'
00152 SELECT CASE (HINMODEL)
00153 CASE ('ALADIN')
00154    ALLOCATE (PFIELD(NNI))
00155    CALL READ_BUFFER('PHIS  ',PFIELD,IRET)
00156 END SELECT
00157 !
00158 IF (IRET /= 0) THEN
00159   CALL ABOR1_SFX('MODE_READ_BUFFER: OROGRAPHY MISSING')
00160 END IF
00161 !
00162 ! Datas given in archives are multiplied by the gravity acceleration
00163 PFIELD = PFIELD / XG
00164 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_ZS',1,ZHOOK_HANDLE)
00165 !
00166 END SUBROUTINE READ_BUFFER_ZS
00167 !
00168 !     ###########################
00169       SUBROUTINE READ_BUFFER_TS(KLUOUT,HINMODEL,PFIELD)
00170 !     ###########################
00171 !
00172 USE MODD_SURF_PAR,   ONLY : XUNDEF
00173 USE MODD_GRID_BUFFER,  ONLY : NNI
00174 !
00175 USE MODI_READ_BUFFER
00176 !
00177 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00178  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00179 REAL, DIMENSION(:), POINTER       :: PFIELD    ! 
00180 !
00181 INTEGER                           :: IRET      ! return code
00182 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00183 !-------------------------------------------------------------------
00184 !
00185 !* Read surface temperature
00186 !
00187 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_TS',0,ZHOOK_HANDLE)
00188 WRITE (KLUOUT,'(A)') ' | Reading surface temperature'
00189 !
00190 SELECT CASE (HINMODEL)
00191 CASE ('ALADIN')
00192    ALLOCATE (PFIELD(NNI))
00193    CALL READ_BUFFER('TG1   ',PFIELD,IRET)
00194 END SELECT
00195 IF (IRET /= 0) THEN
00196   CALL ABOR1_SFX('MODE_READ_BUFFER: SURFACE TEMPERATURE MISSING')
00197 END IF
00198 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_TS',1,ZHOOK_HANDLE)
00199 !
00200 END SUBROUTINE READ_BUFFER_TS
00201 !
00202 !-------------------------------------------------------------------
00203 !     ###########################
00204       SUBROUTINE READ_BUFFER_SST(KLUOUT,HINMODEL,PFIELD)
00205 !     ###########################
00206 !
00207 USE MODD_SURF_PAR,   ONLY : XUNDEF
00208 USE MODD_GRID_BUFFER,  ONLY : NNI
00209 !
00210 USE MODI_READ_BUFFER
00211 !
00212 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00213  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00214 REAL, DIMENSION(:), POINTER       :: PFIELD    ! 
00215 !
00216 INTEGER                           :: IRET      ! return code
00217 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00218 !-------------------------------------------------------------------
00219 !
00220 !* Read surface temperature
00221 !
00222 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_SST',0,ZHOOK_HANDLE)
00223 WRITE (KLUOUT,'(A)') ' | Reading sea surface temperature'
00224 !
00225 SELECT CASE (HINMODEL)
00226 CASE ('ALADIN')
00227    ALLOCATE (PFIELD(NNI))
00228    CALL READ_BUFFER('SST   ',PFIELD,IRET)
00229 !
00230 END SELECT
00231 !
00232 IF (IRET /= 0) THEN
00233   CALL ABOR1_SFX('MODE_READ_BUFFER: SEA SURFACE TEMPERATURE MISSING')
00234 END IF
00235 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_SST',1,ZHOOK_HANDLE)
00236 !
00237 END SUBROUTINE READ_BUFFER_SST
00238 !
00239 !-------------------------------------------------------------------
00240 !     ###########################
00241       SUBROUTINE READ_BUFFER_T2(KLUOUT,HINMODEL,PFIELD)
00242 !     ###########################
00243 !
00244 USE MODD_SURF_PAR,   ONLY : XUNDEF
00245 USE MODD_GRID_BUFFER,  ONLY : NNI
00246 !
00247 USE MODI_READ_BUFFER
00248 !
00249 INTEGER,            INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00250  CHARACTER(LEN=6),   INTENT(IN)    :: HINMODEL  ! Grib originating model
00251 REAL, DIMENSION(:), POINTER       :: PFIELD    ! 
00252 !
00253 INTEGER                           :: IRET      ! return code
00254 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00255 !-------------------------------------------------------------------
00256 !
00257 !* Read surface temperature
00258 !
00259 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_T2',0,ZHOOK_HANDLE)
00260 WRITE (KLUOUT,'(A)') ' | Reading deep soil temperature'
00261 !
00262 SELECT CASE (HINMODEL)
00263 
00264 CASE ('ALADIN')
00265    ALLOCATE (PFIELD(NNI))
00266    CALL READ_BUFFER('TG2   ',PFIELD,IRET)
00267 END SELECT
00268 !
00269 IF (IRET /= 0) THEN
00270   CALL ABOR1_SFX('MODE_READ_BUFFER: DEEP SOIL TEMPERATURE MISSING')
00271 END IF
00272 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_T2',1,ZHOOK_HANDLE)
00273 !
00274 !
00275 END SUBROUTINE READ_BUFFER_T2
00276 !
00277 !     #######################
00278       SUBROUTINE READ_BUFFER_WG(KLUOUT,HINMODEL,PFIELD,PD)
00279 !     #######################
00280 !
00281 ! This tasks is divided in the following steps :
00282 !  - computing the MesoNH constants
00283 !  - reading the grib datas according to the type of file (ECMWF/Arpege/Aladin)
00284 !  - converting from specific humidity to relative humidity
00285 !  - interpolation with land mask
00286 !  - converting back from relative humidity to specific humidity with MesoNH constants
00287 ! Five different models are supported :
00288 !  - ECMWF with 2 layers (untested)
00289 !  - ECMWF with 3 layers (archive before 1991 - Blondin model)
00290 !  - ECMWF with 4 layers (archive after 1991 - Viterbo model)
00291 !  - Arpege/Aladin before ISBA (I don't know the name of this model)
00292 !  - Arpege/Aladin with ISBA model
00293 ! The available model is detect according to the fields which are presents :
00294 !  - ECMWF archive : loads as many layers as possible
00295 !  - Arpege/Aladin archive : ISBA model needs Clay and Sans fraction fields, if they
00296 !    are present, they are used and the model is declared to be ISBA.
00297 ! To detect the height of the layers, two methods are used :
00298 !  - if level type is not 112, a default value is assumed and a warning message is
00299 !    displayed
00300 !  - if level type is ID 112, then the position of the top and bottom surface may be
00301 !    given. If they are present, they are used, if not the default value is taken and
00302 !    a warning message is issued.
00303 !
00304 USE MODD_GRID_BUFFER,  ONLY : NNI
00305 USE MODD_SURF_PAR,   ONLY : XUNDEF
00306 !
00307 USE MODI_READ_BUFFER
00308 !
00309 IMPLICIT NONE
00310 !
00311 !* dummy arguments
00312 !  ---------------
00313 !
00314 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00315  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00316 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
00317 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
00318 !
00319 !
00320 !* local variables
00321 !  ---------------
00322 !
00323 LOGICAL                           :: GISBA     ! T: surface scheme in file is ISBA
00324 INTEGER                           :: IRET      ! return code
00325 REAL,    DIMENSION(:), POINTER    :: ZFIELD    ! field to read
00326 REAL,  DIMENSION(:,:), ALLOCATABLE:: ZWG       ! profile of soil water contents
00327 REAL,  DIMENSION(:),   ALLOCATABLE:: ZCLAY     ! clay fraction
00328 REAL,  DIMENSION(:),   ALLOCATABLE:: ZSAND     ! sand fraction
00329 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWWILT     ! wilting point
00330 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWFC       ! field capacity
00331 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWSAT      ! saturation
00332 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00333 !
00334 !-------------------------------------------------------------------------------
00335 !
00336 ! 1.  Search and read clay fraction if available
00337 !     ------------------------------------------
00338 !
00339 !
00340 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_WG',0,ZHOOK_HANDLE)
00341 ALLOCATE (ZFIELD(NNI))
00342  CALL READ_BUFFER('CLAY  ',ZFIELD,IRET)
00343 !
00344 ! if not available, the model is not ISBA
00345 IF (IRET /= 0) THEN
00346   GISBA = .FALSE.
00347 ELSE
00348   GISBA = .TRUE.
00349   WRITE (KLUOUT,'(A)') ' | The soil model is ISBA'
00350   ALLOCATE (ZCLAY(NNI))
00351   ZCLAY(:) = ZFIELD(:) / 100. ! this field is given in percent
00352   DEALLOCATE (ZFIELD)
00353 END IF
00354 !
00355 !-------------------------------------------------------------------------------
00356 !
00357 ! 2.  Search and read sand fraction if available
00358 !     ------------------------------------------
00359 !
00360 ALLOCATE (ZFIELD(NNI))
00361  CALL READ_BUFFER('SAND  ',ZFIELD,IRET)
00362 !
00363 ! if not available, the model is not ISBA (IWMODE=1)
00364 IF (GISBA) THEN
00365   IF (IRET /= 0) THEN
00366     CALL ABOR1_SFX('MODE_READ_BUFFER: (WG) SAND FRACTION MISSING')
00367   ELSE
00368     ALLOCATE (ZSAND(NNI))
00369     ZSAND(:) = ZFIELD(:) / 100. ! this field is given in percent
00370     DEALLOCATE (ZFIELD)
00371   END IF
00372 END IF
00373 !
00374 !-------------------------------------------------------------------------------
00375 !
00376 ! 3.  Read layer 1 moisture
00377 !     ---------------------
00378 !
00379 ALLOCATE (ZFIELD(NNI))
00380  CALL READ_BUFFER('WG1   ',ZFIELD,IRET)
00381 IF (IRET /= 0) THEN
00382   CALL ABOR1_SFX('MODE_READ_BUFFER: SOIL MOISTURE LEVEL 1 MISSING')
00383 END IF
00384 !
00385 ALLOCATE(ZWG(NNI,2))
00386 ZWG(:,1) = ZFIELD(:)
00387 DEALLOCATE(ZFIELD)
00388 !
00389 !-------------------------------------------------------------------------------
00390 !
00391 ! 4.  Read layer 2 moisture
00392 !     ---------------------
00393 !
00394 ALLOCATE (ZFIELD(NNI))
00395  CALL READ_BUFFER('WG2   ',ZFIELD,IRET)
00396 IF (IRET /= 0) THEN
00397   CALL ABOR1_SFX('MODE_READ_BUFFER: SOIL MOISTURE LEVEL 2 MISSING')
00398 END IF
00399 !
00400 ZWG(:,2) = ZFIELD(:)
00401 DEALLOCATE(ZFIELD)
00402 !
00403 !-------------------------------------------------------------------------------
00404 !
00405 ! 5.  Read layer 2 depth (ISBA only)
00406 !     ------------------
00407 !
00408 ALLOCATE(PD(NNI,3))
00409 !
00410 !* note that soil water reservoir is considered uniform between 0.2m and BUFFER soil depth
00411 IF (GISBA) THEN
00412   ALLOCATE (ZFIELD(NNI))
00413   CALL READ_BUFFER('D2    ',ZFIELD,IRET)
00414   IF (IRET /= 0) THEN
00415     CALL ABOR1_SFX('MODE_READ_BUFFER: LEVEL 2 DEPTH MISSING')
00416   END IF
00417   PD(:,1) = 0.
00418   PD(:,2) = 0.20
00419   PD(:,3) = ZFIELD(:)
00420   !
00421   !* updates Wg in m3/m3
00422   !
00423   ZWG(:,1) = ZWG(:,1) / 10.
00424   ZWG(:,2) = ZWG(:,2) /(1000. * ZFIELD(:))
00425   DEALLOCATE(ZFIELD)
00426 ELSE
00427   PD(:,1) = 0.
00428   PD(:,2) = 0.2
00429   PD(:,3) = 2.
00430 END IF
00431 !
00432 !
00433 !-------------------------------------------------------------------------------
00434 !
00435 ! 6.  Compute relative humidity from units kg/m^2
00436 !     -------------------------------------------
00437 !
00438 ALLOCATE(PFIELD(NNI,3))
00439 !
00440 ! Compute ISBA model constants (if needed)
00441 !
00442 IF (GISBA) THEN
00443   ALLOCATE (ZWFC  (NNI))
00444   ALLOCATE (ZWWILT(NNI))
00445   ALLOCATE (ZWSAT (NNI))
00446   !
00447   ZWSAT (:) = (-1.08*100. * ZSAND(:) + 494.305) * 0.001
00448   ZWWILT(:) = 37.1342E-3 * SQRT( 100. * ZCLAY(:) )
00449   ZWFC  (:) = 89.0467E-3 * (100. * ZCLAY(:) )**0.3496
00450   !
00451   DEALLOCATE (ZSAND)
00452   DEALLOCATE (ZCLAY)
00453 
00454   ZWG(:,1) = MAX(MIN(ZWG(:,1),ZWSAT),0.)
00455   ZWG(:,2) = MAX(MIN(ZWG(:,2),ZWSAT),0.)
00456   !
00457   PFIELD(:,1) = (ZWG(:,1) - ZWWILT) / (ZWFC - ZWWILT)
00458   PFIELD(:,2) = (ZWG(:,2) - ZWWILT) / (ZWFC - ZWWILT)
00459   PFIELD(:,3) = PFIELD(:,2)
00460   DEALLOCATE (ZWSAT)
00461   DEALLOCATE (ZWWILT)
00462   DEALLOCATE (ZWFC)
00463   !
00464 ELSE ! Non ISBA
00465   PFIELD(:,1) =  ZWG(:,1)           /  20.
00466   PFIELD(:,2) = (ZWG(:,1)+ZWG(:,2)) / (20. + 100.)
00467   PFIELD(:,3) = PFIELD(:,2)
00468 END IF
00469 !
00470 DEALLOCATE(ZWG)
00471 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_WG',1,ZHOOK_HANDLE)
00472 !
00473 !-------------------------------------------------------------------------------
00474 !
00475 END SUBROUTINE READ_BUFFER_WG
00476 !
00477 !-------------------------------------------------------------------
00478 !
00479 !     #######################
00480       SUBROUTINE READ_BUFFER_WGI(KLUOUT,HINMODEL,PFIELD,PD)
00481 !     #######################
00482 !
00483 ! This tasks is divided in the following steps :
00484 !  - computing the MesoNH constants
00485 !  - reading the grib datas according to the type of file (ECMWF/Arpege/Aladin)
00486 !  - converting from specific humidity to relative humidity
00487 !  - interpolation with land mask
00488 !  - converting back from relative humidity to specific humidity with MesoNH constants
00489 ! Five different models are supported :
00490 !  - ECMWF with 2 layers (untested)
00491 !  - ECMWF with 3 layers (archive before 1991 - Blondin model)
00492 !  - ECMWF with 4 layers (archive after 1991 - Viterbo model)
00493 !  - Arpege/Aladin before ISBA (I don't know the name of this model)
00494 !  - Arpege/Aladin with ISBA model
00495 ! The available model is detect according to the fields which are presents :
00496 !  - ECMWF archive : loads as many layers as possible
00497 !  - Arpege/Aladin archive : ISBA model needs Clay and Sans fraction fields, if they
00498 !    are present, they are used and the model is declared to be ISBA.
00499 ! To detect the height of the layers, two methods are used :
00500 !  - if level type is not 112, a default value is assumed and a warning message is
00501 !    displayed
00502 !  - if level type is ID 112, then the position of the top and bottom surface may be
00503 !    given. If they are present, they are used, if not the default value is taken and
00504 !    a warning message is issued.
00505 !
00506 USE MODD_GRID_BUFFER,  ONLY : NNI
00507 USE MODD_SURF_PAR,   ONLY : XUNDEF
00508 !
00509 USE MODI_READ_BUFFER
00510 !
00511 IMPLICIT NONE
00512 !
00513 !* dummy arguments
00514 !  ---------------
00515 !
00516 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00517  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00518 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
00519 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
00520 !
00521 !
00522 !* local variables
00523 !  ---------------
00524 !
00525 LOGICAL                           :: GISBA     ! T: surface scheme in file is ISBA
00526 INTEGER                           :: IRET      ! return code
00527 REAL,    DIMENSION(:), POINTER    :: ZFIELD    ! field to read
00528 REAL,  DIMENSION(:,:), ALLOCATABLE:: ZWGI      ! profile of soil ice contents
00529 REAL,  DIMENSION(:),   ALLOCATABLE:: ZCLAY     ! clay fraction
00530 REAL,  DIMENSION(:),   ALLOCATABLE:: ZSAND     ! sand fraction
00531 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWWILT     ! wilting point
00532 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWFC       ! field capacity
00533 REAL,  DIMENSION(:),   ALLOCATABLE:: ZWSAT      ! saturation
00534 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00535 !
00536 !-------------------------------------------------------------------------------
00537 !
00538 ! 1.  Search and read clay fraction if available
00539 !     ------------------------------------------
00540 !
00541 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_WGI',0,ZHOOK_HANDLE)
00542 ALLOCATE (ZFIELD(NNI))
00543  CALL READ_BUFFER('CLAY  ',ZFIELD,IRET)
00544 !
00545 ! if not available, the model is not ISBA (IWMODE=1)
00546 IF (IRET /= 0) THEN
00547   GISBA = .FALSE.
00548 ELSE
00549   GISBA = .TRUE.
00550   WRITE (KLUOUT,'(A)') ' | The soil model is ISBA'
00551   ALLOCATE (ZCLAY(NNI))
00552   ZCLAY(:) = ZFIELD(:) / 100. ! this field is given in percent
00553   DEALLOCATE (ZFIELD)
00554 END IF
00555 !
00556 !-------------------------------------------------------------------------------
00557 !
00558 ! 2.  Search and read sand fraction if available
00559 !     ------------------------------------------
00560 !
00561 ALLOCATE (ZFIELD(NNI))
00562  CALL READ_BUFFER('SAND  ',ZFIELD,IRET)
00563 !
00564 ! if not available, the model is not ISBA (IWMODE=1)
00565 IF (GISBA) THEN
00566   IF (IRET /= 0) THEN
00567     CALL ABOR1_SFX('MODE_READ_BUFFER: (WGI) SAND FRACTION MISSING')
00568   ELSE
00569     ALLOCATE (ZSAND(NNI))
00570     ZSAND(:) = ZFIELD(:) / 100. ! this field is given in percent
00571     DEALLOCATE (ZFIELD)
00572   END IF
00573 END IF
00574 !
00575 !-------------------------------------------------------------------------------
00576 !
00577 ! 3.  Allocate soil ice reservoir
00578 !     ---------------------------
00579 !
00580 ALLOCATE(ZWGI(NNI,2))
00581 !
00582 !-------------------------------------------------------------------------------
00583 !
00584 ! 4.  Read layer 1 soil ice
00585 !     ---------------------
00586 !
00587 ALLOCATE (ZFIELD(NNI))
00588  CALL READ_BUFFER('WGI1  ',ZFIELD,IRET)
00589 IF (IRET == 0) THEN
00590   WRITE (KLUOUT,'(A)') ' -> Soil ice level 1 is present'
00591   ZWGI(:,1) = ZFIELD(:)
00592   DEALLOCATE(ZFIELD)
00593 ELSE
00594   ZWGI(:,1) = 0.
00595 END IF
00596 !
00597 !
00598 !-------------------------------------------------------------------------------
00599 !
00600 ! 5.  Read layer 2 soil ice
00601 !     ---------------------
00602 !
00603 ALLOCATE (ZFIELD(NNI))
00604  CALL READ_BUFFER('WGI2  ',ZFIELD,IRET)
00605 IF (IRET == 0) THEN
00606   WRITE (KLUOUT,'(A)') ' -> Soil ice level 2 is present'
00607   ZWGI(:,2) = ZFIELD(:)
00608   DEALLOCATE(ZFIELD)
00609 ELSE
00610   ZWGI(:,2) = 0.
00611 END IF
00612 !
00613 !
00614 !-------------------------------------------------------------------------------
00615 !
00616 ! 5.  Read layer 2 depth (ISBA only)
00617 !     ------------------
00618 !
00619 ALLOCATE(PD(NNI,3))
00620 !
00621 IF (GISBA) THEN
00622   ALLOCATE (ZFIELD(NNI))
00623   CALL READ_BUFFER('D2    ',ZFIELD,IRET)
00624   IF (IRET /= 0) THEN
00625     CALL ABOR1_SFX('MODE_READ_BUFFER: LEVEL 2 DEPTH FOR ICE MISSING')
00626   END IF
00627   PD(:,1) = 0.
00628   PD(:,2) = 0.20
00629   PD(:,3) = ZFIELD(:)
00630   !
00631   !* updates Wgi in m3/m3
00632   !
00633   ZWGI(:,1) = ZWGI(:,1) / 10.
00634   ZWGI(:,2) = ZWGI(:,2) /(1000. * ZFIELD(:))
00635   DEALLOCATE(ZFIELD)
00636 ELSE
00637   PD(:,1) = 0.
00638   PD(:,2) = 0.20
00639   PD(:,3) = 2.
00640 END IF
00641 !
00642 !
00643 !-------------------------------------------------------------------------------
00644 !
00645 ! 6.  Compute relative humidity from units kg/m^2
00646 !     -------------------------------------------
00647 !
00648 ALLOCATE(PFIELD(NNI,3))
00649 !
00650 ! Compute ISBA model constants (if needed)
00651 !
00652 IF (GISBA) THEN
00653   ALLOCATE (ZWFC  (NNI))
00654   ALLOCATE (ZWWILT(NNI))
00655   ALLOCATE (ZWSAT (NNI))
00656   !
00657   ZWSAT (:) = (-1.08*100. * ZSAND(:) + 494.305) * 0.001
00658   ZWWILT(:) = 37.1342E-3 * SQRT( 100. * ZCLAY(:) )
00659   ZWFC  (:) = 89.0467E-3 * (100. * ZCLAY(:) )**0.3496
00660   !
00661   DEALLOCATE (ZSAND)
00662   DEALLOCATE (ZCLAY)
00663 
00664   ZWGI(:,1) = MAX(MIN(ZWGI(:,1),ZWSAT),0.)
00665   ZWGI(:,2) = MAX(MIN(ZWGI(:,2),ZWSAT),0.)
00666   !
00667   PFIELD(:,1) = ZWGI(:,1) / ZWSAT
00668   PFIELD(:,2) = ZWGI(:,2) / ZWSAT
00669   PFIELD(:,3) = PFIELD(:,2)
00670   DEALLOCATE (ZWSAT)
00671   DEALLOCATE (ZWWILT)
00672   DEALLOCATE (ZWFC)
00673   !
00674 ELSE ! Non ISBA
00675   PFIELD(:,1) = 0.
00676   PFIELD(:,2) = 0.
00677   PFIELD(:,3) = 0.
00678 END IF
00679 !
00680 DEALLOCATE(ZWGI)
00681 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_WGI',1,ZHOOK_HANDLE)
00682 !
00683 !-------------------------------------------------------------------------------
00684 !
00685 END SUBROUTINE READ_BUFFER_WGI
00686 !
00687 !-------------------------------------------------------------------
00688 !
00689 !     #######################
00690       SUBROUTINE READ_BUFFER_TG(KLUOUT,HINMODEL,PFIELD,PD)
00691 !     #######################
00692 !
00693 !
00694 USE MODD_GRID_BUFFER,  ONLY : NNI
00695 USE MODD_SURF_PAR,   ONLY : XUNDEF
00696 !
00697 USE MODI_READ_BUFFER
00698 !
00699 IMPLICIT NONE
00700 !
00701 !* dummy arguments
00702 !  ---------------
00703 !
00704 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00705  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00706 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
00707 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
00708 !
00709 !
00710 !* local variables
00711 !  ---------------
00712 !
00713 REAL,    DIMENSION(:), POINTER    :: ZFIELD    ! field to read
00714 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00715 !
00716 !--------------------------------------------------------------------------------
00717 !
00718 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_TG',0,ZHOOK_HANDLE)
00719 WRITE  (KLUOUT,'(A)') ' | Reading soil temperature'
00720 !
00721 !--------------------------------------------------------------------------------
00722 !
00723 ! 1.  Allocate soil temperature profile
00724 !     ---------------------------------
00725 !
00726 ALLOCATE(PFIELD(NNI,3))
00727 ALLOCATE(PD    (NNI,3))
00728 !
00729 !--------------------------------------------------------------------------------
00730 !
00731 ! 2.  Search and read level 1 (and its depth)
00732 !     -----------------------
00733 !
00734 ALLOCATE (ZFIELD(NNI))
00735  CALL READ_BUFFER_TS(KLUOUT,HINMODEL,ZFIELD)
00736 !
00737 PFIELD(:,1) = ZFIELD(:)
00738 PD    (:,1) = 0.
00739 DEALLOCATE(ZFIELD)
00740 !
00741 !--------------------------------------------------------------------------------
00742 !
00743 ! 3.  Deep soil temperature
00744 !     ---------------------
00745 !
00746 ALLOCATE (ZFIELD(NNI))
00747  CALL READ_BUFFER_T2(KLUOUT,HINMODEL,ZFIELD)
00748 !
00749 PFIELD(:,2) = ZFIELD(:)
00750 PD    (:,2) = 0.2         ! deep temperature depth assumed equal to 0.2m
00751 DEALLOCATE(ZFIELD)
00752 !
00753 !--------------------------------------------------------------------------------
00754 !
00755 ! 4.  Assumes uniform temperature profile below
00756 !     -----------------------------------------
00757 !
00758 PFIELD(:,3) = PFIELD(:,2)
00759 PD    (:,3) = 3.          ! temperature profile down to 3m
00760 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_TG',1,ZHOOK_HANDLE)
00761 !
00762 !
00763 !--------------------------------------------------------------------------------
00764 !
00765 END SUBROUTINE READ_BUFFER_TG
00766 !-------------------------------------------------------------------
00767 !---------------------------------------------------------------------------------------
00768 !
00769 !     #######################
00770       SUBROUTINE READ_BUFFER_SNOW_VEG_DEPTH(KLUOUT,HINMODEL,PFIELD)
00771 !     #######################
00772 !
00773 !
00774 USE MODD_GRID_BUFFER,  ONLY : NNI
00775 USE MODD_SURF_PAR,   ONLY : XUNDEF
00776 USE MODD_SNOW_PAR,   ONLY : XRHOSMAX
00777 !
00778 USE MODI_READ_BUFFER
00779 !
00780 IMPLICIT NONE
00781 !
00782 !* dummy arguments
00783 !  ---------------
00784 !
00785 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00786  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00787 REAL, DIMENSION(:),   POINTER       :: PFIELD    ! field to initialize
00788 !
00789 !
00790 !* local variables
00791 !  ---------------
00792 !
00793 INTEGER                           :: IRET      ! return code
00794 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00795 
00796 !
00797 !--------------------------------------------------------------------------------
00798 !
00799 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_SNOW_VEG_DEPTH',0,ZHOOK_HANDLE)
00800 WRITE  (KLUOUT,'(A)') ' | Reading snow depth'
00801 !
00802 !--------------------------------------------------------------------------------
00803 !
00804 ! 1.  Allocate soil temperature profile
00805 !     ---------------------------------
00806 !
00807 ALLOCATE(PFIELD(NNI))
00808 !
00809 !--------------------------------------------------------------------------------
00810 !
00811 ! 2.  Search and read level 1 (kg/m2)
00812 !     -----------------------
00813 !
00814  CALL READ_BUFFER('SNOW  ',PFIELD,IRET)
00815 !
00816 ! conversion to snow depth (meters)
00817 !
00818   PFIELD = PFIELD / XRHOSMAX
00819 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_SNOW_VEG_DEPTH',1,ZHOOK_HANDLE)
00820 !
00821 !--------------------------------------------------------------------------------
00822 !
00823 END SUBROUTINE READ_BUFFER_SNOW_VEG_DEPTH
00824 !-------------------------------------------------------------------
00825 !-------------------------------------------------------------------
00826 !---------------------------------------------------------------------------------------
00827 !
00828 !     #######################
00829       SUBROUTINE READ_BUFFER_SNOW_VEG(KLUOUT,HINMODEL,PFIELD)
00830 !     #######################
00831 !
00832 !
00833 USE MODD_GRID_BUFFER,  ONLY : NNI
00834 USE MODD_SURF_PAR,   ONLY : XUNDEF
00835 USE MODD_SNOW_PAR,   ONLY : XRHOSMAX
00836 !
00837 USE MODI_READ_BUFFER
00838 !
00839 IMPLICIT NONE
00840 !
00841 !* dummy arguments
00842 !  ---------------
00843 !
00844 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00845  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00846 REAL, DIMENSION(:),   POINTER       :: PFIELD    ! field to initialize
00847 !
00848 !
00849 !* local variables
00850 !  ---------------
00851 !
00852 INTEGER                           :: IRET      ! return code
00853 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00854 
00855 !
00856 !--------------------------------------------------------------------------------
00857 !
00858 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_SNOW_VEG',0,ZHOOK_HANDLE)
00859 WRITE  (KLUOUT,'(A)') ' | Reading snow content (kg/m2)'
00860 !
00861 !--------------------------------------------------------------------------------
00862 !
00863 ! 1.  Allocate soil temperature profile
00864 !     ---------------------------------
00865 !
00866 ALLOCATE(PFIELD(NNI))
00867 !
00868 !--------------------------------------------------------------------------------
00869 !
00870 ! 2.  Search and read level 1 (and its depth)
00871 !     -----------------------
00872 !
00873  CALL READ_BUFFER('SNOW  ',PFIELD,IRET)
00874 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_SNOW_VEG',1,ZHOOK_HANDLE)
00875 !
00876 !
00877 !--------------------------------------------------------------------------------
00878 !
00879 END SUBROUTINE READ_BUFFER_SNOW_VEG
00880 !-------------------------------------------------------------------
00881 !-------------------------------------------------------------------
00882 !---------------------------------------------------------------------------------------
00883 !
00884 !     #######################
00885       SUBROUTINE READ_BUFFER_T_TEB(KLUOUT,HINMODEL,PTI,PFIELD,PD)
00886 !     #######################
00887 !
00888 !
00889 USE MODD_GRID_BUFFER,  ONLY : NNI
00890 USE MODD_SURF_PAR,   ONLY : XUNDEF
00891 !
00892 IMPLICIT NONE
00893 !
00894 !* dummy arguments
00895 !  ---------------
00896 !
00897 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00898  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00899 REAL,                 INTENT(IN)    :: PTI       ! internal temperature
00900 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
00901 REAL, DIMENSION(:,:), POINTER       :: PD        ! normalized grid
00902 !
00903 !
00904 !* local variables
00905 !  ---------------
00906 !
00907 REAL,    DIMENSION(:), POINTER    :: ZFIELD    ! field to read
00908 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00909 !
00910 !--------------------------------------------------------------------------------
00911 !
00912 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_T_TEB',0,ZHOOK_HANDLE)
00913 WRITE  (KLUOUT,'(A)') ' | Reading temperature for buildings'
00914 !
00915 !--------------------------------------------------------------------------------
00916 !
00917 ! 1.  Allocate soil temperature profile
00918 !     ---------------------------------
00919 !
00920 ALLOCATE(PFIELD(NNI,3))
00921 ALLOCATE(PD    (NNI,3))
00922 !
00923 !--------------------------------------------------------------------------------
00924 !
00925 ! 2.  Search and read level 1
00926 !     -----------------------
00927 !
00928 ALLOCATE (ZFIELD(NNI))
00929  CALL READ_BUFFER_TS(KLUOUT,HINMODEL,ZFIELD)
00930 !
00931 PFIELD(:,1) = ZFIELD(:)
00932 PD    (:,1) = 0.
00933 DEALLOCATE(ZFIELD)
00934 !
00935 !--------------------------------------------------------------------------------
00936 !
00937 ! 3.  Deep temperature
00938 !     ----------------
00939 !
00940 PFIELD(:,2) = PTI
00941 PD    (:,2) = 0.5         ! deep temperature depth assumed at half of wall or roof
00942 !
00943 !--------------------------------------------------------------------------------
00944 !
00945 ! 4.  Assumes uniform temperature profile below
00946 !     -----------------------------------------
00947 !
00948 PFIELD(:,3) = PTI
00949 PD    (:,3) = 1.          ! temperature at building interior
00950 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_T_TEB',1,ZHOOK_HANDLE)
00951 !
00952 !
00953 !--------------------------------------------------------------------------------
00954 !
00955 END SUBROUTINE READ_BUFFER_T_TEB
00956 !-------------------------------------------------------------------
00957 !
00958 !     #######################
00959       SUBROUTINE READ_BUFFER_TF_TEB(KLUOUT,HINMODEL,PTI,PFIELD,PD)
00960 !     #######################
00961 !
00962 !
00963 USE MODD_GRID_BUFFER,  ONLY : NNI
00964 USE MODD_SURF_PAR,   ONLY : XUNDEF
00965 !
00966 USE MODI_READ_BUFFER
00967 !
00968 IMPLICIT NONE
00969 !
00970 !* dummy arguments
00971 !  ---------------
00972 !
00973 INTEGER,              INTENT(IN)    :: KLUOUT    ! logical unit of output listing
00974  CHARACTER(LEN=6),     INTENT(IN)    :: HINMODEL  ! Grib originating model
00975 REAL,                 INTENT(IN)    :: PTI       ! internal temperature
00976 REAL, DIMENSION(:,:), POINTER       :: PFIELD    ! field to initialize
00977 REAL, DIMENSION(:,:), POINTER       :: PD        ! thickness of each layer
00978 !
00979 !
00980 !* local variables
00981 !  ---------------
00982 !
00983 REAL,    DIMENSION(:), POINTER    :: ZFIELD    ! field to read
00984 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00985 !
00986 !--------------------------------------------------------------------------------
00987 !
00988 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_TF_TEB',0,ZHOOK_HANDLE)
00989 WRITE  (KLUOUT,'(A)') ' | Reading soil temperature'
00990 !
00991 !--------------------------------------------------------------------------------
00992 !
00993 ! 1.  Allocate soil temperature profile
00994 !     ---------------------------------
00995 !
00996 ALLOCATE(PFIELD(NNI,3))
00997 ALLOCATE(PD    (NNI,3))
00998 !
00999 !--------------------------------------------------------------------------------
01000 !
01001 ! 2.  use building internal temperature as first level
01002 !     -----------------------
01003 !
01004 ALLOCATE (ZFIELD(NNI))
01005 !
01006 PFIELD(:,1) = PTI
01007 PD    (:,1) = 0.
01008 DEALLOCATE(ZFIELD)
01009 !
01010 !--------------------------------------------------------------------------------
01011 !
01012 ! 3.  Deep soil temperature
01013 !     ---------------------
01014 !
01015 ALLOCATE (ZFIELD(NNI))
01016  CALL READ_BUFFER_T2(KLUOUT,HINMODEL,ZFIELD)
01017 !
01018 PFIELD(:,2) = ZFIELD(:)
01019 PD    (:,2) = 0.5         ! deep temperature depth assumed at half of the floor
01020 DEALLOCATE(ZFIELD)
01021 !
01022 !--------------------------------------------------------------------------------
01023 !
01024 ! 4.  Assumes uniform temperature profile below
01025 !     -----------------------------------------
01026 !
01027 PFIELD(:,3) = PFIELD(:,2)
01028 PD    (:,3) = 1.          ! temperature profile down to depth of the floor
01029 !
01030 !
01031 IF (LHOOK) CALL DR_HOOK('MODE_READ_BUFFER:READ_BUFFER_TF_TEB',1,ZHOOK_HANDLE)
01032 !
01033 !--------------------------------------------------------------------------------
01034 !
01035 END SUBROUTINE READ_BUFFER_TF_TEB
01036 !-------------------------------------------------------------------
01037 END MODULE MODE_READ_BUFFER