Newer
Older
!MNH_LIC Copyright 1995-2022 CNRS, Meteo-France and Universite Paul Sabatier

RODIER Quentin
committed
!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_EMOIST
IMPLICIT NONE
CONTAINS
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
FUNCTION EMOIST(KRR,KRRI,PTHLM,PRM,PLOCPEXNM,PAMOIST,PSRCM) RESULT(PEMOIST)
USE PARKIND1, ONLY : JPRB
USE YOMHOOK , ONLY : LHOOK, DR_HOOK
! ############################################################################
!
! PURPOSE
!! -------
! EMOIST computes the coefficient Emoist in the flottability turbulent
! flux. This coefficient relates the vertical flux of the virtual potential
! temperature ( <Thv' W'> ) to the vertical flux of the conservative mixing
! ratio ( <Rnp' W'> ).
!
!!** METHOD
!! ------
!! The virtual potential temperature perturbation is linearized in function
!! of Thl' and Rnp'. The result is
!! Thv'= ( ZA + ZC * Atheta * 2 * SRC ) Thl'
!! +( ZB + ZC * Amoist * 2 * SRC ) Rnp'
!! From this relation, we can compute the verical turbulent fluxes.
!!
!! EXTERNAL
!! --------
!! NONE
!!
!! IMPLICIT ARGUMENTS
!! ------------------
!! Module MODD_CST : contains physical constants.
!! XRV, XRD : R for water vapor and dry air
!!
!! REFERENCE
!! ---------
!!
!! NONE
!!
!!
!! AUTHOR
!! ------
!! Jean-Marie Carriere * Meteo-France *
!!
!! MODIFICATIONS
!! -------------
!! Original 20/03/95
!!
!! J. Stein Feb 28, 1996 optimization + Doctorization
!! J. Stein Spet 15, 1996 Amoist previously computed
!! J.-P. Pinty May 20, 2003 Improve EMOIST expression

RODIER Quentin
committed
!! 03/2021 (JL Redelsperger) Ocean model case
!!
!! ----------------------------------------------------------------------
!
!* 0. DECLARATIONS
! ------------
USE MODD_CST

RODIER Quentin
committed
USE MODD_DYN_n, ONLY : LOCEAN
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
!
IMPLICIT NONE
!
!* 0.1 declarations of arguments and result
!
!
INTEGER :: KRR ! number of moist var.
INTEGER :: KRRI ! number of ice var.
!
REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM ! Conservative pot. temperature
REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM ! Mixing ratios, where
! PRM(:,:,:,1) = conservative mixing ratio
REAL, DIMENSION(:,:,:), INTENT(IN) :: PLOCPEXNM ! Lv(T)/Cp/Exner at time t-1
REAL, DIMENSION(:,:,:), INTENT(IN) :: PAMOIST ! Amoist
REAL, DIMENSION(:,:,:), INTENT(IN) :: PSRCM ! Normalized 2dn_order
! moment s'r'c/2Sigma_s2
!
REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)):: PEMOIST ! result
!
!* 0.2 declarations of local variables
!
REAL,DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2),SIZE(PTHLM,3)) :: &
ZA, ZRW
! ZA = coeft A, ZRW = total mixing ratio rw
REAL :: ZDELTA ! = Rv/Rd - 1
INTEGER :: JRR ! moist loop counter
!
!---------------------------------------------------------------------------
!
!
!* 1. COMPUTE EMOIST
! --------------
!
REAL(KIND=JPRB) :: ZHOOK_HANDLE
IF (LHOOK) CALL DR_HOOK('EMOIST',0,ZHOOK_HANDLE)

RODIER Quentin
committed
!
IF (LOCEAN) THEN
IF ( KRR == 0 ) THEN ! Unsalted
PEMOIST(:,:,:) = 0.
ELSE
PEMOIST(:,:,:) = 1. ! Salted case
END IF
!
ELSE
!
IF ( KRR == 0 ) THEN ! dry case
PEMOIST(:,:,:) = 0.
ELSE IF ( KRR == 1 ) THEN ! only vapor
ZDELTA = (XRV/XRD) - 1.
PEMOIST(:,:,:) = ZDELTA*PTHLM(:,:,:)

RODIER Quentin
committed
ELSE ! liquid water & ice present
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
ZDELTA = (XRV/XRD) - 1.
ZRW(:,:,:) = PRM(:,:,:,1)
!
IF ( KRRI>0) THEN ! rc and ri case
ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,3)
DO JRR=5,KRR
ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR)
ENDDO
ZA(:,:,:) = 1. + ( & ! Compute A
(1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2) - PRM(:,:,:,4)) &
-ZRW(:,:,:) &
) / (1. + ZRW(:,:,:))
!
! Emoist = ZB + ZC * Amoist
! ZB is computed from line 1 to line 2
! ZC is computed from line 3 to line 5
! Amoist* 2 * SRC is computed at line 6
!
PEMOIST(:,:,:) = ZDELTA * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*( &
PRM(:,:,:,2)+PRM(:,:,:,4)))&
/ (1. + ZRW(:,:,:)) &
+( PLOCPEXNM(:,:,:) * ZA(:,:,:) &
-(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*( &
PRM(:,:,:,2)+PRM(:,:,:,4)))&
/ (1. + ZRW(:,:,:)) &
) * PAMOIST(:,:,:) * 2. * PSRCM(:,:,:)
ELSE
DO JRR=3,KRR
ZRW(:,:,:) = ZRW(:,:,:) + PRM(:,:,:,JRR)
ENDDO
ZA(:,:,:) = 1. + ( & ! Compute ZA
(1.+ZDELTA) * (PRM(:,:,:,1) - PRM(:,:,:,2)) &
-ZRW(:,:,:) &
) / (1. + ZRW(:,:,:))
!
! Emoist = ZB + ZC * Amoist
! ZB is computed from line 1 to line 2
! ZC is computed from line 3 to line 5
! Amoist* 2 * SRC is computed at line 6
!
PEMOIST(:,:,:) = ZDELTA * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2)) &
/ (1. + ZRW(:,:,:)) &
+( PLOCPEXNM(:,:,:) * ZA(:,:,:) &
-(1.+ZDELTA) * (PTHLM(:,:,:) + PLOCPEXNM(:,:,:)*PRM(:,:,:,2)) &
/ (1. + ZRW(:,:,:)) &
) * PAMOIST(:,:,:) * 2. * PSRCM(:,:,:)
END IF

RODIER Quentin
committed
END IF

RODIER Quentin
committed
END IF
!---------------------------------------------------------------------------
!
IF (LHOOK) CALL DR_HOOK('EMOIST',1,ZHOOK_HANDLE)
END FUNCTION EMOIST
END MODULE MODE_EMOIST