urban_exch_coef.F90 Source File


Contents

Source Code


Source Code

!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL version 2.1
!SFX_LIC version 1. See LICENSE, Licence_CeCILL_V2.1-en.txt and Licence_CeCILL_V2.1-fr.txt  
!SFX_LIC for details. version 1.
!     #########
SUBROUTINE URBAN_EXCH_COEF(HZ0H, PZ0_O_Z0H, PTG, PQS, PEXNS, PEXNA, PTA, PQA,   &
                             PZREF, PUREF, PVMOD, PZ0,                            &
                             PRI, PCD, PCDN, PAC, PRA, PCH                        )  
!          #######################################################################
!
!!****  *URBAN_DRAG*  
!!
!!    PURPOSE
!!    -------
!
!     Computes the surface drag coefficients over roof, road or town
!     according several scientific formulations
!         
!     
!!**  METHOD
!!    ------
!
!
!
!
!!    EXTERNAL
!!    --------
!!
!!
!!    IMPLICIT ARGUMENTS
!!    ------------------
!!
!!      
!!    REFERENCE
!!    ---------
!!
!!      
!!    AUTHOR
!!    ------
!!
!!      V. Masson           * Meteo-France *
!!
!!    MODIFICATIONS
!!    -------------
!!      Original    01/2009    from urban_drag.f90 (modified by S.  Leroyer at CMC)
!         01/2009 (S. Leroyer) option (HZ0H) for z0h applied on roof, road and town
!!      B. Decharme    06/2009 limitation of Ri
!!      B. Decharme    09/2009 limitation of Ri in surface_ri.F90
!
!-------------------------------------------------------------------------------

USE MODI_SURFACE_RI
USE MODI_SURFACE_CD
USE MODI_SURFACE_AERO_COND
USE MODI_WIND_THRESHOLD
!
USE MODD_CSTS, ONLY : XKARMAN
!
!
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
USE PARKIND1  ,ONLY : JPRB
!
USE MODI_FLXSURF3BX
!
IMPLICIT NONE
!
 CHARACTER(LEN=6)                  :: HZ0H     ! TEB option for z0h roof & road
REAL,               INTENT(IN)    :: PZ0_O_Z0H! z0/z0h ratio used in Mascart (1995)
REAL, DIMENSION(:), INTENT(IN)    :: PTG      ! surface temperature
REAL, DIMENSION(:), INTENT(IN)    :: PQS      ! surface specific humidity
REAL, DIMENSION(:), INTENT(IN)    :: PEXNS    ! surface exner function
REAL, DIMENSION(:), INTENT(IN)    :: PTA      ! temperature at the lowest level
REAL, DIMENSION(:), INTENT(IN)    :: PQA      ! specific humidity
                                              ! at the lowest level
REAL, DIMENSION(:), INTENT(IN)    :: PEXNA    ! exner function
                                              ! at the lowest level
REAL, DIMENSION(:), INTENT(IN)    :: PVMOD    ! module of the horizontal wind
!
REAL, DIMENSION(:), INTENT(IN)    :: PZ0      ! roughness length for momentum
REAL, DIMENSION(:), INTENT(IN)    :: PZREF    ! reference height of the first
                                              ! atmospheric level
