/[lmdze]/trunk/phylmd/Radlwsw/radlwsw.f90
ViewVC logotype

Contents of /trunk/phylmd/Radlwsw/radlwsw.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 337 - (show annotations)
Mon Sep 16 16:54:50 2019 UTC (4 years, 7 months ago) by guez
File size: 10092 byte(s)
In procedure newmicro, rename dummy argument cltau to cldtau. In
procedure nuage, rename dummy argument pcltau to cldtau. In procedure
radlwsw, rename dummy argument cldtaupd to cldtau. Motivation: same
variable name across procedures.

In procedure newmicro, no need for arrays zflwp and zfiwp: scalars are
sufficient (following LMDZ).

1 module radlwsw_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE radlwsw(dist, mu0, fract, paprs, play, tsol, albedo, t, q, wo, &
8 cldfra, cldemi, cldtau, heat, heat0, cool, cool0, radsol, albpla, &
9 topsw, toplw, solsw, sollw, sollwdown, topsw0, toplw0, solsw0, sollw0, &
10 lwdn0, lwdn, lwup0, lwup, swdn0, swdn, swup0, swup, ok_ade, topswad, &
11 solswad)
12
13 ! From LMDZ4/libf/phylmd/radlwsw.F, version 1.4, 2005/06/06 13:16:33
14 ! Author: Z. X. Li (LMD/CNRS)
15 ! Date: 1996/07/19
16
17 ! Objet : interface entre le modèle et les rayonnements solaire et
18 ! infrarouge
19
20 ! ATTENTION: swad has to be interpreted in the following manner:
21 ! not ok_ade zero
22 ! ok_ade aerosol direct forcing is F_{AD} = topsw - topswad
23
24 USE clesphys, ONLY: solaire
25 USE dimphy, ONLY: klev, klon
26 use lw_m, only: lw
27 USE raddim, ONLY: kdlon
28 USE suphec_m, ONLY: rg
29 use sw_m, only: sw
30 USE yoethf_m, ONLY: rvtmp2
31
32 real, intent(in):: dist ! distance astronomique terre-soleil
33 real, intent(in):: mu0(klon) ! cosinus de l'angle zenithal
34 real, intent(in):: fract(klon) ! duree d'ensoleillement normalisee
35 real, intent(in):: paprs(klon, klev+1) ! pression a inter-couche (Pa)
36 real, intent(in):: play(klon, klev) ! pression au milieu de couche (Pa)
37 real, intent(in):: tsol(klon) ! temperature du sol (en K)
38 real, intent(in):: albedo(klon) ! albedo du sol (entre 0 et 1)
39 real, intent(in):: t(klon, klev) ! temperature (K)
40 real, intent(in):: q(klon, klev) ! vapeur d'eau (en kg/kg)
41
42 real, intent(in):: wo(klon, klev)
43 ! column-density of ozone in a layer, in kilo-Dobsons
44
45 real, intent(in):: cldfra(klon, klev) ! fraction nuageuse (entre 0 et 1)
46
47 real, intent(in):: cldemi(klon, klev)
48 ! emissivite des nuages dans l'IR (entre 0 et 1)
49
50 real, intent(in):: cldtau(klon, klev)
51 ! \'epaisseur optique des nuages dans le visible (present-day value)
52
53 real, intent(out):: heat(klon, klev)
54 ! échauffement atmosphérique (visible) (K/jour)
55
56 real, intent(out):: heat0(klon, klev) ! chauffage solaire ciel clair
57 real, intent(out):: cool(klon, klev) ! refroidissement dans l'IR (K/jour)
58
59 real, intent(out):: cool0(klon, klev)
60 ! refroidissement infrarouge ciel clair
61
62 real, intent(out):: radsol(klon)
63 ! bilan radiatif net au sol (W/m**2), positif vers le bas
64
65 real, intent(out):: albpla(klon) ! albedo planetaire (entre 0 et 1)
66 real, intent(out):: topsw(klon) ! flux solaire net au sommet de l'atm.
67
68 real, intent(out):: toplw(klon)
69 ! rayonnement infrarouge montant au sommet de l'atmosphère
70
71 real, intent(out):: solsw(klon) ! flux solaire net à la surface
72
73 real, intent(out):: sollw(klon)
74 ! rayonnement infrarouge net à la surface
75
76 real, intent(out):: sollwdown(klon)
77 real, intent(out):: topsw0(klon)
78 real, intent(out):: toplw0(klon)
79 real, intent(out):: solsw0(klon), sollw0(klon)
80 REAL, intent(out):: lwdn0(klon, klev+1), lwdn(klon, klev+1)
81 REAL, intent(out):: lwup0(klon, klev+1), lwup(klon, klev+1)
82 REAL, intent(out):: swdn0(klon, klev+1), swdn(klon, klev+1)
83 REAL, intent(out):: swup0(klon, klev+1), swup(klon, klev+1)
84
85 logical, intent(in):: ok_ade ! apply the Aerosol Direct Effect
86
87 real, intent(out):: topswad(klon), solswad(klon)
88 ! aerosol direct forcing at TOA and surface
89 ! rayonnement solaire net absorb\'e
90
91 ! Local:
92
93 DOUBLE PRECISION ZFSUP(KDLON, KLEV+1)
94 DOUBLE PRECISION ZFSDN(KDLON, KLEV+1)
95 DOUBLE PRECISION ZFSUP0(KDLON, KLEV+1)
96 DOUBLE PRECISION ZFSDN0(KDLON, KLEV+1)
97
98 DOUBLE PRECISION ZFLUP(KDLON, KLEV+1)
99 DOUBLE PRECISION ZFLDN(KDLON, KLEV+1)
100 DOUBLE PRECISION ZFLUP0(KDLON, KLEV+1)
101 DOUBLE PRECISION ZFLDN0(KDLON, KLEV+1)
102
103 DOUBLE PRECISION zx_alpha1, zx_alpha2
104 INTEGER k, kk, i, iof, nb_gr
105 DOUBLE PRECISION PSCT
106
107 DOUBLE PRECISION PALBD(kdlon, 2), PALBP(kdlon, 2)
108 DOUBLE PRECISION PEMIS(kdlon), PDT0(kdlon), PVIEW(kdlon)
109 DOUBLE PRECISION PPSOL(kdlon), PDP(kdlon, klev)
110 DOUBLE PRECISION PTL(kdlon, klev+1), PPMB(kdlon, klev+1)
111 DOUBLE PRECISION PTAVE(kdlon, klev)
112 DOUBLE PRECISION PWV(kdlon, klev), PQS(kdlon, klev)
113 DOUBLE PRECISION POZON(kdlon, klev) ! mass fraction of ozone
114 DOUBLE PRECISION PAER(kdlon, klev, 5) ! AEROSOLS' OPTICAL THICKNESS
115 DOUBLE PRECISION PCLDLD(kdlon, klev)
116 DOUBLE PRECISION PCLDLU(kdlon, klev)
117 DOUBLE PRECISION PCLDSW(kdlon, klev)
118 DOUBLE PRECISION PTAU(kdlon, 2, klev)
119 DOUBLE PRECISION POMEGA(kdlon, 2, klev)
120 DOUBLE PRECISION PCG(kdlon, 2, klev)
121
122 DOUBLE PRECISION zfract(kdlon), zrmu0(kdlon)
123
124 DOUBLE PRECISION zheat(kdlon, klev), zcool(kdlon, klev)
125 DOUBLE PRECISION zheat0(kdlon, klev), zcool0(kdlon, klev)
126 DOUBLE PRECISION ztopsw(kdlon), ztoplw(kdlon)
127 DOUBLE PRECISION zsolsw(kdlon), zsollw(kdlon), zalbpla(kdlon)
128 DOUBLE PRECISION zsollwdown(kdlon)
129
130 DOUBLE PRECISION ztopsw0(kdlon), ztoplw0(kdlon)
131 DOUBLE PRECISION zsolsw0(kdlon), zsollw0(kdlon)
132 DOUBLE PRECISION zznormcp
133
134 !jq the following quantities are needed for the aerosol radiative forcings
135 DOUBLE PRECISION ztopswad(kdlon), zsolswad(kdlon)
136 ! Aerosol direct forcing at TOA and surface
137
138 real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
139
140 !----------------------------------------------------------------------
141
142 nb_gr = klon / kdlon
143 IF (nb_gr * kdlon /= klon) THEN
144 PRINT *, "kdlon mauvais :", klon, kdlon, nb_gr
145 stop 1
146 ENDIF
147
148 heat = 0.
149 cool = 0.
150 heat0 = 0.
151 cool0 = 0.
152 PSCT = solaire / dist**2
153
154 loop_iof: DO iof = 0, klon - kdlon, kdlon
155 DO i = 1, kdlon
156 zfract(i) = fract(iof+i)
157 zrmu0(i) = mu0(iof+i)
158 PALBD(i, 1) = albedo(iof+i)
159 PALBD(i, 2) = albedo(iof+i)
160 PALBP(i, 1) = albedo(iof+i)
161 PALBP(i, 2) = albedo(iof+i)
162 ! cf. JLD pour etre en accord avec ORCHIDEE il faut mettre
163 ! PEMIS(i) = 0.96
164 PEMIS(i) = 1.
165 PVIEW(i) = 1.66
166 PPSOL(i) = paprs(iof+i, 1)
167 zx_alpha1 = (paprs(iof+i, 1)-play(iof+i, 2)) &
168 / (play(iof+i, 1)-play(iof+i, 2))
169 zx_alpha2 = 1. - zx_alpha1
170 PTL(i, 1) = t(iof+i, 1) * zx_alpha1 + t(iof+i, 2) * zx_alpha2
171 PTL(i, klev+1) = t(iof+i, klev)
172 PDT0(i) = tsol(iof+i) - PTL(i, 1)
173 ENDDO
174 DO k = 2, klev
175 DO i = 1, kdlon
176 PTL(i, k) = (t(iof+i, k)+t(iof+i, k-1))*0.5
177 ENDDO
178 ENDDO
179 DO k = 1, klev
180 DO i = 1, kdlon
181 PDP(i, k) = paprs(iof+i, k)-paprs(iof+i, k+1)
182 PTAVE(i, k) = t(iof+i, k)
183 PWV(i, k) = MAX (q(iof+i, k), 1e-12)
184 PQS(i, k) = PWV(i, k)
185 POZON(i, k) = wo(iof+i, k) * RG * dobson_u * 1e3 &
186 / (paprs(iof+i, k) - paprs(iof+i, k+1))
187 PCLDLD(i, k) = cldfra(iof+i, k)*cldemi(iof+i, k)
188 PCLDLU(i, k) = cldfra(iof+i, k)*cldemi(iof+i, k)
189 PCLDSW(i, k) = cldfra(iof+i, k)
190 PTAU(i, 1, k) = MAX(cldtau(iof+i, k), 1e-05)
191 ! (1e-12 serait instable)
192 PTAU(i, 2, k) = MAX(cldtau(iof+i, k), 1e-05)
193 ! (pour 32-bit machines)
194 POMEGA(i, 1, k) = 0.9999 - 5e-04 * EXP(-0.5 * PTAU(i, 1, k))
195 POMEGA(i, 2, k) = 0.9988 - 2.5e-03 * EXP(-0.05 * PTAU(i, 2, k))
196 PCG(i, 1, k) = 0.865
197 PCG(i, 2, k) = 0.910
198 ENDDO
199 ENDDO
200
201 DO k = 1, klev+1
202 DO i = 1, kdlon
203 PPMB(i, k) = paprs(iof+i, k)/100.
204 ENDDO
205 ENDDO
206
207 DO kk = 1, 5
208 DO k = 1, klev
209 DO i = 1, kdlon
210 PAER(i, k, kk) = 1E-15
211 ENDDO
212 ENDDO
213 ENDDO
214
215 CALL LW(PPMB, PDP, PDT0, PEMIS, PTL, PTAVE, PWV, POZON, PAER, PCLDLD, &
216 PCLDLU, PVIEW, zcool, zcool0, ztoplw, zsollw, ztoplw0, zsollw0, &
217 zsollwdown, ZFLUP, ZFLDN, ZFLUP0, ZFLDN0)
218 CALL SW(PSCT, zrmu0, zfract, PPMB, PDP, PPSOL, PALBD, PALBP, PTAVE, &
219 PWV, PQS, POZON, PCLDSW, PTAU, POMEGA, PCG, zheat, zheat0, &
220 zalbpla, ztopsw, zsolsw, ztopsw0, zsolsw0, ZFSUP, ZFSDN, ZFSUP0, &
221 ZFSDN0, ztopswad, zsolswad, ok_ade)
222
223 DO i = 1, kdlon
224 radsol(iof+i) = zsolsw(i) + zsollw(i)
225 topsw(iof+i) = ztopsw(i)
226 toplw(iof+i) = ztoplw(i)
227 solsw(iof+i) = zsolsw(i)
228 sollw(iof+i) = zsollw(i)
229 sollwdown(iof+i) = zsollwdown(i)
230
231 DO k = 1, klev+1
232 lwdn0 ( iof+i, k) = ZFLDN0 ( i, k)
233 lwdn ( iof+i, k) = ZFLDN ( i, k)
234 lwup0 ( iof+i, k) = ZFLUP0 ( i, k)
235 lwup ( iof+i, k) = ZFLUP ( i, k)
236 ENDDO
237
238 topsw0(iof+i) = ztopsw0(i)
239 toplw0(iof+i) = ztoplw0(i)
240 solsw0(iof+i) = zsolsw0(i)
241 sollw0(iof+i) = zsollw0(i)
242 albpla(iof+i) = zalbpla(i)
243
244 DO k = 1, klev+1
245 swdn0 ( iof+i, k) = ZFSDN0 ( i, k)
246 swdn ( iof+i, k) = ZFSDN ( i, k)
247 swup0 ( iof+i, k) = ZFSUP0 ( i, k)
248 swup ( iof+i, k) = ZFSUP ( i, k)
249 ENDDO
250 ENDDO
251 ! transform the aerosol forcings, if they have to be calculated
252 IF (ok_ade) THEN
253 DO i = 1, kdlon
254 topswad(iof+i) = ztopswad(i)
255 solswad(iof+i) = zsolswad(i)
256 ENDDO
257 ELSE
258 DO i = 1, kdlon
259 topswad(iof+i) = 0.
260 solswad(iof+i) = 0.
261 ENDDO
262 ENDIF
263
264 DO k = 1, klev
265 DO i = 1, kdlon
266 ! scale factor to take into account the difference
267 ! between dry air and water vapour specific heat capacity
268 zznormcp = 1. + RVTMP2 * PWV(i, k)
269 heat(iof+i, k) = zheat(i, k) / zznormcp
270 cool(iof+i, k) = zcool(i, k)/zznormcp
271 heat0(iof+i, k) = zheat0(i, k)/zznormcp
272 cool0(iof+i, k) = zcool0(i, k)/zznormcp
273 ENDDO
274 ENDDO
275 end DO loop_iof
276
277 END SUBROUTINE radlwsw
278
279 end module radlwsw_m

  ViewVC Help
Powered by ViewVC 1.1.21