LMDZ
swde.F90
Go to the documentation of this file.
1 !OPTIONS XOPT(HSFUN)
2 SUBROUTINE swde &
3  & ( kidia, kfdia, klon,&
4  & pgg , pref , prmuz, pto1, pw,&
5  & pre1 , pre2 , ptr1 , ptr2 &
6  & )
7 
8 !**** *SWDE* - DELTA-EDDINGTON IN A CLOUDY LAYER
9 
10 ! PURPOSE.
11 ! --------
12 ! COMPUTES THE REFLECTIVITY AND TRANSMISSIVITY OF A CLOUDY
13 ! LAYER USING THE DELTA-EDDINGTON'S APPROXIMATION.
14 
15 !** INTERFACE.
16 ! ----------
17 ! *SWDE* IS CALLED BY *SWR*, *SWNI*
18 
19 ! EXPLICIT ARGUMENTS :
20 ! --------------------
21 ! PGG : (KLON) ; ASSYMETRY FACTOR
22 ! PREF : (KLON) ; REFLECTIVITY OF THE UNDERLYING LAYER
23 ! PRMUZ : (KLON) ; COSINE OF SOLAR ZENITH ANGLE
24 ! PTO1 : (KLON) ; OPTICAL THICKNESS
25 ! PW : (KLON) ; SINGLE SCATTERING ALBEDO
26 ! ==== OUTPUTS ===
27 ! PRE1 : (KLON) ; LAYER REFLECTIVITY ASSUMING NO
28 ! ; REFLECTION FROM UNDERLYING LAYER
29 ! PTR1 : (KLON) ; LAYER TRANSMISSIVITY ASSUMING NO
30 ! ; REFLECTION FROM UNDERLYING LAYER
31 ! PRE2 : (KLON) ; LAYER REFLECTIVITY ASSUMING
32 ! ; REFLECTION FROM UNDERLYING LAYER
33 ! PTR2 : (KLON) ; LAYER TRANSMISSIVITY ASSUMING
34 ! ; REFLECTION FROM UNDERLYING LAYER
35 
36 ! IMPLICIT ARGUMENTS : NONE
37 ! --------------------
38 
39 ! METHOD.
40 ! -------
41 
42 ! STANDARD DELTA-EDDINGTON LAYER CALCULATIONS.
43 
44 ! EXTERNALS.
45 ! ----------
46 
47 ! NONE
48 
49 ! REFERENCE.
50 ! ----------
51 
52 ! SEE RADIATION'S PART OF THE MODEL'S DOCUMENTATION AND
53 ! ECMWF RESEARCH DEPARTMENT DOCUMENTATION OF THE IFS
54 
55 ! AUTHOR.
56 ! -------
57 ! JEAN-JACQUES MORCRETTE *ECMWF*
58 
59 ! MODIFICATIONS.
60 ! --------------
61 ! ORIGINAL: 88-12-15
62 ! 96-05-30 Michel Deque (security in EXP())
63 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
64 ! Modified: 03-10-10 Deborah Salmond and Marta Janiskova Optimisation
65 ! Modified: 03-12-13 John Hague - MASS Vector Fns
66 ! Y.Seity 06-09-09 : add modset from O.Thouron (MesoNH) under NOVLP tests
67 ! ------------------------------------------------------------------
68 
69 ! ------------------------------------------------------------------
70 
71 !* 0.1 ARGUMENTS
72 ! ---------
73 
74 USE parkind1 ,ONLY : jpim ,jprb
75 USE yomhook ,ONLY : lhook, dr_hook
76 
77 USE yoerdu , ONLY : replog
78 USE yomjfh , ONLY : n_vmass
79 !++MODIFCODE
80 USE yoerad , ONLY : novlp
81 !--MODIFCODE
82 IMPLICIT NONE
83 
84 INTEGER(KIND=JPIM),INTENT(IN) :: KLON
85 INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA
86 INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA
87 REAL(KIND=JPRB) ,INTENT(IN) :: PGG(klon)
88 REAL(KIND=JPRB) ,INTENT(IN) :: PREF(klon)
89 REAL(KIND=JPRB) ,INTENT(IN) :: PRMUZ(klon)
90 REAL(KIND=JPRB) ,INTENT(IN) :: PTO1(klon)
91 REAL(KIND=JPRB) ,INTENT(IN) :: PW(klon)
92 REAL(KIND=JPRB) ,INTENT(OUT) :: PRE1(klon)
93 REAL(KIND=JPRB) ,INTENT(OUT) :: PRE2(klon)
94 REAL(KIND=JPRB) ,INTENT(OUT) :: PTR1(klon)
95 REAL(KIND=JPRB) ,INTENT(OUT) :: PTR2(klon)
96 REAL(KIND=JPRB) :: ZTMP (4,kfdia-kidia+1)
97 REAL(KIND=JPRB) :: ZTMP2 (kfdia-kidia+1+n_vmass)
98 REAL(KIND=JPRB) :: ZTMP3 (kfdia-kidia+1+n_vmass)
99 REAL(KIND=JPRB) :: ZZARG (kfdia-kidia+1+n_vmass)
100 REAL(KIND=JPRB) :: ZZARG2 (kfdia-kidia+1+n_vmass)
101 
102 INTEGER(KIND=JPIM) :: JL, JLL, JLEN
103 
104 REAL(KIND=JPRB) :: ZA11, ZA12, ZA13, ZA21, ZA22, ZA23, ZALPHA,&
105  & ZAM2B, ZAP2B, ZB21, ZB22, ZB23, &
106  & ZBETA, ZC1A, ZC1B, ZC2A, ZC2B, ZDENA, ZDENB, &
107  & ZDT, ZEXKM, ZEXKP, ZEXMU0, ZFF, ZGP, ZRI0A, &
108  & ZRI0B, ZRI0C, ZRI0D, ZRI1A, ZRI1B, ZRI1C, &
109  & ZRI1D, ZRK, ZRM2, ZRP, ZTOP, ZWCP, ZWM, ZX1, &
110  & ZX2, ZXM2P, ZXP2P
111 
112 
113 REAL(KIND=JPRB) :: MINJ, MAXJ, X, Y
114 REAL(KIND=JPRB) :: ZPRMUZ,ZIDENA,ZIDENB,ZRR
115 REAL(KIND=JPRB) :: ZHOOK_HANDLE
116 
117 ! STATEMENT DUNCTIONS
118 minj(x,y) = y - 0.5_jprb*(abs(x-y)-(x-y))
119 maxj(x,y) = y + 0.5_jprb*(abs(x-y)+(x-y))
120 
121 ! ------------------------------------------------------------------
122 
123 !* 1. DELTA-EDDINGTON CALCULATIONS
124 
125 IF (lhook) CALL dr_hook('SWDE',0,zhook_handle)
126 
127 zdt = 2.0_jprb/3._jprb
128 
129  DO jl = kidia,kfdia
130  jll=jl-kidia+1
131  zprmuz=1.0_jprb/prmuz(jl)
132 !++MODIFCODE
133  IF (novlp >= 5) THEN !MESONH_VERSION
134  zgp = pgg(jl)
135  ztop = pto1(jl)
136  zwcp = pw(jl)
137  ELSE !ECMWF VERSION
138  zff = pgg(jl)*pgg(jl)
139  zgp = pgg(jl)/(1.0_jprb+pgg(jl))
140  ztop = (1.0_jprb- pw(jl) * zff) * pto1(jl)
141  zwcp = (1-zff)* pw(jl) /(1.0_jprb- pw(jl) * zff)
142  ENDIF
143 !--MODIFCODE
144  zx1 = 1.0_jprb-zwcp*zgp
145  zwm = 1.0_jprb-zwcp
146  zrm2 = prmuz(jl) * prmuz(jl)
147  zrk = sqrt(maxj(replog,3._jprb*zwm*zx1))
148  zx2 = (1.0_jprb-zrk*zrk*zrm2)*(4._jprb/3._jprb)
149  zrr = 1.0_jprb/zx2
150  zrp=zrk/zx1
151  zalpha = zwcp*zrm2*(1.0_jprb+zgp*zwm)*zrr
152  zbeta = zwcp* prmuz(jl) *(1.0_jprb+3._jprb*zgp*zrm2*zwm)*zrr
153  zzarg(jll) = -maxj( -200._jprb, minj( ztop*zprmuz, 200._jprb) )
154  zzarg2(jll) = minj( zrk*ztop, 200._jprb)
155  ztmp(1,jll) = zprmuz
156  ztmp(2,jll) = zalpha
157  ztmp(3,jll) = zbeta
158  ztmp(4,jll) = zrp
159  ENDDO
160 
161  IF(n_vmass /= 0 ) THEN !USING VECTOR MASS
162  jlen=kfdia-kidia+n_vmass-mod(kfdia-kidia,n_vmass)
163  IF(kfdia-kidia+1 /= jlen) THEN
164  zzarg(kfdia-kidia+2:jlen)=1.0_jprb
165  zzarg2(kfdia-kidia+2:jlen)=1.0_jprb
166  ENDIF
167 ! Commente par MPL le 21.11.08
168 ! CALL VEXP(ZTMP2,ZZARG, JLEN)
169 ! CALL VEXP(ZTMP3,ZZARG2,JLEN)
170  ELSE
171  DO jl = kidia,kfdia
172  jll=jl-kidia+1
173  ztmp2(jll) = exp(zzarg(jll))
174  ztmp3(jll) = exp(zzarg2(jll))
175  ENDDO
176  ENDIF
177 
178  DO jl = kidia,kfdia
179  jll=jl-kidia+1
180  zexmu0 = ztmp2(jll)
181  zexkp = ztmp3(jll)
182  zprmuz = ztmp(1,jll)
183  zalpha = ztmp(2,jll)
184  zbeta = ztmp(3,jll)
185  zrp = ztmp(4,jll)
186  zexkm = 1.0_jprb/zexkp
187  zxp2p = 1.0_jprb+zdt*zrp
188  zxm2p = 1.0_jprb-zdt*zrp
189  zap2b = zalpha+zdt*zbeta
190  zam2b = zalpha-zdt*zbeta
191 
192 !* 1.2 WITHOUT REFLECTION FROM THE UNDERLYING LAYER
193 
194  za11 = zxp2p
195  za12 = zxm2p
196  za13 = zap2b
197  za22 = zxp2p*zexkp
198  za21 = zxm2p*zexkm
199  za23 = zam2b*zexmu0
200  zdena = za11 * za22 - za21 * za12
201  zidena=1.0_jprb/zdena
202  zc1a = (za22*za13-za12*za23)*zidena
203  zc2a = (za11*za23-za21*za13)*zidena
204  zri0a = zc1a+zc2a-zalpha
205  zri1a = zrp*(zc1a-zc2a)-zbeta
206  pre1(jl) = (zri0a-zdt*zri1a)*zprmuz
207  zri0b = zc1a*zexkm+zc2a*zexkp-zalpha*zexmu0
208  zri1b = zrp*(zc1a*zexkm-zc2a*zexkp)-zbeta*zexmu0
209  ptr1(jl) = zexmu0+(zri0b+zdt*zri1b)*zprmuz
210 
211 !* 1.3 WITH REFLECTION FROM THE UNDERLYING LAYER
212 
213  zb21 = za21- pref(jl) *zxp2p*zexkm
214  zb22 = za22- pref(jl) *zxm2p*zexkp
215  zb23 = za23- pref(jl) *zexmu0*(zap2b - prmuz(jl) )
216  zdenb = za11 * zb22 - zb21 * za12
217  zidenb= 1.0_jprb/zdenb
218  zc1b = (zb22*za13-za12*zb23)*zidenb
219  zc2b = (za11*zb23-zb21*za13)*zidenb
220  zri0c = zc1b+zc2b-zalpha
221  zri1c = zrp*(zc1b-zc2b)-zbeta
222  pre2(jl) = (zri0c-zdt*zri1c) * zprmuz
223  zri0d = zc1b*zexkm + zc2b*zexkp - zalpha*zexmu0
224  zri1d = zrp * (zc1b*zexkm - zc2b*zexkp) - zbeta*zexmu0
225  ptr2(jl) = zexmu0 + (zri0d + zdt*zri1d) * zprmuz
226  ENDDO
227 
228 IF (lhook) CALL dr_hook('SWDE',1,zhook_handle)
229 END SUBROUTINE swde
230 
integer(kind=jpim) n_vmass
Definition: yomjfh.F90:11
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
integer(kind=jpim) novlp
Definition: yoerad.F90:24
integer, save kfdia
Definition: dimphy.F90:5
integer, parameter jprb
Definition: parkind1.F90:31
Definition: yoerad.F90:1
real(kind=jprb) replog
Definition: yoerdu.F90:19
logical lhook
Definition: yomhook.F90:12
subroutine swde(KIDIA, KFDIA, KLON, PGG, PREF, PRMUZ, PTO1, PW, PRE1, PRE2, PTR1, PTR2)
Definition: swde.F90:7
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
integer, parameter jpim
Definition: parkind1.F90:13
Definition: yomjfh.F90:1
Definition: yoerdu.F90:1