REAL, DIMENSION(:), INTENT(IN)    :: PUREF    ! reference height of the wind
!                                             ! NOTE this is different from ZZREF
!                                             ! ONLY in stand-alone/forced mode,
!                                             ! NOT when coupled to a model (MesoNH)
REAL, DIMENSION(:), INTENT(OUT)   :: PRI      ! Richardson number
!
REAL, DIMENSION(:), INTENT(OUT)   :: PCD      ! drag coefficient for momentum
REAL, DIMENSION(:), INTENT(OUT)   :: PCDN     ! neutral drag coefficient for momentum
REAL, DIMENSION(:), INTENT(OUT)   :: PAC      ! aerodynamical conductance
REAL, DIMENSION(:), INTENT(OUT)   :: PRA      ! aerodynamical resistance
REAL, DIMENSION(:), INTENT(OUT)   :: PCH      ! drag coefficient for heat
!
!* local variables
!
REAL, DIMENSION(SIZE(PZ0))         :: ZZ0H     ! roughness length for heat
!* BRUT82 & KAND07 cases
REAL,DIMENSION(SIZE(PTA)) :: cmu, ctu, rib,ftemp,fvap,ilmo  ! temporary var for
REAL,DIMENSION(SIZE(PTA)) :: ue,fcor, hBL,lzz0,lzz0t,fm, fh ! flxsurf3
REAL,DIMENSION(SIZE(PTA)) :: z0h_roof,z0h_town,z0h_road     ! local thermal roughness
REAL,DIMENSION(SIZE(PTA)) :: zustar, zta, ztg
REAL,DIMENSION(SIZE(PTA)) :: ZVMOD                          ! wind
INTEGER N
!
!* MASC95 case
REAL,DIMENSION(SIZE(PTA)) :: ZDIRCOSZW     ! orography slope cosine
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!-------------------------------------------------------------------------------
!
!*      1.     Mascart 1995 exchange coefficients
!              ----------------------------------
!
IF (LHOOK) CALL DR_HOOK('URBAN_EXCH_COEF',0,ZHOOK_HANDLE)
IF (HZ0H=='MASC95') THEN
! 
  ZZ0H = PZ0 / PZ0_O_Z0H ! fixed ratio for MASC95
  ZDIRCOSZW=1.           ! no orography slope effect taken into account in TEB
!
  CALL SURFACE_RI(PTG, PQS, PEXNS, PEXNA, PTA, PQA,   &
                    PZREF, PUREF, ZDIRCOSZW, PVMOD, PRI )  
!
  CALL SURFACE_CD(PRI, PZREF, PUREF, PZ0, ZZ0H, PCD, PCDN)
!
  CALL SURFACE_AERO_COND(PRI, PZREF, PUREF, PVMOD, PZ0, ZZ0H, PAC, PRA, PCH)
!
!
!*      2.     Brutsaert 1982  or Kanda 2007 exchange coefficients
!              ---------------------------------------------------
!
ELSEIF(HZ0H=='BRUT82' .OR. HZ0H=='KAND07')THEN
  ! initialisations
  fcor(:)=1.0372462E-04
!RJ: can be removed
  N=SIZE(PTA)
  !
  ! Set a minimum threshold to the wind
  ZVMOD(:) = WIND_THRESHOLD(PVMOD(:),PUREF(:))
  !
  ! First guess of u*
  ZUSTAR(:) = 0.4 * ZVMOD(:) / LOG( PUREF/PZ0(:) )
  !
  IF (HZ0H=='KAND07') THEN ! Kanda 2007
    ZZ0H(:)= PZ0(:) * 7.4 * EXP( - 1.29 *( PZ0(:)*zustar(:)/1.461e-5)**0.25)
  ELSEIF (HZ0H=='BRUT82') THEN ! Brutsaert 1982
    ZZ0H(:)= PZ0(:) * 7.4 * EXP( - 2.46 *( PZ0(:)*zustar(:)/1.461e-5)**0.25)
  ENDIF

  ZTA = PTA/PEXNA
  ZTG = PTG/PEXNS
  CALL FLXSURF3BX( cmu, ctu, PRI,ftemp,fvap,ilmo,    &
                   ue, fcor, ZTA, PQA,           &
                   PUREF, PZREF, ZVMOD, ZTG, PQS,&
                   hBL, PZ0,ZZ0H,                      &
                   lzz0, lzz0t, fm, fh,N               )  
!
  PCD(:) = (cmu(:)/ue(:))**2  
  PCDN(:) = (XKARMAN/LOG(PUREF(:)/PZ0(:)))**2
  PAC(:) = (cmu(:)*ctu(:)/ue(:)**2) * ZVMOD(:)
  PRA(:) = 1. / PAC(:)
  PCH(:) = 1. / (PRA(:) * ZVMOD(:))
!
END IF
IF (LHOOK) CALL DR_HOOK('URBAN_EXCH_COEF',1,ZHOOK_HANDLE)

END SUBROUTINE URBAN_EXCH_COEF