/[lmdze]/trunk/phylmd/clqh.f
ViewVC logotype

Contents of /trunk/phylmd/clqh.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 155 - (show annotations)
Wed Jul 8 17:03:45 2015 UTC (8 years, 9 months ago) by guez
Original Path: trunk/Sources/phylmd/clqh.f
File size: 10794 byte(s)
Do not write any longer to startphy.nc nor read from restartphy.nc the
NetCDF variable ALBLW: it was the same than ALBE. ALBE was for the
visible and ALBLW for the near infrared. In physiq, use only variables
falbe and albsol, removed falblw and albsollw. See revision 888 of
LMDZ.

Removed unused arguments pdp of SUBROUTINE lwbv, ptave of SUBROUTINE
lwv, kuaer of SUBROUTINE lwvd, nq of SUBROUTINE initphysto.

1 module clqh_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE clqh(dtime, itime, jour, debut, rlat, knon, nisurf, knindex, &
8 pctsrf, tsoil, qsol, rmu0, co2_ppm, rugos, rugoro, u1lay, v1lay, coef, &
9 t, q, ts, paprs, pplay, delp, radsol, albedo, snow, qsurf, &
10 precip_rain, precip_snow, fder, swnet, fluxlat, pctsrf_new, agesno, &
11 d_t, d_q, d_ts, z0_new, flux_t, flux_q, dflux_s, dflux_l, fqcalving, &
12 ffonte, run_off_lic_0, flux_o, flux_g)
13
14 ! Author: Z. X. Li (LMD/CNRS)
15 ! Date: 1993/08/18
16 ! Objet : diffusion verticale de "q" et de "h"
17
18 USE conf_phys_m, ONLY: iflag_pbl
19 USE dimens_m, ONLY: iim, jjm
20 USE dimphy, ONLY: klev, klon
21 USE dimsoil, ONLY: nsoilmx
22 USE indicesol, ONLY: is_ter, nbsrf
23 USE interfsurf_hq_m, ONLY: interfsurf_hq
24 USE suphec_m, ONLY: rcpd, rd, rg, rkappa
25
26 REAL, intent(in):: dtime ! intervalle du temps (s)
27 integer, intent(in):: itime
28 integer, intent(in):: jour ! jour de l'annee en cours
29 logical, intent(in):: debut
30 real, intent(in):: rlat(klon)
31 INTEGER, intent(in):: knon
32 integer nisurf
33 integer, intent(in):: knindex(:) ! (knon)
34 real, intent(in):: pctsrf(klon, nbsrf)
35 REAL tsoil(klon, nsoilmx)
36
37 REAL, intent(inout):: qsol(klon)
38 ! column-density of water in soil, in kg m-2
39
40 real, intent(in):: rmu0(klon) ! cosinus de l'angle solaire zenithal
41 REAL, intent(in):: co2_ppm ! taux CO2 atmosphere
42 real rugos(klon) ! rugosite
43 REAL rugoro(klon)
44 REAL u1lay(klon) ! vitesse u de la 1ere couche (m / s)
45 REAL v1lay(klon) ! vitesse v de la 1ere couche (m / s)
46
47 REAL, intent(in):: coef(:, :) ! (knon, klev)
48 ! Le coefficient d'echange (m**2 / s) multiplie par le cisaillement
49 ! du vent (dV / dz). La premiere valeur indique la valeur de Cdrag
50 ! (sans unite).
51
52 REAL t(klon, klev) ! temperature (K)
53 REAL q(klon, klev) ! humidite specifique (kg / kg)
54 REAL, intent(in):: ts(klon) ! temperature du sol (K)
55 REAL paprs(klon, klev+1) ! pression a inter-couche (Pa)
56 REAL pplay(klon, klev) ! pression au milieu de couche (Pa)
57 REAL delp(klon, klev) ! epaisseur de couche en pression (Pa)
58 REAL radsol(klon) ! ray. net au sol (Solaire+IR) W / m2
59 REAL, intent(inout):: albedo(:) ! (knon) albedo de la surface
60 REAL snow(klon) ! hauteur de neige
61 REAL qsurf(klon) ! humidite de l'air au dessus de la surface
62
63 real, intent(in):: precip_rain(klon)
64 ! liquid water mass flux (kg / m2 / s), positive down
65
66 real, intent(in):: precip_snow(klon)
67 ! solid water mass flux (kg / m2 / s), positive down
68
69 real, intent(inout):: fder(klon)
70 real swnet(klon)
71 real fluxlat(klon)
72 real pctsrf_new(klon, nbsrf)
73 REAL agesno(klon)
74 REAL d_t(klon, klev) ! incrementation de "t"
75 REAL d_q(klon, klev) ! incrementation de "q"
76 REAL, intent(out):: d_ts(:) ! (knon) incrementation de "ts"
77 real z0_new(klon)
78 REAL flux_t(klon, klev) ! (diagnostic) flux de la chaleur
79 ! sensible, flux de Cp*T, positif vers
80 ! le bas: j / (m**2 s) c.a.d.: W / m2
81 REAL flux_q(klon, klev) ! flux de la vapeur d'eau:kg / (m**2 s)
82 REAL dflux_s(klon) ! derivee du flux sensible dF / dTs
83 REAL dflux_l(klon) ! derivee du flux latent dF / dTs
84
85 ! Flux d'eau "perdue" par la surface et n\'ecessaire pour que limiter la
86 ! hauteur de neige, en kg / m2 / s
87 REAL fqcalving(klon)
88
89 ! Flux thermique utiliser pour fondre la neige
90 REAL ffonte(klon)
91
92 REAL run_off_lic_0(klon)! runof glacier au pas de temps precedent
93
94 !IM "slab" ocean
95
96 REAL, intent(out):: flux_o(klon) ! flux entre l'ocean et l'atmosphere W / m2
97
98 REAL, intent(out):: flux_g(klon)
99 ! flux entre l'ocean et la glace de mer W / m2
100
101 ! Local:
102
103 REAL evap(klon) ! evaporation au sol
104
105 INTEGER i, k
106 REAL zx_cq(klon, klev)
107 REAL zx_dq(klon, klev)
108 REAL zx_ch(klon, klev)
109 REAL zx_dh(klon, klev)
110 REAL zx_buf1(klon)
111 REAL zx_buf2(klon)
112 REAL zx_coef(klon, klev)
113 REAL local_h(klon, klev) ! enthalpie potentielle
114 REAL local_q(klon, klev)
115 REAL local_ts(klon)
116 REAL psref(klon) ! pression de reference pour temperature potent.
117 REAL zx_pkh(klon, klev), zx_pkf(klon, klev)
118
119 ! contre-gradient pour la vapeur d'eau: (kg / kg) / metre
120 REAL gamq(klon, 2:klev)
121 ! contre-gradient pour la chaleur sensible: Kelvin / metre
122 REAL gamt(klon, 2:klev)
123 REAL z_gamaq(klon, 2:klev), z_gamah(klon, 2:klev)
124 REAL zdelz
125
126 real zlev1(klon)
127 real temp_air(klon), spechum(klon)
128 real epot_air(klon), ccanopy(klon)
129 real tq_cdrag(klon), petAcoef(klon), peqAcoef(klon)
130 real petBcoef(klon), peqBcoef(klon)
131 real swdown(klon)
132 real p1lay(klon)
133
134 real fluxsens(klon)
135 real tsurf_new(knon)
136 real zzpk
137
138 !----------------------------------------------------------------
139
140 if (iflag_pbl == 1) then
141 do k = 3, klev
142 do i = 1, knon
143 gamq(i, k)= 0.0
144 gamt(i, k)= - 1.0e-03
145 enddo
146 enddo
147 do i = 1, knon
148 gamq(i, 2) = 0.0
149 gamt(i, 2) = - 2.5e-03
150 enddo
151 else
152 do k = 2, klev
153 do i = 1, knon
154 gamq(i, k) = 0.0
155 gamt(i, k) = 0.0
156 enddo
157 enddo
158 endif
159
160 DO i = 1, knon
161 psref(i) = paprs(i, 1) !pression de reference est celle au sol
162 local_ts(i) = ts(i)
163 ENDDO
164 DO k = 1, klev
165 DO i = 1, knon
166 zx_pkh(i, k) = (psref(i) / paprs(i, k))**RKAPPA
167 zx_pkf(i, k) = (psref(i) / pplay(i, k))**RKAPPA
168 local_h(i, k) = RCPD * t(i, k) * zx_pkf(i, k)
169 local_q(i, k) = q(i, k)
170 ENDDO
171 ENDDO
172
173 ! Convertir les coefficients en variables convenables au calcul:
174
175 DO k = 2, klev
176 DO i = 1, knon
177 zx_coef(i, k) = coef(i, k)*RG / (pplay(i, k - 1) - pplay(i, k)) &
178 *(paprs(i, k)*2 / (t(i, k)+t(i, k - 1)) / RD)**2
179 zx_coef(i, k) = zx_coef(i, k) * dtime*RG
180 ENDDO
181 ENDDO
182
183 ! Preparer les flux lies aux contre-gardients
184
185 DO k = 2, klev
186 DO i = 1, knon
187 zdelz = RD * (t(i, k - 1)+t(i, k)) / 2.0 / RG / paprs(i, k) &
188 *(pplay(i, k - 1) - pplay(i, k))
189 z_gamaq(i, k) = gamq(i, k) * zdelz
190 z_gamah(i, k) = gamt(i, k) * zdelz *RCPD * zx_pkh(i, k)
191 ENDDO
192 ENDDO
193 DO i = 1, knon
194 zx_buf1(i) = zx_coef(i, klev) + delp(i, klev)
195 zx_cq(i, klev) = (local_q(i, klev)*delp(i, klev) &
196 - zx_coef(i, klev)*z_gamaq(i, klev)) / zx_buf1(i)
197 zx_dq(i, klev) = zx_coef(i, klev) / zx_buf1(i)
198
199 zzpk=(pplay(i, klev) / psref(i))**RKAPPA
200 zx_buf2(i) = zzpk*delp(i, klev) + zx_coef(i, klev)
201 zx_ch(i, klev) = (local_h(i, klev)*zzpk*delp(i, klev) &
202 - zx_coef(i, klev)*z_gamah(i, klev)) / zx_buf2(i)
203 zx_dh(i, klev) = zx_coef(i, klev) / zx_buf2(i)
204 ENDDO
205 DO k = klev - 1, 2, - 1
206 DO i = 1, knon
207 zx_buf1(i) = delp(i, k)+zx_coef(i, k) &
208 +zx_coef(i, k+1)*(1. - zx_dq(i, k+1))
209 zx_cq(i, k) = (local_q(i, k)*delp(i, k) &
210 +zx_coef(i, k+1)*zx_cq(i, k+1) &
211 +zx_coef(i, k+1)*z_gamaq(i, k+1) &
212 - zx_coef(i, k)*z_gamaq(i, k)) / zx_buf1(i)
213 zx_dq(i, k) = zx_coef(i, k) / zx_buf1(i)
214
215 zzpk=(pplay(i, k) / psref(i))**RKAPPA
216 zx_buf2(i) = zzpk*delp(i, k)+zx_coef(i, k) &
217 +zx_coef(i, k+1)*(1. - zx_dh(i, k+1))
218 zx_ch(i, k) = (local_h(i, k)*zzpk*delp(i, k) &
219 +zx_coef(i, k+1)*zx_ch(i, k+1) &
220 +zx_coef(i, k+1)*z_gamah(i, k+1) &
221 - zx_coef(i, k)*z_gamah(i, k)) / zx_buf2(i)
222 zx_dh(i, k) = zx_coef(i, k) / zx_buf2(i)
223 ENDDO
224 ENDDO
225
226 DO i = 1, knon
227 zx_buf1(i) = delp(i, 1) + zx_coef(i, 2)*(1. - zx_dq(i, 2))
228 zx_cq(i, 1) = (local_q(i, 1)*delp(i, 1) &
229 +zx_coef(i, 2)*(z_gamaq(i, 2)+zx_cq(i, 2))) &
230 / zx_buf1(i)
231 zx_dq(i, 1) = - 1. * RG / zx_buf1(i)
232
233 zzpk=(pplay(i, 1) / psref(i))**RKAPPA
234 zx_buf2(i) = zzpk*delp(i, 1) + zx_coef(i, 2)*(1. - zx_dh(i, 2))
235 zx_ch(i, 1) = (local_h(i, 1)*zzpk*delp(i, 1) &
236 +zx_coef(i, 2)*(z_gamah(i, 2)+zx_ch(i, 2))) &
237 / zx_buf2(i)
238 zx_dh(i, 1) = - 1. * RG / zx_buf2(i)
239 ENDDO
240
241 ! Appel a interfsurf (appel generique) routine d'interface avec la surface
242
243 ! initialisation
244 petAcoef =0.
245 peqAcoef = 0.
246 petBcoef =0.
247 peqBcoef = 0.
248 p1lay =0.
249
250 petAcoef(1:knon) = zx_ch(1:knon, 1)
251 peqAcoef(1:knon) = zx_cq(1:knon, 1)
252 petBcoef(1:knon) = zx_dh(1:knon, 1)
253 peqBcoef(1:knon) = zx_dq(1:knon, 1)
254 tq_cdrag(1:knon) =coef(:knon, 1)
255 temp_air(1:knon) =t(1:knon, 1)
256 epot_air(1:knon) =local_h(1:knon, 1)
257 spechum(1:knon)=q(1:knon, 1)
258 p1lay(1:knon) = pplay(1:knon, 1)
259 zlev1(1:knon) = delp(1:knon, 1)
260
261 if(nisurf == is_ter) THEN
262 swdown(:knon) = swnet(:knon) / (1 - albedo)
263 else
264 swdown(:knon) = swnet(:knon)
265 endif
266 ccanopy = co2_ppm
267
268 CALL interfsurf_hq(itime, dtime, jour, rmu0, nisurf, knon, knindex, &
269 pctsrf, rlat, debut, nsoilmx, tsoil, qsol, u1lay, v1lay, temp_air, &
270 spechum, tq_cdrag, petAcoef, peqAcoef, petBcoef, peqBcoef, &
271 precip_rain, precip_snow, fder, rugos, rugoro, snow, qsurf, &
272 ts(:knon), p1lay, psref, radsol, evap, fluxsens, fluxlat, dflux_l, &
273 dflux_s, tsurf_new, albedo, z0_new, pctsrf_new, agesno, fqcalving, &
274 ffonte, run_off_lic_0, flux_o, flux_g)
275
276 flux_t(:knon, 1) = fluxsens(:knon)
277 flux_q(:knon, 1) = - evap(:knon)
278 d_ts = tsurf_new - ts(:knon)
279
280 !==== une fois on a zx_h_ts, on peut faire l'iteration ========
281 DO i = 1, knon
282 local_h(i, 1) = zx_ch(i, 1) + zx_dh(i, 1)*flux_t(i, 1)*dtime
283 local_q(i, 1) = zx_cq(i, 1) + zx_dq(i, 1)*flux_q(i, 1)*dtime
284 ENDDO
285 DO k = 2, klev
286 DO i = 1, knon
287 local_q(i, k) = zx_cq(i, k) + zx_dq(i, k)*local_q(i, k - 1)
288 local_h(i, k) = zx_ch(i, k) + zx_dh(i, k)*local_h(i, k - 1)
289 ENDDO
290 ENDDO
291
292 !== flux_q est le flux de vapeur d'eau: kg / (m**2 s) positive vers bas
293 !== flux_t est le flux de cpt (energie sensible): j / (m**2 s)
294 DO k = 2, klev
295 DO i = 1, knon
296 flux_q(i, k) = (zx_coef(i, k) / RG / dtime) &
297 * (local_q(i, k) - local_q(i, k - 1)+z_gamaq(i, k))
298 flux_t(i, k) = (zx_coef(i, k) / RG / dtime) &
299 * (local_h(i, k) - local_h(i, k - 1)+z_gamah(i, k)) &
300 / zx_pkh(i, k)
301 ENDDO
302 ENDDO
303
304 ! Calcul tendances
305 DO k = 1, klev
306 DO i = 1, knon
307 d_t(i, k) = local_h(i, k) / zx_pkf(i, k) / RCPD - t(i, k)
308 d_q(i, k) = local_q(i, k) - q(i, k)
309 ENDDO
310 ENDDO
311
312 END SUBROUTINE clqh
313
314 end module clqh_m

  ViewVC Help
Powered by ViewVC 1.1.21