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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 337 - (hide annotations)
Mon Sep 16 16:54:50 2019 UTC (4 years, 8 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 guez 53 module radlwsw_m
2 guez 3
3 guez 53 IMPLICIT none
4 guez 3
5 guez 53 contains
6    
7 guez 212 SUBROUTINE radlwsw(dist, mu0, fract, paprs, play, tsol, albedo, t, q, wo, &
8 guez 337 cldfra, cldemi, cldtau, heat, heat0, cool, cool0, radsol, albpla, &
9 guez 212 topsw, toplw, solsw, sollw, sollwdown, topsw0, toplw0, solsw0, sollw0, &
10 guez 217 lwdn0, lwdn, lwup0, lwup, swdn0, swdn, swup0, swup, ok_ade, topswad, &
11     solswad)
12 guez 53
13 guez 217 ! From LMDZ4/libf/phylmd/radlwsw.F, version 1.4, 2005/06/06 13:16:33
14 guez 69 ! Author: Z. X. Li (LMD/CNRS)
15     ! Date: 1996/07/19
16 guez 53
17 guez 69 ! Objet : interface entre le modèle et les rayonnements solaire et
18     ! infrarouge
19    
20 guez 220 ! 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 guez 69
24 guez 118 USE clesphys, ONLY: solaire
25 guez 53 USE dimphy, ONLY: klev, klon
26 guez 71 use lw_m, only: lw
27     USE raddim, ONLY: kdlon
28 guez 53 USE suphec_m, ONLY: rg
29 guez 71 use sw_m, only: sw
30 guez 53 USE yoethf_m, ONLY: rvtmp2
31 guez 217
32 guez 118 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 guez 155 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 guez 212 real, intent(in):: q(klon, klev) ! vapeur d'eau (en kg/kg)
41 guez 118
42 guez 69 real, intent(in):: wo(klon, klev)
43 guez 118 ! column-density of ozone in a layer, in kilo-Dobsons
44    
45 guez 212 real, intent(in):: cldfra(klon, klev) ! fraction nuageuse (entre 0 et 1)
46 guez 53
47 guez 212 real, intent(in):: cldemi(klon, klev)
48     ! emissivite des nuages dans l'IR (entre 0 et 1)
49 guez 53
50 guez 337 real, intent(in):: cldtau(klon, klev)
51     ! \'epaisseur optique des nuages dans le visible (present-day value)
52 guez 212
53 guez 53 real, intent(out):: heat(klon, klev)
54     ! échauffement atmosphérique (visible) (K/jour)
55    
56 guez 213 real, intent(out):: heat0(klon, klev) ! chauffage solaire ciel clair
57 guez 212 real, intent(out):: cool(klon, klev) ! refroidissement dans l'IR (K/jour)
58 guez 213
59 guez 212 real, intent(out):: cool0(klon, klev)
60 guez 213 ! refroidissement infrarouge ciel clair
61 guez 212
62     real, intent(out):: radsol(klon)
63 guez 308 ! bilan radiatif net au sol (W/m**2), positif vers le bas
64 guez 212
65 guez 155 real, intent(out):: albpla(klon) ! albedo planetaire (entre 0 et 1)
66 guez 212 real, intent(out):: topsw(klon) ! flux solaire net au sommet de l'atm.
67 guez 62
68     real, intent(out):: toplw(klon)
69     ! rayonnement infrarouge montant au sommet de l'atmosphère
70    
71 guez 72 real, intent(out):: solsw(klon) ! flux solaire net à la surface
72    
73     real, intent(out):: sollw(klon)
74 guez 308 ! rayonnement infrarouge net à la surface
75 guez 72
76     real, intent(out):: sollwdown(klon)
77 guez 212 real, intent(out):: topsw0(klon)
78 guez 62 real, intent(out):: toplw0(klon)
79 guez 212 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 guez 72
85 guez 212 logical, intent(in):: ok_ade ! apply the Aerosol Direct Effect
86 guez 72
87 guez 212 real, intent(out):: topswad(klon), solswad(klon)
88     ! aerosol direct forcing at TOA and surface
89 guez 217 ! rayonnement solaire net absorb\'e
90 guez 72
91     ! Local:
92    
93 guez 53 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 guez 62 INTEGER k, kk, i, iof, nb_gr
105 guez 53 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 guez 118 DOUBLE PRECISION PWV(kdlon, klev), PQS(kdlon, klev)
113     DOUBLE PRECISION POZON(kdlon, klev) ! mass fraction of ozone
114 guez 178 DOUBLE PRECISION PAER(kdlon, klev, 5) ! AEROSOLS' OPTICAL THICKNESS
115 guez 53 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 guez 118 DOUBLE PRECISION zfract(kdlon), zrmu0(kdlon)
123 guez 53
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 guez 220 ! Aerosol direct forcing at TOA and surface
137 guez 53
138 guez 118 real, parameter:: dobson_u = 2.1415e-05 ! Dobson unit, in kg m-2
139 guez 53
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 guez 217
148 guez 53 heat = 0.
149     cool = 0.
150     heat0 = 0.
151     cool0 = 0.
152 guez 118 PSCT = solaire / dist**2
153 guez 53
154 guez 62 loop_iof: DO iof = 0, klon - kdlon, kdlon
155 guez 53 DO i = 1, kdlon
156     zfract(i) = fract(iof+i)
157 guez 118 zrmu0(i) = mu0(iof+i)
158 guez 53 PALBD(i, 1) = albedo(iof+i)
159 guez 155 PALBD(i, 2) = albedo(iof+i)
160 guez 53 PALBP(i, 1) = albedo(iof+i)
161 guez 155 PALBP(i, 2) = albedo(iof+i)
162 guez 53 ! cf. JLD pour etre en accord avec ORCHIDEE il faut mettre
163     ! PEMIS(i) = 0.96
164 guez 217 PEMIS(i) = 1.
165 guez 53 PVIEW(i) = 1.66
166     PPSOL(i) = paprs(iof+i, 1)
167 guez 72 zx_alpha1 = (paprs(iof+i, 1)-play(iof+i, 2)) &
168     / (play(iof+i, 1)-play(iof+i, 2))
169 guez 217 zx_alpha2 = 1. - zx_alpha1
170 guez 53 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 guez 217 PWV(i, k) = MAX (q(iof+i, k), 1e-12)
184 guez 53 PQS(i, k) = PWV(i, k)
185 guez 118 POZON(i, k) = wo(iof+i, k) * RG * dobson_u * 1e3 &
186     / (paprs(iof+i, k) - paprs(iof+i, k+1))
187 guez 53 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 guez 337 PTAU(i, 1, k) = MAX(cldtau(iof+i, k), 1e-05)
191 guez 53 ! (1e-12 serait instable)
192 guez 337 PTAU(i, 2, k) = MAX(cldtau(iof+i, k), 1e-05)
193 guez 53 ! (pour 32-bit machines)
194 guez 217 POMEGA(i, 1, k) = 0.9999 - 5e-04 * EXP(-0.5 * PTAU(i, 1, k))
195 guez 53 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 guez 217 PPMB(i, k) = paprs(iof+i, k)/100.
204 guez 53 ENDDO
205     ENDDO
206    
207     DO kk = 1, 5
208     DO k = 1, klev
209     DO i = 1, kdlon
210 guez 217 PAER(i, k, kk) = 1E-15
211 guez 53 ENDDO
212     ENDDO
213     ENDDO
214    
215 guez 145 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 guez 53 CALL SW(PSCT, zrmu0, zfract, PPMB, PDP, PPSOL, PALBD, PALBP, PTAVE, &
219 guez 178 PWV, PQS, POZON, PCLDSW, PTAU, POMEGA, PCG, zheat, zheat0, &
220 guez 53 zalbpla, ztopsw, zsolsw, ztopsw0, zsolsw0, ZFSUP, ZFSDN, ZFSUP0, &
221 guez 220 ZFSDN0, ztopswad, zsolswad, ok_ade)
222 guez 53
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 guez 217 topswad(iof+i) = 0.
260     solswad(iof+i) = 0.
261 guez 53 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 guez 62 end DO loop_iof
276 guez 53
277     END SUBROUTINE radlwsw
278    
279     end module radlwsw_m

  ViewVC Help
Powered by ViewVC 1.1.21