LMDZ
sw.F90
Go to the documentation of this file.
1 SUBROUTINE sw &
2  & ( kidia, kfdia , klon , klev , kaer,&
3  & psct , pcardi, ppsol , palbd, palbp , pwv, pqs,&
4  & prmu0, pcg , pcldsw, pdp , pomega, poz, ppmb,&
5  & ptau , ptave , paer,&
6  & pfdown, pfup,&
7  & pcdown, pcup,&
8  & pfdnn, pfdnv , pfupn, pfupv,&
9  & pcdnn, pcdnv , pcupn, pcupv,&
10  & psudu, puvdf , pparf, pparcf, pdiffs , pdirfs, &
11  & lrdust, ppiza_dst,pcga_dst,ptaurel_dst &
12  & )
13 
14 
15 !**** *SW* - COMPUTES THE SHORTWAVE RADIATION FLUXES.
16 
17 ! PURPOSE.
18 ! --------
19 
20 ! THIS ROUTINE COMPUTES THE SHORTWAVE RADIATION FLUXES IN TWO
21 ! SPECTRAL INTERVALS FOLLOWING FOUQUART AND BONNEL (1980).
22 
23 !** INTERFACE.
24 ! ----------
25 
26 ! *SW* IS CALLED FROM *RADLSW*
27 
28 ! IMPLICIT ARGUMENTS :
29 ! --------------------
30 
31 ! ==== INPUTS ===
32 ! ==== OUTPUTS ===
33 
34 ! METHOD.
35 ! -------
36 
37 ! 1. COMPUTES ABSORBER AMOUNTS (SWU)
38 ! 2. COMPUTES FLUXES IN U.V./VISIBLE SPECTRAL INTERVAL (SW1S)
39 ! 3. COMPUTES FLUXES IN NEAR-INFRARED SPECTRAL INTERVAL (SWNI)
40 
41 ! EXTERNALS.
42 ! ----------
43 
44 ! *SWU*, *SW1S*, *SWNI*
45 
46 ! REFERENCE.
47 ! ----------
48 
49 ! SEE RADIATION'S PART OF THE ECMWF RESEARCH DEPARTMENT
50 ! DOCUMENTATION, AND FOUQUART AND BONNEL (1980)
51 
52 ! AUTHOR.
53 ! -------
54 ! JEAN-JACQUES MORCRETTE *ECMWF*
55 
56 ! MODIFICATIONS.
57 ! --------------
58 ! ORIGINAL : 89-07-14
59 ! 95-01-01 J.-J. MORCRETTE Direct/Diffuse Albedo
60 ! 95-12-07 J.-J. MORCRETTE Near-Infrared in nsw-1 Intervals
61 ! 990128 JJMorcrette sunshine duration
62 ! 99-05-25 JJMorcrette Revised aerosols
63 ! 00-12-18 JJMorcrette 6 spectral intervals
64 ! 02-09-01 JJMorcrette UV and PAR
65 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
66 ! Y.Seity 04-11-18 : add two arguments for AROME extern. surface
67 ! Y.Seity 05-10-10 : add add 3 optional arg. for dust SW properties
68 ! JJMorcrette 20060721 PP of clear-sky PAR
69 ! ------------------------------------------------------------------
70 
71 USE parkind1 ,ONLY : jpim ,jprb
72 USE yomhook ,ONLY : lhook, dr_hook
73 !USE YOERAD , ONLY : NSW
74 ! NSW mis dans .def MPL 20140211
76 
77 IMPLICIT NONE
78 
79 include "clesphys.h"
80 
81 integer, save :: icount=0
82 !$OMP THREADPRIVATE(icount)
83 INTEGER(KIND=JPIM),INTENT(IN) :: KLON
84 INTEGER(KIND=JPIM),INTENT(IN) :: KLEV
85 INTEGER(KIND=JPIM),INTENT(IN) :: KIDIA
86 INTEGER(KIND=JPIM),INTENT(IN) :: KFDIA
87 INTEGER(KIND=JPIM),INTENT(IN) :: KAER
88 REAL(KIND=JPRB) ,INTENT(IN) :: PSCT
89 REAL(KIND=JPRB) ,INTENT(IN) :: PCARDI
90 REAL(KIND=JPRB) ,INTENT(IN) :: PPSOL(klon)
91 REAL(KIND=JPRB) ,INTENT(IN) :: PALBD(klon,nsw)
92 REAL(KIND=JPRB) ,INTENT(IN) :: PALBP(klon,nsw)
93 REAL(KIND=JPRB) ,INTENT(IN) :: PWV(klon,klev)
94 REAL(KIND=JPRB) ,INTENT(IN) :: PQS(klon,klev)
95 REAL(KIND=JPRB) ,INTENT(IN) :: PRMU0(klon)
96 REAL(KIND=JPRB) ,INTENT(IN) :: PCG(klon,nsw,klev)
97 REAL(KIND=JPRB) ,INTENT(IN) :: PCLDSW(klon,klev)
98 REAL(KIND=JPRB) :: PDP(klon,klev) ! Argument NOT used
99 REAL(KIND=JPRB) ,INTENT(IN) :: POMEGA(klon,nsw,klev)
100 REAL(KIND=JPRB) ,INTENT(IN) :: POZ(klon,klev)
101 REAL(KIND=JPRB) ,INTENT(IN) :: PPMB(klon,klev+1)
102 REAL(KIND=JPRB) ,INTENT(IN) :: PTAU(klon,nsw,klev)
103 REAL(KIND=JPRB) ,INTENT(IN) :: PTAVE(klon,klev)
104 REAL(KIND=JPRB) ,INTENT(IN) :: PAER(klon,6,klev)
105 !++MODIFCODE
106 LOGICAL ,INTENT(IN) :: LRDUST
107 REAL(KIND=JPRB) ,INTENT(IN) :: PPIZA_DST(klon,klev,nsw)
108 REAL(KIND=JPRB) ,INTENT(IN) :: PCGA_DST(klon,klev,nsw)
109 REAL(KIND=JPRB) ,INTENT(IN) :: PTAUREL_DST(klon,klev,nsw)
110 !--MODIFCODE
111 REAL(KIND=JPRB) ,INTENT(OUT) :: PFDOWN(klon,klev+1)
112 REAL(KIND=JPRB) ,INTENT(OUT) :: PFUP(klon,klev+1)
113 REAL(KIND=JPRB) ,INTENT(OUT) :: PCDOWN(klon,klev+1)
114 REAL(KIND=JPRB) ,INTENT(OUT) :: PCUP(klon,klev+1)
115 REAL(KIND=JPRB) ,INTENT(OUT) :: PFDNN(klon)
116 REAL(KIND=JPRB) ,INTENT(OUT) :: PFDNV(klon)
117 REAL(KIND=JPRB) ,INTENT(OUT) :: PFUPN(klon)
118 REAL(KIND=JPRB) ,INTENT(OUT) :: PFUPV(klon)
119 REAL(KIND=JPRB) ,INTENT(OUT) :: PCDNN(klon)
120 REAL(KIND=JPRB) ,INTENT(OUT) :: PCDNV(klon)
121 REAL(KIND=JPRB) ,INTENT(OUT) :: PCUPN(klon)
122 REAL(KIND=JPRB) ,INTENT(OUT) :: PCUPV(klon)
123 REAL(KIND=JPRB) ,INTENT(OUT) :: PSUDU(klon)
124 REAL(KIND=JPRB) ,INTENT(OUT) :: PUVDF(klon)
125 REAL(KIND=JPRB) ,INTENT(OUT) :: PPARF(klon)
126 REAL(KIND=JPRB) ,INTENT(OUT) :: PPARCF(klon)
127 REAL(KIND=JPRB) ,INTENT(OUT) :: PDIFFS(klon,nsw)
128 REAL(KIND=JPRB) ,INTENT(OUT) :: PDIRFS(klon,nsw)
129 ! ------------------------------------------------------------------
130 
131 !* 0.1 ARGUMENTS
132 ! ---------
133 
134 ! ------------------------------------------------------------------
135 
136 ! ------------
137 
138 REAL(KIND=JPRB) :: ZAKI(klon,2,nsw)&
139  & , ZCLD(KLON,KLEV) , ZCLEAR(KLON) &
140  & , ZDSIG(KLON,KLEV) , ZFACT(KLON)&
141  & , ZFD(KLON,KLEV+1) , ZCD(KLON,KLEV+1)&
142  & , ZCDOWN(KLON,KLEV+1), ZCDNIR(KLON,KLEV+1), ZCDUVS(KLON,KLEV+1)&
143  & , ZFDOWN(KLON,KLEV+1), ZFDNIR(KLON,KLEV+1), ZFDUVS(KLON,KLEV+1)&
144  & , ZFU(KLON,KLEV+1) , ZCU(KLON,KLEV+1)&
145  & , ZCUP(KLON,KLEV+1) , ZCUNIR(KLON,KLEV+1), ZCUUVS(KLON,KLEV+1)&
146  & , ZFUP(KLON,KLEV+1) , ZFUNIR(KLON,KLEV+1), ZFUUVS(KLON,KLEV+1)&
147  & , ZRMU(KLON) , ZSEC(KLON) &
148  & , ZSUDU1(KLON) , ZSUDU2(KLON) &
149  & , ZSUDU1T(KLON) , ZSUDU2T(KLON) &
150  & , ZUD(KLON,5,KLEV+1) ,ZDIFF(KLON,KLEV) ,ZDIRF(KLON,KLEV) &
151  & , ZDIFF2(KLON,KLEV) , ZDIRF2(KLON,KLEV)
152 
153 INTEGER(KIND=JPIM) :: JK, JL, JNU, INUVS, INUIR
154 
155 REAL(KIND=JPRB) :: ZHOOK_HANDLE
156 LOGICAL :: LLDEBUG
157 character*1 str1
158 
159 #include "sw1s.intfb.h"
160 #include "swni.intfb.h"
161 #include "swu.intfb.h"
162 
163 ! ------------------------------------------------------------------
164 
165 !* 1. ABSORBER AMOUNTS AND OTHER USEFUL QUANTITIES
166 ! --------------------------------------------
167 
168 IF (lhook) CALL dr_hook('SW',0,zhook_handle)
169 lldebug=.false.
170 CALL swu ( kidia,kfdia ,klon ,klev,&
171  & psct ,pcardi,pcldsw,ppmb ,ppsol,&
172  & prmu0,ptave ,pwv,&
173  & zaki ,zcld ,zclear,zdsig,zfact,zrmu,zsec,zud )
174 
175 ! ------------------------------------------------------------------
176 !* 2. INTERVAL (0.185/0.25-0.68 MICRON): U.V. AND VISIBLE
177 ! ---------------------------------------------------
178 IF (nsw <= 4) THEN
179  inuvs=1
180  inuir=2
181 ELSEIF (nsw == 6) THEN
182  inuvs=1
183  inuir=4
184 ENDIF
185 
186 DO jk = 1 , klev+1
187  DO jl = kidia,kfdia
188  zfd(jl,jk) =0.0_jprb
189  zfu(jl,jk) =0.0_jprb
190  zcd(jl,jk) =0.0_jprb
191  zcu(jl,jk) =0.0_jprb
192  ENDDO
193 ENDDO
194 DO jl = kidia,kfdia
195  zsudu1t(jl)=0.0_jprb
196  puvdf(jl) =0.0_jprb
197  pparf(jl) =0.0_jprb
198  pparcf(jl) =0.0_jprb
199 ENDDO
200 
201 IF(lldebug) THEN
202 call writefield_phy('sw_zsec',zsec,1)
203 call writefield_phy('sw_zrmu',zrmu,1)
204 call writefield_phy('sw_prmu0',prmu0,1)
205 call writefield_phy('sw_zfact',zfact,1)
206 ENDIF
207 
208 icount=icount+1
209 DO jnu = inuvs , inuir-1
210  !++MODIFCODE
211  CALL sw1s &
212  &( kidia , kfdia, klon , klev , kaer , jnu &
213  &, paer , palbd , palbp, pcg , zcld , zclear &
214  &, zdsig, pomega, poz , zrmu , zsec , ptau , zud &
215  &, zfduvs,zfuuvs, zcduvs,zcuuvs, zsudu1, zdiff,zdirf &
216  &, lrdust,ppiza_dst(:,:,jnu) & ! SSA for this wavelength
217  &, pcga_dst(:,:,jnu) & ! GCA for this wavelengt
218  &, ptaurel_dst(:,:,jnu) ) ! TAUREL for this wavelength
219  !--MODIFCODE
220 IF(lldebug) THEN
221 ! Ecriture des champs avec un indicage du fichier par l'intervalle spectral
222  write(str1,'(i1)') jnu
223  call writefield_phy("sw_zcduvs"//str1,zcduvs,klev+1)
224 ENDIF
225 
226 
227  DO jl=kidia,kfdia
228  pdiffs(jl,jnu)=zdiff(jl,1)*zfact(jl)
229  pdirfs(jl,jnu)=zdirf(jl,1)*zfact(jl)
230  ENDDO
231  DO jk = 1 , klev+1
232  DO jl = kidia,kfdia
233  zfd(jl,jk)=zfd(jl,jk)+zfduvs(jl,jk)
234  zfu(jl,jk)=zfu(jl,jk)+zfuuvs(jl,jk)
235  zcd(jl,jk)=zcd(jl,jk)+zcduvs(jl,jk)
236  zcu(jl,jk)=zcu(jl,jk)+zcuuvs(jl,jk)
237  ENDDO
238  ENDDO
239  DO jl = kidia,kfdia
240  zsudu1t(jl)=zsudu1t(jl)+zsudu1(jl)
241  ENDDO
242 
243  IF (nsw == 6) THEN
244  IF (jnu <= 2) THEN
245  DO jl = kidia,kfdia
246  puvdf(jl)=puvdf(jl)+zfduvs(jl,1)
247  ENDDO
248  ELSEIF (jnu == 3) THEN
249  DO jl=kidia,kfdia
250  pparf(jl)=pparf(jl)+zfduvs(jl,1)
251  pparcf(jl)=pparcf(jl)+zcduvs(jl,1)
252  ENDDO
253  ENDIF
254  ENDIF
255 ENDDO
256 
257 !if (icount==5) stop'on arrete dans sw.F90 au bout de 5 appels'
258 ! ------------------------------------------------------------------
259 
260 !* 3. INTERVAL (0.68-4.00 MICRON): NEAR-INFRARED
261 ! ------------------------------------------
262 
263 DO jk = 1 , klev+1
264  DO jl = kidia,kfdia
265  zfdown(jl,jk)=0.0_jprb
266  zfup(jl,jk)=0.0_jprb
267  zcdown(jl,jk)=0.0_jprb
268  zcup(jl,jk)=0.0_jprb
269  zsudu2t(jl) =0.0_jprb
270  ENDDO
271 ENDDO
272 
273 DO jnu = inuir , nsw
274  !++MODIFCODE
275  CALL swni &
276  &( kidia ,kfdia , klon , klev , kaer , jnu &
277  &, paer ,zaki , palbd, palbp, pcg , zcld, zclear &
278  &, zdsig ,pomega, poz , zrmu , zsec , ptau, zud &
279  &, pwv ,pqs &
280  &, zfdnir,zfunir,zcdnir,zcunir,zsudu2,zdiff2,zdirf2 &
281  &, lrdust,ppiza_dst(:,:,jnu) &
282  &, pcga_dst(:,:,jnu) &
283  &, ptaurel_dst(:,:,jnu) &
284  &)
285  !--MODIFCODE
286 
287 IF(lldebug) THEN
288 ! Ecriture des champs avec un indicage du fichier par l'intervalle spectral
289  write(str1,'(i1)') jnu
290  call writefield_phy("sw_zcdnir"//str1,zcdnir,klev+1)
291 ENDIF
292 
293  DO jl=kidia,kfdia
294  pdiffs(jl,jnu)=zdiff2(jl,1)*zfact(jl)
295  pdirfs(jl,jnu)=zdirf2(jl,1)*zfact(jl)
296  ENDDO
297  DO jk = 1 , klev+1
298  DO jl = kidia,kfdia
299  zfdown(jl,jk)=zfdown(jl,jk)+zfdnir(jl,jk)
300  zfup(jl,jk)=zfup(jl,jk)+zfunir(jl,jk)
301  zcdown(jl,jk)=zcdown(jl,jk)+zcdnir(jl,jk)
302  zcup(jl,jk)=zcup(jl,jk)+zcunir(jl,jk)
303  ENDDO
304  ENDDO
305  DO jl = kidia,kfdia
306  zsudu2t(jl)=zsudu2t(jl)+zsudu2(jl)
307  ENDDO
308 ENDDO
309 
310 ! ------------------------------------------------------------------
311 
312 !* 4. FILL THE DIAGNOSTIC ARRAYS
313 ! --------------------------
314 
315 DO jl = kidia,kfdia
316  pfdnn(jl)=zfdown(jl,1)*zfact(jl)
317  pfdnv(jl)=zfd(jl,1)*zfact(jl)
318  pfupn(jl)=zfup(jl,klev+1)*zfact(jl)
319  pfupv(jl)=zfu(jl,klev+1)*zfact(jl)
320 
321  pcdnn(jl)=zcdown(jl,1)*zfact(jl)
322  pcdnv(jl)=zcd(jl,1)*zfact(jl)
323  pcupn(jl)=zcup(jl,klev+1)*zfact(jl)
324  pcupv(jl)=zcu(jl,klev+1)*zfact(jl)
325 
326  psudu(jl)=(zsudu1t(jl)+zsudu2t(jl))*zfact(jl)
327  puvdf(jl)=puvdf(jl)*zfact(jl)
328  pparf(jl)=pparf(jl)*zfact(jl)
329  pparcf(jl)=pparcf(jl)*zfact(jl)
330 ENDDO
331 
332 !WRITE(*,'("---> Dans SW:")')
333 !WRITE(*,'("ZFUP ",10E12.5)') (ZFUP(1,JK),JK=1,KLEV+1)
334 !WRITE(*,'("ZFU ",10E12.5)') (ZFU(1,JK),JK=1,KLEV+1)
335 !WRITE(*,'("ZFUNIR",10E12.5)') (ZFUNIR(1,JK),JK=1,KLEV+1)
336 !WRITE(*,'("ZFACT ",E12.5)') ZFACT(1)
337 
338 DO jk = 1 , klev+1
339  DO jl = kidia,kfdia
340  pfup(jl,jk) = (zfup(jl,jk) + zfu(jl,jk)) * zfact(jl)
341  pfdown(jl,jk) = (zfdown(jl,jk) + zfd(jl,jk)) * zfact(jl)
342  pcup(jl,jk) = (zcup(jl,jk) + zcu(jl,jk)) * zfact(jl)
343  pcdown(jl,jk) = (zcdown(jl,jk) + zcd(jl,jk)) * zfact(jl)
344  ENDDO
345 ENDDO
346 IF(lldebug) THEN
347 call writefield_phy('sw_pcdown',pcdown,klev+1)
348 ENDIF
349 
350 ! ------------------------------------------------------------------
351 
352 IF (lhook) CALL dr_hook('SW',1,zhook_handle)
353 END SUBROUTINE sw
subroutine sw(KIDIA, KFDIA, KLON, KLEV, KAER, PSCT, PCARDI, PPSOL, PALBD, PALBP, PWV, PQS, PRMU0, PCG, PCLDSW, PDP, POMEGA, POZ, PPMB, PTAU, PTAVE, PAER, PFDOWN, PFUP, PCDOWN, PCUP, PFDNN, PFDNV, PFUPN, PFUPV, PCDNN, PCDNV, PCUPN, PCUPV, PSUDU, PUVDF, PPARF, PPARCF, PDIFFS, PDIRFS, LRDUST, PPIZA_DST, PCGA_DST, PTAUREL_DST)
Definition: sw.F90:13
subroutine swni(KIDIA, KFDIA, KLON, KLEV, KAER, KNU, PAER, PAKI, PALBD, PALBP, PCG, PCLD, PCLEAR, PDSIG, POMEGA, POZ, PRMU, PSEC, PTAU, PUD, PWV, PQS, PFDOWN, PFUP, PCDOWN, PCUP, PSUDU2, PDIFF, PDIRF,
Definition: swni.F90:8
integer, save kidia
Definition: dimphy.F90:6
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
subroutine sw1s(KIDIA, KFDIA, KLON, KLEV, KAER, KNU, PAER, PALBD, PALBP, PCG, PCLD, PCLEAR, PDSIG, POMEGA, POZ, PRMU, PSEC, PTAU, PUD, PFD, PFU, PCD, PCU, PSUDU1, PDIFF, PDIRF,
Definition: sw1s.F90:7
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
integer, save kfdia
Definition: dimphy.F90:5
integer, parameter jprb
Definition: parkind1.F90:31
logical lhook
Definition: yomhook.F90:12
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
subroutine writefield_phy(name, Field, ll)
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
INTERFACE SUBROUTINE RRTM_ECRT_140GP && paer