SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/drag.F90
Go to the documentation of this file.
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