SURFEX v7.3
General documentation of Surfex
|
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