SURFEX v7.3
General documentation of Surfex
|
00001 ! ######### 00002 SUBROUTINE DRAG(HISBA, HSNOW_ISBA, HCPSURF, & 00003 PTG, PWG, PWGI, & 00004 PEXNS, PEXNA, PTA, PVMOD, PQA, PRR, PSR, & 00005 PPS, PRS, PVEG, PZ0, PZ0EFF, PZ0H, & 00006 PWFC, PWSAT, PPSNG, PPSNV, PZREF, PUREF, & 00007 PDIRCOSZW, PDELTA, PF5, PRA, & 00008 PCH, PCD, PCDN, PRI, PHUG, PHUGI, & 00009 PHV, PHU, PCPS, PQS, PFFG, PFFV, PFF, & 00010 PFFG_NOSNOW, PFFV_NOSNOW, & 00011 PLEG_DELTA, PLEGI_DELTA ) 00012 ! ############################################################################ 00013 ! 00014 !!**** *DRAG* 00015 !! 00016 !! PURPOSE 00017 !! ------- 00018 ! 00019 ! Calculates the drag coefficients for heat and momentum transfers 00020 ! over ground (i.e., Ch and Cd). 00021 ! 00022 ! 00023 !!** METHOD 00024 !! ------ 00025 ! 00026 ! 1) computes hu, hv, and delta 00027 ! 00028 ! 2) use this to find qsoil, the grid-averaged relative humidity 00029 ! of the soil 00030 ! 00031 ! 3) calculates the Richardson's number 00032 ! 00033 ! 4) find the transfer and resistance coefficients Ch, Cd, and Ra 00034 ! 00035 !! EXTERNAL 00036 !! -------- 00037 !! 00038 !! IMPLICIT ARGUMENTS 00039 !! ------------------ 00040 !! 00041 !! USE MODD_CST 00042 !! 00043 !! 00044 !! REFERENCE 00045 !! --------- 00046 !! 00047 !! Mascart et al. (1995) 00048 !! Belair (1995) 00049 !! 00050 !! AUTHOR 00051 !! ------ 00052 !! 00053 !! S. Belair * Meteo-France * 00054 !! 00055 !! MODIFICATIONS 00056 !! ------------- 00057 !! Original 13/03/95 00058 !! (J.Stein) 15/11/95 use the potential temperature to compute Ri 00059 !! and PVMOD instead of ZVMOD 00060 !! (P.Lacarrere)15/03/96 replace * PEXNS by / PEXNS 00061 !! (V.Masson) 22/12/97 computation of z0eff after snow treatment 00062 !! (V.Masson) 05/10/98 clear routine 00063 !! (A.Boone) 11/26/98 Option for PDELTA: forested vs default surface 00064 !! (V.Masson) 01/03/03 Puts PDELTA in another routine 00065 !! (P.LeMoigne) 28/07/05 dependance on qs for cp 00066 !! (P.LeMoigne) 09/02/06 z0h and snow 00067 !! (P.LeMoigne) 09/01/08 limitation of Ri 00068 !! (B.Decharme) 01/05/08 optional limitation of Ri 00069 !! (B.Decharme) 03/06/08 flooding scheme 00070 !! (A.Boone) 03/15/10 Add delta fnctions to force LEG ans LEGI=0 00071 !! when hug(i)Qsat < Qa and Qsat > Qa 00072 !! (A.Boone) 21/11/11 Add Rs_max limit for dry conditions with Etv 00073 !! (B. Decharme) 09/12 limitation of Ri in surface_ri.F90 00074 !------------------------------------------------------------------------------- 00075 ! 00076 !* 0. DECLARATIONS 00077 ! ------------ 00078 ! 00079 USE MODD_CSTS, ONLY : XPI, XCPD, XCPV 00080 USE MODD_ISBA_PAR, ONLY : XWGMIN, XRS_MAX 00081 USE MODD_SURF_ATM, ONLY : LDRAG_COEF_ARP, LRRGUST_ARP, XRRSCALE, & 00082 XRRGAMMA, XUTILGUST, LCPL_ARP 00083 ! 00084 USE MODI_SURFACE_RI 00085 USE MODI_SURFACE_AERO_COND 00086 USE MODI_SURFACE_CD 00087 USE MODI_SURFACE_CDCH_1DARP 00088 USE MODI_WIND_THRESHOLD 00089 ! 00090 USE MODE_THERMOS 00091 ! 00092 ! 00093 USE YOMHOOK ,ONLY : LHOOK, DR_HOOK 00094 USE PARKIND1 ,ONLY : JPRB 00095 ! 00096 IMPLICIT NONE 00097 ! 00098 !* 0.1 declarations of arguments 00099 ! 00100 ! 00101 CHARACTER(LEN=*), INTENT(IN) :: HISBA ! type of ISBA version: 00102 ! ! '2-L' (default) 00103 ! ! '3-L' 00104 ! ! 'DIF' 00105 CHARACTER(LEN=*), INTENT(IN) :: HSNOW_ISBA ! 'DEF' = Default F-R snow scheme 00106 ! ! (Douville et al. 1995) 00107 ! ! '3-L' = 3-L snow scheme (option) 00108 ! ! (Boone and Etchevers 2000) 00109 CHARACTER(LEN=*), INTENT(IN) :: HCPSURF ! option for specific heat Cp: 00110 ! ! 'DRY' = dry Cp 00111 ! ! 'HUM' = Cp as a function of qs 00112 ! 00113 REAL, DIMENSION(:), INTENT(IN) :: PTG, PWG, PWGI, PEXNS 00114 ! PTG = surface temperature 00115 ! PWG = near-surface volumetric water content 00116 ! PWGI = near-surface frozen volumetric water content 00117 ! PEXNS = Exner function at the surface 00118 ! 00119 REAL, DIMENSION(:), INTENT(IN) :: PEXNA, PTA, PVMOD, PQA, PRR, PSR, PPS 00120 ! PEXNA= Exner function 00121 ! near surface atmospheric variables 00122 ! PTA = 2m temperature 00123 ! PVMOD = module of the horizontal wind 00124 ! NOTE it should be input as >= 1. (m) 00125 ! PQA = specific humidity 00126 ! PPS = surface pressure 00127 ! PRR = rain rate 00128 ! PSR = snow rate 00129 ! 00130 REAL, DIMENSION(:), INTENT(IN) :: PRS, PVEG, PZ0, PZ0H, PZ0EFF 00131 REAL, DIMENSION(:), INTENT(IN) :: PWFC, PWSAT, PPSNG, PPSNV, PZREF, PUREF 00132 ! PRS = stomatal resistance 00133 ! PVEG = vegetation fraction 00134 ! PZ0 = roughness length for momentum 00135 ! PZ0H = roughness length for heat 00136 ! PZ0EFF= effective roughness length 00137 ! PWFC = field capacity volumetric water content 00138 ! PWSAT = volumetric water content at saturation 00139 ! PPSNG = fraction of the bare ground covered 00140 ! by snow 00141 ! PPSNV = fraction of the vegetation covered 00142 ! by snow 00143 ! PZREF = reference height of the first 00144 ! atmospheric level 00145 ! PUREF = reference height of the wind 00146 ! NOTE this is different from ZZREF 00147 ! ONLY in stand-alone/forced mode, 00148 ! NOT when coupled to a model (MesoNH) 00149 ! 00150 REAL, DIMENSION(:), INTENT(IN) :: PDELTA 00151 ! PDELTA = fraction of the foliage covered 00152 ! by intercepted water 00153 REAL, DIMENSION(:), INTENT(IN) :: PF5 00154 ! PF5 = water stress function for Hv 00155 REAL, DIMENSION(:), INTENT(IN) :: PDIRCOSZW 00156 ! Cosinus of the angle between the normal to the surface and the vertical 00157 REAL, DIMENSION(:), INTENT(INOUT) :: PRA 00158 ! aerodynamic surface resistance 00159 REAL, DIMENSION(:), INTENT(INOUT) :: PCPS 00160 ! specific heat at surface 00161 ! 00162 REAL, DIMENSION(:), INTENT(OUT) :: PCH, PCD, PCDN, PRI 00163 ! PCH = drag coefficient for heat 00164 ! PCD = drag coefficient for momentum 00165 ! PCDN= neutral drag coefficient for momentum 00166 ! PRI = Richardson number 00167 ! 00168 REAL, DIMENSION(:), INTENT(OUT) :: PHUG, PHUGI, PHV, PHU, PQS, PLEG_DELTA, PLEGI_DELTA 00169 ! PHUG = ground relative humidity 00170 ! PHUGI = ground (ice) relative humidity 00171 ! PHV = Halstead coefficient 00172 ! PHU = relative humidity at the surface 00173 ! PQS = humidity at surface 00174 ! PLEG_DELTA = soil evaporation delta fn 00175 ! PLEGI_DELTA = soil sublimation delta fn 00176 ! 00177 REAL, DIMENSION(:), INTENT(IN) :: PFFV, PFF, PFFG, PFFG_NOSNOW, PFFV_NOSNOW 00178 ! PFFG = Floodplain fraction over ground 00179 ! PFFV = Floodplain fraction over vegetation 00180 ! PFF = Floodplain fraction at the surface 00181 ! 00182 ! 00183 ! 00184 !* 0.2 declarations of local variables 00185 ! 00186 ! 00187 ! 00188 REAL, DIMENSION(SIZE(PTG)) :: ZQSAT, 00189 ! ZQSAT = specific humidity at saturation 00190 ZAC, & 00191 ! ZAC = aerodynamical conductance 00192 ZWFC, & 00193 ! ZWFC = field capacity in presence of ice 00194 ZVMOD, & 00195 ! ZVMOD = wind modulus with minimum threshold 00196 ZFP, & 00197 ! ZFP = working variable 00198 ZZHV, & 00199 ! ZZHV = condensation delta fn for Hv 00200 ZRRCOR 00201 ! ZRRCOR = correction of CD, CH, CDN due to moist-gustiness 00202 ! 00203 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00204 !------------------------------------------------------------------------------- 00205 ! 00206 !* 0. Initialization: 00207 ! --------------- 00208 ! 00209 IF (LHOOK) CALL DR_HOOK('DRAG',0,ZHOOK_HANDLE) 00210 PCH(:) =0. 00211 PCD(:) =0. 00212 PHUG(:) =0. 00213 PHUGI(:) =0. 00214 PHV(:) =0. 00215 PHU(:) =0. 00216 ! 00217 ZQSAT(:) =0. 00218 ZWFC(:) =0. 00219 PRI(:) =0. 00220 ! 00221 ZVMOD = WIND_THRESHOLD(PVMOD,PUREF) 00222 ! 00223 !------------------------------------------------------------------------------- 00224 ! 00225 !* 1. RELATIVE HUMIDITY OF THE GROUND HU 00226 ! ---------------------------------- 00227 ! 00228 ! this relative humidity is related to 00229 ! the superficial soil moisture and the 00230 ! field capacity of the ground 00231 ! 00232 ! 00233 ZWFC(:) = PWFC(:)*(PWSAT(:)-PWGI(:))/PWSAT(:) 00234 ! 00235 PHUG(:) = 0.5 * ( 1.-COS(XPI*MIN((PWG(:)-XWGMIN) /ZWFC(:),1.)) ) 00236 00237 ZWFC(:) = PWFC(:)*MAX(XWGMIN, PWSAT(:)-PWG(:))/PWSAT(:) 00238 ! 00239 PHUGI(:) = 0.5 * ( 1.-COS(XPI*MIN(PWGI(:)/ZWFC(:),1.)) ) 00240 ! 00241 ! 00242 ! there is a specific treatment for dew 00243 ! (see Mahfouf and Noilhan, jam, 1991) 00244 ! 00245 ZQSAT(:) = QSAT(PTG(:),PPS(:)) 00246 ! 00247 ! when hu*qsat < qa, there are two 00248 ! possibilities 00249 ! 00250 ! a) low-level air is dry, i.e., 00251 ! qa < qsat 00252 ! 00253 ! NOTE the additional delta fn's 00254 ! here are needed owing to linearization 00255 ! of Qsat in the surface energy budget. 00256 ! 00257 PLEG_DELTA(:) = 1.0 00258 PLEGI_DELTA(:) = 1.0 00259 WHERE ( PHUG*ZQSAT < PQA .AND. ZQSAT > PQA ) 00260 PHUG(:) = PQA(:) / ZQSAT(:) 00261 PLEG_DELTA(:) = 0.0 00262 END WHERE 00263 WHERE ( PHUGI*ZQSAT < PQA .AND. ZQSAT > PQA ) 00264 PHUGI(:) = PQA(:) / ZQSAT(:) 00265 PLEGI_DELTA(:) = 0.0 00266 END WHERE 00267 ! 00268 ! b) low-level air is humid, i.e., 00269 ! qa >= qsat 00270 ! 00271 WHERE ( PHUG*ZQSAT < PQA .AND. ZQSAT <= PQA ) 00272 PHUG(:) = 1.0 00273 END WHERE 00274 WHERE ( PHUGI*ZQSAT < PQA .AND. ZQSAT <= PQA ) 00275 PHUGI(:) = 1.0 00276 END WHERE 00277 ! 00278 !------------------------------------------------------------------------------- 00279 ! 00280 !* 3. HALSTEAD COEFFICIENT (RELATIVE HUMIDITY OF THE VEGETATION) 00281 ! ---------------------------------------------------------- 00282 ! 00283 ZZHV(:) = MAX(0.,SIGN(1.,ZQSAT(:)-PQA(:))) ! condensation on foilage if = 1 00284 ! 00285 PHV(:) = PDELTA(:) + (1.- PDELTA(:))* & 00286 ( PRA(:) + PRS(:)*(1.0 - ZZHV(:)) )* & 00287 ( (1/(PRA(:)+PRS(:))) - (ZZHV(:)*(1.-PF5(:))/(PRA(:)+XRS_MAX)) ) 00288 ! 00289 !------------------------------------------------------------------------------- 00290 ! 00291 !* 4. GRID-AVERAGED HUMIDITY OF THE SURFACE 00292 ! ------------------------------------- 00293 ! 00294 IF(HSNOW_ISBA == '3-L' .OR. HSNOW_ISBA == 'CRO' .OR. HISBA == 'DIF')THEN 00295 ! 00296 ! For explicit snow, humidity HERE only over snow-free region: 00297 ! 00298 PQS(:) =( (1.-PVEG(:))*(1.-PFFG_NOSNOW(:))*(PWG(:) /(PWG(:)+PWGI(:)))*PHUG (:) & 00299 + (1.-PVEG(:))*(1.-PFFG_NOSNOW(:))*(PWGI(:)/(PWG(:)+PWGI(:)))*PHUGI(:) & 00300 + PVEG(:) *(1.-PFFV_NOSNOW(:))* PHV(:) & 00301 + ((1.-PVEG(:))*PFFG_NOSNOW(:)+PVEG(:)*PFFV_NOSNOW(:)))*ZQSAT(:) & 00302 + PVEG(:) *(1.-PFFV_NOSNOW(:))*(1.-PHV(:))*PQA(:) 00303 ! 00304 ELSE 00305 ! 00306 PQS(:) =( (1.-PVEG(:))*(1.-PPSNG(:)-PFFG(:))*(PWG(:) /(PWG(:)+PWGI(:)))*PHUG (:) & 00307 + (1.-PVEG(:))*(1.-PPSNG(:)-PFFG(:))*(PWGI(:)/(PWG(:)+PWGI(:)))*PHUGI(:) & 00308 + (1.-PVEG(:))* PPSNG(:) & 00309 + PVEG(:) *(1.-PPSNV(:)-PFFV(:))*PHV(:) & 00310 + PVEG(:) * PPSNV(:) & 00311 + PFF(:) )*ZQSAT(:) & 00312 + PVEG(:) *(1.-PPSNV(:)-PFFV(:))*(1.-PHV(:))*PQA(:) 00313 ! 00314 ENDIF 00315 ! 00316 PHU(:) = PQS(:)/ZQSAT(:) 00317 ! 00318 !------------------------------------------------------------------------------- 00319 ! 00320 !* 5. SPECIFIC HEAT OF THE SURFACE 00321 ! ---------------------------- 00322 ! 00323 IF (HCPSURF=='DRY') THEN 00324 PCPS(:) = XCPD 00325 ELSEIF(.NOT.LCPL_ARP)THEN 00326 PCPS(:) = XCPD + ( XCPV - XCPD ) * PQA(:) 00327 ENDIF 00328 ! 00329 !------------------------------------------------------------------------------- 00330 ! 00331 !* 6. COMPUTATION OF RESISTANCE AND DRAG COEFFICIENT 00332 ! ---------------------------------------------- 00333 ! 00334 CALL SURFACE_RI(PTG, PQS, PEXNS, PEXNA, PTA, PQA, & 00335 PZREF, PUREF, PDIRCOSZW, PVMOD, PRI ) 00336 ! 00337 !------------------------------------------------------------------------------- 00338 ! 00339 !* 6.5 LIMITATION OF RICHARDSON NUMBER 00340 ! ------------------------------- 00341 ! 00342 !Now done directly in SURFACE_RI subroutine 00343 ! 00344 !------------------------------------------------------------------------------- 00345 !* 7.0 DRAG COEFFICIENT FOR HEAT AND MOMENTUM TRANSFERS 00346 ! ------------------------------------------------- 00347 ! 00348 IF (LDRAG_COEF_ARP) THEN 00349 00350 CALL SURFACE_CDCH_1DARP(PZREF, PZ0EFF, PZ0H, ZVMOD, PTA, PTG, & 00351 PQA, PQS, PCD, PCDN, PCH ) 00352 PRA(:) = 1. / ( PCH(:) * ZVMOD(:) ) 00353 00354 ELSE 00355 00356 ! 00357 !* 7.1 SURFACE AERODYNAMIC RESISTANCE FOR HEAT TRANSFERS 00358 ! ------------------------------------------------- 00359 ! 00360 CALL SURFACE_AERO_COND(PRI, PZREF, PUREF, ZVMOD, PZ0, PZ0H, ZAC, PRA, PCH) 00361 ! 00362 !------------------------------------------------------------------------------- 00363 ! 00364 !* 7.2 DRAG COEFFICIENT FOR MOMENTUM TRANSFERS 00365 ! --------------------------------------- 00366 ! 00367 ! 00368 CALL SURFACE_CD(PRI, PZREF, PUREF, PZ0EFF, PZ0H, PCD, PCDN) 00369 ! 00370 ENDIF 00371 ! 00372 !------------------------------------------------------------------------------- 00373 ! 00374 !* 8. CORRECTION DUE TO MOIST GUSTINESS 00375 ! --------------------------------- 00376 ! 00377 IF (LRRGUST_ARP) THEN 00378 00379 ZFP(:)=MAX(0.0,PRR(:)+PSR(:)) 00380 ZRRCOR(:)=SQRT(1.0+((((ZFP(:)/(ZFP(:)+XRRSCALE))**XRRGAMMA)*XUTILGUST)**2) & 00381 /(PCD(:)*ZVMOD(:)**2)) 00382 00383 PCD = PCD * ZRRCOR 00384 PCH = PCH * ZRRCOR 00385 PCDN = PCDN * ZRRCOR 00386 00387 ENDIF 00388 ! 00389 !------------------------------------------------------------------------------- 00390 ! 00391 ! 00392 !* 9. HALSTEAD COEFFICIENT (WITH THE NEW VALUES OF PRA) 00393 ! ---------------------------------------------------------- 00394 ! 00395 ! 00396 PHV(:) = PDELTA(:) + (1.- PDELTA(:))* & 00397 ( PRA(:) + PRS(:)*(1.0 - ZZHV(:)) )* & 00398 ( (1/(PRA(:)+PRS(:))) - (ZZHV(:)*(1.-PF5(:))/(PRA(:)+XRS_MAX)) ) 00399 ! 00400 IF (LHOOK) CALL DR_HOOK('DRAG',1,ZHOOK_HANDLE) 00401 ! 00402 !------------------------------------------------------------------------------- 00403 ! 00404 ! 00405 END SUBROUTINE DRAG