Skip to content
Snippets Groups Projects
mode_sbl_phy.f90 5.28 KiB
Newer Older
  • Learn to ignore specific revisions
  • !MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
    !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
    !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
    !MNH_LIC for details. version 1.
    !-----------------------------------------------------------------
    !     ###############
          MODULE MODE_SBL_PHY
    !     ###############
    !
    !!****  *MODE_SBL * - contains Surface Boundary Layer characteristics functions
    !!
    !!    PURPOSE
    !!    -------
    !
    !!**  METHOD
    !!    ------
    !!
    !!
    !!
    !!    EXTERNAL
    !!    --------
    !!
    !!    IMPLICIT ARGUMENTS
    !!    ------------------
    !!
    !!    REFERENCE
    !!    ---------
    !!
    !!    Businger et al 1971,   Wyngaard and Cote 1974
    !!
    !!
    !!    AUTHOR
    !!    ------
    !!      V. Masson       * Meteo France *
    !!
    !!    MODIFICATIONS
    !!    -------------
    !!      Original        13/10/99
    !!      V. Masson       06/11/02 optimization and add Businger fonction for TKE
    !!      V. Masson       01/01/03 use PAULSON_PSIM function
    !-----------------------------------------------------------------------------
    USE PARKIND1, ONLY : JPRB
    USE YOMHOOK , ONLY : LHOOK, DR_HOOK
    !
    IMPLICIT NONE
    !-------------------------------------------------------------------------------
    CONTAINS
    !-------------------------------------------------------------------------------
    !
    SUBROUTINE BUSINGER_PHIM(D,PZ_O_LMO,BUSINGERPHIM)
    !
    USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
    !
    IMPLICIT NONE
    !
    TYPE(DIMPHYEX_t),                   INTENT(IN)  :: D
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)  :: PZ_O_LMO
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: BUSINGERPHIM
    
    !
    IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM',0,ZHOOK_HANDLE)
    
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    WHERE ( PZ_O_LMO(:,:) < 0. )
      BUSINGERPHIM(:,:) = (1.-15.*PZ_O_LMO(:,:))**(-0.25)
    
      BUSINGERPHIM(:,:) = 1. + 4.7 * PZ_O_LMO(:,:)
    
    !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM',1,ZHOOK_HANDLE)
    END SUBROUTINE BUSINGER_PHIM
    !
    !-------------------------------------------------------------------------------
    !
    SUBROUTINE BUSINGER_PHIH(D,PZ_O_LMO,BUSINGERPHIH)
    !
    USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
    !
    IMPLICIT NONE
    !
    TYPE(DIMPHYEX_t),                   INTENT(IN)  :: D
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)  :: PZ_O_LMO
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: BUSINGERPHIH
    
    !
    IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH',0,ZHOOK_HANDLE)
    
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    WHERE ( PZ_O_LMO(:,:) < 0. )
      BUSINGERPHIH(:,:) = 0.74 * (1.-9.*PZ_O_LMO(:,:))**(-0.5)
    
      BUSINGERPHIH(:,:) = 0.74 + 4.7 * PZ_O_LMO(:,:)
    
    !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH',1,ZHOOK_HANDLE)
    END SUBROUTINE BUSINGER_PHIH
    !
    !-------------------------------------------------------------------------------
    SUBROUTINE BUSINGER_PHIE(D,CSTURB,PZ_O_LMO,BUSINGERPHIE)
    !
    USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
    USE MODD_CTURB, ONLY: CSTURB_t
    !
    IMPLICIT NONE
    !
    TYPE(DIMPHYEX_t),                   INTENT(IN)   :: D
    TYPE(CSTURB_t),                     INTENT(IN)   :: CSTURB
    
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN)   :: PZ_O_LMO
    REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT)  :: BUSINGERPHIE
    
    !
    IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE',0,ZHOOK_HANDLE)
    
    !$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    WHERE ( PZ_O_LMO(:,:) < 0. )
      BUSINGERPHIE(:,:)=(1.+(-PZ_O_LMO(:,:))**(2./3.)/CSTURB%XALPSBL)&
                                * (1.-15.*PZ_O_LMO(:,:))**(0.5)
    
      BUSINGERPHIE(:,:) = 1./(1. + 4.7 * PZ_O_LMO(:,:))**2
    
    !$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)
    
    IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE',1,ZHOOK_HANDLE)
    END SUBROUTINE BUSINGER_PHIE
    
    !
    SUBROUTINE LMO(D,CST,PUSTAR,PTHETA,PRV,PSFTH,PSFRV,PLMO)
      USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t
      USE MODD_CST, ONLY: CST_t
      USE MODD_PARAMETERS, ONLY: JPVEXT_TURB,XUNDEF
      !
      TYPE(DIMPHYEX_t),        INTENT(IN)  :: D
      TYPE(CST_t),             INTENT(IN)  :: CST
      REAL, DIMENSION(D%NIJT), INTENT(IN)  :: PUSTAR
      REAL, DIMENSION(D%NIJT), INTENT(IN)  :: PTHETA
      REAL, DIMENSION(D%NIJT), INTENT(IN)  :: PRV
      REAL, DIMENSION(D%NIJT), INTENT(IN)  :: PSFTH
      REAL, DIMENSION(D%NIJT), INTENT(IN)  :: PSFRV
      REAL, DIMENSION(D%NIJT),INTENT(OUT)   :: PLMO
    !
      REAL, DIMENSION(D%NIJT)   :: ZTHETAV, ZQ0
      REAL                            :: ZEPS
    
    !
      REAL(KIND=JPRB) :: ZHOOK_HANDLE
      IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO',0,ZHOOK_HANDLE)
    !
      IIJE=D%NIJE
      IIJB=D%NIJB
    
      ZEPS=(CST%XRV-CST%XRD)/CST%XRD
    !
      !$mnh_expand_array(JIJ=IIJB:IIJE)
    
      ZTHETAV(:) = PTHETA(:) * ( 1. +ZEPS * PRV(:))
      ZQ0(:) = PSFTH(:) + ZTHETAV(:) * ZEPS * PSFRV(:)
    
      !$mnh_end_expand_array(JIJ=IIJB:IIJE)
      !$mnh_expand_where(JIJ=IIJB:IIJE)
    
      WHERE ( ZQ0(:)/=0. )
        PLMO(:) = - MAX(PUSTAR(:),1.E-6)**3                &
                      / ( CST%XKARMAN * CST%XG / ZTHETAV(:) *ZQ0(:) )
    
      END WHERE
      !$mnh_end_expand_where(JIJ=IIJB:IIJE)
      IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO',1,ZHOOK_HANDLE)
    END SUBROUTINE LMO
    !