LMDZ
swu.F90
Go to the documentation of this file.
1 !OPTIONS XOPT(HSFUN)
2 SUBROUTINE swu &
3  & ( kidia, kfdia , klon , klev,&
4  & psct , pcardi, pcldsw, ppmb , ppsol, prmu0, ptave, pwv,&
5  & paki , pcld , pclear, pdsig, pfact, prmu , psec , pud &
6  & )
7 
8 !**** *SWU* - SHORTWAVE RADIATION, ABSORBER AMOUNTS
9 
10 ! PURPOSE.
11 ! --------
12 ! COMPUTES THE ABSORBER AMOUNTS USED IN SHORTWAVE RADIATION
13 ! CALCULATIONS
14 
15 !** INTERFACE.
16 ! ----------
17 ! *SWU* IS CALLED BY *SW*
18 
19 ! IMPLICIT ARGUMENTS :
20 ! --------------------
21 
22 ! ==== INPUTS ===
23 ! ==== OUTPUTS ===
24 
25 ! METHOD.
26 ! -------
27 
28 ! 1. COMPUTES ABSORBER AMOUNTS WITH TEMPERATURE AND PRESSURE
29 ! SCALING.
30 
31 ! EXTERNALS.
32 ! ----------
33 
34 ! *SWTT*
35 
36 ! REFERENCE.
37 ! ----------
38 
39 ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT
40 ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)
41 
42 ! AUTHOR.
43 ! -------
44 ! JEAN-JACQUES MORCRETTE *ECMWF*
45 
46 ! MODIFICATIONS.
47 ! --------------
48 ! ORIGINAL : 89-07-14
49 ! 03-03-18 JJMorcrette security on normalized cloud cover
50 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
51 ! Y.Seity 06-09-09 : add modset from O.Thouron (MesoNH) under NOVLP tests
52 
53 ! ------------------------------------------------------------------
54 
55 USE parkind1 ,ONLY : jpim ,jprb
56 USE yomhook ,ONLY : lhook, dr_hook
57 
58 USE yoecld , ONLY : repsec
59 !USE YOERAD , ONLY : NOVLP ,NSW
60 ! NSW mis dans .def MPL 20140211
61 USE yoerad , ONLY : novlp
62 USE yoerdu , ONLY : repscq
63 USE yoesw , ONLY : rpdh1 ,rpdu1 ,rpnh ,rpnu ,&
64  & rtdh2o ,rtdumg ,rth2o ,rtumg
65 USE yoeovlp , ONLY : ra1ovlp
66 
67 IMPLICIT NONE
68 
69 include "clesphys.h"
70 INTEGER(KIND=JPIM),INTENT(IN) :: KLON
71 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
72 INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA
73 INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA
74 REAL(KIND=JPRB) ,INTENT(IN) :: PSCT
75 REAL(KIND=JPRB) ,INTENT(IN) :: PCARDI
76 REAL(KIND=JPRB) ,INTENT(IN) :: PCLDSW(klon,klev)
77 REAL(KIND=JPRB) ,INTENT(IN) :: PPMB(klon,klev+1)
78 REAL(KIND=JPRB) ,INTENT(IN) :: PPSOL(klon)
79 REAL(KIND=JPRB) ,INTENT(IN) :: PRMU0(klon)
80 REAL(KIND=JPRB) ,INTENT(IN) :: PTAVE(klon,klev)
81 REAL(KIND=JPRB) ,INTENT(IN) :: PWV(klon,klev)
82 REAL(KIND=JPRB) ,INTENT(OUT) :: PAKI(klon,2,nsw)
83 REAL(KIND=JPRB) ,INTENT(INOUT) :: PCLD(klon,klev)
84 REAL(KIND=JPRB) ,INTENT(OUT) :: PCLEAR(klon)
85 REAL(KIND=JPRB) ,INTENT(OUT) :: PDSIG(klon,klev)
86 REAL(KIND=JPRB) ,INTENT(OUT) :: PFACT(klon)
87 REAL(KIND=JPRB) ,INTENT(OUT) :: PRMU(klon)
88 REAL(KIND=JPRB) ,INTENT(OUT) :: PSEC(klon)
89 REAL(KIND=JPRB) ,INTENT(OUT) :: PUD(klon,5,klev+1)
90 ! ------------------------------------------------------------------
91 
92 !* 0.1 ARGUMENTS
93 ! ---------
94 
95 INTEGER(KIND=JPIM) :: INUIR
96 
97 ! ------------------------------------------------------------------
98 
99 ! ------------
100 
101 INTEGER(KIND=JPIM) :: IIND(2)
102 REAL(KIND=JPRB) :: ZC1J(klon,klev+1),ZCLEAR(klon),ZCLOUD(klon)&
103  & , ZN175(KLON), ZN190(KLON), ZO175(KLON)&
104  & , ZO190(KLON), ZSIGN(KLON)&
105  & , ZR(KLON,2) , ZSIGO(KLON), ZUD(KLON,2)
106 
107 INTEGER(KIND=JPIM) :: JA, JK, JKL, JKLP1, JKP1, JL, JNU
108 
109 REAL(KIND=JPRB) :: ZDSCO2, ZDSH2O, ZFPPW, ZRTH, ZRTU, ZWH2O, ZALPHA1
110 REAL(KIND=JPRB) :: ZHOOK_HANDLE
111 
112 #include "swtt1.intfb.h"
113 
114 ! ------------------------------------------------------------------
115 
116 !* 1. COMPUTES AMOUNTS OF ABSORBERS
117 ! -----------------------------
118 
119 repsec=1.e-12_jprb !!!!! A REVOIR (MPL)
120 IF (lhook) CALL dr_hook('SWU',0,zhook_handle)
121 iind(1)=1
122 iind(2)=2
123 
124 !* 1.1 INITIALIZES QUANTITIES
125 ! ----------------------
126 
127 DO jl = kidia,kfdia
128  pud(jl,1,klev+1)=0.0_jprb
129  pud(jl,2,klev+1)=0.0_jprb
130  pud(jl,3,klev+1)=0.0_jprb
131  pud(jl,4,klev+1)=0.0_jprb
132  pud(jl,5,klev+1)=0.0_jprb
133  pfact(jl)= prmu0(jl) * psct
134 !- already accounted for in RADINT
135 ! PRMU(JL)=SQRT(1224.* PRMU0(JL) * PRMU0(JL) + 1.) / 35.
136  prmu(jl)=prmu0(jl)
137  psec(jl)=1.0_jprb/prmu(jl)
138  zc1j(jl,klev+1)=0.0_jprb
139 ENDDO
140 
141 !* 1.3 AMOUNTS OF ABSORBERS
142 ! --------------------
143 
144 DO jl= kidia,kfdia
145  zud(jl,1) = 0.0_jprb
146  zud(jl,2) = 0.0_jprb
147  zo175(jl) = ppsol(jl)** rpdu1
148  zo190(jl) = ppsol(jl)** rpdh1
149  zsigo(jl) = ppsol(jl)
150  zclear(jl)=1.0_jprb
151  zcloud(jl)=0.0_jprb
152 ENDDO
153 
154 DO jk = 1 , klev
155  jkp1 = jk + 1
156  jkl = klev+1 - jk
157  jklp1 = jkl+1
158  zalpha1=ra1ovlp(klev+1-jk)
159 
160  DO jl = kidia,kfdia
161  zrth=(rth2o/ptave(jl,jk))**rtdh2o
162  zrtu=(rtumg/ptave(jl,jk))**rtdumg
163  zwh2o = max(pwv(jl,jkl) , repscq )
164 
165  zsign(jl) = 100._jprb * ppmb(jl,jkp1)
166  pdsig(jl,jk) = (zsigo(jl) - zsign(jl))/ppsol(jl)
167  zn175(jl) = zsign(jl) ** rpdu1
168  zn190(jl) = zsign(jl) ** rpdh1
169  zdsco2 = zo175(jl) - zn175(jl)
170  zdsh2o = zo190(jl) - zn190(jl)
171  pud(jl,1,jk) = rpnh * zdsh2o * zwh2o * zrth
172  pud(jl,2,jk) = rpnu * zdsco2 * pcardi * zrtu
173 
174  zfppw=1.6078_jprb*zwh2o/(1.0_jprb+0.608_jprb*zwh2o)
175  pud(jl,4,jk)=pud(jl,1,jk)*zfppw
176  pud(jl,5,jk)=pud(jl,1,jk)*(1.0_jprb-zfppw)
177  zud(jl,1) = zud(jl,1) + pud(jl,1,jk)
178  zud(jl,2) = zud(jl,2) + pud(jl,2,jk)
179  zsigo(jl) = zsign(jl)
180  zo175(jl) = zn175(jl)
181  zo190(jl) = zn190(jl)
182 !print *,'SWU: RTH2O RTDH2O RTUMG RTDUMG',RTH2O,RTDH2O,RTUMG,RTDUMG
183 !print *,'SWU: RPNH ZDSH2O ZWH2O ZRTH',RPNH,ZDSH2O,ZWH2O,ZRTH
184 !print *,'SWU: RPNU ZDSCO2 PCARDI ZRTU',RPNU,ZDSCO2,PCARDI,ZRTU
185 
186 !++MODIFCODE
187  IF ((novlp == 1).OR.(novlp==6).OR.(novlp==8)) THEN
188  zclear(jl)=zclear(jl)&
189  & *(1.0_jprb-max(pcldsw(jl,jkl),zcloud(jl)))&
190  & /(1.0_jprb-min(zcloud(jl),1.0_jprb-repsec))
191  zc1j(jl,jkl)= 1.0_jprb - zclear(jl)
192  zcloud(jl) = pcldsw(jl,jkl)
193  ELSEIF ((novlp == 2).OR.(novlp==7)) THEN
194  zcloud(jl) = max(pcldsw(jl,jkl),zcloud(jl))
195  zc1j(jl,jkl) = zcloud(jl)
196  ELSEIF ((novlp == 3).OR.(novlp==5)) THEN
197  zclear(jl) = zclear(jl)*(1.0_jprb-pcldsw(jl,jkl))
198  zcloud(jl) = 1.0_jprb - zclear(jl)
199  zc1j(jl,jkl) = zcloud(jl)
200  ELSEIF (novlp == 4) THEN
201 !** Hogan & Illingworth (2001)
202  zclear(jl)=zclear(jl)*( &
203  & zalpha1*(1.0_jprb-max(pcldsw(jl,jkl),zcloud(jl))) &
204  & /(1.0_jprb-min(zcloud(jl),1.0_jprb-repsec)) &
205  & +(1.0_jprb-zalpha1)*(1.0_jprb-pcldsw(jl,jkl)) )
206  zc1j(jl,jkl) = 1.0_jprb - zclear(jl)
207  zcloud(jl) = pcldsw(jl,jkl)
208  ENDIF
209 !--MODIFCODE
210  ENDDO
211 ENDDO
212 
213 DO jl=kidia,kfdia
214  pclear(jl)=1.0_jprb-zc1j(jl,1)
215 ENDDO
216 DO jk=1,klev
217  DO jl=kidia,kfdia
218  IF (pclear(jl) < 1.0_jprb) THEN
219  pcld(jl,jk)=pcldsw(jl,jk)/(1.0_jprb-pclear(jl))
220  ELSE
221  pcld(jl,jk)=0.0_jprb
222  ENDIF
223  pcld(jl,jk)=max(0.0_jprb,min(1.0_jprb,pcld(jl,jk)))
224  ENDDO
225 ENDDO
226 
227 !* 1.4 COMPUTES CLEAR-SKY GREY ABSORPTION COEFFICIENTS
228 ! -----------------------------------------------
229 
230 DO ja = 1,2
231  DO jl = kidia,kfdia
232  zud(jl,ja) = zud(jl,ja) * psec(jl)
233  ENDDO
234 ENDDO
235 
236 IF (nsw <= 4) THEN
237  inuir=2
238 ELSEIF (nsw == 6) THEN
239  inuir=4
240 ENDIF
241 
242 DO jnu= inuir,nsw
243 
244  CALL swtt1 ( kidia,kfdia,klon, jnu, 2, iind,&
245  & zud,&
246  & zr )
247 
248  DO ja = 1,2
249  DO jl = kidia,kfdia
250  paki(jl,ja,jnu) = -log( zr(jl,ja) ) / zud(jl,ja)
251  ENDDO
252  ENDDO
253 ENDDO
254 
255 ! ------------------------------------------------------------------
256 
257 IF (lhook) CALL dr_hook('SWU',1,zhook_handle)
258 END SUBROUTINE swu
259 
Definition: yoesw.F90:1
real(kind=jprb) rth2o
Definition: yoesw.F90:26
integer, save kidia
Definition: dimphy.F90:6
real(kind=jprb) rpnu
Definition: yoesw.F90:21
integer, save klon
Definition: dimphy.F90:3
integer(kind=jpim) novlp
Definition: yoerad.F90:24
real(kind=jprb) rtdumg
Definition: yoesw.F90:25
integer, save klev
Definition: dimphy.F90:7
real(kind=jprb) rpdh1
Definition: yoesw.F90:18
real(kind=jprb) repsec
Definition: yoecld.F90:37
real(kind=jprb) rtumg
Definition: yoesw.F90:27
integer, save kfdia
Definition: dimphy.F90:5
integer, parameter jprb
Definition: parkind1.F90:31
Definition: yoerad.F90:1
logical lhook
Definition: yomhook.F90:12
real(kind=jprb) rtdh2o
Definition: yoesw.F90:24
real(kind=jprb), dimension(:), allocatable ra1ovlp
Definition: yoeovlp.F90:13
real(kind=jprb) repscq
Definition: yoerdu.F90:22
Definition: yoecld.F90:1
subroutine swtt1(KIDIA, KFDIA, KLON, KNU, KABS, KIND, PU, PTR)
Definition: swtt1.F90:2
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
real(kind=jprb) rpnh
Definition: yoesw.F90:20
subroutine swu(KIDIA, KFDIA, KLON, KLEV, PSCT, PCARDI, PCLDSW, PPMB, PPSOL, PRMU0, PTAVE, PWV, PAKI, PCLD, PCLEAR, PDSIG, PFACT, PRMU, PSEC, PUD)
Definition: swu.F90:7
integer, parameter jpim
Definition: parkind1.F90:13
real(kind=jprb) rpdu1
Definition: yoesw.F90:19
Definition: yoerdu.F90:1