Newer
Older

RODIER Quentin
committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
!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

RODIER Quentin
committed
!
REAL(KIND=JPRB) :: ZHOOK_HANDLE
INTEGER :: JIJ,JK,IIJB,IIJE,IKT

RODIER Quentin
committed
!
IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIM',0,ZHOOK_HANDLE)
!
IIJE=D%NIJE
IIJB=D%NIJB
IKT=D%NKT
!$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)

RODIER Quentin
committed
WHERE ( PZ_O_LMO(:,:) < 0. )
BUSINGERPHIM(:,:) = (1.-15.*PZ_O_LMO(:,:))**(-0.25)

RODIER Quentin
committed
ELSEWHERE

RODIER Quentin
committed
BUSINGERPHIM(:,:) = 1. + 4.7 * PZ_O_LMO(:,:)

RODIER Quentin
committed
END WHERE
!$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)

RODIER Quentin
committed
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

RODIER Quentin
committed
!
REAL(KIND=JPRB) :: ZHOOK_HANDLE
INTEGER :: JIJ,JK,IIJB,IIJE,IKT

RODIER Quentin
committed
!
IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIH',0,ZHOOK_HANDLE)
!
IIJE=D%NIJE
IIJB=D%NIJB
IKT=D%NKT
!$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)

RODIER Quentin
committed
WHERE ( PZ_O_LMO(:,:) < 0. )
BUSINGERPHIH(:,:) = 0.74 * (1.-9.*PZ_O_LMO(:,:))**(-0.5)

RODIER Quentin
committed
ELSEWHERE

RODIER Quentin
committed
BUSINGERPHIH(:,:) = 0.74 + 4.7 * PZ_O_LMO(:,:)

RODIER Quentin
committed
END WHERE
!$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)

RODIER Quentin
committed
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

RODIER Quentin
committed
!
REAL(KIND=JPRB) :: ZHOOK_HANDLE
INTEGER :: JIJ,JK,IIJB,IIJE,IKT

RODIER Quentin
committed
!
IF (LHOOK) CALL DR_HOOK('MODE_SBL:BUSINGER_PHIE',0,ZHOOK_HANDLE)
!
IIJE=D%NIJE
IIJB=D%NIJB
IKT=D%NKT
!$mnh_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)

RODIER Quentin
committed
WHERE ( PZ_O_LMO(:,:) < 0. )
BUSINGERPHIE(:,:)=(1.+(-PZ_O_LMO(:,:))**(2./3.)/CSTURB%XALPSBL)&
* (1.-15.*PZ_O_LMO(:,:))**(0.5)

RODIER Quentin
committed
ELSEWHERE

RODIER Quentin
committed
BUSINGERPHIE(:,:) = 1./(1. + 4.7 * PZ_O_LMO(:,:))**2

RODIER Quentin
committed
END WHERE
!$mnh_end_expand_where(JIJ=IIJB:IIJE,JK=1:IKT)

RODIER Quentin
committed
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
INTEGER :: IIJB,IIJE, JIJ,IKT
!
REAL(KIND=JPRB) :: ZHOOK_HANDLE
IF (LHOOK) CALL DR_HOOK('MODE_SBL:LMO',0,ZHOOK_HANDLE)
!
IIJE=D%NIJE
IIJB=D%NIJB
IKT=D%NKT
ZEPS=(CST%XRV-CST%XRD)/CST%XRD
!
!$mnh_expand_array(JIJ=IIJB:IIJE)

RODIER Quentin
committed
ZTHETAV(:) = PTHETA(:) * ( 1. +ZEPS * PRV(:))
ZQ0(:) = PSFTH(:) + ZTHETAV(:) * ZEPS * PSFRV(:)

RODIER Quentin
committed
PLMO(:) = XUNDEF
!$mnh_end_expand_array(JIJ=IIJB:IIJE)
!$mnh_expand_where(JIJ=IIJB:IIJE)

RODIER Quentin
committed
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
!

RODIER Quentin
committed
END MODULE MODE_SBL_PHY